[Computer Vision] 머신러닝 & OpenCV #2 SVM, HOG

2023. 10. 11. 00:08Run/Computer Vision

머신러닝 & OpenCV #1 머신러닝 개요, KNN (https://coollikethat.tistory.com/53) 과 이어지는 내용입니다.

 

4. SVM (Support Vector Machine)

  • 2개의 클래스로 구성도니 데이터를 가장 여유있게 분리하는 초평면(hyperplane) 찾는 머신러닝 알고리즘
  • 초평면: 2개의 클래스의 데이터를 분리하는 N차원 공간상의 평면 (ex. 2차원 공간상 분리 → 직선, 3차원 공간상 분리 → 평면)
  • 지도학습의 일종, 분류 회귀에 사용

 

  • (a): 두 직선 모두 점을 잘 분리하나 조금만 이동하면 분리에 실패할 수 있음 (입력 점 데이터에 너무 가깝기 때문)
  • (b): margin(초평면과 가장 가까운 점과의 거리)를 최대로 하는 초평면

 

SVM 커널

  • SVM 알고리즘은 기본적으로 선형으로 분리 가능한 데이터에 적용, but 실생활 데이터는 선형으로 분리되지 않는 경우 많음
  • 이 경우 kernel trick(커널 함수 통해 차원을 늘려서 어떻게든 선형으로 분리할 수 있도록 함) 기법 사용
  • 선형(linear): 아주 단순한 문제인 경우 사용
  • 방사 기저 함수(radial basis function): 가장 널리 사용하는 커널 (γ 인자 값 적절히 설정해야 함)

 

  • OpenCV SVM 클래스 사용하기
    • ml 모듈에 포함되어 있고 cv::ml 네임스페이스에 정의되어 있음
    • 오픈소스 라이브러리 LIBSVM 기반으로 만들어짐
    • SVM::create(): 정적 멤버 함수 사용하여 SVM 객체 생성
    • SVM::setType(int val): 타입 변경 (default SVM::Types::C_SVC)
    • SVM::Types::C_SVC
      • n개 클래스 분류 문제에서 사용
      • 이 타입 사용하는 경우 SVM 알고리즘 내부에서 사용하는 C 파라미터 값 적절히 설정해야 함 (auto 가능)
      • C 값 작은 경우: 훈련 데이터 중 잘못 분류되는 데이터 있어도 최대 margin 선택
      • C 값 큰 경우: margin 작아지더라도 잘못 분류되는 데이터 적어지도록 분류
      • 훈련 데이터에 잡음 등 많은 경우 C 값 크게 설정하는 게 좋음 (but, 데이터마다 다 다름)
    • SVM::setKernel(int kernelType)
      • SVM 알고리즘에서 사용한 커널 함수 지정
      • default SVM::KernelTypes::RBF
    • SVM 알고리즘 타입, 커널 함수 종류 설정한 후에는 각각의 파라미터 설정해야 함
      • C, Nu, P, Degree, Gamma, Coef0 → 1, 0, 0, 0, 1, 0으로 초기화 됨
      • set, get 함수 통해 값 설정하거나 읽어올 수 있음
      • ex. C_SVC 타입 사용하고 RBF 커널 사용하는 경우, setC(), setGamma() 통해 적절한 파라미터 값 설정
    • StatModel::train(): 객체 생성하고 속성 설정한 후 학습 진행
      • 적절한 파라미터 설정하는 것이 중요
      • SVM::trainAuto(): 가장 성능 좋은 파라미터 자동으로 찾아 학습

 

SVM::Types
SVM::KernelTypes
SVM::trainAuto()

 

✅ 2차원 평면에서 2개의 클래스로 구성된 점 분류

(추후 추가 예정)

 

5. HOG (Histogram of Oriented Gradient) & SVM

  • HOG: 입력 영상을 일정 크기의 셀(cell)로 나누고, 2x2 셀을 합쳐 하나의 블록(block)으로 설정

 

  • digits.png
    • 영상 하나의 크기 = 20x20
    •  하나의 크기 = 5x5 → 블록 하나의 크기 = 10x10
    •  하나에서 25(5x5)개의 gradient orient가 구해지고, 이를 histogram으로 표현한 HOG는 9개의 빈(bin)으로 구성됨
    • 블록 하나에서는 9 bins x 4 cells = 36개의 으로 구성된 histogram 정보가 추출됨
    • 블록은 보통 하나의 셀 단위로 이동하므로, 가로로 3개, 세로로 3개 (총 9개) 만들 수 있음
    • 영상 하나에서 만들어지는 HOG feature vector의 차원 크기는 36x9 = 324 (20x20 영상에서 1x324 feature vector 행렬 생성)
    • 이를 세로로 쌓으면 5000x324 크기의 HOG feature vector 행렬이 생성되고, 이를 SVM 클래스의 훈련 데이터로 전달

 

HOG & SVM 예제

 

맞춤형 HOG 객체 생성하기 위한 생성자

  • HOGDescriptor 클래스 이용하여 객체 생성하고 영상에서 HOG feature vector(descriptor) 추출
  • HOGDescriptor 클래스 기본 생성자 사용하면 보행자 검출 설정 기반으로 객체 생성됨 → 맞춤형 HOG 객체 생성하기 위해 다른 생성자 사용
  • 대부분 default 값 설정되어 있어 _winSize, _blockSize, _blockStride, _cellSize, _nbins만 지정하여 사용 가능
  • digits.png 사용하여 HOG feature vector 추출하려는 경우:
    • HOGDescriptor hog(Size(20, 20), Size(10, 10), Size(5, 5), Size(5, 5), 9);

 

  • HOGDescriptor::compute(): 객체 생성한 후 멤버 함수 사용하여 HOG feature vector(descriptor) 계산

 

✅ HOG & SVM 필기체 숫자 인식

(추후 추가 예정)