DEV Community

22
22

Posted on

การจดจำดอกไม้โดยใช้ Convolutional Convolutional Neural Network

ในบทความนี้ เราจะใช้ Convolutional Neural Network (CNN) เพื่อแก้ปัญหาการจำแนกรูปภาพแบบ Supervised Image
โดยเป็นการจำแนกชนิดของดอกไม้ ได้แก่ Anemone, Daisy, Lily, Orchid, Peony และ Rose

เมื่อเราเข้าใจแนวคิดของ Convolutional Neural Network แล้ว ก็สามารถเริ่มทำโปรเจกต์นี้ได้เลย!

ขั้นตอนการทำงานของโมเดล

1.) การนำเข้าโมดูลที่จำเป็น

import numpy as np 
import pandas as pd
import cv2
import matplotlib.pyplot as plt
from PIL import Image
from tensorflow.keras import layers
from tensorflow.keras.preprocessing.image import ImageDataGenerator, load_img
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D
from tensorflow.keras.layers import Activation, Dropout, Flatten, Dense
from tensorflow.keras.optimizers import Adam
import tensorflow as tf
import os
Enter fullscreen mode Exit fullscreen mode

2.) การนำเข้าชุดข้อมูลและการเตรียมข้อมูลเบื้องต้น
ให้ทำการดาวน์โหลดไฟล์ข้อมูลที่จะใช้ หากข้อมูลที่นำเข้าเป็นไฟล์ zip สามารถใช้โค้ดด้านล่างนี้เพื่อแตกไฟล์ได้

from zipfile import ZipFile
file_name = '/content/flowers.zip'

with ZipFile(file_name, 'r') as zip:
  zip.extractall()
  print('Done')
Enter fullscreen mode Exit fullscreen mode
from zipfile import ZipFile
file_name = '/content/test_img.zip'

with ZipFile(file_name, 'r') as zip:
  zip.extractall()
  print('Done')
Enter fullscreen mode Exit fullscreen mode

เมื่อดาวน์โหลดชุดข้อมูลเรียบร้อยแล้ว เราจำเป็นต้องปรับขนาดของภาพด้วย โดยสามารถกำหนดขนาดของภาพได้โดยใช้โค้ดด้านล่างนี้

base_dir = '/content/flowers/flowers'

img_size = 224
batch = 64
Enter fullscreen mode Exit fullscreen mode

3.) ตัวสร้างข้อมูลภาพ
สำหรับการใช้ตัวสร้างข้อมูลภาพ ให้ทำตามโค้ดด้านล่างนี้

train_datagen = ImageDataGenerator(rescale=1. / 255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True,validation_split=0.2)
test_datagen = ImageDataGenerator(rescale=1. / 255,validation_split=0.2)

train_datagen = train_datagen.flow_from_directory(base_dir,target_size=(img_size, img_size),subset='training',batch_size=batch)
test_datagen = test_datagen.flow_from_directory(base_dir,target_size=(img_size, img_size),subset='validation',batch_size=batch)
Enter fullscreen mode Exit fullscreen mode

ผลลัพธ์จะออกมาดังนี้
Image description

4.) การพัฒนาโมเดล
จากจุดนี้เราจะเริ่มสร้างโมเดล CNN โดยใช้ไลบรารี TensorFlow เนื่องจาก TensorFlow มีฟังก์ชันที่ครบถ้วนและจำเป็นสำหรับการกำหนดโครงสร้างของ Convolutional Neural Network และใช้ในการฝึกโมเดลกับชุดข้อมูลด้วย

model = Sequential()
model.add(Conv2D(filters=64, kernel_size=(5, 5), padding='same',activation='relu', input_shape=(224, 224, 3)))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(filters=64, kernel_size=(3, 3),padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))

model.add(Conv2D(filters=64, kernel_size=(3, 3),padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))

model.add(Conv2D(filters=64, kernel_size=(3, 3),padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))

model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dense(6, activation="softmax"))
Enter fullscreen mode Exit fullscreen mode

การสรุปตัวโมเดล
ให้เราใช้โค้ดด้านล่างนี้ได้เลย

model.summary()
Enter fullscreen mode Exit fullscreen mode

ผลลัพธ์จะออกมาดังนี้
Image description

tf.keras.utils.plot_model(model,show_shapes = True,show_dtype = True,show_layer_activations = True)
Enter fullscreen mode Exit fullscreen mode

ผลลัพธ์จะออกมาดังนี้
Image description

การคอมไพล์โมเดล
เราสามารถใช้โค้ดด้านล่างนี้ได้เลย

model.compile(optimizer=tf.keras.optimizers.Adam(),
              loss='categorical_crossentropy', metrics=['accuracy'])
Enter fullscreen mode Exit fullscreen mode

การฝึกฝนโมเดล
การฝึกฝนโมเดลอาจจะใช้เวลาสักครู่หนึ่ง โดยโมเดลของเราจะทำการฝึกเป็นเวลา 30 รอบ โดยการฝึกฝนโมเดลเราสามารถใช้โค้ดด้านล่างนี้ได้เลย

epochs=30
model.fit(train_datagen,epochs=epochs,validation_data=test_datagen)
Enter fullscreen mode Exit fullscreen mode

ผลลัพธ์จะออกมาดังนี้
Image description

การบันทึกและโหลดโมเดล
เมื่อเราบันทึกโมเดลเรียบร้อยแล้ว เราจะสามารถนำมาใช้เมื่อไรก็ได้โดยไม่ต้องฝึกโมเดลใหม่ซ้ำแล้วซ้ำอีก

from tensorflow.keras.models import load_model
model.save('Model.h5')

savedModel=load_model('Model.h5')
Enter fullscreen mode Exit fullscreen mode

5.) การประเมินผลและการคาดเดาด้วยโมเดล
ถ้าหากโมเดลยังให้ผลลัพธ์ไม่ดีเท่าที่ควร เราสามารถลองปรับค่าพารามิเตอร์ต่างๆเพื่อให้ได้ผลลัพธ์การคาดเดาที่ดีขึ้นได้เช่นกัน

โดยโค้ดด้านล่างนี้จะเอาไว้ดูว่าแต่ละ class ถูกจับคู่กับเลขอะไรบ้าง

train_datagen.class_indices
Enter fullscreen mode Exit fullscreen mode

ผลลัพธ์จะออกมาดังนี้
Image description

การใช้งานโมเดล

เราสามารถใช้โค้ดด้านล่างนี้ในการใช้งานโมเดลของเราได้เลย

from keras.preprocessing import image

#Creating list for mapping
list_ = ['Anemone','Daisy','Lily','Orchid', 'Peony', 'Rose']

#Input image
test_image = image.load_img('/content/test_img/img1.jpg',target_size=(224,224))

#For show image
plt.imshow(test_image)
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image,axis=0)

# Result array
result = savedModel.predict(test_image)
print(result)

#Mapping result array with the main name list
i=0
for i in range(len(result[0])):
  if(result[0][i]==1):
    print(list_[i])
    break
Enter fullscreen mode Exit fullscreen mode

ผลลัพธ์จะออกมาดังนี้
Image description

เราสามารถใช้งานโมเดลนี้ต่อไปกับรูปอื่นๆได้ด้วยโค้ดด้านล่างนี้เลย โดยเราสามารถเปลี่ยนรูปภาพได้จากบรรทัดนี้

test_image = image.load_img('/content/test_img/img.jpg',target_size=(224,224))
Enter fullscreen mode Exit fullscreen mode

และก็สามารถใช้โมเดลให้คาดเดาภาพได้ต่อตามความต้องการของเราได้เลย!

#Input image
test_image = image.load_img('/content/test_img/img2.jpg',target_size=(224,224))
#For show image
plt.imshow(test_image)
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image,axis=0)

# Result array
result = savedModel.predict(test_image)
print(result)

#Mapping result array with the main name list
i=0
for i in range(len(result[0])):
  if(result[0][i]==1):
    print(list_[i])
    break
Enter fullscreen mode Exit fullscreen mode

ผลลัพธ์จะออกมาดังนี้
Image description

#Input image
test_image = image.load_img('/content/test_img/img3.jpg',target_size=(224,224))
#For show image
plt.imshow(test_image)
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image,axis=0)

# Result array
result = savedModel.predict(test_image)
print(result)

#Mapping result array with the main name list
i=0
for i in range(len(result[0])):
  if(result[0][i]==1):
    print(list_[i])
    break
Enter fullscreen mode Exit fullscreen mode

ผลลัพธ์จะออกมาดังนี้
Image description

สรุปผล

Convolutional Neural Network ออกแบบมาเพื่อประมวลผลข้อมูลที่มีโครงสร้างเป็นกริด เช่น รูปภาพ โดยเฉพาะอย่างยิ่งสำหรับงานที่เกี่ยวข้องกับการจดจำและประมวลผลภาพ โดยในบทความนี้ได้ทำการประยุกต์ใช้ Convolutional Neural Network มาใช้ในการจำแนกดอกไม้โดยใช้ชุดข้อมูลที่มีภาพของดอกไม้ประเภท​ต่างๆ

อ้างอิง
1.) https://www.geeksforgeeks.org/flower-recognition-using-convolutional-neural-network/
2.) https://drive.google.com/file/d/1pAtV0Tu-FhDrbWZ_tGeSaSnqnoaDh4rU/view?usp=sharing
3.) https://drive.google.com/file/d/1BmKktbktPQmF3_70hUrH99Z8gUmXcuhZ/view?usp=sharing

Top comments (0)