11-5. SVM 알고리즘

서포트 벡터 머신(Support Vector Machine) 알고리즘

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

     초평면 방정식에서 마진 방정식을 최대로 만드는 w를 구하는 계산을 사용한다. 이 때 constraints, Lagrange multiplier, KKT conditions 등을 사용하며 결과적으로 주어진 데이터를 분할하는 최적의 해가 답이 된다. (세부적인 내용은 추가 검색 필요)

     주어진 샘플을 완벽하게 두 개의 그룹으로 선형 분리할 수 없는 경우, 오분류 에러(Soft margine, C-SVM)을 허용하며, 이 때 C값은 사용자가 설정하는 파라미터로 C값이 커지면 오분류 에러는 작아지지만 마진이 커지며 반대는 반대의 결과를 만든다.

SVM 계산 원리 (출처:FastCampus)

    비선형 데이터 분류하기

     비선형으로 분포한 데이터를 선형 분류 알고리즘인 SVM 알고리즘으로 분리할 경우 두 가지 방법이 있다.

     1. 매핑 함수(mapping function): 비선형 데이터의 차원을 확장하여 선형으로 분리

매핑 함수 예시 (출처:FastCampus)

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

커널 함수 설명 (출처:FastCampus)


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 타입 종류 (출처:FastCampus/OpenCV)

    SVM 커널 지정하기: <cv2.ml_SVM object>.setKernel(kernelType) -> None

     kernelType은 커널 함수 종류를 지정하며 cv2.ml.SVM_으로 시작하는 상수이다. (링크)

     kernelType에 따라 필요한 파라미터를 지정해주어야 한다.

SVM 커널 타입 종류 (출처:FastCampus/OpenCV)

    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 함수를 사용하여 제공되는 데이터에 대한 분류/회귀 값을 예측

SVM_C_SVC 타입 SVM으로 각각 선형, 방사 기저 함수, 다항식 커널 종류를 선택하여 테스트한 모습


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. 숫자 쓸 영상 공간 검은색으로 리셋

HOG 특징 벡터을 구하여 SVM을 학습시킨 후 제공되는 필기체 숫자 영상을 가지고 예측하는 구조(출처:FastCampus)

동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.


인증 타임

SVM 알고리즘은 처음 듣는 모델이라 좀 신기 했다. 수학적 내용은 좀 더 훓어봐야할거 같고 다양한 파라미터와 커널을 갖는 모델들을 전부 테스트 해보지는 못해서 아쉽니다.

필기체 숫자 인식의 경우 여전히 내가 쓰는 9는 인식을 잘 못하는데 뭐가 문제인걸까?

제공된 트레이닝 데이터 20프로를 검증용으로 사용할 경우 98.2%의 정확도로 kNN에 비해 더 높은 퍼포먼스를 보여준다고 했는데. 9를 제외하면 그런거 같기도 하다.

 

11-5. 공부 인증 영상
11-6. 공부 인증 영상
11-7. 공부 인증 영상


#패스트캠퍼스 #패스트캠퍼스 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #OpenCV를 활용한 컴퓨터비전과 딥러닝 올인원 패키지 Online

 

패스트캠퍼스(FastCampus) 강의 둘러보러 가기 

   

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.


 

+ Recent posts