[Computer Vision] 머신러닝 & OpenCV #2 SVM, HOG
2023. 10. 11. 00:08ㆍRun/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 알고리즘은 기본적으로 선형으로 분리 가능한 데이터에 적용, 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(): 가장 성능 좋은 파라미터 자동으로 찾아 학습
✅ 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 클래스의 훈련 데이터로 전달
- 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 필기체 숫자 인식
(추후 추가 예정)
'Run > Computer Vision' 카테고리의 다른 글
[Computer Vision] 딥러닝 & OpenCV (0) | 2023.10.11 |
---|---|
[Computer Vision] 머신러닝 & OpenCV #1 머신러닝 개요, KNN (0) | 2023.10.11 |
[Computer Vision] 영상 밝기와 명암비 조절 & 필터링 (0) | 2023.10.11 |
[Computer Vision] OpenCV 주요 기능 (0) | 2023.10.11 |
[Computer Vision] Mat 클래스 (0) | 2023.10.11 |