Nhận biết hoa bằng TensorFlow Lite trên iOS

1. Giới thiệu

657431be3173fa86.pngS

TensorFlow là một khung máy học đa năng. Bạn có thể sử dụng TensorFlow ở bất cứ đâu, từ huấn luyện các mô hình lớn trên các cụm trên đám mây, cho đến chạy các mô hình cục bộ trên một hệ thống nhúng như điện thoại.

Lớp học lập trình này sử dụng TensorFlow Lite để chạy mô hình nhận dạng hình ảnh trên thiết bị iOS.

Kiến thức bạn sẽ học được

  • Cách tối ưu hoá mô hình bằng bộ chuyển đổi TFLite.
  • Cách chạy tệp trong ứng dụng iOS được tạo sẵn bằng trình phiên dịch TFLite.

Sản phẩm bạn sẽ tạo ra

Một ứng dụng máy ảnh đơn giản chạy chương trình nhận dạng hình ảnh TensorFlow để nhận diện các loại hoa.

Điều kiện tiên quyết

Nếu bạn đang thực hiện lớp học lập trình này trên phần cứng của riêng mình, hãy đảm bảo rằng bạn đã cài đặt các mục sau:

  • Xcode 10 trở lên
  • CocoaPods 1.8.0 trở lên

c45ecd122998622e.png

Giấy phép: Sử dụng miễn phí

2. Huấn luyện trình nhận dạng hoa bằng Colab

Lớp học lập trình này sẽ sử dụng Colaboratory và Xcode.

Mở Colab (sử dụng Trình tạo mô hình TensorFlow Lite để huấn luyện một thuật toán phân loại nhằm nhận dạng hoa bằng cách sử dụng công nghệ học chuyển giao và xuất mô hình TFLite để dùng trong ứng dụng di động).

3. Thiết lập thư mục đang hoạt động

Sao chép kho lưu trữ Git

Lệnh sau đây sẽ sao chép kho lưu trữ Git, chứa các tệp cần thiết cho lớp học lập trình này:

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

Bây giờ, hãy cd vào gốc dự án Xcode của bản sao mà bạn vừa tạo. Đó là nơi bạn sẽ tiếp tục làm việc trong phần còn lại của lớp học lập trình này:

cd examples/lite/examples/image_classification/ios

4. Thiết lập ứng dụng iOS

Cài đặt phần phụ thuộc

Bằng cách sử dụng CocoaPods, hãy cài đặt các phần phụ thuộc của ứng dụng iOS (bao gồm cả TensorFlow Lite). Sau khi lệnh cài đặt hoàn tất, hãy mở ImageClassification.xcworkspace để mở dự án trong Xcode.

pod install --repo-update
open ImageClassification.xcworkspace

5. Chạy ứng dụng thử nghiệm

Để sử dụng máy ảnh, ứng dụng phải chạy trên thiết bị thực, vì Trình mô phỏng iOS không có quyền truy cập vào máy ảnh của máy Mac. Để xây dựng ứng dụng cho thiết bị iOS, bạn phải đăng ký tham gia Chương trình dành cho nhà phát triển của Apple hoặc có quyền truy cập vào thiết bị mà người khác đã cấp cho bạn.

Nếu muốn chạy lớp học lập trình này trong trình mô phỏng, bạn cần phải sao chép hình ảnh vào bảng dán từ Safari trong chính trình mô phỏng. Dưới đây là các bước xử lý hình ảnh trong trình mô phỏng:

  1. Xây dựng ứng dụng theo mục tiêu trình mô phỏng mà bạn chọn.
  2. Trong trình mô phỏng iOS, hãy nhấn tổ hợp phím Cmd+Shift+H để thu nhỏ ứng dụng.
  3. Nhấn vào Safari ở cuối màn hình chính và tìm kiếm một hình ảnh.
  4. Trong kết quả tìm kiếm của Google Hình ảnh, hãy nhấn vào một kết quả rồi nhấn và giữ hình ảnh đó. Trong hộp thoại bật lên, hãy chọn "Copy" (Sao chép).
  5. Quay lại ứng dụng TFL Classify. Hình ảnh được sao chép sẽ tự động hiển thị cùng với kết quả suy luận. Nếu không, hãy đảm bảo rằng bạn đã sao chép chính dữ liệu hình ảnh chứ không phải URL đến hình ảnh.

Kiểm thử bản dựng và cài đặt ứng dụng

Trước khi thay đổi bất cứ điều gì đối với ứng dụng, hãy chạy phiên bản đi kèm với kho lưu trữ. Chọn thiết bị iOS của bạn từ trình đơn thả xuống ở trên cùng bên trái:

275753d3a77a0df3.pngs

Sau đó, nhấn Cmd+R hoặc nhấn nút Phát f96cf117245c0fa6.png trong Xcode để tạo ứng dụng cho thiết bị của bạn. Ứng dụng sẽ tự động khởi chạy sau khi được cài đặt vào thiết bị của bạn.

Phiên bản này của ứng dụng sử dụng MobileNet tiêu chuẩn, được huấn luyện trước về 1000 danh mục ImageNet. Hàm này có dạng như sau:

d11436f0bb5a75db.jpeg

6. Chạy ứng dụng tuỳ chỉnh

Chế độ thiết lập ứng dụng mặc định sẽ phân loại hình ảnh vào một trong 1000 lớp ImageNet, bằng cách sử dụng MobileNet tiêu chuẩn.

Bây giờ, hãy sửa đổi ứng dụng đó để ứng dụng đó sẽ sử dụng mô hình được huấn luyện lại cho các danh mục hình ảnh tuỳ chỉnh được huấn luyện trong Colab.

7. Chuyển đổi ứng dụng để chạy mô hình

Thêm tệp mô hình vào dự án

Tài nguyên mô hình của dự án nằm tại ImageClassification > Model trong trình điều hướng dự án Xcode. Để thay thế các tệp đó, trước tiên, hãy xoá 2 tệp hiện có trong nhóm Model. Khi được nhắc, hãy chọn "Chuyển vào Thùng rác":

cf2f7fefb2e5075f.png

Sau đó, hãy kéo các tệp model.tflitelabels.txt mà bạn đã tải xuống từ Colab vào Nhóm mô hình. Khi được nhắc, hãy đảm bảo bạn đã chọn cả Copy items if neededAdd to targets.

281d7eb72635bb5f.png.

Sửa đổi mã của ứng dụng

Để ứng dụng hoạt động được, chúng ta cần cập nhật đường dẫn của logic tải mô hình để trỏ đến mô hình mới mà chúng ta đã thêm.

Mở ModelDataHandler.swift (đường dẫn điều hướng Xcode: ImageAnalysis -> ModelDataHandler -> ModelDataHandler.swift) và thay đổi dòng 36 thành

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

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

Hãy đảm bảo lưu tất cả các thay đổi.

8. Chạy ứng dụng tuỳ chỉnh

Nhấn Cmd+B hoặc nhấn nút Phát f96cf117245c0fa6.png trong Xcode để tạo ứng dụng cho thiết bị của bạn. Sau khi khởi chạy, ứng dụng sẽ có dạng như sau:

c45ecd122998622e.png

Bạn có thể giữ đồng thời nút nguồn và nút tăng âm lượng để chụp ảnh màn hình.

Bây giờ, hãy thử tìm kiếm hoa trên web, hướng máy ảnh về phía màn hình máy tính và xem những hình ảnh đó có được phân loại chính xác không.

Hoặc nhờ một người bạn chụp ảnh bạn và tìm ra loại TensorFlow mà bạn là \\uf339 \\uf33b \\uf337!

9. Cách thức hoạt động

Bây giờ, khi ứng dụng đã chạy, hãy xem đoạn mã dành riêng cho TensorFlow Lite.

TensorFlowLiteSwift

Ứng dụng này sử dụng thư viện TensorFlowLite Swift thông qua CocoaPods. Thư viện Swift là một trình bao bọc mỏng trên TFLite C API. Đây là một trình bao bọc của thư viện TFLite C++.

Các dòng sau trong tệp Podfile của mô-đun sẽ kéo phiên bản mới nhất của kho lưu trữ thông số kỹ thuật CocoaPods trên toàn cầu của nhóm vào dự án.

Podfile

target 'ImageClassification' do
  use_frameworks!

  # Pods for ImageClassification
   pod 'TensorFlowLiteSwift'
end

Sử dụng API TensorFlow Lite Swift

Tất cả mã tương tác với TensorFlow Lite đều có trong ModelDataHandler.swift.

Thiết lập

Khối quan tâm đầu tiên là trình khởi tạo cho 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)
}

Có một số dòng mà bạn cần thảo luận chi tiết hơn.

Dòng sau đây sẽ tạo trình phiên dịch TFLite:

ModelDataHandler.swift

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

Trình phiên dịch chịu trách nhiệm truyền dữ liệu thô đầu vào thông qua biểu đồ TensorFlow. Chúng ta truyền đường dẫn đến mô hình của trình thông dịch trên đĩa và sau đó trình thông dịch tải đường dẫn dưới dạng FlatBufferModel.

Dòng cuối cùng tải danh sách nhãn:

loadLabels(fileInfo: labelsFileInfo)

Tất cả những việc này chỉ là tải các chuỗi từ một tệp văn bản vào bộ nhớ.

Chạy mô hình

Khối quan tâm thứ hai là phương thức runModel. Phương thức này sẽ lấy CVPixelBuffer làm dữ liệu đầu vào, chạy trình phiên dịch và trả về văn bản cần in trong ứng dụng.

ModelDataHandler.swift

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

10. Tiếp theo là gì?

Bạn có thể xem thêm thông tin qua một số đường liên kết sau đây: