11-5. SVM 알고리즘
서포트 벡터 머신(Support Vector Machine) 알고리즘
두 개의 그룹(데이터)을 분리하는 방법으로 데이터들과 거리가 가장 먼 초평면(hyperplane)을 선택하여 분리하는 방법(maximum margine classifier)
초평면 방정식에서 마진 방정식을 최대로 만드는 w를 구하는 계산을 사용한다. 이 때 constraints, Lagrange multiplier, KKT conditions 등을 사용하며 결과적으로 주어진 데이터를 분할하는 최적의 해가 답이 된다. (세부적인 내용은 추가 검색 필요)
주어진 샘플을 완벽하게 두 개의 그룹으로 선형 분리할 수 없는 경우, 오분류 에러(Soft margine, C-SVM)을 허용하며, 이 때 C값은 사용자가 설정하는 파라미터로 C값이 커지면 오분류 에러는 작아지지만 마진이 커지며 반대는 반대의 결과를 만든다.

비선형 데이터 분류하기
비선형으로 분포한 데이터를 선형 분류 알고리즘인 SVM 알고리즘으로 분리할 경우 두 가지 방법이 있다.
1. 매핑 함수(mapping function): 비선형 데이터의 차원을 확장하여 선형으로 분리

2. 커널 트릭(Kernel Trick): SVM 초평면 계산에서 사용되는 벡터 내적 연산을 대체하는 비선형 커널 함수(kernel function)을 정의하여 사용. 주요 커널 함수 종류로는 다항식 커널 함수(Polynomial Kernel function)과 방사 기저 함수(Radial Basis function)이 있다.

11-6. OpenCV SVM 사용하기
OpenCV SVM
SVM 객체 생성하기: cv2.ml.SVM_create() -> <cv2.ml_SVM object>
SVM 타입 지정하기: <cv2.ml_SVM object>.setType(type) -> None
type는 SVM 종류를 지정하며 cv2.ml.SVM_으로 시작하는 상수이다. (링크)
type에 따라 필요한 파라미터를 설정해주어야 한다. <cv2.ml_SVM object>.set-Param_name(value) 함수를 사용한다.

SVM 커널 지정하기: <cv2.ml_SVM object>.setKernel(kernelType) -> None
kernelType은 커널 함수 종류를 지정하며 cv2.ml.SVM_으로 시작하는 상수이다. (링크)
kernelType에 따라 필요한 파라미터를 지정해주어야 한다.

SVM 자동 학습 시키기(k-폴드 교차 검증 방식 사용): <cv2.ml_SVM object>.trainAuto(samples, layout, responses, kFold, ...) -> retval
samples는 (N,d) 크기와 np.float32 데이터 형식을 갖는 np.ndarray 형태의 학습 데이터 행렬
layout는 학습 데이터 배치 방법으로 cv2.ROW_SAMPLE 또는 cv2.COL_SAMPLE 중 하나 선택
responses는 (N,) 크기와 np.int32 데이터 형식을 갖는 np.ndarray 형태의 각 학습 데이터에 대응하는 응답(레이블) 벡터
kFold는 교차 검증을 위한 부분 집합 개수
retval는 학습이 정상적으로 완료되면 true를 반환
*파라미터를 설정할 경우 trainAuto가 아닌 train 함수를 사용한다.
학습이 완료되면 <cv2.ml_SVM object>도 <cv2.ml_StatModel>을 상속 받은 클래스이기 때문에 predict 함수를 사용하여 제공되는 데이터에 대한 분류/회귀 값을 예측

11-7. HOG & SVM 필기체 숫자 인식
HOG와 SVM을 사용한 필기체 숫자 인식
kNN 예제 때와 마찬가지로 사람이 쓴 글씨체의 숫자를 자동 인식
SVM을 트레이닝할 데이터는 kNN 트레이닝으로 쓰였던 자료와 동일하다. (링크)
1. 20x20 크기 숫자 영상을 5x5 셀 크기로 나누어 네 개의 셀로 구성된 10x10 블록을 구성하여 HOG 기술자 벡터 생성
2. HOG 기술자 벡터도 한 행으로 펼치기
3. 한 행으로 펼쳐진 모든 벡터를 하나로 묶기
4. SVM 알고리즘에 training 데이터로 제공 (SVM_C_SVC 타입, 방사 기저 함수 커널 종류로 테스트 -> <cv2.ml_SVM object>.save(filename)을 사용하면 트레이닝 한 SVM알고리즘을 저장하여 cv2.ml.SVM_load(filename)으로 다시 불러올수 있다.)
5. 검은색 배경에 마우스로 숫자를 쓸 영상 공간 제공
6. 특정 키 입력을 받으면 영상을 20x20으로 정규화 후 한 행으로 나열하여 SVM 알고리즘에 제공
7. 분류된 숫자값을 출력하기
8. 숫자 쓸 영상 공간 검은색으로 리셋

동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.
인증 타임
SVM 알고리즘은 처음 듣는 모델이라 좀 신기 했다. 수학적 내용은 좀 더 훓어봐야할거 같고 다양한 파라미터와 커널을 갖는 모델들을 전부 테스트 해보지는 못해서 아쉽니다.
필기체 숫자 인식의 경우 여전히 내가 쓰는 9는 인식을 잘 못하는데 뭐가 문제인걸까?
제공된 트레이닝 데이터 20프로를 검증용으로 사용할 경우 98.2%의 정확도로 kNN에 비해 더 높은 퍼포먼스를 보여준다고 했는데. 9를 제외하면 그런거 같기도 하다.



#패스트캠퍼스 #패스트캠퍼스 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #OpenCV를 활용한 컴퓨터비전과 딥러닝 올인원 패키지 Online
패스트캠퍼스(FastCampus) 강의 둘러보러 가기
↓ ↓ ↓
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'남돈내배 > 2022_FastCampus_환급이벤트' 카테고리의 다른 글
| 패스트캠퍼스 챌린지 46일차 - Ch12. 딥러닝 이해와 영상 인식 (0) | 2022.03.10 |
|---|---|
| 패스트캠퍼스 챌린지 45일차 - Ch11. 머신 러닝 (0) | 2022.03.09 |
| 패스트캠퍼스 챌린지 43일차 - Ch11. 머신 러닝 (0) | 2022.03.07 |
| 패스트캠퍼스 챌린지 42일차 - Ch11. 머신 러닝 (0) | 2022.03.06 |
| 패스트캠퍼스 챌린지 41일차 - Ch10. 객체 추적과 모션 벡터 (0) | 2022.03.05 |