인프런 커뮤니티 질문&답변

avatar196kc님의 프로필 이미지

작성한 질문수

[라즈베리파이] IoT 딥러닝 Computer Vision 실전 프로젝트

직접 쓴 손글씨 딥러닝 모델 적용하기

plt. show() 숫자 출력 3값만 나옵니다.

작성

·

267

0

RBP_DL12_openCV_get_image

숫자  7 , 5 ,3 을  3값으로 찾네요. 

어디 부분을 확인을 해야 하나요? 

답변 3

0

안녕하세요?

그러면 이전에 설명한 내용을 참조하세요.

어제 '[특별강의]model정확도 99%이상 높이기'라는 단원을 과정에 추가하였으니 그 내용을 보시면 되겠습니다.

감사합니다. 

0

avatar196kc님의 프로필 이미지
avatar196kc
질문자

수정한 내용은 없고 다시 실행을 하니 3, 5, 3 나옵니다. 

0

안녕하세요?

좋은 질문해주셨네요.

먼저 코드를 보니 조금 수정하신 것 같은데 제가 제공해 드린 내용그래도 실행해서 같은 결과가 나오는지 확인해주세요. 만약 코드의 잘못일 수도 있지만 같은 결과가 나오면 아닐 수도 있습니다.

제가 이 내용을 가지고 특별강의를 만들었어요. 곧 공지하고 강의에 특별강의 형태로 포함할 것입니다. 

이미 강의에서도 설명드렸지만 이 예제는 직접 쓴 손글씨를 인식하는 것을 실행을 해보기 위한 주제라 정확도면에서 아쉬운 점이 있습니다. 강의를 진행하면서 이 후에 정확도를 높이는 여러 가지 방법을 소개하지만 당장 MNIST모델의 정확도를 높이는 방법을 소개해 드리겠습니다. 물론 모델 말고도 상용서비스를 한다면 프로그램에도 다양한 필터, 기법, 예외처리 등 보완해서 인식률을 높이는 여러 방법이 필요하겠지만 일단 모델 자체도 실습을 위해서 간단하게 학습해서 만들었기 때문에 정확도에 한계가 있습니다.

이전 단원에서 저희가 MNIST모델을 만들었던 RBP_DL11_MNIST_model.ipynb파일을 보면 학습할 때 4개의 레이어만으로 모델을 만들었습니다.

model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(num_classes, activation='softmax')

])

텐서플로에서 제공하는 다른 예제를 보면 모델을 보다 정교한 레이어로 만들어서 인식률을 높이는 방법을 제시하고 있습니다. 물론 이럴 경우 학습에 보다 많은 시간과 리소스를 필요로 하기 때문이지요. 예제는 colab파일인데 주소는 아래와 같습니다.

https://colab.research.google.com/github/tensorflow/examples/blob/master/lite/examples/digit_classifier/ml/mnist_tflite.ipynb

아래 내용처럼 relu를 사용하는 dense layer를 복잡한 Convolution layers로 바꿔주면 정확도로 높아진다고 나오고 있습니다.

참고로 아래의 결과를 가져오는 keras.layers.Dense(10) 레이어는 지우면 안됩니다.

# Define the model architecture
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation=tf.nn.relu),

# Optional: You can replace the dense layer above with the convolution layers below to get higher accuracy.
# keras.layers.Reshape(target_shape=(28, 28, 1)),
# keras.layers.Conv2D(filters=32, kernel_size=(3, 3), activation=tf.nn.relu),
# keras.layers.Conv2D(filters=64, kernel_size=(3, 3), activation=tf.nn.relu),
# keras.layers.MaxPooling2D(pool_size=(2, 2)),
# keras.layers.Dropout(0.25),
# keras.layers.Flatten(input_shape=(28, 28)),
# keras.layers.Dense(128, activation=tf.nn.relu),
# keras.layers.Dropout(0.5),

keras.layers.Dense(10)

]) 

이렇게 모델을 개선해서(문법은 살짝 다르므로 keras.layers  를 tf.keras.layers로 바꾸세요.) 새로 모델파일을 만들면 인식률이 높아질 겁니다. 

그런데 제가 MNIST모델과 다른 모델을 학습하고 실행해 보면서 경험한 것은  일단 학습에 사용한 사진 자체가 우리가 사용하는 방식과 다를 수 있다는 겁니다. 아시겠지만 MNIST는 미국사람이 쓴 손글씨로 우리가 쓰는 숫자와 쓰는 방식이 약간 다르더라고요. 제가 쓴 7의 경우를 보면 끝이 약간 안으로 굽어있어 가끔 3의 특성으로 인식하기도 합니다. 한번 MNIST데이터에 있는 손글씨를 출력해 보시면 이해가 가실 수 있습니다. 이 모델 뿐 아니라 다른 과정에서 성별과 나이를 식별하는 모델을 사용하는데 이럴 경우 학습에 사용된 얼굴 이미지들이 모두 서양 사람들의 이미지라 저희 얼굴에서 정확도가 떨어지는 경우를 확인합니다.

그래서 제가 관련된 실제 프로젝트를 하면서 어떻게 새로 사진 데이터를 모을 수 있느냐를 고민하고 있습니다. 결국 보다 높은 정확도를 필요로 하면 근본적으로 사진 데이터부터 충분히 모을 필요도 있습니다.

도움되시길 바랍니다.

감사합니다.