C와 C++에 대해서

|

C와 C++에 대해서

1. C와 C++의 차이점

  • C++은 C를 확장시킨 언어이며, C는 절차지향 패턴을 따르는 반면 C++은 객체지향 패턴을 따름
  • C에서는 같은 이름을 가진 함수가 존재할 수 없지만, C++에서는 오버로딩/오버라이딩을 통한 존재 가능
    • 오버로딩: 같은 이름의 함수를 여러 개 정의하고, 매개변수의 유형과 개수를 다르게 해 유형의 호출에 응답하게 함
    • 오버라이딩: 상위 클래스가 갖는 멤버변수가 하위 클래스로 상속되듯이, 상위 클래스가 갖고 있는 메소드도 하위 클래스로 상속 되어 하위 클래스에서 사용 가능. 즉, 상속 관계에 있는 클래스 간에 같은 이름의 메소드를 정의하는 기술을 오버라이딩 (하위 클래스에서 해당 메소드 재정의해 사용 가능)
  • C에서는 변수, 함수를 코드 초반에 선언해야 하지만, C++에선 중간 어디서든 선언 가능

2. 클래스와 구조체의 차이점

  • C의 구조체
    • 구조체는 하나의 구조로 묶일 수 있는 데이터, 즉 변수들의 집합
      • C에서도 클래스처럼 함수 포인터를 이용해 클래스처럼 함수를 포함시킬 수 있음
    • 구조체(struct)는 default가 public
  • C++의 클래스
    • 클래스는 구조체처럼 변수 뿐만 아니라, 합수(메서드)까지 포함 가능
    • 클래스(class)는 default가 private

3. 객체지향 프로그래밍과 절차지향 프로그래밍과의 차이점은?

  • 각각 객체지향 프로그래밍은 Object Oriented Programming(OOP), 절차지향 프로그래밍은 Procedural Programming
  • 절차지향, 구조적 프로그래밍(C)
    • 초창기에 많이 사용한 방법으로 순차적 프로그래밍이라고도 함
    • 해야할 작업을 순서대로 코딩
    • 구조적 프로그래밍에서는 함수 단위로 구성되며 기능별로 묶어놓은 특징이 있음
    • 장점
      • 컴퓨터의 처리구조와 유사해 실행속도가 빠름
    • 단점
      • 유지보수가 어려움
      • 실행 순서가 정해져있으므로 코드의 순서가 바뀌면 동일한 결과를 보장하기 어려움
      • 디버깅이 어려움
  • 객체지향 프로그래밍(JAVA, C++, C#, Python)
    • 주 구성요소는 클래스와 객체
    • 상속과 다형성을 특징으로 들 수 있음
      • 다형성은 오버로딩/오버라이딩을 의미
    • 클래스를 활용해 각각의 기능별로 구성이 가능하며, 이를 나중에 하나로 합쳐서 프로그램의 완성이 가능
    • 객체 별로 개발이 가능하기에 팀 프로젝트를 하기에도 유리한 장점을 갖고 있음
    • 코드의 재사용이 가능하며 오류 발생 가능성이 적고 안전성이 높음
    • 장점
      • 코드의 재활용성이 높음
      • 코딩이 절차지향보다 간편함
      • 디버깅이 쉬움
    • 단점
      • 처리속도가 절차지향보다 느림
      • 설계에 많은 시간소요가 들어감

4. C++ 클래스의 소멸자에 virtual 키워드 붙이는 이유

  • 상속 받았을 때 virtual 키워드가 없다면 최상위 부모 객체에 대한 소멸만 이루어져 메모리 누수의 원인이 됨
  • C++에서 가상함수(virtual)는 파생클래스에서 재정의할 것으로 기대하는 멤버 함수를 의미
    • 자신이 호출하는 객체의 동적 타입에 따라 실제 호출할 함수가 결정됨
    • 기초클래스에서 virtual 키워드를 사용해 가상함수를 선언하면 파생 클래스에서 재정의된 멤버 함수도 자동으로 가상함수가 됨

5. 동적 바인딩이란?*

  • C++ 컴파일러는 함수 호출 시 어느 블록에 있는 함수를 호출해야 하고, 해당 함수가 저장된 정확한 메모리 위치까지 알아야 함
  • 이처럼 함수를 호출하는 코드에서 어느 블록에 있는 함수를 실행하라는 의미로 해석하는 것을 바인딩(binding) 이라고 함
  • C++의 경우 함수가 오버로딩 될 수 있으므로 이 작업이 복잡해짐
  • 대부분 함수를 호출하는 코드는 컴파일 타임에 고정된 메모리 주소로 변환되는데, 이것을 정적 바인딩 또는 초기 바인딩 이라고 함
    • C++에서는 가상함수가 아닌 멤버함수는 모두 정적 바인딩
  • 가상함수의 호출은 컴파일러가 어떤 함수를 호출해야 하는지 미리 알 수 없음
    • 따라서 가상함수의 경우에는 런타임에 올바른 함수가 실행되도록 해야 하는데, 이를 동적 바인딩이라고 함

6. 가상 함수 테이블이란?*

  • 클래스 안에 가상함수가 포함되어 있을 시 객체를 생성할 때 가상함수를 가리키는 포인터가 생성됨
  • 이 포인터는 가상테이블의 시작주소를 가리키는 포인터이며, 각 클래스마다 하나의 고유 가상테이블이 생성됨
  • 가상함수를 호출하면 C++ 프로그램은 가상함수 테이블에 접근해 자신이 필요한 함수의 주소를 찾아 호출함
  • 가상 함수를 사용하면 이처럼 함수 호출의 과정이 복잡해지므로 메모리와 실행속도 측면에서 부담이 가중됨

7. malloc()과 new에 대해

  • malloc()은 함수이고 new는 연산자
  • malloc()은 시스템함수로서 함수 안에서 메모리를 할당함
  • new는 연산자로 바로 메모리를 할당하는것이 아니라 생성자를 호출해 메모리를 할당
    • 생성자를 통해 호출하기때문에 new로 메모리를 할당하면 생성 시 초기화가 가능한 장점이 있음
  • realloc()은 메모리 할당이 실패할 경우 null이 반환되기 때문에 기존의 메모리가 할당되어있는 포인터를 잃어버리게되는 문제가 있음

8. 오버로딩과 오버라이딩

  • 오버로딩: 하나의 클래스에 같은 이름을 가진 메서드를 재정의
    • 변환형, 매개변수의 타입이 다르거나 매개변수의 개수가 달라야 함
  • 오버라이딩: 클래스 간 상속 관계에서 메서드를 재정의
    • 단순 재사용이 아니라 자식 클래스에서 상속 받은 메서드를 재정의하며 다른 연산을 수행토록 함
    • 조건: 메서드 이름, 매개변수, 리턴 타입이 같아야 함

9. Volatile 키워드

  • Volatile로 선언된 변수는 외부적인 요인으로 그 값이 언제든지 바뀔 수 있음을 뜻함
    • 따라서 컴파일러는 volatile 선언된 변수에 대해서는 최적화를 수행하지 않음
  • 사용 이유
    • Memory-mapped I/O처럼 메모리 주소에 연결된 하드웨어 레지스터에 값을 쓰는 프로그램이라면 이런 컴파일러의 최적화 방식(반복작업 하지 않도록 하는)은 오류를 야기할 수 있음
    • 각각의 register writing 과정이 하드웨어에 특정 명령을 전달하는 것이므로, 주소가 같다는 이유만으로 중복되는 쓰기 명령을 없애버리면 하드웨어가 오작동할 수 있음
  • 사용되는 분야: 임베디드 프로그래밍, 인터럽트 서비스 루틴의 사용, 멀티 쓰레드 환경
  • 공통점은 현재 프로그램의 수행 흐름과 상관없이 외부 요인이 변수 값을 변경 가능하다는 점

10. Call by value, Call by reference

  • 함수 호출 시, 메모리 공간 안에서는 함수를 위한 별도의 임시 공간이 생성됨(C++은 스택에 저장)
    • 함수 종료시 해당 메모리 공간은 사라짐
  • Call-by-value, 즉 값에 의한 호출 방식은 함수 호출 시 전달되는 변수의 값을 복사해 함수의 인자로 전달하는 방식 이며, 이 인자는 함수 안에서 지역적으로 사용되는 local 변수의 성격을 가짐
    • 따라서 함수 외부에서 값이 변경돼도 외부 값은 그대로 유지됨
  • Call-by-reference, 즉 참조에 의한 호출 방식은 함수 호출 시 전달되는 변수의 레퍼런스(주솟값)를 인자로 전달하는 방식 이며, 함수 안에서 값이 변하면 외부의 전달해준 값도 변경됨
    • 그냥 전달받은 변수가 저장된 메모리 주소에 접근해 해당 값을 갖고 연산한다고 생각하면 됨

11. C에서 구조체(struct)의 sizeof 적용시 주의점

typedef struct temp
{
    char a;
    int b;
}T;
  • 위 경우, 1byte의 cher와 4byte의 int의 변수를 가지므로 sizeof(T)를 하면 5가 나올 것으로 예상 할 수 있음
  • 하지만, 실제로는 sizeof(T)=8
    • 이는 구조체 안에서 가장 큰 자료형을 따라가기 때문이며, 순서에 따라 또 달라짐

12. const 키워드

  • 포인터 변수에 const 키워드를 붙이는 방법은 2가지가 있음
  • const int* MAX = &value: const가 앞에 붙는 경우로, *MAX = 10으로 다른값으로 초기화 불가
  • int* const MAX = &value: const가 뒤에 붙는 경우로, MAX = &other로 다른 포인터 변수로 초기화 불가
  • const int* const MAX = &value: 둘 다 불가능 (값 및 다른 포인터 변수로 초기화 불가)
  • 구조체 멤버 변수에 const 키워드가 붙는 경우 구조체 변수를 생성할 때마다 초기화를 해줘야 함
  • 클래스 멤버 변수에 const를 뒤에 붙이면 그 함수 내에선 클래스 멤버 변수 값을 변경 할 수 없음
    • 즉, const 함수 내에서는 const 함수가 아니면 호출 불가
  • 함수 내에서 매개변수를 const로 상수화시키는 경우는 값이 변하면 안되는 매개변수에 const를 사용해줘 실수로 발생하는 버그를 줄임

13. 함수 포인터

  • 함수를 배열 또는 구조체에 넣거나, 함수 자체를 함수의 매개변수로 넘겨주고, 반환값으로 가져오기 위해 만든 포인터
void hello()
{
    printf(Hello, world!\n);
}

int main()
{
    void (*fptr)(); //반환 없는 void, 매개변수가 없는 함수포인터 fptr 선언
    // int (*fptr)(int, int);  << 반환형이 int이고, 매개변수가 int 2개를 받는 함수포인터 fptr
    fp = hello;
    fp(); // Hello, world! 출력
}

14. 메모리 단편화를 해결할 수 있는 기법

  • 메모리 단편화: 사용가능한 메모리가 충분히 존재해도 할당(사용)이 불가능한 상태
  • 내부 단편화: 할당될 크기에 비해 실제 나뉘어 있는 메모리의 크기가 커서 해당 단위 자원 내부에 사용하지 않는 메모리 공간이 발생 할 때를 의미
    • 즉, 프로세스가 필요한 양보다 더 큰 메모리가 할당되어서 프로세스에서 사용하는 메모리 공간이 낭비 되는 상황
    • ex. 메모장을 사용할 때 OS가 4kb를 할당해줬지만, 실제론 1kb만큼만 사용하고 있다면 3kb만큼의 내부 단편화가 발생함
  • 외부 단편화: 나뉘어 있는 단위의 크기보다 할당될 크기가 더 커서 남는 메모리의 전체 합은 충분하나 할당이 불가능할 때를 의미
    • 즉, 메모리 할당/해제의 반복 작업에서 사용되지 않는 작은 메모리가 중간중간 존재하게 되고, 이 작은 메모리들이 많아져서 총 메모리 공간은 충분하지만 실제로 할당 할 수 없는 상황
    • ex. 32MB 램에 처음에 8mb, 다음에 16mb, 마지막에 8mb 메모리가 할당되는 프로세스가 돌아가고 첫 번째와 마지막 프로세스가 종료된 경우, 총 빈 공간은 16mb가 되지만 9mb가 필요한 새 프로세스에 대한 메모리를 할당할 공간이 부족해지는 현상
  • 해결방법
    • 압축: 여러 곳에 분산되어 있는 단편화된 메모리 공간들을 결합해서 하나의 큰 공간으로 만듦
    • 페이징: 가상메모리 사용, 외부 단편화 해결, 내부 단편화 존재
      • 보조기억장치를 이용한 가상메모리를 같은 크기의 블록으로 나눈 것을 페이지라 하고, RAM을 페이지와 같은 크기로 나눈 것을 프레임이라고 할 때
      • 사용하지 않는 프레임을 페이지에 옮기고 필요한 메모리를 페이지 단위로 프레임에 옮기는 기법
      • 페이지와 프레임을 대응시키기 위해 page mapping 과정이 필요해서 paging table을 만듦
      • 페이징 기법을 사용하면 연속적이지 않은 공간도 활용 가능하기에 외부 단편화 문제를 해결 가능
      • 하지만 페이지 단위에 맞게 꽉채워 쓰는게 아니므로 내부 단편화의 문제는 여전히 존재
      • 페이지 단위를 작게하면 내부 단편화 문제도 해결 가능하지만 page mapping 과정이 복잡해져 효율이 떨어지게 됨
    • 세그멘테이션: 논리 메모리와 물리 메모리를 서로 다른 크기의 논리적 단위인 세그먼트로 분할
      • 메모리에 적재될 때 빈공간을 찾아 할당하는 사용자 관점의 가상 메모리 관리기법
      • 공간들을 계속 쓰다보면 결국 외부 단편화가 발생 할 수 잇음

15. 인터페이스와 추상클래스의 차이

  • 추상 클래스의 목적
    • 기존의 클래스에서 공통된 부분을 추상화하여 상속하는 클래스에게 구현을 강제화
    • 메서드의 동작을 구현하는 자식클래스로 책임을 위임/공유의 목적
  • 인터페이스의 목적
    • 구현하는 모든 클래스에 대해 특정한 메서드가 반드시 존재하도록 강제
  • 인터페이스는 다중 구현이 가능하지만 추상클래스는 다중 상속이 불가능

16. 인라인 함수

  • 일반적인 함수를 호출할 때, 새로운 스택을 생성해 프로그램 카운트 루틴을 새롭게 시작하게 됨
    • 이 경우 성능저하를 초래할 수 있음
  • 인라인 함수는 실제 함수를 호출하는것이 아닌, 정의된 함수가 호출의 시기의 루틴에 그대로 코드를 옮겨놓는 것과 같은 결과를 만들어냄
    • 빨라진다!

17. 수많은 생성자에 관해

  • 디폴트 생성자: 인수도 없고 내용도 없는 생성자
    • 클래스 내에서 아무런 생성자도 정의하지 않은 경우 호출됨
    • 내용이 비었기에 멤버 변수는 쓰레기 값을 갖고 있음
  • 복사 생성자: 같은 클래스의 객체끼리의 대입을 할 때 사용되는 생성자
  • 디폴트 복사 생성자: 같은 클래스 타입의 객체를 인수로 받아 멤버 대 멤버 복사를 하는 생성자
  • 얕은 복사: 복사 생성자를 통해 다른 객체가 힙에 할당된 동일한 메모리에 있는 변수를 참조
    • 결국 새로운 주소값을 생성한 것이 아닌, 받아온 객체가 갖고 있는 멤버 변수의 메모리에 다리만 얹어놓는 꼴
  • 깊은 복사: 이를 위해선 컴파일 상에서 제공된 디폴트 복사 생성자를 오버로딩 해야함
myClass(const myClass &T)
{
      a = T.a;
      name = new char[strlen(_name) + 1];
      strcpy(name, _name);
  }  // 매개변수로 자신 객체가 들어올 때 상황에 대해 똑같이 한번 더 오버로딩 해줌

18. void 포인터

  • 포인터 주소를 저장하는 변수
  • 포인터의 크기는 4byte (32bit OS 기준)
  • void 포인터는 자료형이 결정되지 않은, 어떤 자료형의 주소든 그 주솟값을 저장하는 포인터
    • 어떤 자료형의 주소든 저장 할 수 있음
    • 어떤 자료형의 주소든 4byte를 넘지 않음

EfficientNet:Rethinking Model Scaling for Convolutional Neural Networks

|

EfficientNet:Rethinking Model Scaling for Convolutional Neural Networks

Original paper: https://arxiv.org/pdf/1905.11946.pdf

Authors: Mingxing Tan, and Quoc V. Le

  • 참고 글
    • https://hoya012.github.io/blog/EfficientNet-review/
  • CVPR2019에 발표된 논문으로, image classification task에서 성능이 좋은 model인 efficientnet을 제안함
views
EfficientNet의 실험결과
  • ImageNet 데이터셋에 대해 정확도를 초점으로 한 모델과 효율성(efficient)을 초점으로 한 모델들이 굉장히 많이 제안됨
  • 이러한 모든 모델들의 성능을 크게 상회하는 모델을 제안함
  • 아래에선 어떻게 이렇게 좋은 성능을 달성했는지에 대해 설명

Model Scaling

  • 일반적으로 CNN의 정확도를 높일 때 잘 짜여진 모델 자체를 찾는 방법도 있지만, 기존 모델을 바탕으로 complexity를 높히는 방법도 많이 사용됨
views
Model Scaling 기법 예시
  • 위의 그림은 존재하는 모델의 size를 키워주는 방법들의 예시를 보여줌
  • 대표적으로 filter의 개수(channel의 개수)를 늘리는 width scaling 과 layer의 개수를 늘리는 depth scaling , 그리고 input image의 해상도를 높이는 resolution scaling 이 자주 사용됨
  • ResNet이 depth scaling을 통해 모델의 크기를 조절하는 대표적인 모델(ex. ResNet-50, ResNet-101)
  • MobileNet, ShuffleNet 등이 width scaling을 통해 모델의 크기를 조절하는 대표적인 모델(ex. MobileNet-224 1.0, MobileNet-224 0.5)
  • 하지만 기존 방식들에서는 위의 3가지 scaling을 동시에 고려하는 경우가 거의 없었음
  • 또한 3가지 scaling 기법 중 어떤 기법을 사용할지에 대해서도 마땅한 가이드라인이 없으며, 실제로 scaling한다고 해서 linear하게 정확도가 향상되는 것이 아니기에 일일이 실험을 해봐야 한다는 어려움이 존재

  • 본 논문에서는 실제로 3가지 scaling 기법에 대해 각 scaling 기법마다 나머지는 고정하고 1개의 scaling factor만 키워가며 정확도의 변화를 측정함
views
Single dimenstion model scaling 실험결과
  • 위의 그림에서 width scaling, depth scaling 은 비교적 이른 시점에 정확도가 saturation되며 그나마 resolution scaling 이 키우면 키울수록 정확도가 더 향상되는 모습을 보임

  • 비슷한 방식으로 depth(d)와 resolution(r)을 고정하고 width만 조절해서 정확도의 변화를 측정하는 실험을 수행

views
Width scaling 실험결과
  • 같은 연산량(FLOPS)임에도 불구하고 크게는 1.5%까지 정확도가 차이가 날 수 있음
  • 초록색 선과 노란색 선을 비교하면 depth를 키우는 것 보다는 resolution을 키우는 것이 정확도가 더 좋아지는 것을 확인 할 수 있음
  • 빨간 선을 보면 1가지, 혹은 2가지 scaling factor만 키우는것보다 3가지 scaling factor 모두 동시에 키워주는것이 가장 성능이 좋아지는 것을 실험적으로 보여줌

  • 직관적으로 생각해봐도 input image가 커지면 그에 따라서 convolution의 receptive field도 늘려줘야 하고, 더 커진 fine-grained pattern들을 학습하기 위해 더 많은 channel이 필요한건 합리적인 주장임
  • 즉, 모델의 크기를 키워줄 때 위의 3가지 요소들을 동시에 고려하는 것이 좋다는 것은 어찌보면 당연한 주장
  • 이제, 어떻게 이 3가지 요소들을 고려할 것인지에 대해 설명함

Compound Scaling

  • 위의 실험들을 통해 3가지 scaling factor를 동시에 고려하는 것이 좋다는 것을 입증함
  • 이번엔 최적의 비율을 찾아서 실제 모델에 적용을 해서 다른 모델들과 성능을 비교하는 과정을 설명함
  • 이 논문에선 모델(F)을 고정하고 depth(d), width(w), resolution(r)의 3가지를 조절하는 방법을 제안하는데, 여기서 고정하는 모델(F)을 성능이 좋은 모델로 선정하는것이 굉장히 중요함
    • 아무리 scaling factor를 조절해도 초기 모델 자체의 성능이 낮다면 최대 임계 성능도 낮아지기 때문
  • 이 논문에서는 MnasNet과 거의 동일한 search space 하에서 AutoML을 통해 모델을 탐색했고, 이 과정을 통해 찾은 작은 모델을 EfficientNet-B0 라고 함
views
EfficientNet-B0의 구조
  • 모델 구조는 MnasNet과 거의 유사하며, 위와 같이 구성됨
  • 이 모델을 base로 하여 3가지 scaling factor를 동시에 고려하는 Compund Scaling 을 적용하여 실험을 수행
    • Depth: $d=\alpha^{\phi}$
    • Width: $w=\beta^{\phi}$
    • Resolution: $r=\gamma^{\phi}$
    • 단, 다음의 조건을 만족
      • $\alpha\cdot \beta^2\cdot \gamma^2\approx 2$
      • $\alpha\geq1, \beta\geq1, \gamma\geq1$
  • 우선 depth, width, resolution은 각각 알파, 베타, 감마로 나타내며 각각의 비율은 $\alpha\cdot \beta^2\cdot \gamma^2\approx 2$ 조건을 만족해야 함
  • 여기서 width와 resolution에 제곱항이 들어간 이유는 depth는 2배 키워주면 FLOPS도 비례해서 2배 증가하지만, width와 resolution은 공간 방향으로 2차원이므로 제곱 배 증가하기 때문임
    • 따라서 제곱을 곱해서 계산함
  • 다음에 전체 모델 사이즈는 알파, 베타, 감마에 똑같은 파이만큼 제곱해서 조절하게 됨
  • EfficientNet의 알파, 베타, 감마 값은 간단한 grid search를 통해 구하는 방식을 제안하며, 처음 단계에서는 파이를 1로 고정한 뒤 타겟 데이터셋에서 좋은 성능을 보이는 알파, 베타, 감마 값을 찾아냄
  • 이 논문에선 $\alpha=1.2$, $\beta=1.1$, $\gamma=1.15$를 사용하며, 이 3개의 scaling factor들을 고정한 뒤 $\phi$를 키워주며 모델의 사이즈를 키워주며 실험

  • 기존 사람이 디자인한 CNN, AutoML을 통해 찾은 CNN들과 비교를 한 결과는 아래와 같음
views
ImageNet 실험결과
  • 결과를 보면 알 수 있듯이 기존 ConvNet들에 비해 비슷한 정확도를 보이면서 parameter 수와 FLOPS 수를 굉장히 많이 절약 할 수 있음
  • 또한 기존에 ImageNet 데이터셋에서 가장 높은 정확도를 달성했던 GPipe보다 더 높은 정확도를 달성함
    • 동시에 parameter수와 FLOPS 수도 굉장히 많이 절약함
  • 실험 결과가 상당히 의미있고 좋음
  • 이 외에도 다양한 실험 결과들은 논문에서 확인 가능
views
Class Activation Map 실험결과
  • 마지막으로 모델이 이미지를 분류할 때 영상 내 어느 영역에 집중했는지 확인 할 수 있는 class activation map(CAM)을 뽑았을 때, 3개의 caling factor를 각각 고려하는 경우보다 동시에 고려했을 때 더 정교한 CAM을 얻을 수 있었음

결론

  • 직관적이고 간단한 방식을 적용해 우수한 성능을 내는 점이 인상깊었음

Do Better ImageNet Models Transfer Better?

|

Do Better ImageNet Models Transfer Better?

Original paper: https://arxiv.org/pdf/1805.08974.pdf

Authors: Simon Kornblith, Jonathon Shlens, and Quoc V. Le (Google Brain)

  • 참고 글
    • https://norman3.github.io/papers/docs/do_better_imagenet_models_transfer_better.html

Abstract

  • Pretrained 된 모델을 이용해 다른 task에서 transfer learning을 하는것은 computer vision 분야에서 매우 효과가 좋음
  • 하지만 여기엔 슬픈 전설이 있음
    • ImageNet에서의 성능이 좋은 모델일수록 해당 모델을 backbone으로 사용해서 transfer learning을 하면 성능이 더 좋음
  • 본 논문에서는 12개의 데이터 셋, 16개의 classification 모델을 비교해서 위의 가설이 사실인지 검증함
    • 실제 backbone과 tranfer task와의 성능에 대한 상관 관계가 매우 높은것을 확인함

Introduction

  • 지난 십여년간 computer vision 학계에서는 모델간 성능 비교를 위한 벤치마크 측정 수단을 만들이는데 공을 들임
  • 그 중 가장 성공한 프로젝트는 ImageNet
  • ImageNet으로 학습된 모델을 이용해 transfer learning, object detection, image segmentation 등의 다양한 task에 대해 성능평가를 수행함
  • 여기서 암묵적인 가정은
    1. ImageNet에서 좋은 성능을 보이는 모델은 다른 image task에서도 좋은 성능을 낸다는 것
    2. 더 좋은, 성능이 좋은 모델을 사용할수록 transfer learning에서 더 좋은 성능을 얻을 수 있음
  • 이전의 다양한 연구들을 토대로 위 가정들은 어느정도 맞는듯 함

  • 본 논문에서는 실험 기준을 세우기 위해 ImageNet feature와 classification model 모두를 살펴봄
    • 16개의 최신 CNN 모델들과 12개의 유명한 classification dataset을 사용해 검증
  • 논문에서는 총 3가지 실험을 수행
    1. Pretrained ImageNet에서 고정된 feature 값을 추출한 뒤, 이 결과로 새로운 task를 학습
      • Transfer learning as a fixed feature extractor
      • Feature extractor는 그대로, 뒤 쪽은 학습
    2. Pretrained ImageNet을 다시 fine-tuning 하여 학습
      • Transfer learning
      • 일반적인 전이학습으로, pretrained 모델로 weight parameter 초기화 후 해당값을 시작점으로 하여 재학습
    3. 그냥 각 모델들을 개별 task에서 from scratch로 학습
      • 처음부터 모델을 학습시키는 방법
  • Main contributions
    • 더 나은 성능의 imageNet pretrained model을 사용하는것이 linear classification의 transfer learning에서 더 나은 feature extractor의 feature map을 만들어내며(r=0.99), 전체 네트워크가 fine-tuning 되었을 때 더 나은 성능을 보임(r=0.96)
    • ImageNet task에서 모델의 성능을 향상시키는 regularizer들은 feature extractor의 출력 feature map의 관점에서 transfer learning에 오히려 방해가 됨
      • 즉, transfer learning에서는 regularizer들을 사용하지 않는것이 성능이 더 좋았음
    • ImaegNet에서 성능이 좋은 모델일수록 다른 task에서도 비슷하게 성능이 더 좋았음

Statistical methods

  • 서로 다른 난이도를 가진 여러 데이터 집합을 통해 각 모델의 성능의 상관관계를 제대로 측정하는것은 매우 어려운 일
  • 따라서 단순하게 성능이 몇% 올랐는지를 확인하는 방식에는 문제가 있음
    • 예를 들어 현재 정확도가 50%일때와 정확도가 99%일때, 성능을 1%향상시키는 것은 서로 다른 의미를 가짐
  • 논문에서는 log-odd를 사용해서 변환된 성능 측정 방식을 사용함
  • Logit 변환은 비율 데이터 분석에서 가장 흔하게 사용되는 계산방식
  • 사용되는 스케일이 log단위로 변경되기에 갑싱 변화량 $\Delta$ 는 $exp$ 의 비율로 적용되는것을 알 수 있음
  • Error bar도 Morey가 제안한 방법으로 적당히 잘 구성함(논문 참고)
  • 이제 ImageNet의 정확도와 log-transformed 정확도의 상관 관계를 측정
    • 자세한 내용은 논문의 appendix 참고
views

실험 결과

  • 16개의 모델로 ImageNet(ILSVRC2012) validation set의 top-1 accuracy 비교
    • 각 모델들은 71.6~80.8%의 정확도 성능을 보임
  • 공평한 비교를 위해 모든 모델은 직접 재학습을 함
    • 여기서 BN scale parameter, label smoothing, dropout auxiliary head 등은 나누어 확인
    • 논문의 appendix A.3에 더 자세히 기술되어 있음
  • 총 12개의 classification dataset을 실험
    • 데이터셋의 training set size는 2,040개부터 75,750개까지 다양함 (Appendix H 참조)
    • CIFAR-10, CIFAR-100, PASCAL-VOC-2007, Caltech-101, Food-101, Bird-snap, Cars, Aircraft, Pets, DTD, scene-classification etc.
views
  • 그림 2는 실제 테스트 결과를 보여줌
  • ImageNet에 대한 top-1 accuracy 결과와 새로운 task에 대한 상관관계를 나타냄
  • 다음 설정으로 실험 수행
    1. Logistic regression classifier (마지막 전 레이어 fixed feature 사용)
    2. ImageNet을 기본으로 fine-tunning 작업 수행
    3. 동일한 아키텍쳐 모델로 새로운 task에서 재학습
views

Fixed feature extractor

  • Fixed feature를 먼저 추출한 뒤 이 값으로 logistic regression을 수행
    • L-BFGS를 사용했으며 data augmentation은 공정한 실험을 위해 적용하지 않음
  • 최대한 같은 실험조건으로 실험
  • 공개된 pretrained checkpoint 값들을 사용해 테스트 할 경우
    • ResNet과 DenseNet이 다른 모델에 비해 일관적으로 높은 성능을 얻음을 확인함
    • 다만 ImageNet과 transfer 정확도의 사이의 상관관계가 매우 낮음 (appendix B)
    • 이는 regularizer의 적용 유무에 따른 차이로 보여짐
  • 그림 3은 각 regularizer의 적용 여부에 따른 성능을 확인
  • 총 4개 종류로 여러 방식을 조합해 성능을 확인
    1. BN scale parameter 제거 ($\gamma$)
    2. Label smoothing 적용여부
    3. Dropout 적용여부
    4. Auxiliary classifier head 적용여부
  • 위의 사항들은 ImageNet에서 top-1 정확도에 1% 이내의 성능 영향을 미침
  • 하지만 transfer learning의 정확도에는 각각 미치는 영향도가 모두 다름
views
  • Embedding에서도 차이가 있음
views
  • 자세한 내용은 appendix C 참조

Fine tuning

  • 그림 2가 fine tuning의 실험 결과
views
  • ImageNet으로 학습된 모델을 사용해 각 task에 대해 fine tuning 수행
  • 총 20,000 step동안 학습을 진행하며, Nesterov momentum(SGD momentum)과 cosine-decay lr을 적용
  • Batch size는 256 사용
  • Grid search 기법을 이용해 최적의 hyperparameter(lr, weight decaying rate)를 찾음 (appendix A.5)
  • 이 실험에서는 ImageNet top-1 정확도와 다른 dataset에 해당 모델이 transfer learning 적용되어 학습되어졌을 때의 정확도를 비교
    • 둘의 상관관계가 높음을 확인함 (r=0.96)
  • Logistic regression과 비교해서 regularization(정규화) 기법들을 적용시켜 학습시 regularizer의 영향도는 작아짐
  • 그림 5는 Inception v4와 Inception-ResNet-v2에 대해 마찬가지로 regularizer들을 적용시켜본 결과
views
  • Logistic regression 실험과 마찬가지로 BN scale은 사용하고 label smoothing은 적용하지 않았을 때의 결과가 가장 좋았음
  • Dropout과 auxiliary head는 경우에 따라 성능 향상이 될 수도 있고 아닐 수도 있음
    • 자세한 내용은 appendix C.2
  • 무엇보다도 fine-tuning 방식이 transfer learning햇을 때 정확도가 가장 좋았음(성능이 가장 좋았음)
    • 하지만 어떤 데이터셋을 사용하느냐에 따라 얻을 수 있는 이득의 정도는 달라짐
  • 자세한 내용은 그림 6과 appendix E를 참고
views

Random initialization

  • 앞선 결과들만 살펴본다면 성느으이 향상이 ImageNet pretrained weight 값들로 인한 것인지, 아니면 architecture 자체에서 오는 것인지 확인하기 어려움
  • 여기서는 순수히 동일한 architecture를 이용해서 초기 weight parameter를 랜덤하게 초기화해 학습시킴
    • 각종 옵션 및 hyperparameter는 fine-tuning 실험과 동일하게 설정
  • 여기서 상관관계는 어느 정도 유의미한 결과를 보임(r=0.55)
  • 특히 10,000개 미만의 데이터를 가지는 7개 데이터셋에서는 상관관계가 매우 낮았음(r=0.29)
    • 자세한 내용은 appendix D
  • 반면 데이터 셋의 크기가 클 경우 상관관계가 매우 높았음 (r=0.86)

Fine-tuning with better models is comparable to specialized methods for transfer learning

  • ImageNet 정확도와 transfer learning시 정확도의 상관관계가 매우 높다고 확인됨
  • ImageNet에서 더 정확한 모델이 transfer learning 적용시켜도 더 정확한지 확인
  • 그림 6에서 확인가능하듯이 12개 데이터셋 중 제일 정확한 모델이 7개 데이터 셋에서도 SOTA의 성능을 보임 (appendix F)
    • 이는 ImageNet으로 학습된 모델의 성능이 transferred model의 성능에 큰 영향을 준다는 의미

ImageNet pretraining does not necessarily improve accuracy on fine-grained tasks

views
  • FGVC task에서는 transfer learning을 적용해도 성능 향상의 폭이 적었음
    • Stanford car, FGVC Aircraft등…
    • ImageNet에서 car class는 10개정도로 적음
    • Stanford car의 car class는 196개로 이로 인해 잘 동작하지 않는것으로 판단됨

ImageNet pretraining accelerates convergence

views
  • Stanford car와 FGVC-Aircraft에서 23(SURF)의 방식에 따른 성능 차이가 없는 것을 확인
  • 위의 그림을 볼 때 2의 방식이 수렴 속도 면에서 유의미한 차이가 존재
    • 학습 속도면에서 fine-tuned model이 훨씬 학습속도가 빠름

Accuracy benefits of ImageNet pretraining fade quickly with dataset size

views
  • 결과를 놓고 보면, ImageNet pretrained model을 사용하는것이 최고다…

네트워크 과적합(Overfitting) 방지 방법 정리

|

네트워크 과적합(Overfitting) 방지 방법 정리

  • 출처
    • https://umbum.tistory.com/221?category=751025
    • https://kratzert.github.io/2016/02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html
  • 오버피팅?
    • 훈련 데이터에만 지나치게 의존적으로 학습되어 새로운 데이터에 제대로된 응답을 하지 못하는 현상
    • 주로 다음과 같은 모델에서 발생함
      • 모델이 깊어 파라미터 수가 많고, 표현력이 좋은 모델
      • 학습용 데이터셋의 양이 부족한 경우

배치 정규화(Batch normalization)

  • 활성화 값(Activation value)이 적절하게 분포되도록 하는 값을 좋은 가중치의 초깃값으로 봄
  • 가중치의 초깃값에 의존하지 않고 활성화 값을 강제로 적절히 분포되도록 하는 것을 배치 정규화라고 함

  • 배치 정규화는 모든 노드가 뒤쪽 노드와 연결되어있는 각 레이어(affine layer)를 통과한 미니배치의 출력을 표준정규분포로 정규화함
  • 일반적으로 아래와 같이 네트워크가 구성
    • …->Conv layer->Batch normalization layer->Conv layer->…
  • 배치 정규화의 장점은 아래와 같음
    • 가중치 파라미터의 초깃값에 크게 의존적이지 않게 됨
    • Gradient vanishing/exploding 방지
    • 과적합(overfitting) 억제

수식적인 접근

  • 미니배치 $B={x_1, x_2, .., x_n}$을 평균이 0, 분산이 1인 표준정규분포를 따르는 $\hat{B}={\hat{x_1}, \hat{x_2}, .., \hat{x_n}}$로 정규화
  • 여기서 $B$가 미니배치이므로 $x_i$는 단일 원소 값이 아니라 단일 입력 데이터 벡터임에 유의해야 함
  • 즉, 배치 정규화는 단일 입력 데이터 단위가 아니라 미니배치 단위로 정규화됨

Mini-batch 평균

Mini-batch 분산

Normalization

  • 정규화에서 $x_i-\mu_B$가 평균을 0으로 만들고, $\sqrt{\sigma_B^2+\epsilon}$가 분산을 1로 만듦
  • 표준편차로 나누면 분산이 1이 됨
  • $\epsilon$은 0으로 나눠지는것을 방지하기 위한 아주 작은 상수

  • 정규화 후에 배치 정규화 계층마다 이 정규화된 데이터에 대한 고유한 스케일링(Scaling, $\gamma$), 쉬프팅(Shifting, $\beta$) 수행
    • $y_i\leftarrow\gamma\hat{x_i}+\beta$
  • 초깃값은 $\gamma=1,\; \beta=0$으로 설정되며 학습과정에서 적절한 값으로 조정해 나감

일반화(Regularization)

  • 네트워크의 과적합 학습을 방지하기위해 아래와 같은 regularization 기법들을 사용함
  • Regularization은 네트워크가 범용성을 갖도록 만들어줌
    • 앞서 언급된 정규화(normalization)와는 엄연히 다름

Weight decay (L2 regularization)

  • L2 regularization은 가장 보편화된 일반화 기법
  • Overfitting은 일반적으로 weight parameter의 값이 커서 발생하는 경우가 많기때문에 weight parameter의 값이 클수록 큰 페널티를 부과해서 overfitting을 억제함

  • 여기서 penalty 부과란 weight list가 $W$일 때 loss function의 결과에 $\frac{1}{2}\lambda W W^T$을 더하는 것을 말함
    • $\lambda$는 weight decaying의 강도를 조절하는 하이퍼 파라미터로, 크게 설정할수록 큰 weight penalty가 부과됨
    • 각 layer의 weight에 해당하는 weight vector $W_i$에 대해 계산한 값을 모두 합산해서 loss function에 더함
  • Loss function에 $\frac{1}{2}\lambda W^2$를 더하는것이 어떻게 weight parameter에 penalty를 부과하는것인가?
    • $\frac{1}{2}\lambda W^2$를 loss function에 더함으로써 gradient descent 과정에서 위 항을 미분한 $\lambda W$ 를 항상 더하게 됨
    • 이에 따라 weight $W$의 update 과정에서 $W\leftarrow W-\eta(\frac{\partial L}{\partial W}+\lambda W)$가 되므로, weight 값이 그만큼 더 보정되게 됨 ($\eta$: learning rate)
  • Loss function 값에 $\lambda |W|$를 더하는 sparsity(L1 regularization)도 있으며, L1, L2 regularization을 동시에 적용 가능
  • 하지만 일반적으로 L2 regularization만을 사용하는것이 더 좋은 결과를 가져옴

Dropout

  • L1, L2 regularization과 상호 보완적인 방법
  • Dropout은 각 계층마다 일정 비율의 노드를 임의로 정해 weight parameter update시 누락시켜 진행하는 방법
  • 이는 네트워크 내부에서 이뤄지는 앙상블 학습방법중 하나로 생각해도 됨
    • 앙상블 학습은 개별적으로 학습시킨 여러 모델의 출력을 종합해 추론하는 방식
    • Dropout과 별개로 여러 네트워크를 개별적으로 학습시키고, 각 네트워크에 같은 입력을 줘 나온 출력값에 대해 평균을 구한 후 가장 큰 평균을 갖는 값을 최종 결과로 추론하기에 전체 모델의 정확도가 향상되는 장점이 있음
    • Ex. (Network1.output[1] + Network2.output[1])/2 = Ensemble.output[1]
  • Backpropagation은 일반적인 경로처럼 동작하지만, connection이 끊어진 노드는 weight parameter update가 수행되지 않음
    • Forward pass는 일반적인 경우처럼 수행
      • 미리 선택된 path에 대해서만 forward pass를 수행함
    • Backward pass에서는 drop된(connection 끊어진) 노드에 대한 weight parameter update가 수행되지 않음
views
  • Test 과정에선 모든 노드에 일반적인 경우와 동일하게 입력이 전파되어야 함
    • 단, test시엔 각 노드의 출력에 학습과정에서 삭제된 노드의 비율만큼을 곱해서 출력시켜야 한다고 하지만 실제로느 그렇지 않아도 잘 동작한다고 함

Hyperparameter optimization

  • 하이퍼파라미터는 네트워크 weight parameter 외부의 학습되지 않는 파라미터들을 의미함
  • 학습 과정 중 특정 하이퍼파라미터들을 사용하는 모델의 성능 평가에 test dataset을 사용하는 경우 하이퍼파라미터 값들이 매 test 결과로 오버피팅 됨
    • 즉, 학습과정 중 생성되는 모델의 중간 성능을 검증하고자 할 때 쓰이는게 validation set, 최종성능을 검증하고자 할 때 쓰이는게 test set
    • 이를 위해 test에서 사용되지 않는 validation dataset이 필요함
  • 하이퍼파라미터 최적화는 대략적인 범위를 설정하고, 그 범위에서 무작위로 값을 선택해 정확도를 평가한 후 좋은 정확도를 내는 곳으로 범위를 축소하는 방식을 반복함
  • 어느 정도 범위가 좁아지면 그 범위 내에서 값을 하나 골라냄
    • Grid search같은 규칙적 탐색보다는 무작위로 샘플링해 탐색하는것이 더 좋은 결과를 낸다고 함
  • 범위는 보통 10의 거듭제곱 단위로 지정됨
    • log scale
  • 딥러닝 모델의 학습에는 시간이 많이 소요되므로 학습을 위한 epoch를 작게 해 1회 validation에 걸리는 시간을 단축하는것이 효과적

Data augmentation

  • 학습용 데이터셋의 개수가 부족할 때, 각 영상을 Rotate/Flip/Crop/Shift/Partial masking/HIS distortion 등을 적용해 데이터셋을 확장시키는 방법
  • 간편하지만 효과가 매우 좋음

자율주행차 만들기

|

자율 주행 자동차 만들기

  • 리우 샤오샨, 리 리윤, 탕 지에, 우 슈앙, 장 뤽 고디오 지음
  • 남기혁, 김은도, 서영빈 옮김 (에이콘)

1. 자율 주행 개요

자율 주행 알고리즘

센싱

  • GPS와 IMU(Inertial measurement unit)
    • 자율 주행차의 위치 파악을 위해 필요함
    • 관성정보 및 지리적 위치에 대한 측정 값을 200Hz 이상의 빠른 주기로 알려줌
    • GPS는 로컬라이제이션 센서 중 상당히 정확하지만 업데이트 주기가 약 10Hz 수준으로 긴 편
    • 따라서 최신 위치 정보를 실시간 제공받을 수 없음
    • IMU는 시간 흐름에 따른 누적 오차로 인해 위치 추정 값의 정확도가 갈수록 떨어짐
    • 하지만 IMU는 주기가 200Hz 이상으로 굉장히 짧아 실시간성이 좋음
    • 따라서 GPS와 IMU를 조합하여 차량 위치에 대한 정확한 정보를 실시간으로 업데이트함
  • 라이다
    • 매핑, 로컬라이제이션, 장애물 회피등에 사용됨
    • 레이저 빛의 ToF를 측정해 거리를 측정하고 단색 3D 맵을 생성
    • 정확도가 높기 때문에 HD맵을 생성하고 이동중인 자동차 위치를 파악해 로컬라이제이션(추정)한 뒤, 전방의 장애물을 감지하는 작업에 주로 사용됨
      • 벨로다인 64빔 레이저는 10Hz 주기로 회전하며 측정값을 초당 130만번 읽음
  • 카메라
    • 차로, 신호등, 보행자 감지 등과 같이 객체 인지 및 추적 작업에 활용됨
    • 현재는 안전성을 높이기 위해 1080p 카메라를 8개 이상 사용함
    • 이를 토대로 전방, 후방, 좌우 객체를 감지하고 인지하고 추적함
    • 초당 약 1.8GB에 해당하는 원본 데이터를 생성함
  • 레이더와 소나
  • 장애물 회피를 위한 최후의 수단으로 사용됨
  • 차량 이동 경로 선상에서 가장 가까이 있는 대상까지의 거리와 속도 정보를 담고있음
  • 레이더와 소나에서 생성된 데이터는 가공을 잘 하지 않음
  • 또한 메인 연산 파이프라인을 거치지 않고 제어 장치로 곧바로 전달해 방향을 전환하거나 브레이크를 밟거나 안전벨트를 당기는 긴급한 동작 수행

    인지

  • 로컬라이제이션, 객체 감지, 객체 추적의 3단계로 구성
    로컬라이제이션
    • GPS/IMU를 활용해 현재 위치를 계산
    • GPS의 느린 주기와 높은 정확도, IMU의 빠른 주기와 큰 누적 오차의 장점들을 잘 융합하도록 칼만 필터 를 사용함
      • IMU는 5ms마다 차랑의 최신 위치 정보를 알려주지만 시간이 갈수록 오차가 누적됨
      • 이런 IMU의 오차를 100ms마다 GPS 정보로 보정함
    • GPS와 IMU를 조합한 장치로 전파 업데이트 모델을 구현함으로써 로컬라이제이션 결과를 빠르고 정확하게 계산
views
  • 하지만, GPS와 IMU만을 이용해 조합한 결과를 완전히 믿을 순 없음
    • 정확도는 1미터 범위에서만 보장됨
    • GPS신호는 다중 경로 문제를 갖고 있기 때문에 신호가 건물에 반사되며 노이즈가 증가
    • 하늘이 가려진 곳에서는 GPS신호를 정확히 수신 불가
  • 카메라를 이용해 비전 기반으로 로컬라이제이션 파이프라인을 구성하면 다음과 같음
    • 스테레오 이미지 쌍에 대한 삼각 측량으로 disparity map 만들기
      • 각 포인트의 깊이 정보를 추출하는데 활용됨
    • 연속적으로 들어오는 스테레오 이미지 프레임 사이에서 두드러진 특징을 찾아 각 각 특징점 사이의 상호 연관 관계 파악
    • 특징점과 기존에 파악한 맵을 비교하는 방식으로 차량의 현재 위치를 알아 낼 수 있음
    • 하지만 비전 기반의 위치 측정 기법은 조명 상태에 민감하기에 이 방법만으론 구현 불가
    • 파이프라인
      • 스테레오 이미지로 삼각측량->특징감지->특징매칭->동작예측->차량위치
        • 중간에 이전 시차 맵을 사용
  • 위와 같은 이유들로 인해 라이다 기반 시스템의 particle filter 기법을 주로 사용함
    • 라이다로 생성된 포인트 클라우드로 주변 환경에 대한 형태를 만들고
    • 파티클 필터를 이용해 관측된 형태를 기존에 파악된 맵과 비교하는 방식으로 불확실성을 줄임
      • 파티클 필터를 적용해 라이다 측정 값과 맵의 상호 연관성을 파악하는 방식으로 이동 중인 차량의 로컬라이제이션을 처리함
      • 파티클 필터 기법은 10cm 수준의 정확도로 로컬라이제이션을 실시간으로 처리 할 수 있으며 도시 환경에서 효과적임
    • 하지만 라이다 자체도 주변 대기 환경(비, 안개 등)에 민감하게 반응하므로 신뢰성을 높히기 위해 센서 퓨전 프로세스를 적용함
  • 센서 퓨전은 각 센서가 갖는 장점 특성을 융합해 취합하는 프로세스
views
객체 인지 및 추적
  • 주로 라이다나 CNN 기반의 영상처리를 이용해 객체 인지 작업 수행
    • 영상 속에 어떤 객체가 어느 크기로 어느 위치에 존재하는지를 찾는 작업
  • 객체 추적이란 원하는 객체를 선택해서 해당 객체의 이동 궤적을 자동으로 추정하는 기법
    • 주변의 자동차나 보행자 등을 추적하는데 이 기법을 적용해 충돌 방지에 활용함
동작
  • 차량의 주변 환경을 파악했다면 의사결정 단계에서 안전하고 효율적인 동작 계획을 실시간으로 생성
  • 동작 예측
    • 안전한 운행을 위해선 동작 예측이 필수임
    • 다른 차량의 도달 가능한 지점에 대한 확률 모델을 만들고, 도달 가능한 지점에 대한 확률 분포를 구하는 기법이 있음
  • 경로 계획
    • 일반적으로 가능한 모든 경로를 탐색하고 비용함수로 최적의 경로를 선택하면 된다고 생각하지만, 이는 엄청난 연산량이 필요하며 실시간 처리가 불가
    • 이처럼 결정적인 알고리즘을 적용할 때엔 계산 복잡도를 줄여 실시간 처리를 위해 확률 기반의 기법을 주로 사용함
  • 장애물 회피
    • 물체와 부딪히지 않도록 장애물 회피 메커니즘을 두 단계 이상으로 구성함
    • 첫 번째는 등동형 메커니즘으로, 교통 예측을 기반으로 처리
      • 차량이 주행하는 동안 교통 예측을 통해 충돌까지 남은 시간이나 최소 거리에 대한 추정치 등을 계산하며, 이 정보를 토대로 장애물 회피 메커니즘이 작동해 주변 경로를 다시 계획
    • 두 번째는 레이더 데이터 기반의 수동형(반응형) 메커니즘으로, 경로 상의 물체가 감지되면 주행 제어 시스템에 개입해 장애물을 피하도록 조작

자율 주행 클라이언트 시스템

  • 실시간 및 신뢰성 요구사항을 만족하도록 앞의 알고리즘을 통합함
    • 데이터량이 많으므로 방대한 양의 데이터가 충분히 처리 가능할 정도의 프로세싱 파이프라인이 빨라야 하고
    • 한 부분에서 오류가 발생하더라도 복구 가능할 정도로 견고해야 함
    • 이 연산을 처리함에 있어 에너지 및 리소스 제약사항도 만족해야 함

ROS

  • 각 작업을 수행하는 노드를 만들고, 이를 연결하여 전체 시스템을 구성
    • 각 노드는 토픽, 서비스를 통해 서로 통신함
  • 문제점
    • 신뢰성: 마스터는 하나만 존재하고 장애가 발생한 노드를 복구하기 위한 모니터가 없음
    • 성능: 메시지를 브로드캐스트 방식으로 보내는 과정에서 같은 메시지가 여러 번 중복되어 성능저하 유발
    • 보안: 인증과 암호화 메커니즘이 없음 (ROS2.0에서 보완)
  • 신뢰성
    • 마스터 노드가 하나기때문에 마스터 노드가 죽으면 전체 시스템이 죽음
      • 이를 해결하기 위해 백업 마스터 노드를 설정
      • 메인 노드가 죽으면 백업 노드가 이어받아 시스템이 그대로 구동되게 함
      • 또한 주키퍼 메커니즘을 통해 모니터링하다가 장애가 발생한 노드 발견 시 이를 재구동해 전체 ROS 시스템의 신뢰성을 보장
  • 성능
    • 공유 메모리 메커니즘을 적용해 메시지가 TCP/IP 스택을 거치지 않고 목적지 노드로 곧바로 가도록 처리
    • ROS 노드가 메시지를 브로드캐스팅하는 과정에서 여러 개의 복사본을 만들어 느려짐
      • 멀티캐스트 메커니즘으로 대체하여 시스템 처리량을 향상시켜 보완 가능
  • 보안
    • 해커가 ROS 노드에 침투해 메모리를 끊임없이 할당시켜 전체 메모리를 고갈시켜 시스템을 뻗게 할 수 있음
      • 리눅스 컨테이너를 사용해 각 노드마다 허용된 리소스 양을 제한하는 방식으로 해결 가능
    • ROS 노드끼리 주고받는 메시지를 중간에 가로채는 중간자 공격에 취약
      • 통신 과정에서 메시지를 암호화 시켜서 해결 가능

하드웨어 플랫폼

  • 책 저자는 ARM SoC를 이용해 최대 전력소비량이 15W에 불과한 시스템을 이용함
    • 25FPS로 로컬라이제이션 수행 가능
    • 3FPS로 객체탐지
    • 6ms로 계획 및 제어 파이프라인 구동
    • 시스템을 차량에 장착해 로컬라이제이션 과정에 손실 없이 시속 8km/h로 구동

2. 자율 주행을 위한 로컬라이제이션

  • 자율 주행 자동차에서 가장 핵심적인 테스크는 자동차의 위치를 실시간으로 정확하게 알아내는 로컬라이제이션임

GNSS를 이용한 로컬라이제이션

GNSS 오차 분석

  • 사람이 운전할 땐 주로 위성 항법 시스템(GNSS, Global Navigation Satellite System)을 사용해 로컬라이제이션함
  • 자율주행 차량도 GNSS를 이용
  • GNSS에는 GPS, GLONASS, Galileo, BeiDou 등이 존재함
  • GNSS의 오차요소는 아래와 같음
    • 위성 시계 오차: 위성 내부 원자 시계의 오차, 작은오차로도 영향력이 큼
    • 궤도 오차: 위성이 움직이면서 궤도 내에서 발생하는 오차 (최대 2.5m 까지 발생)
    • 이온층 지연: 대기 중 이온층 내부의 이온의 영향으로 위성 신호가 지연되는 현상 (태양의 활동이나 계절 등에 따라 달라짐)
    • 대류층 지연: 대류층의 온도, 습도, 대기압에 따른 지연 현상
    • 다중 경로 오차: 빌딩 벽과 같이 물체에 반사된 GNSS 신호를 안테나가 수신할 경우 발생하는 현상

위성 기반 오차 보정 시스템

  • 자세한 내용 책 참조

HD 맵과 라이다를 이용한 로컬라이제이션

  • 웨이모, 바이두, BMW 등 사용 자율주행 자동차 시제품은 대부분 라이다와 HD맵을 통해 로컬라이제이션을 수행함
라이다 개요
  • 펄스 레이저를 쏘아 반사된 펄스를 센서로 측정하는 방식으로 ToF를 계산해 물체와의 거리를 측정함
    • 빛은 항상 같은 속도로 움직이기때문에 정확하고 정밀한 3D 지도를 만들 수 있음
  • 라이다에는 간섭성 탐지 방식과 비간섭성 탐지 방식(에너지 탐지 방식)이 있음
  • 간섭성은 도플러 주파수나 위상 변화를 측정하는데 적합
    • 낮은 전력을 소모하지만, 복잡한 송수신 장치가 필요
    • 전자기 스펙트럼 안에서 광학적인 부분이나 주변에만 에너지파를 생성하도록 특화된 다이오드를 사용하기때문에 전력 소모량이 적음
  • 비간섭성은 빛을 발사하면 모든 방향으로 버져나가는 특성을 이용
    • 넓은 범위에 빛을 방사하므로 전력 소모량이 비교적 큼
  • 간섭성과 비간섭성 모두 고에너지 시스템과 마이크로펄스 시스템으로 구분됨
    • 고에너지 시스템은 사람의 눈에 해로운 수준의 빛을 사용함
    • 마이크로펄스 시스템은 안전한 저전력의 빛을 사용
      • 수신부는 고체 가이거 모드 애벌랜츠 포토 다이오드 검출기에서 광자를 세는 방식으로 작동
  • 대부분 자율주행 시스템에선 안전한 간섭성 마이크로펄스 시스템 모델을 사용
  • 주로 600~1,000nm 파장 레이저 사용하며, 1,550nm 파장의 레이저는 낮은 정확성으로 먼 거리의 목표물을 측정할 때 사용됨
    • 1,550nm 레이저는 야간투시경으로 볼 수 없기때문에 군사용으로도 사용 가능
    • 또한 비나 안개 등의 상황에 조금 더 강건해짐
HD맵 개요
  • 자율주행을 위해선 센티미터급의 정밀 지도가 필요(HD급)
  • 도로의 변화가 반영되도록 지도의 업데이트가 수행되어야 함
  • 다른 모듈과 매끄럽게 연동되어야 함
  • HD맵 제작의 핵심 기술은 다음과 같음
    • 주변 환경의 세밀한 지도를 만들어서 GNSS/INS 항법을 보완
    • 자동차의 라이다 센서로 HD맵 기준의 자동차 위치를 알아냄
    • 즉, GNSS/INS/LiDAR를 이용한 센서 퓨전으로 완성됨
  • 우선, GNS/INS로 대략적인 위치 정보를 생성하고
  • 라이다를 이용해 2D 위치를 좀 더 정밀하게 측정
    • 외에도 카메라 등의 다양한 센서 융합/사용
  • 라이다 스캔으로 수집한 데이터는 주변 환경에 대한 로컬 지도처럼 사용 가능함
  • 좀 더 넓은 영역의 지도를 생성하기 위해 맵 매칭 과정을 통해 로컬 지도를 하나의 글로벌 지도로 만들어야 함
    • 맵 매칭은 로컬 라이다 스캔 데이터를 서로 비교해 데이터가 겹치는 영역을 찾아서 해당 영역을 로컬 지도를 엮는 연결고리로 활용함
라이다와 HD맵을 이용한 로컬라이제이션
  • 일반적으로 로컬라이제이션 과정에 파티클 필터를 적용
    • 거리 데이터를 분석해 자동차 아래의 지평면을 추출하고
    • 이와 측정한 적외선 반사 지도 정보에 대한 상관함수를 피어슨 적률 상관함수를 통해 계산
    • 각 파티클은 시간에 대한 속도를 투영한 값을 가짐
    • 현재 속도는 휠 오도메트리, INS, GNSS를 사용하는 tightly coupled 관성 항법 시스템을 통해 추정함
  • 파티클 필터 이전에는 주로 칼만 필터를 사용해 state space model을 풀었음
    • 칼만 필터는 선형 가우시안 상태 공간 모델에 대한 최적해를 구하는 필터
    • 선형성 또는 가우시안 조건을 만족하지 않는 환경이라면 확장 칼만 필터나 무향 칼만 필터를 적용
  • 파티클 필터는관측 할 수 있는 시점부터 실시간으로 동작해 잠재 프로세스에 대한 주변 분포의 근사치를 구함
    • 중요도 샘플링 과정을 통해 파티클이라 부르는 이산 값과 그 값에 대한 비중의 집합으로 각 시점마다 분포의 근사치를 구함
  • 파티클 필터는 HD맵의 로컬라이제이션 과정에서 실시간으로 적용됨
  • 자세한 내용은 책 참조 (p.64)
비주얼 오도메트리 (p.68)
  • 하나 이상의 카메라에서 입력된 데이터만으로 자동차의 움직임을 추정하는 과정
    • 현재 이미지와 이전 이미지 사이의 상대적인 변화를 구하고, 이를 통해 자동차의 궤적을 구함
    • 비주얼 오도메트리로 자세가 변할 때마다 경로를 점진적으로 복원함
  • 비주얼 오도메트리의 진행과정 (새로 들어온 이미지마다 모두 수행)
    • 특징점 추출
    • 추출된 특징점과 일치하는 부분이 이전 프레임에 존재하는지 검사
      • 여기서 각기 다른 프레임에서 공통되는 3차원 특징을 2D 특징으로 재투영하는것을 이미지 대응이라고 함
    • 모션 추정
      • 현재 사진과 이전 사진 두 시간 사이 상대적인 움직임을 계산하고, 이를 이용해 이전 자세를 결합해 현재 자동차의 자세를 구함
    • 최신 프레임(현재 프레임)에 대해 번들 조정을 수행해 로컬 궤적 추정치의 정확도를 높힘
      • 번들 조정: 좀 더 정확한 로컬 궤적의 추정치를 구하기 위해 최근 자세 x에 대한 교정 작업을 반복하며, 최근 m개의 이미지에 대해 재구성한 3D 지점들의 재투영 오차의 제곱합을 최소화 하는 방식으로 진행
스테레오 비주얼 오도메트리
  • 관성 센서는 한쪽으로 흐르는 드리프트 현상이 발생하기 쉽고
  • 휠 오도메트리는 울퉁불퉁한 오프로드 지형에서는 측정 값이 불안정함
  • 실시간 로컬라이제이션에 스테레오 비주얼 오도메트리를 주로 사용함
    • 연속적으로 들어오는 스테레오 이미지 쌍으로부터 프레임 단위로 카메라의 움직임을 추정하는 방식으로 작동
    • Disparity image를 기반으로 추정
    • 오차가 적고(4,000프레임 동안 1m) 연산속도가 빠름(20ms)
  • 스테레오 비주얼 오도메트리 작동 방법
    • 코너 특징 탐지 방식으로 각 프레임마다 특징을 검출
    • 로컬 윈도에 대한 절대 합을 통해 프레임 사이의 특징을 매칭
    • 일관된 매칭 집합 중 가장 큰 것을 찾음(인라이어 검출)
    • 인라이어 집합에 있는 특징에 대한 재투영 오차를 최소화하는 프레임 사이의 움직임을 찾음
모노큘러 비주얼 오도메트리
  • 자세한 내용 책 참조(p.71)
관성 비주얼 오도메트리
  • 자세한 내용 책 참조(p.72)