이번 시간은 문서에 표현된 필기체 숫자 인식에 대해 알아본다.
문서에서 필기체 숫자 인식
- 문서를 촬영 또는 스캔한 영상에서 필기체 숫자를 인식하는 프로그램
구현할 기술
- 각 숫자의 부분 영상 추출
Labeling , FindContour 함수등을 사요앟면 어렵지않게 찾아낼 수 있다.
레이블링 이용으로 각 숫자의 바운딩 박스 정보 추출
- 숫자 부분 영상을 정규화 과정을 거쳐 20x20 크기로 resize
어떤 형태로 resize를 해야지 SVM 또는 HOG 방법을 이용해서 정확도를 높일 수 있을지 생각해야한다.
숫자의 바운딩 박스 부분의 영상의 가로 / 세로 비율을 유지할 것
학습에 사용된 숫자 영상이 20x20 크기에 꽉 찬 형태가 아니므로 적절한 여백 유지
- HOG & SVM 방법으로 숫자 인식
코드 리뷰
첫번째로 필기체를 인식할 입력영상을 불러온다.
그리고 이전 강의에서 계속 배웠었던 HOG 객체를 생성하고
이전 숫자인식에 사용했던 미리 학습된 SVM 데이터를 불러온다.
그리고 GrayScale 에서 분류작업을 하기때문에 컬러영상이라면 GrayScale 영상으로 변환시켜준다.
Threshold 를 사용하여 GrayScale 로 변환시켜준 영상을 이진화 시켜준다.
( Inverse를 시키는 것도 잘 봐야한다 )
이후 conntedComponetsWithStats 레이블링 함수를 사용하여 인식할 숫자들을
Bllob 한다.
레이블링 이후 나온 x ,y , w, h 를 이용해서 숫자부분만 오려낸다
그리고 각각의 숫자영상들을 HOG 방법을 이용하여 compute 해주고 그결과를 Transpose 하고
* Transpose - 전치행렬 변환
나온 결과값을 svm predict 코드에 넣어주어 최종 결과를 받는 형태로 코드가 작성된다.
마지막으로 최종결과를 출력해주는 코드로 구성된다.
* norm_Img
위 코드 중 20x20 으로 잘라서 나온 이미지의 Width Height를 추출하고
해당 이미지를 반전시켜준다. ( 자세히보면 scr_gray 이미지를 받아오는데 scr_gray는 원본영상에 반전을 하지 않은 영상)
그리고 노이즈의 영향을 최대한 줄이기위해 GaussianBlur 방법을 사용하여 블러링해준다.
그리고 14을 Height로 나누어주는데 원래 20pixel을 Height로 나눠주어야하지만 위/아래 3픽셀의 여백을 고려하여
14로 나눠주고 나온 값을 20x20 zero 영상 가운데 복사한다.
확실하게 이해하기 위해 20으로 나눈 영상과 14로 나눈 영상을 imshow로 보자.
그래서 이해한바로는 라벨링으로 추출되어 나온 숫자를 20x20 사이즈의 제로버퍼에 복사하는데
위에서 설명한대로 위아래 양옆 사이즈에 여백이 있어야 비교할 데이터와의 효율이 올라가기 때문에
더 작게 라벨링 사이즈를 줄여서 복사하는 방식으로 진행되는 것 같음
결과영상
그래서 다시한번 강조하시는 것이
머신러닝을 사용할 때 원본데이터와 비교데이터의 정규화를 어떻게 할지에 대한 고민이 가장 중요하다고 한다.
'Program > 머신러닝' 카테고리의 다른 글
[Open CV] 머신러닝 _ 숫자 영상 정규화 (0) | 2022.07.14 |
---|---|
[Open CV] 머신러닝 _ 숫자 영상 정규화 (0) | 2022.07.12 |
[Open CV] 머신러닝 _ HOG+SVM 필기체 숫자 인식 (0) | 2022.07.11 |
[Open CV] 머신러닝 _ OpenCV SVM 사용하기 (0) | 2022.07.10 |
[Open CV] 머신러닝 SVM 알고리즘 (0) | 2022.07.09 |