การจดจำดอกไม้โดยใช้ 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 2.) การนำเข้าชุดข้อมูลและการเตรียมข้อมูลเบื้องต้น ให้ทำการดาวน์โหลดไฟล์ข้อมูลที่จะใช้ หากข้อมูลที่นำเข้าเป็นไฟล์ zip สามารถใช้โค้ดด้านล่างนี้เพื่อแตกไฟล์ได้ from zipfile import ZipFile file_name = '/content/flowers.zip' with ZipFile(file_name, 'r') as zip: zip.extractall() print('Done') from zipfile import ZipFile file_name = '/content/test_img.zip' with ZipFile(file_name, 'r') as zip: zip.extractall() print('Done') เมื่อดาวน์โหลดชุดข้อมูลเรียบร้อยแล้ว เราจำเป็นต้องปรับขนาดของภาพด้วย โดยสามารถกำหนดขนาดของภาพได้โดยใช้โค้ดด้านล่างนี้ base_dir = '/content/flowers/flowers' img_size = 224 batch = 64 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) ผลลัพธ์จะออกมาดังนี้ 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")) การสรุปตัวโมเดล ให้เราใช้โค้ดด้านล่างนี้ได้เลย model.summary() ผลลัพธ์จะออกมาดังนี้ tf.keras.utils.plot_model(model,show_shapes = True,show_dtype = True,show_layer_activations = True) ผลลัพธ์จะออกมาดังนี้ การคอมไพล์โมเดล เราสามารถใช้โค้ดด้านล่างนี้ได้เลย model.compile(optimizer=tf.keras.optimizers.Adam(), loss='categorical_crossentropy', metrics=['accuracy']) การฝึกฝนโมเดล การฝึกฝนโมเดลอาจจะใช้เวลาสักครู่หนึ่ง โดยโมเดลของเราจะทำการฝึกเป็นเวลา 30 รอบ โดยการฝึกฝนโมเดลเราสามารถใช้โค้ดด้านล่างนี้ได้เลย epochs=30 model.fit(train_datagen,epochs=epochs,validation_data=test_datagen) ผลลัพธ์จะออกมาดังนี้ การบันทึกและโหลดโมเดล เมื่อเราบันทึกโมเดลเรียบร้อยแล้ว เราจะสามารถนำมาใช้เมื่อไรก็ได้โดยไม่ต้องฝึกโมเดลใหม่ซ้ำแล้วซ้ำอีก from tensorflow.keras.models import load_model model.save('Model.h5') savedModel=load_model('Model.h5') 5.) การประเมินผลและการคาดเดาด้วยโมเดล ถ้าหากโมเดลยังให้ผลลัพธ์ไม่ดีเท่าที่ควร เราสามารถลองปรับค่าพารามิเตอร์ต่างๆเพื่อให้ได้ผลลัพธ์การคาดเดาที่ดีขึ้นได้เช่นกัน โดยโค้ดด้านล่างนี้จะเอาไว้ดูว่าแต่ละ class ถูกจับคู่กับเลขอะไรบ้าง train_datagen.class_indices ผลลัพธ์จะออกมาดังนี้ การใช้งานโมเดล เราสามารถใช้โค้ดด้านล่างนี้ในการใช้งานโมเดลของเราได้เลย 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 ผลลัพธ์จะออกมาดังนี้ เราสามารถใช้งานโมเดลนี้ต่อไปกับรูปอื่นๆได้ด้วยโค้ดด้านล่างนี้เลย โดยเราสามารถเปลี่ยนรูปภาพได้จากบรรทัดนี้ test_image = image.load_img('/content/test_img/img.jpg',targ

Apr 9, 2025 - 18:09
 0
การจดจำดอกไม้โดยใช้ 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

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

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

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

with ZipFile(file_name, 'r') as zip:
  zip.extractall()
  print('Done')

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

base_dir = '/content/flowers/flowers'

img_size = 224
batch = 64

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)

ผลลัพธ์จะออกมาดังนี้
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"))

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

model.summary()

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

tf.keras.utils.plot_model(model,show_shapes = True,show_dtype = True,show_layer_activations = True)

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

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

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

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

epochs=30
model.fit(train_datagen,epochs=epochs,validation_data=test_datagen)

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

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

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

savedModel=load_model('Model.h5')

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

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

train_datagen.class_indices

ผลลัพธ์จะออกมาดังนี้
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

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

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

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

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

#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

ผลลัพธ์จะออกมาดังนี้
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

ผลลัพธ์จะออกมาดังนี้
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