Tích hợp Mô hình tuỳ chỉnh vào Ứng dụng của bạn

1. Trước khi bắt đầu

Trong lớp học lập trình đầu tiên của loạt video này, bạn đã tạo một ứng dụng rất đơn giản sử dụng tính năng Gắn nhãn hình ảnh để phân tích cú pháp nội dung của hình ảnh. Bạn đã đưa cho bạn hình ảnh của một bông hoa cúc, và trả lại cho bạn rằng nó nhìn thấy những thứ như một cánh hoa hoặc bầu trời. Sau đó, trong lớp học lập trình thứ hai, bạn đã chuyển sang sử dụng Python để huấn luyện một mô hình mới, tuỳ chỉnh có khả năng nhận diện 5 loại hoa khác nhau.

Trong lớp học lập trình này, bạn sẽ cập nhật ứng dụng từ phòng thí nghiệm đầu tiên bằng mô hình của phòng thí nghiệm thứ hai!

Bạn có thể lấy mã nguồn đầy đủ cho lớp học lập trình này bằng cách sao chép kho lưu trữ này. Bạn sẽ thấy các thư mục con cho Android và iOS. Mã của lớp học lập trình trước có sẵn dưới dạng ImageClassifierStep1 nếu bạn muốn làm theo. Mã hoàn thiện cho lớp học lập trình này có sẵn dưới dạng ImageClassifierStep2.

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

  • Bạn chắc hẳn đã hoàn thành 2 lớp học lập trình đầu tiên trong lộ trình học tập này

Sản phẩm bạn sẽ xây dựng và học hỏi

  • Tích hợp mô hình tuỳ chỉnh, được huấn luyện trong phòng thí nghiệm trước, vào một ứng dụng Android hoặc iOS

Bạn cần có

  • Android Studio, có tại developer.android.com/studio cho phần Android của phòng thí nghiệm
  • Xcode có trên App Store của Apple, dành cho phần iOS của phòng thí nghiệm này

2. Tải ứng dụng Starter

Trước tiên, bạn cần có ứng dụng này trong Lớp học lập trình "Xây dựng ứng dụng thị giác máy tính" đầu tiên trên Android hoặc iOS. Nếu bạn đã trải qua phòng thí nghiệm này, nó sẽ được gọi là ImageClassifierStep1. Nếu không muốn truy cập vào phòng thí nghiệm, bạn có thể sao chép phiên bản hoàn thiện từ kho lưu trữ

Hãy mở tệp này trong Android Studio, thực hiện mọi nội dung cập nhật cần thiết và khi ứng dụng đã sẵn sàng chạy để đảm bảo ứng dụng hoạt động. Bạn sẽ thấy như sau:

f3703d45d1332d1d.png

Đây là một ứng dụng sơ khai nhưng nó cho thấy một số chức năng rất mạnh mẽ chỉ với một đoạn mã ngắn. Tuy nhiên, nếu muốn bông hoa này được nhận dạng là hoa cúc chứ không chỉ là một bông hoa, bạn sẽ phải cập nhật ứng dụng để sử dụng mô hình tuỳ chỉnh trong lớp học lập trình Tạo mô hình tuỳ chỉnh cho thuật toán phân loại hình ảnh.

3. Cập nhật build.gradle để sử dụng các Mô hình Bộ công cụ học máy tuỳ chỉnh

  1. Sử dụng Android Studio, tìm tệp build.gradle ở cấp ứng dụng. Cách dễ nhất để thực hiện việc này là trong trình khám phá dự án. Đảm bảo Android được chọn ở trên cùng và bạn sẽ thấy thư mục Gradle Scripts (Tập lệnh Gradle) ở dưới cùng.
  2. Mở tệp dành cho Module (Mô-đun), với tên ứng dụng của bạn đứng trước ".app" như được hiển thị ở đây – (Module: ImageClassifierStep1.app):

8fe1d04b40610047.pngS

  1. Ở cuối tệp, hãy tìm chế độ cài đặt phần phụ thuộc. Tại đó, bạn sẽ thấy dòng sau:
implementation 'com.google.mlkit:image-labeling:17.0.1'

Số phiên bản này có thể khác. Luôn tìm số phiên bản mới nhất trên trang web của Bộ công cụ học máy tại: https://developers.google.com/ml-kit/vision/image-labeling/android

  1. Thay thế bằng tài liệu tham khảo thư viện gắn nhãn hình ảnh tuỳ chỉnh. Bạn có thể tìm số phiên bản của trình bổ trợ này tại: https://developers.google.com/ml-kit/vision/image-labeling/custom-models/android
implementation 'com.google.mlkit:image-labeling-custom:16.3.1'
  1. Ngoài ra, bạn sẽ thêm một mô hình .tflite mà bạn đã tạo trong phòng thí nghiệm trước đó. Bạn sẽ không muốn nén mô hình này khi Android Studio biên dịch ứng dụng, vì vậy hãy nhớ sử dụng chế độ cài đặt này trong phần Android của cùng tệp build.gradle:
aaptOptions{
    noCompress "tflite"
}

Đảm bảo mục này không nằm trong bất kỳ chế độ cài đặt nào khác. Bạn nên lồng mã này ngay trong thẻ android. Ví dụ:

62d546bff11d2a50.pngS

4. Thêm mô hình TFLite

Trong lớp học lập trình trước, bạn đã tạo mô hình tuỳ chỉnh và tải xuống dưới dạng model.tflite.

Trong dự án, hãy tìm thư mục Assets hiện chứa flower1.jpg. Sao chép mô hình vào thư mục đó như sau:

  1. Nhấp chuột phải vào thư mục Assets (Tài sản) trong Android Studio. Trong trình đơn mở ra, chọn Hiển thị trong Finder. ("Hiển thị trong Trình khám phá" trên Windows và "Hiển thị trong Tệp" trên Linux.)

db30b47e419a326b.png

  1. Bạn sẽ được đưa đến thư mục trên hệ thống tệp. Sao chép tệp model.tflite vào thư mục đó, cùng với flower1.jpg.

36de0c51bec1c19e.png.

Android Studio sẽ cập nhật để hiển thị cả hai tệp này trong thư mục thành phần:

e9f4e9f394d9b357.png

Giờ thì bạn đã có thể cập nhật mã.

5. Cập nhật mã cho mô hình tuỳ chỉnh

Bước đầu tiên là thêm một số mã để tải mô hình tuỳ chỉnh.

  1. Trong tệp MainActivity, hãy thêm nội dung sau đây vào onCreate, ngay bên dưới dòng có nội dung setContentView(R.layout.activity_main).

Lựa chọn này sẽ sử dụng LocalModel để tạo từ thành phần model.tflite. Nếu Android Studio khiếu nại bằng cách chuyển "LocalModel" màu đỏ, nhấn ALT + Enter để nhập thư viện. Thao tác này sẽ thêm một tệp nhập vào com.google.mlkit.common.model.LocalModel cho bạn.

val localModel = LocalModel.Builder()
        .setAssetFilePath("model.tflite")
        .build()

Trước đây, trong trình xử lý btn.setOnClickListener, bạn đã sử dụng mô hình mặc định. Đã thiết lập ứng dụng bằng mã sau:

val labeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)

Bạn sẽ thay thế điều đó để sử dụng mô hình tuỳ chỉnh.

  1. Thiết lập một đối tượng tuỳ chọn tuỳ chỉnh:
val options = CustomImageLabelerOptions.Builder(localModel)
        .setConfidenceThreshold(0.7f)
        .setMaxResultCount(5)
        .build()

Thao tác này sẽ thay thế các tuỳ chọn mặc định bằng một nhóm tuỳ chỉnh. Ngưỡng tin cậy thiết lập một tiêu chuẩn để đánh giá chất lượng của thông tin dự đoán được trả về. Nếu nhìn lại mẫu ở đầu lớp học lập trình này, trong đó hình ảnh là một bông hoa cúc, bạn có 4 dự đoán, mỗi dự đoán có một giá trị bên cạnh, chẳng hạn như "Sky" là .7632.

Bạn có thể lọc bỏ những kết quả có chất lượng thấp hơn một cách hiệu quả bằng cách dùng ngưỡng tin cậy cao. Ví dụ: đặt giá trị này thành 0,9 sẽ không trả về bất kỳ nhãn nào có mức độ ưu tiên thấp hơn mức đó. setMaxResultCount() hữu ích trong các mô hình có nhiều lớp, nhưng vì mô hình này chỉ có 5 nên bạn sẽ chỉ để nó ở mức 5.

Giờ đây, khi đã có các tuỳ chọn cho công cụ gắn nhãn, bạn có thể thay đổi bản sao của công cụ gắn nhãn thành:

val labeler = ImageLabeling.getClient(options)

Phần còn lại của mã sẽ chạy mà không cần sửa đổi. Hãy dùng thử!

dd40c36c4edbb33.png

Ở đây, bạn có thể thấy rằng bông hoa này đã được xác định là hoa cúc với xác suất 0,959!

Giả sử bạn đã thêm hình ảnh thứ hai về một bông hoa rồi chạy lại như sau:

8556a5fbea487842.pngS

Nó xác định đó là một bông hoa hồng.

Bạn có thể thắc mắc tại sao lại nói hoa hồng thay vì chỉ có "hoa hồng". Đó là do trong tập dữ liệu, các nhãn được cung cấp theo tên thư mục và đáng tiếc là các tên thư mục đó hơi không nhất quán, đôi khi sử dụng số ít (như "daisy") và đôi khi sử dụng số nhiều (như "hoa hồng"). Đừng nhầm lẫn điều này với mô hình đang cố đếm các mục trong hình ảnh – mô hình này sơ khai hơn nhiều và chỉ có thể xác định được loại hoa!

6. Tải ứng dụng Start (Bắt đầu) dành cho iOS

  1. Trước tiên, bạn cần có ứng dụng này trong Lớp học lập trình đầu tiên. Nếu bạn đã trải qua phòng thí nghiệm này, nó sẽ được gọi là ImageClassifierStep1. Nếu không muốn truy cập vào phòng thí nghiệm, bạn có thể sao chép phiên bản hoàn thiện từ kho lưu trữ này. Xin lưu ý rằng các nhóm và miền .xcworkspace không có trong kho lưu trữ, vì vậy, hãy nhớ chạy "cài đặt nhóm" trước khi tiếp tục thực hiện bước tiếp theo từ cùng thư mục với .xcproject.
  2. Mở ImageClassifierStep1.xcworkspace trong Xcode. Xin lưu ý rằng bạn nên sử dụng .xcworkspace, chứ không phải .xcproject vì bạn đã gói Bộ công cụ học máy bằng các nhóm và không gian làm việc sẽ tải các nhóm này.

Trong phần còn lại của phòng thí nghiệm này, tôi sẽ chạy ứng dụng trong trình mô phỏng iPhone. Trình mô phỏng này sẽ hỗ trợ các mục tiêu bản dựng trong lớp học lập trình này. Nếu muốn sử dụng thiết bị của riêng mình, bạn có thể cần phải thay đổi mục tiêu bản dựng trong phần cài đặt dự án cho phù hợp với phiên bản iOS.

Hãy chạy ứng dụng và bạn sẽ thấy kết quả như sau:

9e151ed18f99fb98.pngS

Bạn nên lưu ý đến các phân loại rất chung chung – cánh hoa, hoa, bầu trời. Mô hình mà bạn tạo trong lớp học lập trình trước đã được huấn luyện để phát hiện 5 loại hoa, trong đó có loại hoa này, đó là hoa cúc.

Trong phần còn lại của lớp học lập trình này, bạn sẽ tìm hiểu những việc cần làm để nâng cấp ứng dụng bằng mô hình tuỳ chỉnh.

7. Sử dụng nhóm gắn nhãn hình ảnh trong Bộ công cụ học máy tuỳ chỉnh

Ứng dụng đầu tiên dùng tệp nhóm để lấy thư viện và mô hình của Công cụ gắn nhãn hình ảnh cho Bộ công cụ học máy cơ sở. Bạn cần cập nhật phương thức đó để sử dụng các thư viện gắn nhãn hình ảnh tuỳ chỉnh.

  1. Tìm tệp có tên podfile trong thư mục dự án. Mở tệp và bạn sẽ thấy giao diện như sau:
platform :ios, '10.0'

target 'ImageClassifierStep1' do
        pod 'GoogleMLKit/ImageLabeling'
end
  1. Thay đổi nội dung khai báo nhóm từ ImageLabeling thành ImageLabelingCustom như sau:
platform :ios, '10.0'

target 'ImageClassifierStep1' do
        pod 'GoogleMLKit/ImageLabelingCustom'
end
  1. Sau khi hoàn tất, hãy dùng cửa sổ dòng lệnh để chuyển đến thư mục chứa tệp podfile (cũng như .xcworkspace) rồi chạy pod install.

bb5d78eb7c7ab975.png

Sau vài phút, các thư viện MLKitImageLabeling sẽ bị xoá và các thư viện tuỳ chỉnh sẽ được thêm vào. Bây giờ, bạn có thể mở .xcworkspace để chỉnh sửa mã của mình.

8. Thêm Mô hình TFLite vào Xcode

Trong lớp học lập trình trước, bạn đã tạo một mô hình tuỳ chỉnh và tải xuống dưới dạng model.tflite. Nếu bạn không có sẵn đoạn mã này, hãy quay lại và chạy lớp học lập trình đó hoặc xem mã colab tại đây. Nếu không có quyền truy cập vào Google Colab, bạn có thể truy cập vào sổ tay tại đường liên kết này

  1. Khi không gian làm việc đang mở trong Xcode, hãy kéo model.tflite vào dự án của bạn. Tệp này phải nằm trong cùng thư mục với các tệp còn lại, chẳng hạn như ViewController.swift hoặc Main.storyboard.
  2. Một hộp thoại sẽ bật lên với các tuỳ chọn để thêm tệp. Hãy nhớ chọn Add to Targets (Thêm vào mục tiêu), nếu không mô hình sẽ không được đóng gói với ứng dụng khi được triển khai cho thiết bị.

Lưu ý rằng nút "Add to Targets" (Thêm vào mục tiêu) sẽ có ImageClassifierStep1 nếu bạn bắt đầu từ đó và tiếp tục thông qua từng bước trong phòng thí nghiệm này hoặc ImageClassifierStep2 (như được hiển thị) nếu bạn đã chuyển đến mã hoàn chỉnh.

5b6a7f40c73f0f1f.png.

Việc này sẽ đảm bảo rằng bạn có thể tải mô hình. Bạn sẽ tìm hiểu cách thực hiện việc đó trong bước tiếp theo.

9. Cập nhật mã cho Mô hình tuỳ chỉnh

  1. Mở tệp ViewController.swift của bạn. Bạn có thể thấy lỗi liên quan đến thông tin "nhập MLKitImageLabeling" ở đầu tệp. Điều này là do bạn đã xoá các thư viện gắn nhãn hình ảnh chung khi cập nhật tệp nhóm. Vui lòng xoá dòng này và cập nhật những nội dung sau:
import MLKitVision
import MLKit
import MLKitImageLabelingCommon
import MLKitImageLabelingCustom

Có thể dễ dàng đọc nhanh những thông tin này và nghĩ rằng chúng đang lặp lại cùng một mã! Tuy nhiên, "Thông thường" và "Tuỳ chỉnh" phần cuối!

  1. Tiếp theo, bạn sẽ tải mô hình tuỳ chỉnh mà bạn đã thêm ở bước trước. Tìm Func getLabels(). Bên dưới dòng có nội dung visionImage.orientation = image.imageOrientation, hãy thêm các dòng sau:
// Add this code to use a custom model
let localModelFilePath = Bundle.main.path(forResource: "model", ofType: "tflite")
let localModel = LocalModel(path: localModelFilePath!)
  1. Tìm mã để chỉ định các tuỳ chọn cho ImageLabeler chung. Có thể bạn sẽ gặp lỗi vì các thư viện đó đã bị xoá:
let options = ImageLabelerOptions()

Thay thế bằng mã này để sử dụng CustomImageLabelerOptions và chỉ định mô hình cục bộ:

let options = CustomImageLabelerOptions(localModel: localModel)

...và chỉ vậy thôi! Hãy thử chạy ứng dụng của bạn ngay! Khi bạn cố gắng phân loại hình ảnh, kết quả sẽ chính xác hơn – và cho bạn biết rằng bạn đang nhìn thấy một bông hoa cúc có xác suất cao!

238cd21748a97cf4.png.

Giả sử bạn đã thêm hình ảnh thứ hai về một bông hoa rồi chạy lại như sau:

75f3970a6b509bfe.pngs

Ứng dụng đã phát hiện thành công rằng hình ảnh này khớp với nhãn "hoa hồng"!

10. Xin chúc mừng!

Giờ đây, bạn đã chuyển từ việc tạo một ứng dụng dùng mô hình chung để nhận dạng nội dung của hình ảnh, sang việc tạo mô hình học máy của riêng mình để nhận dạng những vật cụ thể (chẳng hạn như hoa), rồi cập nhật ứng dụng để sử dụng mô hình tuỳ chỉnh.

Tất nhiên, ứng dụng tạo ra sẽ rất hạn chế vì ứng dụng này sử dụng các thành phần hình ảnh theo gói. Tuy nhiên, phần máy học đang hoạt động tốt. Ví dụ: bạn có thể sử dụng AndroidX Camera để lấy khung hình từ một trang video trực tiếp rồi phân loại chúng để xem điện thoại của bạn nhận ra những bông hoa nào!

Từ đây, khả năng là vô tận – và nếu bạn có dữ liệu của riêng mình về một thứ gì đó không phải là hoa, thì bạn có nền tảng về những gì cần thiết để tạo một ứng dụng nhận diện được chúng bằng Computer Vision. Đây chỉ là một vài bước đầu tiên để khám phá một thế giới rộng lớn hơn và hy vọng bạn đã thích làm việc này!