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

1. Giới thiệu

657431be3173fa86.pngS android.png

Lưu ý: Lớp học lập trình này yêu cầu thiết bị thực để kiểm thử

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ị Android.

Cài đặt Android Studio 4.1 trở lên

Nếu bạn chưa cài đặt ứng dụng này, hãy tải xuống và cài đặt Android Studio 4.1 trở lên trong khi huấn luyện mô hình TensorFlow Lite.

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

  • Cách huấn luyện thuật toán phân loại hình ảnh tuỳ chỉnh của riêng bạn bằng Trình tạo mô hình TensorFlow Lite.
  • Cách sử dụng Android Studio để nhập mô hình TensorFlow Lite nhằm tích hợp mô hình tuỳ chỉnh trong ứng dụng Android bằng CameraX.
  • Cách sử dụng GPU trên điện thoại để tăng tốc mô hình.

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.

f11c2821f2c8311d.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

Trước khi bắt đầu quá trình huấn luyện mô hình, hãy bắt đầu tải xuống và cài đặt Android Studio 4.1 trở lên.

Mở Colab để biết cách huấn luyện một thuật toán phân loại bằng Keras để nhận dạng hoa bằng công nghệ học chuyển dữ liệu TensorFlow Lite.

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/hoitab/TFLClassify.git

Tiếp theo, hãy chuyển đến thư mục bạn vừa sao chép kho lưu trữ. Đây là nơi bạn sẽ thực hiện trong phần còn lại của lớp học lập trình này:

cd TFLClassify

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

android.png

Cài đặt Android Studio 4.1 trở lên

Nếu bạn chưa cài đặt ứng dụng này, hãy cài đặt Android Studio 4.1 trở lên.

Mở dự án bằng Android Studio

Mở một dự án bằng Android Studio bằng cách làm theo các bước sau:

  1. Mở Android Studio 7f2480ded53a193b.pngS. Sau khi tải xong, hãy chọn "Open an Existing project" (Mở một dự án hiện có) từ cửa sổ bật lên này:

f3b8bea7e3b39376.png

  1. Trong bộ chọn tệp, hãy chọn TFLClassify/build.gradle trong thư mục đang làm việc của bạn.
  1. Bạn sẽ nhận được tính năng "Gradle Sync" (Đồng bộ hoá Gradle) là lần đầu tiên bạn mở dự án, hỏi về cách sử dụng trình bao bọc gradle. Nhấp "OK".

d68b4d7189e6c1e4.png

  1. Bật mô hình nhà phát triển và tính năng Gỡ lỗi qua USB trên điện thoại nếu bạn chưa bật. Đây là quy trình thiết lập một lần. Hãy làm theo các hướng dẫn này.
  2. Sau khi cả dự án và điện thoại của bạn đã sẵn sàng, bạn có thể chạy dự án trên thiết bị thực bằng cách chọn TFL_Classify.start rồi nhấn nút chạy 86934b7b01ad7565.pngS trên thanh công cụ:

60a77ef126c1373d.png.

  1. Bây giờ, hãy cho phép Bản minh hoạ Tensorflow truy cập vào camera của bạn:

b63cba02bb36b7e3.png

  1. Bạn sẽ thấy màn hình sau đây trên điện thoại với các số ngẫu nhiên thay cho kết quả thực.

82c603596afa35f1.png.

5. Thêm TensorFlow Lite vào ứng dụng Android

  1. Chọn mô-đun start trong trình khám phá dự án ở phía bên trái:

cede7f2b8b23c1a7.png

  1. Nhấp chuột phải vào mô-đun start hoặc nhấp vào File, sau đó nhấp vào New > Other > TensorFlow Lite Model

bf243d9fdd27e20a.png

  1. Chọn vị trí mô hình mà trước đó bạn đã tải FlowerModel.tflite đã huấn luyện tuỳ chỉnh xuống.

cfee18cc6674a408.png

  1. Nhấp vào Finish.
  2. Bạn sẽ thấy các mục sau khi kết thúc. HoaModel.tflite được nhập thành công và hiển thị thông tin cấp cao về mô hình bao gồm dữ liệu đầu vào / đầu ra cũng như một số mã mẫu để bạn bắt đầu.

82840065f0d59def.png.

6. Không bắt buộc: Xem tất cả danh sách việc cần làm

Danh sách TODO (Việc cần làm) giúp bạn dễ dàng di chuyển đến đúng vị trí mà bạn cần cập nhật lớp học lập trình. Bạn cũng có thể sử dụng nhật ký này trong dự án Android để nhắc bản thân về công việc sau này. Bạn có thể thêm các mục việc cần làm bằng cách sử dụng nhận xét trong mã rồi nhập từ khoá TODO. Để truy cập vào danh sách VIỆC CẦN LÀM, bạn có thể:

  1. Một cách tuyệt vời để xem những việc chúng ta sẽ làm là xem danh sách VIỆC CẦN LÀM. Để làm việc đó, hãy chọn trong thanh trình đơn trên cùng View > Tool Windows > TODO

5de29b413574f25c.pngS

  1. Theo mặc định, tệp này liệt kê tất cả TODO trong tất cả mô-đun khiến hơi khó hiểu. Chúng ta chỉ có thể sắp xếp các TODO bắt đầu bằng cách nhấp vào nút "Group by" (Nhóm theo) ở cạnh bảng điều khiển TODO (Việc cần làm) rồi chọn Modules

5d8fe7b102340208.pngS

  1. Mở rộng tất cả mục trong mô-đun bắt đầu:

8d0f14a039995b20.pngS

7. Chạy mô hình tuỳ chỉnh bằng TensorFlow Lite

  1. Nhấp vào TODO 1 trong danh sách TODO hoặc mở tệp MainActivity.kt rồi tìm TODO 1, khởi chạy mô hình bằng cách thêm dòng sau:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  ...
  // TODO 1: Add class variable TensorFlow Lite Model
  private val flowerModel = FlowerModel.newInstance(ctx)

  ...
}
  1. Bên trong phương thức phân tích của Trình phân tích CameraX, chúng ta cần chuyển đổi dữ liệu đầu vào của camera ImageProxy thành Bitmap và tạo đối tượng TensorImage cho quá trình suy luận.
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 2: Convert Image to Bitmap then to TensorImage
  val tfImage = TensorImage.fromBitmap(toBitmap(imageProxy))
  ...
}
  1. Xử lý hình ảnh và thực hiện các thao tác sau đối với kết quả:
  • Sắp xếp giảm dần kết quả theo xác suất trong thuộc tính score có xác suất cao nhất đầu tiên.
  • Lấy k kết quả hàng đầu như được xác định bằng hằng số MAX_RESULT_DISPLAY. Bạn có thể tuỳ ý thay đổi giá trị của biến này để nhận được kết quả nhiều hơn hoặc ít hơn.
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 3: Process the image using the trained model, sort and pick out the top results
  val outputs = flowerModel.process(tfImage)
      .probabilityAsCategoryList.apply {
          sortByDescending { it.score } // Sort with highest confidence first
      }.take(MAX_RESULT_DISPLAY) // take the top results

  ...
}
  1. Chuyển đổi kết quả đã sắp xếp và lọc thành đối tượng dữ liệu Recognition sẵn sàng để RecyclerView sử dụng thông qua tính năng Liên kết dữ liệu:
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 4: Converting the top probability items into a list of recognitions
  for (output in outputs) {
      items.add(Recognition(output.label, output.score))
  }
  ...
}
  1. Thêm chú thích hoặc xoá các dòng sau để tạo kết quả giả mạo mà chúng ta thấy trước đây:
// START - Placeholder code at the start of the codelab. Comment this block of code out.
for (i in 0..MAX_RESULT_DISPLAY-1){
    items.add(Recognition("Fake label $i", Random.nextFloat()))
}
// END - Placeholder code at the start of the codelab. Comment this block of code out.
  1. Chạy ứng dụng trên thiết bị thực bằng cách chọn TFL_Classify.start rồi nhấn nút chạy 86934b7b01ad7565.pngS trên thanh công cụ:

60a77ef126c1373d.png.

  1. Bạn sẽ thấy màn hình sau đây trên điện thoại của mình với các số ngẫu nhiên thay cho kết quả thực sẽ được hiển thị:

f11c2821f2c8311d.png

8. Không bắt buộc: Tăng tốc quá trình suy luận bằng uỷ quyền GPU

TensorFlow Lite hỗ trợ một số trình tăng tốc phần cứng để tăng tốc độ suy luận trên thiết bị di động của bạn. GPU là một trong những trình tăng tốc mà TensorFlow Lite có thể tận dụng thông qua cơ chế uỷ quyền và giải pháp này khá dễ sử dụng.

  1. Mở build.gradle trong mô-đun start hoặc bạn có thể nhấp vào TODO 5 trong danh sách TODO rồi thêm phần phụ thuộc sau:
// TODO 5: Optional GPU Delegates    
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
  1. Quay lại tệp MainActivity.kt hoặc nhấp vào TODO 6 trong danh sách TODO. Thay thế cách khởi tạo đơn giản của productModel bằng cách sau: Lấy một phiên bản trong danh sách về khả năng tương thích với GPU và khởi chạy GPU, tuỳ thuộc vào việc đó có phải là một trong những GPU tương thích có trong danh sách hay không. Nếu không, hãy khởi tạo 4 luồng CPU để chạy mô hình này:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {
  ...

  // TODO 1: Add class variable TensorFlow Lite Model
  // Initializing the flowerModel by lazy so that it runs in the same thread when the process
  // method is called.
  private val flowerModel: FlowerModel by lazy{

    // TODO 6. Optional GPU acceleration
    val compatList = CompatibilityList()

    val options = if(compatList.isDelegateSupportedOnThisDevice){
        Log.d(TAG, "This device is GPU Compatible ")
        Model.Options.Builder().setDevice(Model.Device.GPU).build()
    } else {
        Log.d(TAG, "This device is GPU Incompatible ")
        Model.Options.Builder().setNumThreads(4).build()
    }

  ...
}
  1. Thay đổi trình khởi tạo mô hình để sử dụng thuộc tính này bằng cách thêm options vào đầu vào phương thức:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  private val flowerModel: FlowerModel by lazy{

    ...

    // Initialize the Flower Model
    FlowerModel.newInstance(ctx, options)
  }
}
  1. Chạy ứng dụng trên thiết bị thực bằng cách chọn TFL_Classify.start rồi nhấn nút chạy 86934b7b01ad7565.pngS trên thanh công cụ:

60a77ef126c1373d.png.

9. 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: