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

Nhận dạng hoa bằng TensorFlow Lite trên Android

Thông tin về lớp học lập trình này

subjectLần cập nhật gần đây nhất: thg 4 7, 2025
account_circleTác giả: Hoi Lam (revamping author), Yash Katariya (original author)

1. Giới thiệu

657431be3173fa86.png android.png

Lưu ý: Lớp học lập trình này yêu cầu một 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ừ việc huấn luyện các mô hình khổng lồ trên các cụm trên đám mây cho đến việc 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.

Nếu bạn chưa cài đặt, hãy tải xuống và cài đặt Android Studio 4.1 trở lên trong khi bạn đang 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 trình 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 để xác định hoa.

f11c2821f2c8311d.png

Giấy phép: Miễn phí sử dụng

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

Trước khi bắt đầu 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 để xem cách huấn luyện một bộ phân loại bằng Keras nhằm nhận dạng hoa bằng công nghệ học chuyển đổi 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 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 khung Android

android.png

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

Nếu bạn chưa cài đặt, 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.png. Sau khi tải, hãy chọn "Mở dự án hiện có" trong 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 hoạt động.
  1. Bạn sẽ thấy cửa sổ bật lên "Gradle Sync" (Đồng bộ hoá Gradle) trong lần đầu tiên mở dự án, yêu cầu sử dụng trình bao bọc gradle. Nhấp "OK".

d68b4d7189e6c1e4.png

  1. Bật chế độ 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 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.png 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 máy ảnh của bạn:

b63cba02bb36b7e3.png

  1. Bạn sẽ thấy màn hình sau trên điện thoại, trong đó các số ngẫu nhiên sẽ thay thế vị trí hiển thị 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 ở 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à bạn đã tải FlowerModel.tflite được huấn luyện tuỳ chỉnh xuống trước đó.

cfee18cc6674a408.png

  1. Nhấp vào Finish.
  2. Bạn sẽ thấy kết quả sau. FlowerModel.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 cả đầ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 việc cần làm giúp bạn dễ dàng chuyển đến vị trí chính xác 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 tính năng này trong dự án Android để nhắc mình về công việc trong tương lai. 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 mã và 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 hay để xem những việc chúng ta sẽ làm là xem danh sách việc cần làm. Để thực hiện việc đó, hãy chọn trên thanh trình đơn trên cùng View > Tool Windows > TODO

5de29b413574f25c.png

  1. Theo mặc định, công cụ này liệt kê tất cả việc cần làm trong tất cả các mô-đun, điều này gây nhầm lẫn một chút. Chúng ta chỉ có thể sắp xếp các việc cần làm bắt đầu bằng cách nhấp vào nút nhóm theo bên cạnh bảng điều khiển TODO rồi chọn Modules

5d8fe7b102340208.png

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

8d0f14a039995b20.png

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. 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 máy ảnh 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 trên kết quả:
  • Sắp xếp kết quả theo thứ tự giảm dần theo xác suất trong thuộc tính score, trong đó xác suất cao nhất sẽ xuất hiện trước.
  • Lấy k kết quả hàng đầu theo định nghĩa của hằng số MAX_RESULT_DISPLAY. Bạn có thể tuỳ ý thay đổi giá trị của biến này để nhận được nhiều hoặc ít kết quả 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. Đánh dấu ghi chú hoặc xoá các dòng sau đây giúp tạo ra kết quả giả mạo mà chúng ta thấy trước đó:
// 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.png trên thanh công cụ:

60a77ef126c1373d.png

  1. Bạn sẽ thấy màn hình sau trên điện thoại, trong đó các số ngẫu nhiên sẽ thay thế vị trí hiển thị kết quả thực:

f11c2821f2c8311d.png

8. Không bắt buộc: Tăng tốc suy luận bằng trình 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. 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à 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ế quá trình khởi tạo đơn giản của flowerModel bằng cách sau: Lấy một thực thể của danh sách khả năng tương thích GPU và khởi chạy GPU tuỳ thuộc vào việc GPU đó có phải là một trong các GPU tương thích được liệt kê hay không. Nếu không, hãy khởi tạo 4 luồng CPU để chạy mô hình:
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 phương thức này bằng cách thêm options vào dữ liệu đầu vào của 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.png trên thanh công cụ:

60a77ef126c1373d.png

9. Bước tiếp theo

Sau đây là một số đường liên kết để bạn biết thêm thông tin: