# Larger CNN for the MNIST Dataset import numpy from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense from keras.layers import Dropout from keras.layers import Flatten from keras.layers.convolutional import Conv2D from keras.layers.convolutional import MaxPooling2D from keras.utils import np_utils from keras import backend as K K.set_image_dim_ordering('th') # fix random seed for reproducibility seed = 7 numpy.random.seed(seed) # load data (X_train, y_train), (X_test, y_test) = mnist.load_data() # reshape to be [samples][pixels][width][height] X_train = X_train.reshape(X_train.shape[0], 1, 28, 28).astype('float32') X_test = X_test.reshape(X_test.shape[0], 1, 28, 28).astype('float32') # normalize inputs from 0-255 to 0-1 X_train = X_train / 255 X_test = X_test / 255 # one hot encode outputs y_train = np_utils.to_categorical(y_train) y_test = np_utils.to_categorical(y_test) num_classes = y_test.shape[1] # define the larger model def larger_model(): # create model model = Sequential() model.add(Conv2D(30, (5, 5), input_shape=(1, 28, 28), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(15, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.2)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dense(50, activation='relu')) model.add(Dense(num_classes, activation='softmax')) # Compile model model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) return model # build the model model = larger_model() # Fit the model model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=20, batch_size=200) # Save entire model to a HDF5 file model.save('my_model.h5') print ("Finished") หรือดาวน์โหลดโค้ดจากลิงค์ด้านล่าง https://drive.google.com/open?id=1h1I8IXJAN64-OihiThKmMXjah5THVcMa Save ไปที่ โฟลเดอร์ number_robot และตั้งชื่อเป็น build_model.py
from time import sleep from picamera import PiCamera camera = PiCamera() camera.resolution = (800, 800) camera.start_preview() sleep(2) camera.capture('/home/pi/number_robot/image.jpg') from skimage.io import imread import numpy as np im = imread("image.jpg") from skimage.transform import resize # resize to 28 x 28 im_resize = resize(im,(28,28), mode='constant') from skimage.color import rgb2gray # turn the image from color to gray im_gray = rgb2gray(im_resize) # the color of the original set are inverted,so we invert it here im_gray_invert = 255 - im_gray*255 #treat color under threshold as black im_gray_invert[im_gray_invert<=90] = 0 from keras.models import load_model model=load_model('my_model.h5') im_final = im_gray_invert.reshape(1,1,28,28) # the below output is a array of possibility of respective digit ans = model.predict(im_final) print(ans) ans = ans[0].tolist().index(max(ans[0].tolist())) print("the predicted digit is",ans)
สามารถดูภาพที่ถ่าย โดยให้คลิกขวาที่ไฟล์ image.jpg เลือก Chromium Web Browser
จะแสดงภาพที่หุ่นยนต์ถ่ายไว้
10.4 ทดสอบการทำงาน
สร้างไฟล์ robot_number.py โดย เปิดโปรแกรม Python 3 (IDLE) เขียนโค้ดดังนี้ import RPi.GPIO as GPIO #set GPIO numbering mode and define output pins GPIO.setmode(GPIO.BOARD) GPIO.setup(11,GPIO.OUT) GPIO.setup(13,GPIO.OUT) GPIO.setup(35,GPIO.OUT) GPIO.setup(37,GPIO.OUT) from time import sleep from picamera import PiCamera camera = PiCamera() camera.resolution = (800, 800) camera.start_preview() sleep(2) camera.capture('/home/pi/number_robot/image.jpg') from skimage.io import imread import numpy as np im = imread("image.jpg") from skimage.transform import resize # resize to 28 x 28 im_resize = resize(im,(28,28), mode='constant') from skimage.color import rgb2gray # turn the image from color to gray im_gray = rgb2gray(im_resize) # the color of the original set are inverted,so we invert it here im_gray_invert = 255 - im_gray*255 #treat color under threshold as black im_gray_invert[im_gray_invert<=90] = 0 from keras.models import load_model model=load_model('my_model.h5') im_final = im_gray_invert.reshape(1,1,28,28) # the below output is a array of possibility of respective digit ans = model.predict(im_final) print(ans) ans = ans[0].tolist().index(max(ans[0].tolist())) print("the predicted digit is",ans) if ans == 8: GPIO.output(11,False) GPIO.output(13,False) GPIO.output(35,False) GPIO.output(37,False) elif ans == 2: GPIO.output(11,True) GPIO.output(13,False) GPIO.output(35,True) GPIO.output(37,False) sleep(0.3) GPIO.output(11,False) GPIO.output(13,False) GPIO.output(35,False) GPIO.output(37,False) elif ans == 3: GPIO.output(11,False) GPIO.output(13,True) GPIO.output(35,False) GPIO.output(37,True) sleep(0.4) GPIO.output(11,False) GPIO.output(13,False) GPIO.output(35,False) GPIO.output(37,False) elif ans == 4: GPIO.output(11,True) GPIO.output(13,False) GPIO.output(35,False) GPIO.output(37,False) sleep(0.4) GPIO.output(11,False) GPIO.output(13,False) GPIO.output(35,False) GPIO.output(37,False) elif ans == 5: GPIO.output(11,False) GPIO.output(13,False) GPIO.output(35,True) GPIO.output(37,False) sleep(0.4) GPIO.output(11,False) GPIO.output(13,False) GPIO.output(35,False) GPIO.output(37,False) else: GPIO.output(11,False) GPIO.output(13,False) GPIO.output(35,False) GPIO.output(37,False) GPIO.cleanup() หรือดาวน์โหลดโค้ดจากลิงค์ด้านล่าง https://drive.google.com/open?id=1IgsAd5Utat5Nhptxw4qU2C67Hg9I0r4s Save ไปที่ โฟลเดอร์ number_robot และตั้งชื่อเป็น robot_number.py
เสียบสาย USB ของ Power Bank ต่อเข้ากับ 5V Micro USB ของบอร์ด Raspberry Pi
เปิด เพาเวอร์สวิตซ์ จะมีไฟสีแดงติดที่ Motor Driver