Bắt đầu nhanh cho Android

Trang này hướng dẫn bạn cách xây dựng ứng dụng Android với TensorFlow Lite để phân tích nguồn cấp dữ liệu camera trực tiếp và xác định đối tượng. Trường hợp sử dụng máy học này được gọi là phát hiện đối tượng . Ứng dụng mẫu sử dụng thư viện TensorFlow Lite Task cho tầm nhìn thông qua các dịch vụ Google Play để cho phép thực thi mô hình máy học phát hiện đối tượng, đây là phương pháp được đề xuất để xây dựng ứng dụng ML với TensorFlow Lite.

Bản demo hoạt hình phát hiện đối tượng

Thiết lập và chạy ví dụ

Đối với phần đầu tiên của bài tập này, hãy tải mã ví dụ xuống từ GitHub và chạy mã đó bằng Android Studio . Các phần sau của tài liệu này khám phá các phần có liên quan của ví dụ về mã để bạn có thể áp dụng chúng cho ứng dụng Android của riêng mình. Bạn cần cài đặt các phiên bản sau của những công cụ này:

  • Android Studio 4.2 trở lên
  • SDK Android phiên bản 21 trở lên

Lấy mã ví dụ

Tạo một bản sao cục bộ của mã ví dụ để bạn có thể xây dựng và chạy nó.

Để sao chép và thiết lập mã ví dụ:

  1. Sao chép kho git
    git clone https://github.com/tensorflow/examples.git
    
  2. Định cấu hình phiên bản git của bạn để sử dụng tính năng kiểm tra thưa thớt, do đó bạn chỉ có các tệp cho ứng dụng ví dụ phát hiện đối tượng:
    cd examples
    git sparse-checkout init --cone
    git sparse-checkout set lite/examples/object_detection/android_play_services
    

Nhập và chạy dự án

Sử dụng Android Studio để tạo một dự án từ mã mẫu đã tải xuống, xây dựng và chạy dự án đó.

Để nhập và xây dựng dự án mã ví dụ:

  1. Khởi động Android Studio .
  2. Từ trang Chào mừng của Android Studio, chọn Nhập dự án hoặc chọn Tệp > Mới > Nhập dự án .
  3. Điều hướng đến thư mục mã ví dụ chứa tệp build.gradle ( ...examples/lite/examples/object_detection/android_play_services/build.gradle ) và chọn thư mục đó.

Sau khi bạn chọn thư mục này, Android Studio sẽ tạo một dự án mới và xây dựng nó. Khi quá trình xây dựng hoàn tất, Android Studio hiển thị thông báo BUILD SUCCESSFUL trong bảng trạng thái Build Output .

Để chạy dự án:

  1. Từ Android Studio, chạy dự án bằng cách chọn Run > Run…MainActivity .
  2. Chọn một thiết bị Android được đính kèm có camera để kiểm tra ứng dụng.

Cách ứng dụng ví dụ hoạt động

Ứng dụng ví dụ sử dụng mô hình phát hiện đối tượng được đào tạo trước, chẳng hạn như mobilenetv1.tflite , ở định dạng TensorFlow Lite, tìm kiếm các đối tượng trong luồng video trực tiếp từ camera của thiết bị Android. Mã cho tính năng này chủ yếu có trong các tệp sau:

  • ObjectDetectorHelper.kt - Khởi tạo môi trường thời gian chạy, cho phép tăng tốc phần cứng và chạy mô hình ML phát hiện đối tượng.
  • CameraFragment.kt - Xây dựng luồng dữ liệu hình ảnh camera, chuẩn bị dữ liệu cho mô hình và hiển thị kết quả phát hiện đối tượng.

Các phần tiếp theo sẽ hiển thị cho bạn các thành phần chính của các tệp mã này để bạn có thể sửa đổi ứng dụng Android để thêm chức năng này.

Xây dựng ứng dụng

Các phần sau đây giải thích các bước chính để xây dựng ứng dụng Android của riêng bạn và chạy mô hình hiển thị trong ứng dụng ví dụ. Các hướng dẫn này sử dụng ứng dụng mẫu được hiển thị trước đó làm điểm tham chiếu.

Thêm phụ thuộc dự án

Trong ứng dụng Android cơ bản của bạn, hãy thêm các phần phụ thuộc của dự án để chạy các mô hình máy học TensorFlow Lite và truy cập các chức năng tiện ích dữ liệu ML. Các hàm tiện ích này chuyển đổi dữ liệu như hình ảnh thành định dạng dữ liệu tensor mà mô hình có thể xử lý.

Ứng dụng mẫu sử dụng thư viện TensorFlow Lite Task cho tầm nhìn từ các dịch vụ của Google Play để cho phép thực thi mô hình máy học phát hiện đối tượng. Hướng dẫn sau đây giải thích cách thêm các phần phụ thuộc thư viện bắt buộc vào dự án ứng dụng Android của riêng bạn.

Để thêm phụ thuộc mô-đun:

  1. Trong mô-đun ứng dụng Android sử dụng TensorFlow Lite, hãy cập nhật tệp build.gradle của mô-đun để bao gồm các phần phụ thuộc sau. Trong mã ví dụ, tệp này nằm ở đây: ...examples/lite/examples/object_detection/android_play_services/app/build.gradle

    ...
    dependencies {
    ...
        // Tensorflow Lite dependencies
        implementation 'org.tensorflow:tensorflow-lite-task-vision-play-services:0.4.2'
        implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
    ...
    }
    
  2. Trong Android Studio, đồng bộ hóa các phần phụ thuộc của dự án bằng cách chọn: File > Sync Project with Gradle Files .

Khởi tạo dịch vụ Google Play

Khi sử dụng dịch vụ Google Play để chạy các mô hình TensorFlow Lite, bạn phải khởi tạo dịch vụ trước khi có thể sử dụng. Nếu bạn muốn sử dụng hỗ trợ tăng tốc phần cứng với dịch vụ, chẳng hạn như tăng tốc GPU, bạn cũng bật hỗ trợ đó như một phần của quá trình khởi tạo này.

Để khởi chạy TensorFlow Lite với các dịch vụ của Google Play:

  1. Tạo một đối tượng TfLiteInitializationOptions và sửa đổi nó để kích hoạt hỗ trợ GPU:

    val options = TfLiteInitializationOptions.builder()
        .setEnableGpuDelegateSupport(true)
        .build()
    
  2. Sử dụng phương thức TfLiteVision.initialize() để cho phép sử dụng thời gian chạy dịch vụ Play và đặt trình nghe để xác minh rằng nó đã tải thành công:

    TfLiteVision.initialize(context, options).addOnSuccessListener {
        objectDetectorListener.onInitialized()
    }.addOnFailureListener {
        // Called if the GPU Delegate is not supported on the device
        TfLiteVision.initialize(context).addOnSuccessListener {
            objectDetectorListener.onInitialized()
        }.addOnFailureListener{
            objectDetectorListener.onError("TfLiteVision failed to initialize: "
                    + it.message)
        }
    }
    

Khởi tạo trình thông dịch mô hình ML

Khởi tạo trình thông dịch mô hình học máy TensorFlow Lite bằng cách tải tệp mô hình và cài đặt các tham số mô hình. Mô hình TensorFlow Lite bao gồm tệp .tflite chứa mã mô hình. Bạn nên lưu trữ các mô hình của mình trong thư mục src/main/assets của dự án phát triển, ví dụ:

.../src/main/assets/mobilenetv1.tflite`

Để khởi tạo mô hình:

  1. Thêm tệp mô hình .tflite vào thư mục src/main/assets của dự án phát triển của bạn, chẳng hạn như ssd_mobilenet_v1 .
  2. Đặt biến modelName để chỉ định tên tệp của mô hình ML của bạn:

    val modelName = "mobilenetv1.tflite"
    
  3. Đặt các tùy chọn cho mô hình, chẳng hạn như ngưỡng dự đoán và kích thước tập hợp kết quả:

    val optionsBuilder =
        ObjectDetector.ObjectDetectorOptions.builder()
            .setScoreThreshold(threshold)
            .setMaxResults(maxResults)
    
  4. Bật tính năng tăng tốc GPU bằng các tùy chọn và cho phép mã lỗi một cách nhẹ nhàng nếu khả năng tăng tốc không được hỗ trợ trên thiết bị:

    try {
        optionsBuilder.useGpu()
    } catch(e: Exception) {
        objectDetectorListener.onError("GPU is not supported on this device")
    }
    
    
  5. Sử dụng các cài đặt từ đối tượng này để xây dựng đối tượng TensorFlow Lite ObjectDetector có chứa mô hình:

    objectDetector =
        ObjectDetector.createFromFileAndOptions(
            context, modelName, optionsBuilder.build())
    

Để biết thêm thông tin về cách sử dụng đại biểu tăng tốc phần cứng với TensorFlow Lite, hãy xem Đại biểu TensorFlow Lite .

Chuẩn bị dữ liệu cho mô hình

Bạn chuẩn bị dữ liệu để mô hình diễn giải bằng cách chuyển đổi dữ liệu hiện có như hình ảnh sang định dạng dữ liệu Tensor để mô hình của bạn có thể xử lý dữ liệu đó. Dữ liệu trong Tensor phải có kích thước hoặc hình dạng cụ thể phù hợp với định dạng dữ liệu được sử dụng để huấn luyện mô hình. Tùy thuộc vào mô hình bạn sử dụng, bạn có thể cần phải chuyển đổi dữ liệu để phù hợp với những gì mô hình mong đợi. Ứng dụng ví dụ sử dụng đối tượng ImageAnalysis để trích xuất các khung hình ảnh từ hệ thống con máy ảnh.

Để chuẩn bị dữ liệu cho việc xử lý theo mô hình:

  1. Xây dựng đối tượng ImageAnalysis để trích xuất hình ảnh theo định dạng được yêu cầu:

    imageAnalyzer =
        ImageAnalysis.Builder()
            .setTargetAspectRatio(AspectRatio.RATIO_4_3)
            .setTargetRotation(fragmentCameraBinding.viewFinder.display.rotation)
            .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
            .setOutputImageFormat(OUTPUT_IMAGE_FORMAT_RGBA_8888)
            .build()
            ...
    
  2. Kết nối máy phân tích với hệ thống con camera và tạo bộ đệm bitmap để chứa dữ liệu nhận được từ camera:

            .also {
            it.setAnalyzer(cameraExecutor) { image ->
                if (!::bitmapBuffer.isInitialized) {
                    bitmapBuffer = Bitmap.createBitmap(
                        image.width,
                        image.height,
                        Bitmap.Config.ARGB_8888
                    )
                }
                detectObjects(image)
            }
        }
    
  3. Trích xuất dữ liệu hình ảnh cụ thể mà mô hình cần và chuyển thông tin xoay hình ảnh:

    private fun detectObjects(image: ImageProxy) {
        // Copy out RGB bits to the shared bitmap buffer
        image.use { bitmapBuffer.copyPixelsFromBuffer(image.planes[0].buffer) }
        val imageRotation = image.imageInfo.rotationDegrees
        objectDetectorHelper.detect(bitmapBuffer, imageRotation)
    }    
    
  4. Hoàn thành mọi chuyển đổi dữ liệu cuối cùng và thêm dữ liệu hình ảnh vào đối tượng TensorImage , như được hiển thị trong phương thức ObjectDetectorHelper.detect() của ứng dụng ví dụ:

    val imageProcessor = ImageProcessor.Builder().add(Rot90Op(-imageRotation / 90)).build()
    
    // Preprocess the image and convert it into a TensorImage for detection.
    val tensorImage = imageProcessor.process(TensorImage.fromBitmap(image))
    

Chạy dự đoán

Sau khi tạo đối tượng TensorImage với dữ liệu hình ảnh ở định dạng chính xác, bạn có thể chạy mô hình dựa trên dữ liệu đó để đưa ra dự đoán hoặc suy luận . Trong ứng dụng ví dụ, mã này có trong phương thức ObjectDetectorHelper.detect() .

Để chạy mô hình và tạo dự đoán từ dữ liệu hình ảnh:

  • Chạy dự đoán bằng cách chuyển dữ liệu hình ảnh đến chức năng dự đoán của bạn:

    val results = objectDetector?.detect(tensorImage)
    

Xử lý đầu ra mô hình

Sau khi bạn chạy dữ liệu hình ảnh dựa trên mô hình phát hiện đối tượng, nó sẽ tạo ra danh sách kết quả dự đoán mà mã ứng dụng của bạn phải xử lý bằng cách thực thi logic nghiệp vụ bổ sung, hiển thị kết quả cho người dùng hoặc thực hiện các hành động khác. Mô hình phát hiện đối tượng trong ứng dụng ví dụ tạo ra danh sách dự đoán và hộp giới hạn cho các đối tượng được phát hiện. Trong ứng dụng ví dụ, kết quả dự đoán được chuyển đến đối tượng người nghe để xử lý thêm và hiển thị cho người dùng.

Để xử lý kết quả dự đoán mô hình:

  1. Sử dụng mẫu trình nghe để chuyển kết quả tới mã ứng dụng hoặc đối tượng giao diện người dùng của bạn. Ứng dụng ví dụ sử dụng mẫu này để chuyển kết quả phát hiện từ đối tượng ObjectDetectorHelper sang đối tượng CameraFragment :

    objectDetectorListener.onResults( // instance of CameraFragment
        results,
        inferenceTime,
        tensorImage.height,
        tensorImage.width)
    
  2. Hành động dựa trên kết quả, chẳng hạn như hiển thị dự đoán cho người dùng. Ứng dụng ví dụ vẽ một lớp phủ trên đối tượng CameraPreview để hiển thị kết quả:

    override fun onResults(
      results: MutableList<Detection>?,
      inferenceTime: Long,
      imageHeight: Int,
      imageWidth: Int
    ) {
        activity?.runOnUiThread {
            fragmentCameraBinding.bottomSheetLayout.inferenceTimeVal.text =
                String.format("%d ms", inferenceTime)
    
            // Pass necessary information to OverlayView for drawing on the canvas
            fragmentCameraBinding.overlay.setResults(
                results ?: LinkedList<Detection>(),
                imageHeight,
                imageWidth
            )
    
            // Force a redraw
            fragmentCameraBinding.overlay.invalidate()
        }
    }
    

Bước tiếp theo