Trang này hướng dẫn bạn cách tạo ứ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 các đố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 Tác vụ TensorFlow Lite cho tầm nhìn thông qua các dịch vụ của Google Play để cho phép thực thi mô hình học máy phát hiện đối tượng, đây là phương pháp được khuyến nghị để xây dựng ứng dụng ML với TensorFlow Lite.
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 xuống mã ví dụ từ GitHub và chạy nó 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ụ mã, vì vậy bạn có thể áp dụng chúng cho các ứ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 các 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ã mẫu
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ụ:
- Sao chép kho lưu trữ git
git clone https://github.com/tensorflow/examples.git
- Định cấu hình phiên bản git của bạn để sử dụng kiểm tra thưa thớt, vì vậy 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 dự án từ mã mẫu đã tải xuống, xây dựng dự án và chạy nó.
Để nhập và xây dựng dự án mã mẫu:
- Khởi động Android Studio .
- 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 .
- Điều hướng đến thư mục mã ví dụ có 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 Đầu ra bản dựng .
Để chạy dự án:
- Từ Android Studio, chạy dự án bằng cách chọn Run> Run… và MainActivity .
- 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 mẫu hoạt động
Ứng dụng mẫu 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 nằm 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 hiển thị cho bạn các thành phần chính của các tệp mã này, vì vậ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 giải thích các bước chính để tạo ứng dụng Android của riêng bạn và chạy mô hình được hiển thị trong ứng dụng mẫu. 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ụ thuộc dự án để chạy các mô hình học máy TensorFlow Lite và truy cập các chức năng tiện ích dữ liệu ML. Các chức năng tiện ích này chuyển đổi dữ liệu như hình ảnh thành định dạng dữ liệu tensor có thể được xử lý bởi một mô hình.
Ứng dụng mẫu sử dụng thư viện Tác vụ TensorFlow Lite cho tầm nhìn từ các dịch vụ của Google Play để cho phép thực thi mô hình học máy phát hiện đối tượng. Các hướng dẫn sau giải thích cách thêm các 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 các phụ thuộc mô-đun:
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' ... }
Trong Android Studio, đồng bộ hóa các phần phụ thuộc của dự án bằng cách chọn: Tệp> Đồng bộ hóa Dự án với Tệp Gradle .
Khởi tạo các dịch vụ của Google Play
Khi bạn sử dụng các dịch vụ của Google Play để chạy các mô hình TensorFlow Lite, bạn phải khởi chạy 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:
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()
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 một trình nghe để xác minh rằng nó đã được 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à thiết lập các thông 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:
- Thêm tệp mô hình
.tflite
vào thư mụcsrc/main/assets
asset của dự án phát triển của bạn, chẳng hạn như ssd_mobilenet_v1 . Đặt biến
modelName
để chỉ định tên tệp của mô hình ML của bạn:val modelName = "mobilenetv1.tflite"
Đặ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)
Bật tăng tốc GPU với các tùy chọn và cho phép mã không thành công nếu không hỗ trợ tăng tốc trên thiết bị:
try { optionsBuilder.useGpu() } catch(e: Exception) { objectDetectorListener.onError("GPU is not supported on this device") }
Sử dụng cài đặt từ đối tượng này để tạo đố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 để giải thích theo mô hình bằng cách chuyển đổi dữ liệu hiện có, chẳng hạn 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 để đào tạo 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 mẫu sử dụng đối tượng ImageAnalysis
để trích xuất các khung hình ảnh từ hệ thống con của máy ảnh.
Để chuẩn bị dữ liệu cho quá trình xử lý của mô hình:
Xây dựng một đối tượng
ImageAnalysis
để trích xuất hình ảnh ở định dạng 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() ...
Kết nối máy phân tích với hệ thống con của máy ảnh và tạo bộ đệm bitmap để chứa dữ liệu nhận được từ máy ảnh:
.also { it.setAnalyzer(cameraExecutor) { image -> if (!::bitmapBuffer.isInitialized) { bitmapBuffer = Bitmap.createBitmap( image.width, image.height, Bitmap.Config.ARGB_8888 ) } detectObjects(image) } }
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) }
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ứcObjectDetectorHelper.detect()
của ứng dụng mẫu: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
Khi bạn 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 mẫu, mã này được chứa 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 một danh sách các 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 mẫu tạo ra một danh sách các 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 mẫu, 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:
Sử dụng mẫu trình nghe để chuyển kết quả đến mã ứng dụng hoặc các đối tượng giao diện người dùng của bạn. Ứng dụng mẫu sử dụng mẫu này để chuyển kết quả phát hiện từ đối tượng
ObjectDetectorHelper
sang đối tượngCameraFragment
:objectDetectorListener.onResults( // instance of CameraFragment results, inferenceTime, tensorImage.height, tensorImage.width)
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 mẫu 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
- Tìm hiểu thêm về API thư viện tác vụ
- Tìm hiểu thêm về API thông dịch viên .
- Khám phá các công dụng của TensorFlow Lite trong các ví dụ .
- Tìm hiểu thêm về cách sử dụng và xây dựng mô hình học máy với TensorFlow Lite trong phần Mô hình .
- Tìm hiểu thêm về cách triển khai học máy trong ứng dụng di động của bạn trong Hướng dẫn dành cho nhà phát triển TensorFlow Lite .