รู้จักดอกไม้ด้วย TensorFlow Lite บน iOS

657431be3173fa86.png

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

codelab นี้ใช้ TensorFlow Lite เพื่อเรียกใช้โมเดลการจดจำรูปภาพบนอุปกรณ์ iOS

สิ่งที่คุณจะได้เรียนรู้

  • วิธีเพิ่มประสิทธิภาพโมเดลของคุณโดยใช้ตัวแปลง TFLite
  • วิธีเรียกใช้ในแอป iOS ที่สร้างไว้ล่วงหน้าโดยใช้ล่าม TFLite

สิ่งที่คุณจะสร้าง

แอพกล้องง่ายๆที่รันโปรแกรมจดจำภาพ TensorFlow เพื่อระบุดอกไม้

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

หากคุณกำลังทำ codelab บนฮาร์ดแวร์ของคุณเองโปรดตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งสิ่งต่อไปนี้แล้ว:

  • Xcode 10 หรือสูงกว่า
  • CocoaPods 1.8.0 หรือสูงกว่า

c45ecd122998622e.png

ใบอนุญาต: ใช้งานได้ฟรี

codelab นี้จะใช้ Colaboratory และ Xcode

เปิด Colab ซึ่งใช้ TensorFlow Lite Model Maker เพื่อฝึกลักษณนามให้จดจำดอกไม้โดยใช้การเรียนรู้การถ่ายโอนและส่งออกโมเดล TFLite เพื่อใช้ในแอพมือถือ

โคลนที่เก็บ Git

คำสั่งต่อไปนี้จะโคลนที่เก็บ Git ที่มีไฟล์ที่จำเป็นสำหรับ codelab นี้:

git clone https://github.com/tensorflow/examples.git

ตอนนี้ cd ลงในรูทโปรเจ็กต์ Xcode ของโคลนที่คุณเพิ่งสร้างขึ้น นั่นคือที่ที่คุณจะทำงานในส่วนที่เหลือของ codelab นี้:

cd examples/lite/examples/image_classification/ios

ติดตั้งการอ้างอิง

ใช้ CocoaPods ติดตั้งการอ้างอิงของแอป iOS (รวมถึง TensorFlow Lite) เมื่อคำสั่งติดตั้งเสร็จสิ้นให้เปิด ImageClassification.xcworkspace เพื่อเปิดโปรเจ็กต์ใน Xcode

pod install --repo-update
open ImageClassification.xcworkspace

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

หากคุณต้องการเรียกใช้ codelab นี้ในโปรแกรมจำลองคุณจะต้องคัดลอกภาพไปยัง Pasteboard จาก Safari ในโปรแกรมจำลองนั้นเอง ขั้นตอนในการประมวลผลภาพในเครื่องจำลองมีดังนี้

  1. สร้างแอปไปยังเป้าหมายการจำลองที่คุณเลือก
  2. ในโปรแกรมจำลอง iOS ให้กด Cmd + Shift + H เพื่อย่อขนาดแอป
  3. แตะ Safari ที่ด้านล่างของหน้าจอหลักแล้วค้นหารูปภาพ
  4. ในผลการค้นหารูปภาพของ Google ให้แตะที่ผลการค้นหาแล้วกดภาพค้างไว้ ในกล่องโต้ตอบที่ปรากฏขึ้นให้เลือก "คัดลอก"
  5. กลับไปที่แอป TFL Classify รูปภาพที่คัดลอกควรแสดงโดยอัตโนมัติพร้อมกับผลการอนุมาน หากไม่เป็นเช่นนั้นตรวจสอบให้แน่ใจว่าคุณได้คัดลอกข้อมูลรูปภาพเองไม่ใช่ URL ของรูปภาพ

ทดสอบสร้างและติดตั้งแอป

ก่อนที่จะทำการเปลี่ยนแปลงใด ๆ กับแอพให้เรียกใช้เวอร์ชันที่มาพร้อมกับที่เก็บ เลือกอุปกรณ์ iOS ของคุณจากเมนูแบบเลื่อนลงด้านซ้ายบน:

275753d3a77a0df3.png

จากนั้นกด Cmd + R หรือกดปุ่มเล่น f96cf117245c0fa6.png ปุ่มใน Xcode เพื่อสร้างแอปไปยังอุปกรณ์ของคุณ แอปควรเปิดโดยอัตโนมัติเมื่อติดตั้งลงในอุปกรณ์ของคุณ

แอปเวอร์ชันนี้ใช้ MobileNet มาตรฐานซึ่งผ่านการฝึกอบรมมาแล้วในหมวด 1000 ImageNet ควรมีลักษณะดังนี้:

d11436f0bb5a75db.jpeg

การตั้งค่าแอพเริ่มต้นจะแบ่งประเภทรูปภาพเป็นหนึ่งในคลาส ImageNet 1,000 คลาสโดยใช้ MobileNet มาตรฐาน

ตอนนี้เรามาปรับเปลี่ยนแอปเพื่อให้แอปใช้โมเดลที่ได้รับการฝึกฝนใหม่สำหรับหมวดหมู่รูปภาพที่กำหนดเองของเราซึ่งได้รับการฝึกฝนใน Colab

เพิ่มไฟล์โมเดลของคุณลงในโปรเจ็กต์

รีซอร์สโมเดลของโปรเจ็กต์อยู่ใน ImageClassification > Model ในตัวนำทางโปรเจ็กต์ Xcode หากต้องการแทนที่ไฟล์ก่อนอื่นให้ลบไฟล์ที่มีอยู่สองไฟล์ในกลุ่ม Model เมื่อได้รับแจ้งให้เลือก "ย้ายไปที่ถังขยะ":

cf2f7fefb2e5075f.png

จากนั้นลากไฟล์ model.tflite และ labels.txt คุณดาวน์โหลดจาก Colab ลงในกลุ่ม Model เมื่อได้รับแจ้งตรวจสอบให้แน่ใจว่า Copy items if needed และ Add to targets ถูกเลือกทั้งคู่

281d7eb72635bb5f.png

แก้ไขโค้ดของแอพ

เพื่อให้แอปของเราทำงานได้เราจำเป็นต้องอัปเดตเส้นทางของลอจิกการโหลดโมเดลเพื่อให้ชี้ไปที่โมเดลใหม่ที่เราเพิ่มเข้าไป

เปิด ModelDataHandler.swift (เส้นทางการนำทาง Xcode: ImageClassification -> ModelDataHandler -> ModelDataHandler.swift) และเปลี่ยน บรรทัด 36 เป็น

// before
static let modelInfo: FileInfo = (name: "mobilenet_quant_v1_224", extension: "tflite")

// after
static let modelInfo: FileInfo = (name: "model", extension: "tflite")

อย่าลืมบันทึกการเปลี่ยนแปลงทั้งหมด

กด Cmd + B หรือกดปุ่ม Play f96cf117245c0fa6.png ปุ่มใน Xcode เพื่อสร้างแอปไปยังอุปกรณ์ของคุณ เมื่อเปิดตัวแอปควรมีลักษณะดังนี้:

c45ecd122998622e.png

คุณสามารถกดปุ่มเปิด / ปิดและเพิ่มระดับเสียงไว้ด้วยกันเพื่อถ่ายภาพหน้าจอ

ตอนนี้ลองค้นหาดอกไม้ในเว็บเล็งกล้องไปที่หน้าจอคอมพิวเตอร์และดูว่ารูปภาพเหล่านั้นถูกจัดประเภทอย่างถูกต้องหรือไม่

หรือให้เพื่อนถ่ายภาพคุณและค้นหาว่า TensorFlower ของคุณเป็นแบบไหน \\ uf339\\ uf33b\\ uf337 !

ตอนนี้คุณมีแอปที่ใช้งานอยู่ลองดูรหัสเฉพาะของ TensorFlow Lite

TensorFlowLiteSwift

แอพนี้ใช้ไลบรารี TensorFlowLite Swift ผ่าน CocoaPods ไลบรารี Swift เป็นกระดาษห่อหุ้มแบบบางบน TFLite C API ซึ่งเป็นตัวห่อของไลบรารี TFLite C ++

บรรทัดต่อไปนี้ในไฟล์ Podfile ของโมดูลจะดึงที่เก็บข้อมูลจำเพาะ CocoaPods แบบพ็อดโกลบอลเวอร์ชันล่าสุดลงในโปรเจ็กต์

Podfile

target 'ImageClassification' do
  use_frameworks!

  # Pods for ImageClassification
   pod 'TensorFlowLiteSwift'
end

ใช้ TensorFlow Lite Swift API

โค้ดที่โต้ตอบกับ TensorFlow Lite มีอยู่ใน ModelDataHandler.swift

ติดตั้ง

บล็อกแรกที่น่าสนใจคือตัวเริ่มต้นสำหรับ ModelDataHandler :

ModelDataHandler.swift

/// A failable initializer for `ModelDataHandler`. A new instance is created if the model and
/// labels files are successfully loaded from the app's main bundle. Default `threadCount` is 1.
init?(modelFileInfo: FileInfo, labelsFileInfo: FileInfo, threadCount: Int = 1) {
  let modelFilename = modelFileInfo.name

  // Construct the path to the model file.
  guard let modelPath = Bundle.main.path(
    forResource: modelFilename,
    ofType: modelFileInfo.extension
  ) else {
    print("Failed to load the model file with name: \(modelFilename).")
    return nil
  }

  // Specify the options for the `Interpreter`.
  self.threadCount = threadCount
  var options = InterpreterOptions()
  options.threadCount = threadCount
  do {
    // Create the `Interpreter`.
    interpreter = try Interpreter(modelPath: modelPath, options: options)
    // Allocate memory for the model's input `Tensor`s.
    try interpreter.allocateTensors()
  } catch let error {
    print("Failed to create the interpreter with error: \(error.localizedDescription)")
    return nil
  }
  // Load the classes listed in the labels file.
  loadLabels(fileInfo: labelsFileInfo)
}

มีสองสามบรรทัดที่ควรกล่าวถึงในรายละเอียดเพิ่มเติม

บรรทัดต่อไปนี้สร้างตัวแปล TFLite:

ModelDataHandler.swift

interpreter = try Interpreter(modelPath: modelPath, options: options)

ล่ามมีหน้าที่ส่งข้อมูลดิบผ่านกราฟ TensorFlow เราส่งล่ามพา ธ ไปยังโมเดลของเราบนดิสก์จากนั้นล่ามจะโหลดเป็น FlatBufferModel

บรรทัดสุดท้ายโหลดรายการป้ายกำกับ:

loadLabels(fileInfo: labelsFileInfo)

ทั้งหมดนี้คือการโหลดสตริงจากไฟล์ข้อความลงในหน่วยความจำ

เรียกใช้โมเดล

บล็อกที่สองที่น่าสนใจคือเมธอด runModel ใช้ CVPixelBuffer เป็นอินพุตเรียกใช้ล่ามและส่งคืนข้อความเพื่อพิมพ์ในแอป

ModelDataHandler.swift

try interpreter.copy(rgbData, toInputAt: 0)
// ...
try interpreter.invoke()
// ...
outputTensor = try interpreter.output(at: 0)

ลิงค์สำหรับข้อมูลเพิ่มเติมมีดังต่อไปนี้: