Program/딥러닝

[Open CV] 딥러닝 _ 딥러닝 학습과 모델 파일 저장

사막여유 2022. 7. 18. 08:08
728x90

 

텐서 플로우를 이용해서 필기체 숫자 학습하는 과정을 보고 학습된 결과를 pb파일로 저장하는 방법을 알아본다.

 

Tensorflow로 필기체 숫자 인식 학습하기

 - OpenCV DNN 모듈에서 이용할 목적으로 TensorFlow를 이용하여 필기체 숫자 인식을 하습하고, 그 결과를
   pb 파일로 저장하기

 - 네크워크 구조 : [Conv - Pool - Conv - Pool - FC - FC - FC ]

 -학습데이터 : MNIST 데이터 셋
  Yann LeCun 교수가 필기체 숫자 인식을 위해 사용했던 데이터 셋
  각각의 숫자는 28 x 28 크기의 0~1 사이의 실수값으로 구성된 영상 데이터
  60,000개의 훈련용 영상과 10,000개의 테스트 영상

 - 준비 사항
   TensorFlow 1.13.1 설치
   > pip install tensorflow==1.13.1

 


코드리뷰

 

위에서 나온 코드들 중 OpenCV 코드는 전혀 없고

TensorFlow , Python 코드가 주를 이루고있다.

그래서 어떤 방식으로 동작하는지 전체적인 구조에 관한 것만 설명한다.

 

처음에는 input_data.read_data_sets 로 MNIST 데이터를 받아온다.

그러면 현재폴더 밑에 MNIST_data라는 폴더가 생기고 그 밑에 MNIST 관련된 Data를 다운받을 수 있다.

그리고 learning_rate, training_epochs, batch_size 가 의미하는 것은 Gradient Dicent 라는 알고리즘에서 

Learning _ rate : 학습을 어느정도 빠르기로 동작시킬 것인지 ( 너무 크게주면 빨라서 학습이 튈 가능성이 있고
                           너무 작게주면 학습이 너무 느려지는 현상이 있어 보통 0.001의 값을 많이 준다. )

Training_epochs : 학습시킬 횟수

Batch_size : MNIST 라고하는 데이터셋이 전체 60,000개의 트레이닝 데이터를 갖고있는데 60,000개의 데이터를
                    한꺼번에학습하는 것이 아니라 그 중 100개씩 짤라서 학습을 하겠다는 의미

 

그리고 #Model configuration 에서는

MNIST 데이터를 파일에서 불러오게되면 1차원형태로 불러와지는데 이를

X 로 28x28형태의 2차원 형태로 변환시켜주고 Y ( Output ) 을 10개 갖는다고 정의해준다.

그리고 이 전 강의에서 배웠던 Convolution 과 Pooling을 함수에서 찾아볼 수 있다.

https://opencv-master.tistory.com/119

 

[Open CV] 딥러닝 _ CNN 이해하기

딥러닝에서 영상을 다룰 때 필수적으로 사용되고 있는 CNN이라는 구조에 대해서 알아본다. 컨볼류션 신경망 ( CNN : Convolutional Neural Network )  - 영상 인식 등을 위해 필수적으로 사용되고 있는 딥러

opencv-master.tistory.com

 

마지막으로 한줄로 쭉 펴줘야하는 형태가 있었는데 그 형태를 tf.contrib.layers.flatten ( pool2 ) 라는 함수로 만든다.

 

그리고 실제 Traing 과정을 보면 위에서 설정해주었던 training_epochs 만큼 for문을 돌리는 것을 확인할 수 있다.

그래서 batch_xs를 지속적으로 돌리면서 optimizer에 Weight 값을 지속적으로 업데이트하는 형태로 Training 한다.

 

전체 학습과정이 끝나게되면 mnist 에 Training이 있고 Test가 있는데 Test이미지를 가져와서 28x28 이미지로 reshape를 해서 입력을 주고 해당 이미지를 맞추었는지 틀렸는지 카운팅을한다.

그래서 그 결과를 accuracy 형태로 나타내게 된다.

 

마지막으로 트레이닝 이후에 나온 Weight 결과를 pb파일로 나타내는 코드인데 해당 코드가 가장 심플한 방법의 코드라고 생각된다고한다.

 

그래서 실제로 동작시켜보면

현재 해당 노트북으로는 실행이 안되는 것을 발견했는데 원인을 찾기전 강의에서 나온결과를 보자면

 

 

 

 

위와같이 결과값이 나오게되는데 20번 이상을 주게된다고 더 감소하는 것이 아니라

오히려 과적합에 빠질 수 있기때문에 적당한 값을 넣어주는 것이 중요하다.

 

 

위 이미지처럼 mnist_cnn.pb 파일이 출력되게 되었는데 다음강의에서는 해당 pb파일을

OpenCV에서 사용하는 방법에 대해 알아본다.

 

 

* 위에서 발견했던 오류에 대한 해결방법

 

TypeError: Descriptors cannot not be created directly 라는 에러가 떳는데 해당 에러를 구글링해보니

TensorFlow를 install 할 때 protobuf 가 최신버전이 다운로드 된 것 같아

이 부분을 다운그레이드 해주거나 TensorFlow 를 최신버전으로 업데이트 해줘야한다고한다.

이번 강의에서는 추후 나올 한글 인식을 위해 TensorFlow를 업데이트한다고 하지 않으니

protobuf 를 다운그레이드 시켜준다.

 

https://exerror.com/typeerror-descriptors-cannot-not-be-created-directly/

 

[Solved] TypeError: Descriptors cannot not be created directly - Exception Error

To Solve TypeError: Descriptors cannot not be created directly protobuf has recently Released the latest version and the Cause of this Update

exerror.com

 

pip install --upgrade "protobuf<=3.20.1"

 

 

그리고 위 과정을 다시 반복하니 잘 동작되는 것을 볼 수 있다.

728x90