주어진 데이터를 분석하여 규칙성, 패턴 등을 찾고 이를 이용하여 의미있는 정보를 추출하는 과정
train : 훈련 데이터를 이용하여 모델을 학습하는 과정
predict : 학습된 모델을 이용하여 새로운 데이터로부터 적절한 값을 예측하는 과정
새로운 데이터를 더 정확하게 예측하기 위함
모델의 일반화 성능을 향상시키는 방향으로 학습해야 함
훈련 데이터셋을 지나치게 정확하게 구분하도록 학습하여 모델의 일반화 성능이 떨어지게 되는 현상
cv::ml::StatModel
train
predict
cv::ml::ANN_MLP
cv::ml::DTrees
cv::ml::EM
cv::ml::KNearest
cv::ml::LogisticRegression
cv::ml::NormalBayesClassifier
cv::ml::SVM
cv::ml::SVMSDG
samples : 훈련 데이터 행렬
layout : 훈련 데이터 배치 방법
ROW_SAMPLE | 하나의 데이터가 한 행으로 구성 |
COL_SAMPLE | 하나의 데이터가 한 열로 구성 |
responses : 각 훈련 데이터에 대응되는 응답 행렬
return : 훈련이 잘 되었으면 true
virtual bool StatModel::train(InputArray samples,
int layout,
InputArray responses);
samples : 입력 벡터가 행 단위로 저장된 행렬
results : 각 입력 샘플에 대한 예측 결과를 저장한 행렬
flags : 추가적인 플래그 상수
return : 입력 벡터가 하나인 경우에 대한 응답
virtual float StatModel::predict(InputArray samples,
OutputArray results = noArray(),
int flags = 0) const;
기본적으로 두 개의 그룹(데이터)을 분리하는 방법으로 데이터들과 거리가 가장 먼 초평면(hyperplane)을 선택하여 분리하는 방법(maximum margin classifier)
초평면 :
마진()을 최대로 만드는 구하기
주어진 샘플을 완벽하게 두 개의 그룹으로 선형 분리할 수 없을 경우 오분류 에러를 허용(Soft margin, C-SVM)
오분류 에러 마진
오분류 에러 마진
SVM은 선형 분류 알고리즘이지만 실제 데이터는 비선형 분포 가능
비선형 데이터의 차원을 확장하면 선형으로 분리 가능
매핑 함수(mapping function)
매핑 함수를 직접 사용하는 대신 SVM 초평면 계산에서 사용되는 벡터 내적 연산을 대체하는 비선형 커널 함수(kernel function)를 정의하여 사용
SVM 객체 생성
StatModel::train() 메소드를 이용하여 훈련을 해서 사용해야 함
static Ptr<SVM> SVM::create();
val : SVM::Types 열거형 상수 중 하나를 지정
열거형 상수 | 설명 | 파라미터 |
---|---|---|
C_SVC | C-서포트 벡터 분류 | C |
NU_SVC | v-서포트 벡터 분류 | Nu |
ONE_CLASS | 1-분류 서포트 벡터 머신 | C, Nu |
EPS_SVR | -서포트 벡터 회귀 | P, C |
NU_SVR | v-서포트 벡터 회귀 | Nu, C |
virtual void SVM::setType(int val);
kernelType : 커널 함수 종류
열거형 상수 | 설명 | 파라미터 |
---|---|---|
LINEAR | 선형 커널 | |
POLY | 다항식 커널 | Degree, Gamma, Coef0 |
RBF | 방사 기저 함수 커널 | Gamma |
SIGMOID | 시그모이드 커널 | Gamma, Coef0 |
CHI2 | 지수 카이 제곱 커널 | Gamma |
INTER | 히스토그램 교차 커널 |
virtual void SVM::setKernel(int kernelType);
k-폴드 교차 검증을 통해 최선의 파라미터를 찾아 훈련
virtual bool SVM::trainAuto(InputArray samples,
int layout,
InputArray responses,
int kFold = 10,
Ptr<ParamGrid> Cgrid = SVM::getDefaultGridPtr(SVM::C),
Ptr<ParamGrid> gammaGrid = SVM::getDefaultGridPtr(SVM::GAMMA),
Ptr<ParamGrid> pgrid = SVM::getDefaultGridPtr(SVM::P),
Ptr<ParamGrid> nugrid = SVM::getDefaultGridPtr(SVM::NU),
Ptr<ParamGrid> coeffgrid = SVM::getDefaultGridPtr(SVM::COEF),
Ptr<ParamGrid> degreegrid = SVM::getDefaultGridPtr(SVM::DEGREE),
bool balanced = false)
Histogram of Oriented Gradients
영상의 지역적 그래디언트 방향 정보를 특징 벡터로 사용
2005년 CVPR 학회에서 보행자 검출 방법으로 소개되어 널리 사용되기 시작함
이후 다양한 객체 인식에서 활용됨
Original Image : 720x475
입력 영상을 스캔하면서 부분 영상을 추출
크기 정규화 64x128
64x128 영상 패치를 8x8 크기의 셀로 나누고 각 셀에서 그래디언트 계산
각 셀에서 그래디언트 방향과 크기 정보를 이용하여 9개의 방향 성분에 대한 히스토그램을 구함
블록 히스토그램 구하기
8x8 셀 4개를 하나의 블록을 지정
블록 하나의 크기는 16x16
각 블록의 히스토그램 빈 개수는 4x9=36개
특징 벡터의 차원
하나의 부분 영상 패치에서의 특징 벡터 크기
7x15x36=3780
필기체 인식
다수의 필기체 숫자 데이터가 필요
C:\opencv-4.5.5\sources\samples\data
20x20 숫자 영상이 가로 100개 세로 50개
20x20 크기의 영상 5000개
5x5 셀 4개를 하나의 블록으로 지정
블록 하나의 크기는 10x10
10x10 블록 HOG 기술자 (4-1)x(4-1)x(9x4)=324차원
1x324 크기의 벡터 5000개
전체 벡터를 하나의 행렬로 묶어서 표현
5000x324 크기의 행렬 1개
SVM 알고리즘
훈련 데이터 영상과 테스트 데이터 영상의 위치, 크기, 회전 등의 요소를 정규화하여 인식 성능을 향상시킬 수 있음
norm_digit 추가