สร้างโมเดลที่กำหนดเองสำหรับตัวแยกประเภทรูปภาพ

1. ก่อนเริ่มต้น

ใน Codelab ก่อนหน้านี้ คุณได้สร้างแอปสำหรับ Android และ iOS ที่ใช้โมเดลการติดป้ายกำกับรูปภาพพื้นฐานซึ่งจดจำคลาสของรูปภาพได้หลายร้อยคลาส โดยทั่วไปแล้ว Google จดจำรูปภาพดอกไม้ เช่น กลีบดอกไม้ ดอกไม้ ต้นไม้ และท้องฟ้า

หากต้องการอัปเดตแอปให้จดจำดอกไม้ ดอกเดซี่ หรือกุหลาบที่เฉพาะเจาะจง คุณจะต้องใช้โมเดลที่กำหนดเองซึ่งได้รับการฝึกโดยยกตัวอย่างจำนวนมากของดอกไม้แต่ละประเภทที่คุณต้องการจดจำ

ข้อกำหนดเบื้องต้น

  • Codelab ก่อนหน้านี้ในเส้นทางการเรียนรู้นี้

สิ่งที่คุณจะสร้างและเรียนรู้

  • วิธีฝึกโมเดลที่กำหนดเองของ Image Classifier โดยใช้ TensorFlow Lite Model Maker

สิ่งที่ต้องมี

  • ไม่จำเป็นต้องใช้ฮาร์ดแวร์ใดเป็นพิเศษ ทุกอย่างสามารถทำได้โดยใช้ Google Colab ในเบราว์เซอร์

2. เริ่มต้นใช้งาน

เราได้จัดเตรียมโค้ดทั้งหมดที่จะปฏิบัติตามไว้ให้คุณแล้ว และพร้อมดำเนินการโดยใช้ Google Colab ที่นี่ หากไม่มีสิทธิ์เข้าถึง Google Colab คุณสามารถโคลนที่เก็บและใช้สมุดบันทึกชื่อ CustomImageClassifierModel.ipynb ซึ่งอยู่ในไดเรกทอรี ImageClassificationMobile->colab ได้

หากมีตัวอย่างของดอกไม้จำนวนมาก การฝึกโมเดลด้วยเครื่องมือสร้างโมเดล TensorFlow Lite เพื่อให้จดจำได้นั้นเป็นเรื่องง่ายสำหรับคุณ

วิธีที่ง่ายที่สุดคือการสร้างไฟล์ .zip หรือ .tgz ที่มีรูปภาพโดยจัดเรียงเป็นไดเรกทอรี ตัวอย่างเช่น ถ้าคุณใช้รูปดอกเดซี่ ดอกแดนดิไลออน กุหลาบ ดอกทานตะวัน และทิวลิป คุณสามารถจัดรูปภาพลงในไดเรกทอรีได้ดังนี้

4ee12554e75b103f.png

ใส่ไฟล์แล้วโฮสต์ไว้ในเซิร์ฟเวอร์ คุณก็จะฝึกโมเดลได้ด้วย คุณจะใช้เครื่องมือที่จัดเตรียมไว้ให้คุณในห้องทดลองนี้

ห้องทดลองนี้จะสมมติว่าคุณกำลังใช้ Google Colab เพื่อฝึกโมเดล ไปที่ colab.research.google.com ได้เลย หากใช้สภาพแวดล้อมอื่น คุณอาจต้องติดตั้งทรัพยากร Dependency จำนวนมาก ไม่ใช่แค่ TensorFlow

3. ติดตั้งและนำเข้าทรัพยากร Dependency

  1. ติดตั้ง TensorFlow Lite Model Maker ซึ่งทำได้ด้วยการติดตั้ง PIP &> /dev/null ที่ส่วนท้ายจะระงับเอาต์พุต เครื่องสร้างแบบจำลองจะแสดงผลข้อมูลจำนวนมากที่ไม่เกี่ยวข้องในทันที ระบบหยุดการทำงานเพื่อให้คุณโฟกัสกับงานที่ทำอยู่ได้
# Install Model maker
!pip install -q tflite-model-maker &> /dev/null
  1. ถัดไป คุณจะต้องนำเข้าไลบรารีที่ต้องใช้และตรวจสอบว่าใช้ TensorFlow 2.x อยู่ ดังนี้
# Imports and check that we are using TF2.x
import numpy as np
import os

from tflite_model_maker import configs
from tflite_model_maker import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import image_classifier
from tflite_model_maker.image_classifier import DataLoader

import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')

เมื่อสภาพแวดล้อมพร้อมแล้ว ก็ถึงเวลาเริ่มสร้างโมเดลของคุณ

4. ดาวน์โหลดและเตรียมข้อมูล

หากรูปภาพได้รับการจัดระเบียบเป็นโฟลเดอร์ และโฟลเดอร์เหล่านั้นมีการซิปไว้ หากคุณดาวน์โหลดไฟล์ ZIP และแตกไฟล์ ระบบจะติดป้ายกำกับรูปภาพให้คุณโดยอัตโนมัติตามโฟลเดอร์ที่รูปภาพนั้นอยู่ ระบบจะอ้างอิงไดเรกทอรีนี้เป็น data_path

data_path = tf.keras.utils.get_file(
      'flower_photos',
      'https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz',
      untar=True)

จากนั้นระบบจะโหลดเส้นทางข้อมูลนี้ไปยังโมเดลโครงข่ายระบบประสาทเทียมเพื่อฝึกด้วยคลาส ImageClassifierDataLoader ของเครื่องสร้างโมเดล TensorFlow Lite เพียงเล็งไปที่โฟลเดอร์ แล้วคุณก็พร้อมใช้งานแล้ว

องค์ประกอบสำคัญอย่างหนึ่งในการฝึกโมเดลด้วยแมชชีนเลิร์นนิงคือการไม่ใช้ข้อมูลทั้งหมดในการฝึก ลองเลื่อนเวลาเล็กน้อยเพื่อทดสอบโมเดลด้วยข้อมูลที่ไม่เคยเห็นมาก่อน ขั้นตอนนี้ทำได้ง่ายโดยใช้วิธีการแยกของชุดข้อมูลที่กลับมาจาก ImageClassifierDataLoader เมื่อคุณผ่านการทดสอบ 0.9 คุณจะได้รับข้อมูลการฝึกอบรม 90% และ 10% เป็นข้อมูลการทดสอบ

data = DataLoader.from_folder(data_path)
train_data, test_data = data.split(0.9)

เมื่อระบบเตรียมข้อมูลแล้ว คุณก็สร้างโมเดลโดยใช้ข้อมูลนั้นได้

5. สร้างโมเดลตัวแยกประเภทรูปภาพ

เครื่องสร้างแบบจำลองจะนำเสนอข้อมูลเฉพาะมากมายของการออกแบบโครงข่ายระบบประสาทเทียม คุณจึงไม่ต้องรับมือกับการออกแบบเครือข่ายและสิ่งต่างๆ เช่น Convolutions ความหนาแน่น ความหนาแน่น relu การแยกส่วน การสูญเสียฟังก์ชัน และเครื่องมือเพิ่มประสิทธิภาพ สำหรับโมเดลเริ่มต้น คุณเพียงแค่ใช้รหัสบรรทัดเดียวในการสร้างโมเดลโดยการฝึกโครงข่ายระบบประสาทด้วยข้อมูลที่ให้ไว้ ดังนี้

model = image_classifier.create(train_data)

เมื่อเรียกใช้ คุณจะเห็นเอาต์พุตที่มีลักษณะดังนี้

Model: "sequential_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
hub_keras_layer_v1v2_2 (HubK (None, 1280)              3413024
_________________________________________________________________
dropout_2 (Dropout)          (None, 1280)              0
_________________________________________________________________
dense_2 (Dense)              (None, 5)                 6405
=================================================================
Total params: 3,419,429
Trainable params: 6,405
Non-trainable params: 3,413,024
_________________________________________________________________
None
Epoch 1/5
103/103 [===] - 15s 129ms/step - loss: 1.1169 - accuracy: 0.6181

Epoch 2/5
103/103 [===] - 13s 126ms/step - loss: 0.6595 - accuracy: 0.8911

Epoch 3/5
103/103 [===] - 13s 127ms/step - loss: 0.6239 - accuracy: 0.9133

Epoch 4/5
103/103 [===] - 13s 128ms/step - loss: 0.5994 - accuracy: 0.9287

Epoch 5/5
103/103 [===] - 13s 126ms/step - loss: 0.5836 - accuracy: 0.9385

ส่วนแรกจะแสดงสถาปัตยกรรมโมเดลของคุณ สิ่งที่เครื่องสร้างโมเดลทำอยู่เบื้องหลังเรียกว่าการเรียนรู้การโอน ซึ่งใช้โมเดลก่อนการฝึกที่มีอยู่เป็นจุดเริ่มต้น และนำสิ่งที่โมเดลนั้นได้เรียนรู้เกี่ยวกับวิธีการสร้างภาพและนำมาใช้ในการทำความเข้าใจดอกไม้ 5 ดอกนี้ คุณจะเห็นข้อความนี้ในบรรทัดแรกว่า

hub_keras_layer_v1v2_2 (HubK (None, 1280)              3413024

คีย์คือคำว่า "Hub" ซึ่งบอกเราว่าโมเดลนี้มาจาก TensorFlow Hub โดยค่าเริ่มต้น เครื่องสร้างโมเดล TensorFlow Lite ใช้โมเดลชื่อ "MobileNet" ซึ่งออกแบบมาให้จดจำรูปภาพ 1,000 ประเภท ตรรกะในที่นี้คือวิธีการที่ใช้ โดยการเรียนรู้ "ฟีเจอร์" เพื่อแยกระหว่าง 1, 000 ชั้นเรียน แล้วนำมาใช้ซ้ำได้ "ฟีเจอร์" เดียวกัน สามารถนำมาใช้กับดอกไม้ทั้ง 5 ชนิดได้ จึงไม่จำเป็นต้องเรียนรู้ใหม่ตั้งแต่ต้น

โมเดลนี้ผ่าน 5 Epoch แล้ว โดยที่ Epoch เป็นวงจรของการฝึกเต็มรูปแบบ ซึ่งโครงข่ายประสาทจะพยายามจับคู่รูปภาพกับป้ายกํากับ เมื่อเวลาผ่านไป 5 Epoch แล้วภายในเวลาประมาณ 1 นาที ข้อมูลการฝึกมีความแม่นยำ 93.85% เมื่อมี 5 คลาส การสุ่มเดาก็แม่นยำ 20% เท่านี้ก็ผ่านหมดแล้ว! (นอกจากนี้ยังมีการรายงานตัวเลข "ความสูญเสีย" ด้วย แต่ตอนนี้คุณไม่ต้องสนใจตัวเลขนี้)

ก่อนหน้านี้คุณแบ่งข้อมูลเป็นข้อมูลการฝึกและการทดสอบ เพื่อให้คุณสามารถวัดได้ว่าเครือข่ายมีประสิทธิภาพเป็นอย่างไรบนข้อมูลที่ไม่เคยเห็นมาก่อน ซึ่งเป็นตัวบ่งชี้ที่ดีขึ้นว่าเครือข่ายจะมีประสิทธิภาพเป็นอย่างไรในการใช้งานในชีวิตจริงโดยใช้ model.evaluate กับข้อมูลทดสอบ ดังนี้

loss, accuracy = model.evaluate(test_data)

ซึ่งเอาต์พุตจะมีลักษณะดังนี้

12/12 [===] - 5s 115ms/step - loss: 0.6622 - accuracy: 0.8801

ดูความแม่นยำที่นี่ ซึ่งคิดเป็น 88.01% ดังนั้นการใช้โมเดลเริ่มต้นในชีวิตจริงน่าจะมีความแม่นยำระดับนั้น ซึ่งถือว่าไม่แย่สำหรับโมเดลเริ่มต้นที่คุณฝึกไปแล้วประมาณ 1 นาที แน่นอนว่าคุณอาจจะต้องปรับเปลี่ยนสิ่งต่างๆ มากมายเพื่อปรับปรุงโมเดล ซึ่งนั่นถือเป็นวิทยาศาสตร์ที่ดีเลยทีเดียว

6. ส่งออกโมเดล

เมื่อฝึกโมเดลแล้ว ขั้นตอนถัดไปคือการส่งออกโมเดลในรูปแบบ .tflite ที่แอปพลิเคชันบนอุปกรณ์เคลื่อนที่ใช้งานได้ เครื่องมือสร้างโมเดลช่วยให้คุณมีวิธีส่งออกที่ใช้งานง่าย เพียงระบุไดเรกทอรีที่จะแสดงเอาต์พุต

ต่อไปนี้เป็นรหัส:

model.export(export_dir='/mm_flowers')

หากคุณใช้โค้ดนี้ใน Google Colab คุณจะดูโมเดลได้โดยคลิกไอคอนโฟลเดอร์ทางด้านซ้ายของหน้าจอ ดังนี้

cc5b9988775633b4.png

จากที่นี่ คุณจะเห็นรายการไดเรกทอรีปัจจุบัน ใช้ปุ่มที่ระบุเพื่อเลื่อน "ขึ้น" ไดเรกทอรี:

51e6ac47c992142a.png

ในโค้ดที่คุณระบุให้ส่งออกไปยังไดเรกทอรี mm_flowers เปิดแอปนั้น แล้วคุณจะเห็นไฟล์ชื่อ "model.tflite" นี่คือโมเดลที่ได้รับการฝึกของคุณ

57bad87f294fd189.png

เลือกไฟล์และคุณจะเห็นจุด 3 จุดปรากฏขึ้นทางด้านขวา คลิกปุ่มเหล่านี้เพื่อดูเมนูตามบริบท แล้วดาวน์โหลดโมเดลจากที่นั่น

aee14ad10c4a8a1a.png

หลังจากนั้นสักครู่ โมเดลจะดาวน์โหลดไปยังโฟลเดอร์ดาวน์โหลด

7. ขอแสดงความยินดี

ตอนนี้คุณพร้อมที่จะผสานรวมเข้ากับแอปบนอุปกรณ์เคลื่อนที่ของคุณแล้ว คุณจะได้ทำในห้องทดลองถัดไป