การจัดประเภทภาพด้วย TensorFlow Lite Model Maker

ดูใน TensorFlow.org เรียกใช้ใน Google Colab ดูแหล่งที่มาบน GitHub ดาวน์โหลดสมุดบันทึก ดูโมเดล TF Hub

ไลบรารี TensorFlow Lite Model Maker ช่วยลดความยุ่งยากในกระบวนการปรับและแปลงโมเดลเครือข่ายประสาทเทียม TensorFlow เป็นข้อมูลอินพุตเฉพาะเมื่อปรับใช้โมเดลนี้สำหรับแอปพลิเคชัน ML บนอุปกรณ์

สมุดบันทึกนี้แสดงตัวอย่างแบบ end-to-end ที่ใช้ไลบรารี Model Maker นี้เพื่อแสดงให้เห็นถึงการปรับตัวและการแปลงโมเดลการจำแนกรูปภาพที่ใช้กันทั่วไปเพื่อจัดประเภทดอกไม้บนอุปกรณ์พกพา

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

ในการเรียกใช้ตัวอย่างนี้ก่อนอื่นเราต้องติดตั้งแพ็คเกจที่จำเป็นหลายแพ็คเกจรวมถึงแพ็คเกจ Model Maker ที่ใน GitHub repo

pip install -q tflite-model-maker

นำเข้าแพ็คเกจที่ต้องการ

import os

import numpy as np

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

from tflite_model_maker import model_spec
from tflite_model_maker import image_classifier
from tflite_model_maker.config import ExportFormat
from tflite_model_maker.config import QuantizationConfig
from tflite_model_maker.image_classifier import DataLoader

import matplotlib.pyplot as plt
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/numba/core/errors.py:154: UserWarning: Insufficiently recent colorama version found. Numba requires colorama >= 0.3.9
  warnings.warn(msg)

ตัวอย่างง่ายๆจาก End-to-End

รับเส้นทางข้อมูล

มาดูภาพเพื่อเล่นกับตัวอย่างง่ายๆจาก end-to-end นี้ ภาพหลายร้อยภาพเป็นการเริ่มต้นที่ดีสำหรับ Model Maker ในขณะที่ข้อมูลมากขึ้นอาจทำให้เกิดความแม่นยำได้ดีขึ้น

Downloading data from https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz
228818944/228813984 [==============================] - 2s 0us/step

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

อัปโหลดไฟล์

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

เรียกใช้ตัวอย่าง

ตัวอย่างประกอบด้วยโค้ด 4 บรรทัดดังที่แสดงด้านล่างซึ่งแต่ละบรรทัดแสดงถึงหนึ่งขั้นตอนของกระบวนการทั้งหมด

ขั้นตอนที่ 1. โหลดข้อมูลอินพุตเฉพาะสำหรับแอป ML บนอุปกรณ์ แยกเป็นข้อมูลการฝึกอบรมและข้อมูลการทดสอบ

data = DataLoader.from_folder(image_path)
train_data, test_data = data.split(0.9)
INFO:tensorflow:Load image with size: 3670, num_label: 5, labels: daisy, dandelion, roses, sunflowers, tulips.

ขั้นตอนที่ 2. ปรับแต่งโมเดล TensorFlow

model = image_classifier.create(train_data)
INFO:tensorflow:Retraining the models...
WARNING:tensorflow:Please add `keras.layers.InputLayer` instead of `keras.Input` to Sequential model. `keras.Input` is intended to be used by Functional model.
WARNING:tensorflow:Please add `keras.layers.InputLayer` instead of `keras.Input` to Sequential model. `keras.Input` is intended to be used by Functional model.
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
hub_keras_layer_v1v2 (HubKer (None, 1280)              3413024   
_________________________________________________________________
dropout (Dropout)            (None, 1280)              0         
_________________________________________________________________
dense (Dense)                (None, 5)                 6405      
=================================================================
Total params: 3,419,429
Trainable params: 6,405
Non-trainable params: 3,413,024
_________________________________________________________________
None
Epoch 1/5
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/keras/optimizer_v2/optimizer_v2.py:375: UserWarning: The `lr` argument is deprecated, use `learning_rate` instead.
  "The `lr` argument is deprecated, use `learning_rate` instead.")
103/103 [==============================] - 12s 31ms/step - loss: 0.8568 - accuracy: 0.7797
Epoch 2/5
103/103 [==============================] - 4s 35ms/step - loss: 0.6462 - accuracy: 0.9020
Epoch 3/5
103/103 [==============================] - 4s 35ms/step - loss: 0.6186 - accuracy: 0.9190
Epoch 4/5
103/103 [==============================] - 3s 32ms/step - loss: 0.5984 - accuracy: 0.9217
Epoch 5/5
103/103 [==============================] - 4s 36ms/step - loss: 0.5853 - accuracy: 0.9336

ขั้นตอนที่ 3. ประเมินแบบจำลอง

loss, accuracy = model.evaluate(test_data)
12/12 [==============================] - 2s 39ms/step - loss: 0.6424 - accuracy: 0.8828

ขั้นตอนที่ 4. ส่งออกไปยังโมเดล TensorFlow Lite

ที่นี่เราส่งออกโมเดล TensorFlow Lite พร้อม ข้อมูลเมตา ซึ่งเป็นมาตรฐานสำหรับคำอธิบายโมเดล ไฟล์เลเบลฝังอยู่ในข้อมูลเมตา ค่าเริ่มต้นของเทคนิคการหาปริมาณหลังการฝึกอบรมคือการหาปริมาณแบบผสมผสานสำหรับงานการจัดประเภทรูปภาพ

คุณสามารถดาวน์โหลดได้ในแถบด้านข้างทางซ้ายเช่นเดียวกับส่วนการอัปโหลดเพื่อใช้งานของคุณเอง

model.export(export_dir='.')
INFO:tensorflow:Assets written to: /tmp/tmpagqtnzk2/assets
INFO:tensorflow:Assets written to: /tmp/tmpagqtnzk2/assets
WARNING:absl:For model inputs containing unsupported operations which cannot be quantized, the `inference_input_type` attribute will default to the original type.
INFO:tensorflow:Label file is inside the TFLite model with metadata.
INFO:tensorflow:Label file is inside the TFLite model with metadata.
INFO:tensorflow:Saving labels in /tmp/tmprk11gbxt/labels.txt
INFO:tensorflow:Saving labels in /tmp/tmprk11gbxt/labels.txt
INFO:tensorflow:TensorFlow Lite model exported successfully: ./model.tflite
INFO:tensorflow:TensorFlow Lite model exported successfully: ./model.tflite

หลังจาก 4 ขั้นตอนง่ายๆเหล่านี้เราสามารถใช้ไฟล์โมเดล TensorFlow Lite ในแอพพลิเคชั่นบนอุปกรณ์ได้เช่นในแอพอ้างอิงการ จัดหมวดหมู่รูปภาพ

กระบวนการโดยละเอียด

ปัจจุบันเรารองรับหลายรุ่นเช่นรุ่น EfficientNet-Lite *, MobileNetV2, ResNet50 เป็นรุ่นที่ผ่านการฝึกอบรมสำหรับการจำแนกภาพ แต่มีความยืดหยุ่นมากในการเพิ่มโมเดลที่ได้รับการฝึกฝนมาก่อนแล้วให้กับไลบรารีนี้ด้วยโค้ดเพียงไม่กี่บรรทัด

ต่อไปนี้จะอธิบายถึงตัวอย่างตั้งแต่ต้นจนจบทีละขั้นตอนเพื่อแสดงรายละเอียดเพิ่มเติม

ขั้นตอนที่ 1: โหลดข้อมูลอินพุตเฉพาะสำหรับแอป ML บนอุปกรณ์

ชุดข้อมูลดอกไม้ประกอบด้วยรูปภาพ 3670 ภาพจาก 5 คลาส ดาวน์โหลดชุดข้อมูลเวอร์ชันที่เก็บถาวรและถอดออก

ชุดข้อมูลมีโครงสร้างไดเร็กทอรีต่อไปนี้:

flower_photos
|__ daisy
    |______ 100080576_f52e8ee070_n.jpg
    |______ 14167534527_781ceb1b7a_n.jpg
    |______ ...
|__ dandelion
    |______ 10043234166_e6dd915111_n.jpg
    |______ 1426682852_e62169221f_m.jpg
    |______ ...
|__ roses
    |______ 102501987_3cdb8e5394_n.jpg
    |______ 14982802401_a3dfb22afb.jpg
    |______ ...
|__ sunflowers
    |______ 12471791574_bb1be83df4.jpg
    |______ 15122112402_cafa41934f.jpg
    |______ ...
|__ tulips
    |______ 13976522214_ccec508fe7.jpg
    |______ 14487943607_651e8062a1_m.jpg
    |______ ...
image_path = tf.keras.utils.get_file(
      'flower_photos.tgz',
      'https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz',
      extract=True)
image_path = os.path.join(os.path.dirname(image_path), 'flower_photos')

ใช้คลาส DataLoader เพื่อโหลดข้อมูล

สำหรับวิธี from_folder() มันสามารถโหลดข้อมูลจากโฟลเดอร์ได้ ถือว่าข้อมูลรูปภาพของคลาสเดียวกันอยู่ในไดเร็กทอรีย่อยเดียวกันและชื่อโฟลเดอร์ย่อยคือชื่อคลาส ปัจจุบันรองรับภาพที่เข้ารหัส JPEG และภาพที่เข้ารหัส PNG แล้ว

data = DataLoader.from_folder(image_path)
INFO:tensorflow:Load image with size: 3670, num_label: 5, labels: daisy, dandelion, roses, sunflowers, tulips.
INFO:tensorflow:Load image with size: 3670, num_label: 5, labels: daisy, dandelion, roses, sunflowers, tulips.

แยกเป็นข้อมูลการฝึกอบรม (80%) ข้อมูลการตรวจสอบความถูกต้อง (10% ทางเลือก) และข้อมูลการทดสอบ (10%)

train_data, rest_data = data.split(0.8)
validation_data, test_data = rest_data.split(0.5)

แสดงตัวอย่างรูปภาพ 25 ภาพพร้อมป้ายกำกับ

plt.figure(figsize=(10,10))
for i, (image, label) in enumerate(data.gen_dataset().unbatch().take(25)):
  plt.subplot(5,5,i+1)
  plt.xticks([])
  plt.yticks([])
  plt.grid(False)
  plt.imshow(image.numpy(), cmap=plt.cm.gray)
  plt.xlabel(data.index_to_label[label.numpy()])
plt.show()

png

ขั้นตอนที่ 2: ปรับแต่ง TensorFlow Model

สร้างแบบจำลองลักษณนามรูปภาพที่กำหนดเองตามข้อมูลที่โหลด โมเดลเริ่มต้นคือ EfficientNet-Lite0

model = image_classifier.create(train_data, validation_data=validation_data)
INFO:tensorflow:Retraining the models...
INFO:tensorflow:Retraining the models...
WARNING:tensorflow:Please add `keras.layers.InputLayer` instead of `keras.Input` to Sequential model. `keras.Input` is intended to be used by Functional model.
WARNING:tensorflow:Please add `keras.layers.InputLayer` instead of `keras.Input` to Sequential model. `keras.Input` is intended to be used by Functional model.
Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
hub_keras_layer_v1v2_1 (HubK (None, 1280)              3413024   
_________________________________________________________________
dropout_1 (Dropout)          (None, 1280)              0         
_________________________________________________________________
dense_1 (Dense)              (None, 5)                 6405      
=================================================================
Total params: 3,419,429
Trainable params: 6,405
Non-trainable params: 3,413,024
_________________________________________________________________
None
Epoch 1/5
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/keras/optimizer_v2/optimizer_v2.py:375: UserWarning: The `lr` argument is deprecated, use `learning_rate` instead.
  "The `lr` argument is deprecated, use `learning_rate` instead.")
91/91 [==============================] - 6s 49ms/step - loss: 0.8756 - accuracy: 0.7689 - val_loss: 0.6990 - val_accuracy: 0.8551
Epoch 2/5
91/91 [==============================] - 4s 45ms/step - loss: 0.6632 - accuracy: 0.8856 - val_loss: 0.6706 - val_accuracy: 0.8835
Epoch 3/5
91/91 [==============================] - 4s 45ms/step - loss: 0.6257 - accuracy: 0.9090 - val_loss: 0.6627 - val_accuracy: 0.8920
Epoch 4/5
91/91 [==============================] - 4s 46ms/step - loss: 0.6064 - accuracy: 0.9214 - val_loss: 0.6562 - val_accuracy: 0.8920
Epoch 5/5
91/91 [==============================] - 4s 47ms/step - loss: 0.5894 - accuracy: 0.9303 - val_loss: 0.6510 - val_accuracy: 0.8892

ดูโครงสร้างโมเดลโดยละเอียด

model.summary()
Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
hub_keras_layer_v1v2_1 (HubK (None, 1280)              3413024   
_________________________________________________________________
dropout_1 (Dropout)          (None, 1280)              0         
_________________________________________________________________
dense_1 (Dense)              (None, 5)                 6405      
=================================================================
Total params: 3,419,429
Trainable params: 6,405
Non-trainable params: 3,413,024
_________________________________________________________________

ขั้นตอนที่ 3: ประเมินรูปแบบที่กำหนดเอง

ประเมินผลลัพธ์ของแบบจำลองรับการสูญเสียและความถูกต้องของแบบจำลอง

loss, accuracy = model.evaluate(test_data)
12/12 [==============================] - 1s 24ms/step - loss: 0.5999 - accuracy: 0.9292

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

# A helper function that returns 'red'/'black' depending on if its two input
# parameter matches or not.
def get_label_color(val1, val2):
  if val1 == val2:
    return 'black'
  else:
    return 'red'

# Then plot 100 test images and their predicted labels.
# If a prediction result is different from the label provided label in "test"
# dataset, we will highlight it in red color.
plt.figure(figsize=(20, 20))
predicts = model.predict_top_k(test_data)
for i, (image, label) in enumerate(test_data.gen_dataset().unbatch().take(100)):
  ax = plt.subplot(10, 10, i+1)
  plt.xticks([])
  plt.yticks([])
  plt.grid(False)
  plt.imshow(image.numpy(), cmap=plt.cm.gray)

  predict_label = predicts[i][0][0]
  color = get_label_color(predict_label,
                          test_data.index_to_label[label.numpy()])
  ax.xaxis.label.set_color(color)
  plt.xlabel('Predicted: %s' % predict_label)
plt.show()

png

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

ขั้นตอนที่ 4: ส่งออกไปยัง TensorFlow Lite Model

แปลงโมเดลที่ผ่านการฝึกอบรมเป็นรูปแบบโมเดล TensorFlow Lite พร้อมด้วย ข้อมูลเมตา เพื่อให้คุณสามารถใช้ในแอปพลิเคชัน ML บนอุปกรณ์ได้ในภายหลัง ไฟล์เลเบลและไฟล์คำศัพท์ถูกฝังอยู่ในข้อมูลเมตา ชื่อไฟล์ TFLite เริ่มต้นคือ model.tflite

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

model.export(export_dir='.')
INFO:tensorflow:Assets written to: /tmp/tmp2s_q22rj/assets
INFO:tensorflow:Assets written to: /tmp/tmp2s_q22rj/assets
WARNING:absl:For model inputs containing unsupported operations which cannot be quantized, the `inference_input_type` attribute will default to the original type.
INFO:tensorflow:Label file is inside the TFLite model with metadata.
INFO:tensorflow:Label file is inside the TFLite model with metadata.
INFO:tensorflow:Saving labels in /tmp/tmpo2h6s5wc/labels.txt
INFO:tensorflow:Saving labels in /tmp/tmpo2h6s5wc/labels.txt
INFO:tensorflow:TensorFlow Lite model exported successfully: ./model.tflite
INFO:tensorflow:TensorFlow Lite model exported successfully: ./model.tflite

ดู ตัวอย่างแอปพลิเคชันและคำแนะนำ เกี่ยวกับการ จัดประเภทรูปภาพ สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการรวมโมเดล TensorFlow Lite เข้ากับแอพมือถือ

โมเดลนี้สามารถรวมเข้ากับแอพ Android หรือ iOS โดยใช้ ImageClassifier API ของ ไลบรารีงาน TensorFlow Lite

รูปแบบการส่งออกที่อนุญาตอาจเป็นอย่างใดอย่างหนึ่งหรือรายการต่อไปนี้:

โดยค่าเริ่มต้นจะส่งออกโมเดล TensorFlow Lite พร้อมข้อมูลเมตา คุณยังสามารถเลือกส่งออกไฟล์ต่างๆ ตัวอย่างเช่นการเอ็กซ์พอร์ตเฉพาะไฟล์เลเบลดังนี้:

model.export(export_dir='.', export_format=ExportFormat.LABEL)
INFO:tensorflow:Saving labels in ./labels.txt
INFO:tensorflow:Saving labels in ./labels.txt

นอกจากนี้คุณยังสามารถประเมินรูปแบบ tflite กับ evaluate_tflite วิธี

model.evaluate_tflite('model.tflite', test_data)
{'accuracy': 0.9318801089918256}

การใช้งานขั้นสูง

ฟังก์ชัน create เป็นส่วนสำคัญของไลบรารีนี้ ใช้การเรียนรู้แบบถ่ายโอนด้วยรูปแบบที่กำหนดไว้ล่วงหน้าซึ่งคล้ายกับ บทช่วยสอน

ฟังก์ชัน create ประกอบด้วยขั้นตอนต่อไปนี้:

  1. แยกข้อมูลออกเป็นการฝึกอบรมการตรวจสอบข้อมูลการทดสอบตามพารามิเตอร์ validation_ratio และ test_ratio ค่าเริ่มต้นของ validation_ratio และ test_ratio คือ 0.1 และ 0.1
  2. ดาวน์โหลด Image Feature Vector เป็นโมเดลพื้นฐานจาก TensorFlow Hub โมเดลที่ฝึกไว้ล่วงหน้าเริ่มต้นคือ EfficientNet-Lite0
  3. เพิ่มส่วนหัวลักษณนามด้วย Dropout Layer ที่มี dropout_rate ระหว่าง head layer และ pre- dropout_rate model ค่าเริ่มต้น dropout_rate คือค่า dropout_rate ดีฟอลต์จาก make_image_classifier_lib โดย TensorFlow Hub
  4. ประมวลผลข้อมูลอินพุตดิบล่วงหน้า ในขณะนี้ขั้นตอนก่อนการประมวลผลรวมถึงการปรับค่าของพิกเซลภาพแต่ละภาพให้เป็นมาตรฐานเพื่อจำลองขนาดอินพุตและปรับขนาดให้เป็นขนาดอินพุตของโมเดล EfficientNet-Lite0 มีขนาดอินพุต [0, 1] และขนาดภาพอินพุต [224, 224, 3]
  5. ป้อนข้อมูลลงในโมเดลลักษณนาม โดยค่าเริ่มต้นพารามิเตอร์การฝึกเช่นยุคการฝึกขนาดแบทช์อัตราการเรียนรู้โมเมนตัมเป็นค่าเริ่มต้นจาก make_image_classifier_lib โดย TensorFlow Hub เฉพาะหัวหน้าลักษณนามเท่านั้นที่ได้รับการฝึกฝน

ในส่วนนี้เราจะอธิบายหัวข้อขั้นสูงหลายหัวข้อรวมถึงการเปลี่ยนไปใช้รูปแบบการจำแนกรูปภาพอื่นการเปลี่ยนพารามิเตอร์ไฮเปอร์พารามิเตอร์การฝึกอบรมเป็นต้น

ปรับแต่งการหาปริมาณหลังการฝึกอบรมในโมเดล TensorFLow Lite

การหาปริมาณหลังการฝึกอบรม เป็นเทคนิคการแปลงที่สามารถลดขนาดโมเดลและเวลาแฝงในการอนุมานขณะเดียวกันก็ปรับปรุงความเร็วในการอนุมานของ CPU และฮาร์ดแวร์ด้วยการลดความแม่นยำของโมเดลลงเล็กน้อย ดังนั้นจึงใช้กันอย่างแพร่หลายในการปรับโมเดลให้เหมาะสม

ไลบรารี Model Maker ใช้เทคนิคการหาปริมาณหลังการฝึกอบรมที่เป็นค่าเริ่มต้นเมื่อส่งออกโมเดล หากคุณต้องการปรับแต่งการหาปริมาณหลังการฝึกอบรม Model Maker รองรับตัวเลือกการหาปริมาณหลังการฝึกอบรมหลายรายการโดยใช้ QuantizationConfig เช่นกัน ลองใช้ float16 quantization เป็นตัวอย่าง ขั้นแรกกำหนดค่าการกำหนดค่าปริมาณ

config = QuantizationConfig.for_float16()

จากนั้นเราส่งออกโมเดล TensorFlow Lite ด้วยการกำหนดค่าดังกล่าว

model.export(export_dir='.', tflite_filename='model_fp16.tflite', quantization_config=config)
INFO:tensorflow:Assets written to: /tmp/tmpalsh2f4f/assets
INFO:tensorflow:Assets written to: /tmp/tmpalsh2f4f/assets
INFO:tensorflow:Label file is inside the TFLite model with metadata.
INFO:tensorflow:Label file is inside the TFLite model with metadata.
INFO:tensorflow:Saving labels in /tmp/tmpjwujjf3x/labels.txt
INFO:tensorflow:Saving labels in /tmp/tmpjwujjf3x/labels.txt
INFO:tensorflow:TensorFlow Lite model exported successfully: ./model_fp16.tflite
INFO:tensorflow:TensorFlow Lite model exported successfully: ./model_fp16.tflite

ใน Colab คุณสามารถดาวน์โหลดโมเดลชื่อ model_fp16.tflite จากแถบด้านข้างทางซ้ายเช่นเดียวกับส่วนการอัปโหลดที่กล่าวถึงข้างต้น

เปลี่ยนรุ่น

เปลี่ยนเป็นโมเดลที่รองรับในไลบรารีนี้

ไลบรารีนี้รองรับรุ่น EfficientNet-Lite, MobileNetV2, ResNet50 ในตอนนี้ EfficientNet-Lite เป็นตระกูลของรูปแบบการจำแนกภาพที่สามารถบรรลุความแม่นยำที่ล้ำสมัยและเหมาะสำหรับอุปกรณ์ Edge โมเดลเริ่มต้นคือ EfficientNet-Lite0

เราสามารถเปลี่ยนโมเดลเป็น MobileNetV2 ได้โดยเพียงแค่ตั้งค่าพารามิเตอร์ model_spec เป็นข้อกำหนดรุ่น MobileNetV2 ในวิธีการ create

model = image_classifier.create(train_data, model_spec=model_spec.get('mobilenet_v2'), validation_data=validation_data)
INFO:tensorflow:Retraining the models...
INFO:tensorflow:Retraining the models...
WARNING:tensorflow:Please add `keras.layers.InputLayer` instead of `keras.Input` to Sequential model. `keras.Input` is intended to be used by Functional model.
WARNING:tensorflow:Please add `keras.layers.InputLayer` instead of `keras.Input` to Sequential model. `keras.Input` is intended to be used by Functional model.
Model: "sequential_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
hub_keras_layer_v1v2_2 (HubK (None, 1280)              2257984   
_________________________________________________________________
dropout_2 (Dropout)          (None, 1280)              0         
_________________________________________________________________
dense_2 (Dense)              (None, 5)                 6405      
=================================================================
Total params: 2,264,389
Trainable params: 6,405
Non-trainable params: 2,257,984
_________________________________________________________________
None
Epoch 1/5
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/keras/optimizer_v2/optimizer_v2.py:375: UserWarning: The `lr` argument is deprecated, use `learning_rate` instead.
  "The `lr` argument is deprecated, use `learning_rate` instead.")
91/91 [==============================] - 7s 50ms/step - loss: 0.9188 - accuracy: 0.7565 - val_loss: 0.7582 - val_accuracy: 0.8409
Epoch 2/5
91/91 [==============================] - 4s 45ms/step - loss: 0.6916 - accuracy: 0.8712 - val_loss: 0.7522 - val_accuracy: 0.8608
Epoch 3/5
91/91 [==============================] - 4s 48ms/step - loss: 0.6505 - accuracy: 0.9062 - val_loss: 0.7361 - val_accuracy: 0.8580
Epoch 4/5
91/91 [==============================] - 4s 46ms/step - loss: 0.6184 - accuracy: 0.9210 - val_loss: 0.7362 - val_accuracy: 0.8636
Epoch 5/5
91/91 [==============================] - 4s 47ms/step - loss: 0.6006 - accuracy: 0.9313 - val_loss: 0.7257 - val_accuracy: 0.8636

ประเมินโมเดล MobileNetV2 ที่ได้รับการฝึกฝนใหม่เพื่อดูความแม่นยำและความสูญเสียในข้อมูลการทดสอบ

loss, accuracy = model.evaluate(test_data)
12/12 [==============================] - 1s 32ms/step - loss: 0.6459 - accuracy: 0.9019

เปลี่ยนเป็นโมเดลใน TensorFlow Hub

นอกจากนี้เรายังสามารถเปลี่ยนไปใช้โมเดลใหม่อื่น ๆ ที่ป้อนรูปภาพและส่งออกเวกเตอร์คุณลักษณะด้วยรูปแบบ TensorFlow Hub

ในฐานะที่เป็นโมเดล Inception V3 เป็นตัวอย่างเราสามารถกำหนด inception_v3_spec ซึ่งเป็นอ็อบเจ็กต์ของ image_classifier ModelSpec และมีข้อมูลจำเพาะของโมเดล Inception V3

เราจำเป็นต้องระบุชื่อรุ่น name , URL ของ TensorFlow Hub รูปแบบ uri ในขณะเดียวกันค่าเริ่มต้นของ input_image_shape คือ [224, 224] เราจำเป็นต้องเปลี่ยนเป็น [299, 299] สำหรับรุ่น Inception V3

inception_v3_spec = image_classifier.ModelSpec(
    uri='https://tfhub.dev/google/imagenet/inception_v3/feature_vector/1')
inception_v3_spec.input_image_shape = [299, 299]

จากนั้นโดยการตั้งค่าพารามิเตอร์ model_spec เป็น inception_v3_spec ในวิธีการ create เราสามารถฝึกโมเดล Inception V3 ใหม่ได้

ขั้นตอนที่เหลือเหมือนกันทุกประการและเราจะได้รับโมเดล InceptionV3 TensorFlow Lite ที่กำหนดเองได้ในที่สุด

เปลี่ยนรูปแบบที่คุณกำหนดเอง

หากเราต้องการใช้โมเดลแบบกำหนดเองที่ไม่ได้อยู่ใน TensorFlow Hub เราควรสร้างและส่งออก ModelSpec ใน TensorFlow Hub

จากนั้นเริ่มกำหนดวัตถุ ModelSpec เหมือนกระบวนการข้างต้น

เปลี่ยนพารามิเตอร์การฝึกอบรม

นอกจากนี้เรายังสามารถเปลี่ยน dropout_rate การฝึกอบรมเช่น epochs , dropout_rate และ batch_size ที่อาจส่งผลต่อความแม่นยำของโมเดล พารามิเตอร์ของโมเดลที่คุณสามารถปรับได้ ได้แก่ :

  • epochs : epochs อื่น ๆ สามารถบรรลุความแม่นยำได้ดีขึ้นจนกว่าจะบรรจบกัน แต่การฝึกฝนสำหรับยุคต่างๆมากเกินไปอาจนำไปสู่การสวมใส่มากเกินไป
  • dropout_rate : อัตราการออกกลางคันหลีกเลี่ยงการใส่อุปกรณ์มากเกินไป ไม่มีโดยค่าเริ่มต้น
  • batch_size : จำนวนตัวอย่างที่จะใช้ในขั้นตอนการฝึกอบรมเดียว ไม่มีโดยค่าเริ่มต้น
  • validation_data : ข้อมูลการตรวจสอบ หากไม่มีให้ข้ามขั้นตอนการตรวจสอบความถูกต้อง ไม่มีโดยค่าเริ่มต้น
  • train_whole_model : หากเป็นจริงโมดูล Hub จะได้รับการฝึกฝนร่วมกับเลเยอร์การจำแนกที่อยู่ด้านบน มิฉะนั้นให้ฝึกเฉพาะเลเยอร์การจัดประเภทด้านบนเท่านั้น ไม่มีโดยค่าเริ่มต้น
  • learning_rate : อัตราการเรียนรู้พื้นฐาน ไม่มีโดยค่าเริ่มต้น
  • momentum : Python ลอยส่งต่อไปยังเครื่องมือเพิ่มประสิทธิภาพ ใช้เฉพาะเมื่อ use_hub_library เป็น True ไม่มีโดยค่าเริ่มต้น
  • shuffle : บูลีนไม่ว่าควรจะสับข้อมูลหรือไม่ เป็นเท็จโดยปริยาย
  • use_augmentation : บูลีนใช้การเพิ่มข้อมูลสำหรับการประมวลผลล่วงหน้า เป็นเท็จโดยปริยาย
  • use_hub_library : บูลีนใช้ make_image_classifier_lib จากฮับเทนเซอร์โฟลว์เพื่อฝึกโมเดลใหม่ ไปป์ไลน์การฝึกอบรมนี้สามารถบรรลุประสิทธิภาพที่ดีขึ้นสำหรับชุดข้อมูลที่ซับซ้อนซึ่งมีหลายหมวดหมู่ True ตามค่าเริ่มต้น
  • warmup_steps : จำนวนขั้นตอนการวอร์มอัพสำหรับกำหนดการวอร์มอัพในอัตราการเรียนรู้ ถ้าไม่มีระบบจะใช้ warmup_steps เริ่มต้นซึ่งเป็นขั้นตอนการฝึกอบรมทั้งหมดในสองยุค ใช้เฉพาะเมื่อ use_hub_library เป็น False ไม่มีโดยค่าเริ่มต้น
  • model_dir : เป็นทางเลือกตำแหน่งของไฟล์จุดตรวจโมเดล ใช้เฉพาะเมื่อ use_hub_library เป็น False ไม่มีโดยค่าเริ่มต้น

พารามิเตอร์ที่ไม่มีโดยค่าเริ่มต้นเช่น epochs จะได้รับพารามิเตอร์เริ่มต้นที่เป็นรูปธรรมใน make_image_classifier_lib จากไลบรารี TensorFlow Hub หรือ train_image_classifier_lib

ตัวอย่างเช่นเราสามารถฝึกฝนกับยุคต่างๆได้มากขึ้น

model = image_classifier.create(train_data, validation_data=validation_data, epochs=10)
INFO:tensorflow:Retraining the models...
INFO:tensorflow:Retraining the models...
WARNING:tensorflow:Please add `keras.layers.InputLayer` instead of `keras.Input` to Sequential model. `keras.Input` is intended to be used by Functional model.
WARNING:tensorflow:Please add `keras.layers.InputLayer` instead of `keras.Input` to Sequential model. `keras.Input` is intended to be used by Functional model.
Model: "sequential_3"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
hub_keras_layer_v1v2_3 (HubK (None, 1280)              3413024   
_________________________________________________________________
dropout_3 (Dropout)          (None, 1280)              0         
_________________________________________________________________
dense_3 (Dense)              (None, 5)                 6405      
=================================================================
Total params: 3,419,429
Trainable params: 6,405
Non-trainable params: 3,413,024
_________________________________________________________________
None
Epoch 1/10
91/91 [==============================] - 6s 50ms/step - loss: 0.8710 - accuracy: 0.7682 - val_loss: 0.6951 - val_accuracy: 0.8722
Epoch 2/10
91/91 [==============================] - 4s 46ms/step - loss: 0.6585 - accuracy: 0.8925 - val_loss: 0.6643 - val_accuracy: 0.8807
Epoch 3/10
91/91 [==============================] - 4s 48ms/step - loss: 0.6215 - accuracy: 0.9131 - val_loss: 0.6533 - val_accuracy: 0.8835
Epoch 4/10
91/91 [==============================] - 4s 45ms/step - loss: 0.6021 - accuracy: 0.9186 - val_loss: 0.6467 - val_accuracy: 0.8864
Epoch 5/10
91/91 [==============================] - 4s 47ms/step - loss: 0.5890 - accuracy: 0.9320 - val_loss: 0.6461 - val_accuracy: 0.8835
Epoch 6/10
91/91 [==============================] - 4s 42ms/step - loss: 0.5758 - accuracy: 0.9399 - val_loss: 0.6411 - val_accuracy: 0.8864
Epoch 7/10
91/91 [==============================] - 4s 42ms/step - loss: 0.5676 - accuracy: 0.9475 - val_loss: 0.6367 - val_accuracy: 0.8949
Epoch 8/10
91/91 [==============================] - 4s 42ms/step - loss: 0.5614 - accuracy: 0.9485 - val_loss: 0.6369 - val_accuracy: 0.8920
Epoch 9/10
91/91 [==============================] - 4s 42ms/step - loss: 0.5536 - accuracy: 0.9536 - val_loss: 0.6397 - val_accuracy: 0.8920
Epoch 10/10
91/91 [==============================] - 4s 42ms/step - loss: 0.5489 - accuracy: 0.9550 - val_loss: 0.6385 - val_accuracy: 0.8977

ประเมินแบบจำลองที่ได้รับการฝึกอบรมใหม่ด้วย 10 ยุคการฝึกอบรม

loss, accuracy = model.evaluate(test_data)
12/12 [==============================] - 1s 24ms/step - loss: 0.5883 - accuracy: 0.9428

อ่านเพิ่มเติม

คุณสามารถอ่านตัวอย่างการ จัดหมวดหมู่รูปภาพ ของเราเพื่อเรียนรู้รายละเอียดทางเทคนิค สำหรับข้อมูลเพิ่มเติมโปรดดูที่: