Python, OpenCV görüntü işleme ve Tensorflow yapay zeka derin öğrenme kütüphaneleri kullanılarak ekrana el yazısı ile çizilen bir numaranın ne olduğunu tahmin eden bir uygulama yapıyoruz. Ekrana çizdiğimiz sayının ne olduğunu öngören sistem temel derin öğrenme süreci konularında giriş yapabileceğiniz örnek bir uygulama olması amacıyla paylaşılmıştır.
Uygulama hakkında sorularınızı yorumlarda belirtebilirsiniz.
İçerik Tablosu
KERAS İle Derin Öğrenme Modeli Oluşturma
Bu projede, keras kullanarak el yazısı sayıyı tahmin etmek için derin bir öğrenme modeli oluşturulur. Numarayı keras dosyasını kullanarak tanımlarken, modeli eğitmek için MNIST El Yazısı görüntüleri Veri Kümelerini kullanıldı, modeli eğittikten sonra eğitilen modeli kaydedebiliriz, böylece programı her çalıştırdığımızda modeli eğitmemiz gerekmez.
Modeli eğitmek için “number recognize using keras.py” dosyasını bir kere çalıştırmanız yeterli olacaktır.
Python ve OpenCV Kullanarak Çizim Penceresi Oluşturma
Daha sonra opencv kullanarak project.py dosyasında, bir numara çizip ‘s’ veya ‘S’ tuşuna basarak kaydedebileceğiniz bir GUI oluşturdum, fonksiyon daha sonra kaydedilen görüntüyü okur ve ardından ana programa döner. Görüntü daha sonra modelin sayıyı tahmin etmesi için gereken boyuta dönüştürülür. Görüntü daha sonra modele beslenir ve öngörülen sayıyı döndürür. Numara daha sonra Öngörülen numaraya yazılır.
Çalışma Videosu
Alttaki videoda nasıl çalıştığını görebilirsiniz.
Python ve OpenCV Kodlarımız:
project.py dosyası
import numpy as np
import cv2
from tensorflow import keras
windowName = 'Bir Numara Cizin'
img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow(windowName)
# true if mouse is pressed
drawing = False
# if True, draw rectangle. Press 'm' to toggle to curve
mode = True
(ix, iy) = (-1, -1)
# mouse callback function
# brush function
def draw_shape(event, x, y, flags, param):
global ix, iy, drawing, mode
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
(ix, iy) = x, y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing:
if mode:
cv2.circle(img, (x, y), 15, (0, 0, 255), -1)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
if mode:
cv2.circle(img, (x, y), 15, (0, 0, 255), -1)
cv2.setMouseCallback(windowName, draw_shape)
def main():
global mode
while(True):
cv2.imshow(windowName, img)
k = cv2.waitKey(1)
if k == ord('m') or k == ord('M'):
mode = not mode
# 's' is used to save the image you have drawn in Window
elif k == ord('s') or k == ord('S'):
cv2.imwrite('num.png', img)
elif k == 27:
break
cv2.destroyAllWindows()
img2 = cv2.imread('num.png')
return img2
if __name__ == "__main__":
img = main()
img2 = img
# converting Color of the image to gray
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# resize the image
img = cv2.resize(img, (28, 28), interpolation=cv2.INTER_AREA)
# convert img to float32 type
img = img.astype('float32')
img /= 255
img = np.reshape(img, (1, 28, 28, 1))
# loading the previously saved model
model1 = keras.models.load_model('model.h5')
# predicting the number in the image
num = model1.predict_classes(img)[0]
# prints the number predicted
print('number = ', num)
f = np.zeros((500, 500, 3), dtype='uint8')
font = cv2.FONT_HERSHEY_SIMPLEX
org = (20, 20)
fontScale = 1
color = (255, 255, 0)
thickness = 2
print(num)
# shows the predicted number in the image
img2 = cv2.putText(img2, f'Tespit Edilen Sayı = {num}', org, font,
fontScale, color, thickness, cv2.LINE_AA)
cv2.imshow('Predicted', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
Keras ile Sayı Tanımlama İçin Kullandığımız kodlarımız:
Bu kodları çalıştırdıktan sonra bir süre öğrenme modellerinin oluşturulması için beklemelisiniz. İsterseniz model dosyasını sayfanın altındaki kodları indir bölümünden indirebilirsiniz.
# importing keras
from tensorflow import keras
# dividing MNIST datasets to training and test datasets
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)
# converting dataset to float32 type
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
# preparing the model
model = keras.models.Sequential([
keras.layers.Conv2D(64, (2, 2), padding='same',
activation='elu', input_shape=[28, 28, 1]),
keras.layers.MaxPooling2D(2),
keras.layers.Conv2D(128, (3, 3), padding="same", activation="elu"),
keras.layers.Conv2D(256, (4, 4), padding="same", activation="elu"),
keras.layers.Dropout(0.5),
keras.layers.MaxPooling2D(2),
keras.layers.Flatten(),
keras.layers.Dense(128, activation="elu"),
keras.layers.Dropout(0.25),
keras.layers.Dense(10, activation="softmax")
])
# compiling the model
model.compile(loss="sparse_categorical_crossentropy", metrics=[
"accuracy"], optimizer=keras.optimizers.SGD(lr=0.08))
print(model.summary())
# train the model
model.fit(x_train, y_train, epochs=5)
# Evaluate the model
model.evaluate(x_test, y_test)
# saving the model
model.save('model.h5')
print('Model Saved')
Uygulamayı İndirme:
Tüm kodları ve öğrenme modelini github linkinden indirebilirsiniz. –> https://github.com/jagadishb1409/Digit-recognition
Diğer OpenCV Örnekleri
Python ve OpenCv görüntü işleme kütüphanesi kullanarak hazırladığımız diğer örneklerimizin listesi:
- OpenCV Nedir?
- Python ve OpenCV ile Video Oynatma
- Python ve OpenCV ile Videoyu Renklerine Ayırma
- Python ve OpenCV İle Video Kaydetme
- Python ve OpenCV ile Resim İşlemlerine Giriş
- Python ve OpenCV Kullanarak Yüz Tanıma Uygulaması
- Python ve OpenCV Kullanarak Bilgisayar Kamerasından Görüntü Almak
- Pyton ve OpenCV Kullanarak Kenar Algılama Uygulaması
- Python ve OpenCV Kullanarak Resimlere Elastik Efekti Verme
- Python ve OpenCV Kullanarak SuperPixel İşlemi Uygulaması
- Python Ve OpenCv İle WebCam’den Aldığınız Görüntüyü İşlemek
- Python Ve OpenCV Ile Resimlerinizi JSON Formatına Çevirin
- Python Ve OpenCV Ile Youtube Videolarını Stream Yapma
- Python Ve OpenCV Kullanarak Bir Resmin Tüm Piksellerine Ulaşmak
- Python ve OpenCV kullanarak komik aynalar uygulaması