머신러닝과 필기체 숫자 인식

BERT·2023년 5월 2일
0

Computer Vision

목록 보기
50/56

머신러닝

주어진 데이터를 분석하여 규칙성, 패턴 등을 찾고 이를 이용하여 의미있는 정보를 추출하는 과정

머신러닝 단계

train : 훈련 데이터를 이용하여 모델을 학습하는 과정
predict : 학습된 모델을 이용하여 새로운 데이터로부터 적절한 값을 예측하는 과정

머신러닝 학습의 목적

새로운 데이터를 더 정확하게 예측하기 위함
\rarr 모델의 일반화 성능을 향상시키는 방향으로 학습해야 함

Overfitting

훈련 데이터셋을 지나치게 정확하게 구분하도록 학습하여 모델의 일반화 성능이 떨어지게 되는 현상

  • 훈련 데이터셋 문제
    훈련 데이터 셋이 너무 적은 경우
    훈련 데이터 셋이 전체 데이터셋의 특성/분포를 반영하지 않는 경우
  • 모델 문제
    모델이 복잡할수록 과적합 발생 확률이 높음

머신러닝 학습

  • 훈련 데이터의 분할
    학습 가능한 데이터를 훈련, 검증, 테스트 데이터 셋으로 분할하여 사용
  • k-폴드 교차 검증
    훈련 데이터를 k개로 분할하여 여러 번 검증 수행

OpenCV 머신러닝 클래스

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;

SVM

Support Vector Machine

기본적으로 두 개의 그룹(데이터)을 분리하는 방법으로 데이터들과 거리가 가장 먼 초평면(hyperplane)을 선택하여 분리하는 방법(maximum margin classifier)

최대 마진 초평면 구하기

초평면 : wx+b=0w \cdot x + b=0
마진(2w\displaystyle\frac{2}{\|w\|})을 최대로 만드는 ww 구하기

maxw2wminw12w12w2\displaystyle\max_{w}\frac{2}{\|w\|}\rarr\min_{w}\frac{1}{2}\|w\|\rarr\frac{1}{2}\|w\|^2

오분류 에러 허용하기

주어진 샘플을 완벽하게 두 개의 그룹으로 선형 분리할 수 없을 경우 오분류 에러를 허용(Soft margin, C-SVM)
12w212w2+Ci=1Nξi\displaystyle\frac{1}{2}\|w\|^2\rarr\frac{1}{2}\|w\|^2+C\sum_{i=1}^N\xi_i
CC \uarr 오분류 에러 \darr 마진 \darr
CC \darr 오분류 에러 \uarr 마진 \uarr

비선형 데이터 분리하기

SVM은 선형 분류 알고리즘이지만 실제 데이터는 비선형 분포 가능
비선형 데이터의 차원을 확장하면 선형으로 분리 가능
매핑 함수(mapping function) Φ(x)=xd\Phi(x)=x_d

kernel trick

매핑 함수를 직접 사용하는 대신 SVM 초평면 계산에서 사용되는 벡터 내적 연산을 대체하는 비선형 커널 함수(kernel function)를 정의하여 사용

주요 커널 함수

  • Polynomial : K(xi,xj)=(xixj+1)dK(x_i,x_j)=(x_i \cdot x_j + 1)^d
    d : 변경할 차원 수
  • Radial basis function : K(xi,xj)=exp(γxixj2)K(x_i,x_j)=exp(-\gamma\|x_i-x_j\|^2)
    γ\gamma \uarr 학습 데이터에 크게 의존적 : overfitting
    γ\gamma \darr 학습 데이터 분포를 대략적으로 표현 : underfitting

SVM 객체 생성

SVM 객체 생성
StatModel::train() 메소드를 이용하여 훈련을 해서 사용해야 함

static Ptr<SVM> SVM::create();

SVM 타입 지정

val : SVM::Types 열거형 상수 중 하나를 지정

열거형 상수설명파라미터
C_SVCC-서포트 벡터 분류C
NU_SVCv-서포트 벡터 분류Nu
ONE_CLASS1-분류 서포트 벡터 머신C, Nu
EPS_SVRϵ\epsilon-서포트 벡터 회귀P, C
NU_SVRv-서포트 벡터 회귀Nu, C
virtual void SVM::setType(int val);

SVM 커널 지정

kernelType : 커널 함수 종류

열거형 상수설명파라미터
LINEAR선형 커널
POLY다항식 커널Degree, Gamma, Coef0
RBF방사 기저 함수 커널Gamma
SIGMOID시그모이드 커널Gamma, Coef0
CHI2지수 카이 제곱 커널Gamma
INTER히스토그램 교차 커널
virtual void SVM::setKernel(int kernelType);

SVM 자동 훈련

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)

RBF

LINEAR

HOG 알고리즘

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개

HOG 특징 벡터를 이용한 SVM 학습

20x20 크기의 영상 5000개
5x5 셀 4개를 하나의 블록으로 지정
블록 하나의 크기는 10x10
10x10 블록 HOG 기술자 (4-1)x(4-1)x(9x4)=324차원
1x324 크기의 벡터 5000개
전체 벡터를 하나의 행렬로 묶어서 표현
5000x324 크기의 행렬 1개
SVM 알고리즘

숫자 영상 정규화

훈련 데이터 영상과 테스트 데이터 영상의 위치, 크기, 회전 등의 요소를 정규화하여 인식 성능을 향상시킬 수 있음

norm_digit 추가

0개의 댓글