Program/머신러닝

[Open CV] 머신러닝 _ 숫자 영상 정규화

사막여유 2022. 7. 12. 07:24
728x90

 

이번시간에는 HOG과 SVM 알고리즘을 사용하여 숫자 인식을 하는 프로그램에서 숫자 영상을 정규화 하는 과정을

추가하여 성능을 향상시키는 방법에 관해 알아본다.

 

HOG & SVM 필기체 숫자 인식

정중앙에 숫자를 쓰지 않을 경우?

- digits.png 데이터를 80:20으로 나눠서 검증할 경우 정확도가 98.7% 이지만, 체감 성능은 훨씬 낮게 나타남

 

학습 데이터 영상 정규화 ( Normalization )

 - 학습 데이터 영상과 테스트 데이터 영상의 위치, 크기, 회전 등의 요소를 정규화 인식 성능 향상

 * 여러개의 데이터를 분석할 일이 있을때 어떤 식으로 이 데이터들을 정규화 할지 고민해야한다.

 

숫자 영상의 무게 중심이 전체 영상 중앙이 되도록 위치 정규화

위 이미지를 보게되면 바운딩박스의 중심이라고 생각할 수도 있는데

바운딩박스의 중심을 중앙으로 놓은게 아니고 픽셀이 더 많은 곳이 가중치가 더 들어가 무게중심이 된다.

 


코드리뷰

저번 강의에서 나온 svmdigits1.py 와 코드는 거의 비슷한데

위에서 설명했었던 무게중심에 관한 코드가 추가되었다.

 

 

cv2.moments 함수를 사용한다.

moments 함수는 윤곽선이나 이미지의 0차 모멘트부터 3차 모멘트까지 계산하는 알고리즘으로

공간모멘트, 중심모멘트, 정규화된 중심 모멘트, 질량 중심 등을 계산할 수 있다.

 

그리고 나온 무게중심을 이미지의 중심으로 어파인 변환하는 코드를 추가한다.

 

 

이후 이전 강의에서처럼 바로 hog.compute로 계산하는 것이 아닌 norm_digit으로 해당 숫자 이미지를

정규화 해준 이후에 hog 알고리즘을 사용한다.

 

 

그리고 사용자가 마우스 이벤트로 입력한 숫자에 대해서도 

무게중심을 정규화하는 함수를 거치기 때문에 같은 위치에서 숫자를 비교하여

인식률이 크게 향상되는 것을 알 수 있다.

 

그런데 숫자를 작게쓰는 것과 크게 쓰는것에도 차이가 생겨

작게 쓰면 인식률이 또 크게 떨어지는 것을 알 수 있는데

이는 사이즈에 대한 정규화도 진행해주면 인식률이 높아질 수 있다.

 

그래서 많은 양의 데이터를 비교하게 될 때 어떻게하면 이 데이터들을 정규화할 수 있을까 라는

생각을 습관화하는 것이 좋다.

728x90