Program/딥러닝

[Open CV] 딥러닝 _ MNIST 학습 모델 사용하기

사막여유 2022. 7. 21. 23:04
728x90

 

MNIST 필기체 숫자 모델을 가져와서 OpenCV DNN에서 사용하는 방법을 설명한다.

 


코드리뷰

 

 

K 최근접 알고리즘과 SVM 알고리즘을 이용해 필기체 숫자인식을 했던방법과 동일한 인터페이스를 갖는다.

마우스를 사용해서 사람이 숫자를 쓰면 해당 숫자를 인식하는데

인식하는 엔진이 딥러닝으로 바뀐 것으로 이해하면 좋을 것 같다.

 

그래서 중간에 readNet 함수를 사용한 것이 보일텐데 여기서 mnist_cnn.pb 파일을 불러온다.

그러면 net이라고 하는 클래스 객체가 생성이 되고 

이후 그림을 그리기 위한 400x400 짜리 zeros 이미지를 만들게 된다.

 

그리고 waitkey 함수를 사용해서 스페이스바를 입력해줬을 경우에 

내가 그려놓은 그림을 blobFromImage 함수를 호출해서 blob이라는 객체로 변환을 한다.

그리고 호출할때는 1/255를 해서 Nomalization을 한형태로 호출해야한다. 

왜냐하면 학습을 시킬때도 Nomalization을 한 형태이기 때문에 같은 형태로 호출해야하기 때문.

이후 만들어진 blob 객체를 network Input으로 주고 Layer를 쭉 실행시켜준다.

 

그럼 prob라는 확률의 값이 나오게되고 ( 10개의 ndarray로 반환 )

최대값 element가 있는 위치를 찾게되면 해당 인덱스 값이 인식한 숫자 즉, 결과값의 확률이라고 볼 수 있다.

 

 

그런데 실제로 값을 입력해보면 99%의 확률이라고는 하지만 인식이 잘 되지 않는 경우가 많다.

특히 귀퉁이에 쓰게되거나 6,9 등의 숫자등은 체감상 99%의 인식률이라고 느껴지지 않는다.

 

따라서 SVM방식으로 필기체를 인식했었던 것 처럼 위치 정규화 코드를 추가해서 인식을 진행시켜야한다.

따라서 그린 숫자를 norm_digit 을 사용하면 조금 더 높은 정확성으로 인식할 수 있다.

 

정규화가 그만큼 중요하다는 것을 알 수 있었던 강의다.

728x90