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

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

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

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

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

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

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

  • วิธีฝึกโมเดลที่กำหนดเองของตัวแยกประเภทรูปภาพโดยใช้ TensorFlow Lite Model Maker

สิ่งที่คุณต้องมี

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

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

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

หากมีตัวอย่างดอกไม้ชนิดหนึ่งๆ จำนวนมาก คุณจะฝึกโมเดลด้วย TensorFlow Lite Model Maker เพื่อให้จดจำดอกไม้เหล่านั้นได้ค่อนข้างง่าย

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

4ee12554e75b103f.png

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

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

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

  1. ติดตั้ง TensorFlow Lite Model Maker ซึ่งทำได้โดยใช้ pip install ส่วน &> /dev/null ที่ท้ายคำสั่งจะระงับเอาต์พุต Model Maker จะแสดงผลหลายอย่างที่ไม่เกี่ยวข้องในทันที ระบบจึงปิดเสียงไว้เพื่อให้คุณมีสมาธิกับงานที่ทำอยู่
# 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 Model Maker ได้ เพียงชี้ไปที่โฟลเดอร์ก็พร้อมใช้งานแล้ว

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

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

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

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

Model Maker จะสรุปรายละเอียดต่างๆ ในการออกแบบโครงข่ายประสาทเทียมไว้มากมาย เพื่อให้คุณไม่ต้องกังวลเรื่องการออกแบบเครือข่าย รวมถึงสิ่งต่างๆ เช่น การบิดเบือน การเชื่อมต่อแบบหนาแน่น 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

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

hub_keras_layer_v1v2_2 (HubK (None, 1280)              3413024

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

โมเดลผ่านการฝึก 5 ยุค โดยยุคคือวงจรการฝึกแบบเต็มที่โครงข่ายประสาทเทียมพยายามจับคู่รูปภาพกับป้ายกำกับ เมื่อผ่านไป 5 ยุคในเวลาประมาณ 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 Maker มีวิธีการส่งออกที่ง่ายต่อการใช้งาน เพียงแค่ระบุไดเรกทอรีที่จะส่งออก

รหัสมีดังนี้

model.export(export_dir='/mm_flowers')

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

cc5b9988775633b4.png

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

51e6ac47c992142a.png

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

57bad87f294fd189.png

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

aee14ad10c4a8a1a.png

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

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

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