Keras와 OpenCV를 사용하여 손글씨 숫자 인식하기Deep Learning & Machine Learning/Keras2023. 10. 9. 11:26
Table of Contents
반응형
이번 영상에서는 Keras와 OpenCV를 사용하여 직접 쓴 손글씨를 인식하는 방법을 소개합니다.
설명은 아래 유튜브 영상을 확인하세요.
https://youtu.be/TV3oplqa5VA?feature=shared
영상에서 사용한 코드입니다.
from tensorflow.keras.datasets import mnist from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout, Flatten from tensorflow.keras.layers import Conv2D, MaxPooling2D from tensorflow.keras.utils import to_categorical from tensorflow.keras.preprocessing.image import ImageDataGenerator batch_size = 128 num_classes = 10 epochs = 12 img_rows, img_cols = 28, 28 (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1) x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1) input_shape = (img_rows, img_cols, 1) x_train = x_train.astype('float32') x_test = x_test.astype('float32') x_train /= 255 x_test /= 255 y_train = to_categorical(y_train, num_classes) y_test = to_categorical(y_test, num_classes) model = Sequential() model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape)) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(num_classes, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) datagen = ImageDataGenerator( rotation_range=40, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, fill_mode='nearest') model.fit_generator(datagen.flow(x_train, y_train, batch_size=batch_size), steps_per_epoch=x_train.shape[0] // batch_size, validation_data=(x_test, y_test), epochs=epochs, verbose=2) score = model.evaluate(x_test, y_test, verbose=2) print('Test loss:', score[0]) print('Test accuracy:', score[1]) model.save('model.h5') |
import cv2 as cv import numpy as np from tensorflow.keras.models import load_model img_color = cv.imread('test3.jpg', cv.IMREAD_COLOR) img_gray = cv.cvtColor(img_color, cv.COLOR_BGR2GRAY) ret,img_binary = cv.threshold(img_gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU) kernel = cv.getStructuringElement( cv.MORPH_RECT, ( 5, 5 ) ) img_binary = cv.morphologyEx(img_binary, cv. MORPH_CLOSE, kernel) cv.imshow('digit', img_binary) cv.waitKey(0) contours, hierarchy = cv.findContours(img_binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) for contour in contours: x, y, w, h = cv.boundingRect(contour) length = max(w, h) + 60 img_digit = np.zeros((length, length, 1),np.uint8) new_x,new_y = x-(length - w)//2, y-(length - h)//2 img_digit = img_binary[new_y:new_y+length, new_x:new_x+length] kernel = np.ones((5, 5), np.uint8) img_digit = cv.morphologyEx(img_digit, cv.MORPH_DILATE, kernel) cv.imshow('digit', img_digit) cv.waitKey(0) model = load_model('model.h5') img_digit = cv.resize(img_digit, (28, 28), interpolation=cv.INTER_AREA) img_digit = img_digit / 255.0 img_input = img_digit.reshape(1, 28, 28, 1) predictions = model.predict(img_input) number = np.argmax(predictions) print(number) cv.rectangle(img_color, (x, y), (x+w, y+h), (255, 255, 0), 2) location = (x + int(w *0.5), y - 10) font = cv.FONT_HERSHEY_COMPLEX fontScale = 1.2 cv.putText(img_color, str(number), location, font, fontScale, (0,255,0), 2) cv.imshow('digit', img_digit) cv.waitKey(0) cv.imshow('result', img_color) cv.waitKey(0) |
작성 2020. 3. 30
반응형
'Deep Learning & Machine Learning > Keras' 카테고리의 다른 글
Keras 모델 전체 파라미터 개수 세기 (0) | 2023.10.22 |
---|---|
tf.keras.applications.EfficientNet 모델 사용시 주의할 점 (0) | 2023.10.10 |
TensorFlow 예제 - Keras + OpenCV를 사용하여 실제 손글씨 숫자 인식 (0) | 2023.10.09 |
Keras 모델을 TensorFlow Lite로 변환하기 (h5 -> pb -> tflite) (0) | 2022.10.23 |
Keras Tuner를 사용하여 하이퍼파라미터 찾는 예제 (0) | 2022.02.20 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
@webnautes :: 멈춤보단 천천히라도
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!