Tích hợp chức năng nhận dạng ảnh trên ứng dụng di động không còn là điều xa vời — người dùng ngày nay mong đợi ứng dụng có thể hiểu nội dung hình ảnh một cách tự nhiên: từ quét tài liệu, nhận diện sản phẩm, đến trợ giúp người khiếm thị. AI chạy offline trên smartphone đã trở thành yêu cầu cơ bản để đảm bảo tốc độ và bảo mật.
Bạn sẽ học cách nhúng một mô hình .tflite thực sự tồn tại và ổn định — cụ thể là ssdlite_mobilenet_v2_coco.tflite từ TensorFlow Object Detection Model Zoo (có thể tải được trong thời gian dài). Nếu bạn từng đọc qua Hướng dẫn sử dụng YOLOv8 để nhận diện đối tượng, Tạo hệ thống nhận diện khuôn mặt bằng OpenCV hoặc Tự động phân loại ảnh thời trang bằng AI, đây là bài viết giúp bạn mang mô hình AI đó vào thực tế smartphone.
Chọn model .tflite thật sự tồn tại
Bạn có thể tải mô hình từ GitHub nnsuite/testcases – nơi chứa bản ssd_mobilenet_v2_coco.tflite rõ ràng, đã tồn tại và sử dụng rộng rãi:
-
Link tải model:
https://github.com/nnsuite/testcases/blob/master/DeepLearningModels/tensorflow-lite/ssd_mobilenet_v2_coco/ssd_mobilenet_v2_coco.tflite
File là mô hình SSDLite MobileNet V2 pretrained trên COCO, hỗ trợ nhận diện 90 lớp đối tượng như người, xe, động vật, đồ dùng…
Tạo dự án Android và thêm TensorFlow Lite
Khởi tạo project Android Studio → chọn Empty Activity (Java). Sau đó chỉnh build.gradle (Module: app):
implementation 'org.tensorflow:tensorflow-lite:2.12.0' implementation 'org.tensorflow:tensorflow-lite-support:0.4.3' implementation 'org.tensorflow:tensorflow-lite-task-vision:0.4.3'
Sau đó nhấn Sync Now.
Thêm model và labels vào assets
-
Tạo folder
src/main/assets/ -
Tải
ssd_mobilenet_v2_coco.tflitetừ link ở trên vào folder này. -
Tạo file
labelmap.txttrong assets chứa tên 90 nhãn COCO (bạn có thể copy từ file.pbtxtvà chuyển sang txt, giữ thứ tự).
Ví dụ nội dung labelmap:
person bicycle car motorcycle airplane bus train truck boat traffic light ...
Thiết kế giao diện người dùng
Trong res/layout/activity_main.xml:
<LinearLayout ... >
<ImageView
android:id="@+id/imageView"
... />
<Button
android:id="@+id/btnPick"
android:text="Chọn ảnh" />
<TextView
android:id="@+id/resultText"
... />
</LinearLayout>
Giao diện gồm: vùng hiển thị ảnh, nút chọn ảnh, và vùng hiển thị kết quả nhận diện.
Xử lý ảnh và chạy mô hình
Giải thích: Model .tflite này là object detection — bạn cần load mô hình, xử lý ảnh để tạo TensorImage, gọi Task API (ObjectDetector) để nhận danh sách kết quả gồm bounding box, nhãn và score.
Giải thích: TensorFlow Lite Task Vision API chèn toàn bộ bước tiền xử lý và hậu xử lý (non-max suppression) giúp code ngắn gọn và dễ bảo trì.
public class MainActivity extends AppCompatActivity {
private static final int PICK_IMAGE = 100;
private ObjectDetector objectDetector;
private ImageView imageView;
private TextView resultText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = findViewById(R.id.imageView);
resultText = findViewById(R.id.resultText);
try {
ObjectDetector.ObjectDetectorOptions options =
ObjectDetector.ObjectDetectorOptions.builder()
.setMaxResults(5)
.setScoreThreshold(0.4f)
.build();
objectDetector = ObjectDetector.createFromFileAndOptions(
this, "ssd_mobilenet_v2_coco.tflite", options);
} catch (IOException e) {
e.printStackTrace();
}
findViewById(R.id.btnPick).setOnClickListener(v -> {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, PICK_IMAGE);
});
}
@Override
protected void onActivityResult(int req, int res, Intent data) {
super.onActivityResult(req, res, data);
if (req == PICK_IMAGE && res == RESULT_OK && data != null) {
try {
Uri uri = data.getData();
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
imageView.setImageBitmap(bitmap);
detectObjects(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void detectObjects(Bitmap bitmap) {
TensorImage image = TensorImage.fromBitmap(bitmap);
List<Detection> results = objectDetector.detect(image);
StringBuilder sb = new StringBuilder();
for (Detection d : results) {
String label = d.getCategories().get(0).getLabel();
float score = d.getCategories().get(0).getScore();
sb.append(label).append(" (").append(String.format("%.2f", score)).append(")\n");
}
resultText.setText(sb.toString());
}
}
Mở rộng: nhận diện bằng camera tương tác thời gian thực
Bạn có thể dùng CameraX + TensorFlow Lite để xử lý khung hình thời gian thực. Task API vẫn dùng tương tự, kết quả Detection có thể vẽ bounding boxes bằng Canvas, overlay lên PreviewView.
So sánh model và hiệu năng
SSD-MobileNet-V2 là một trong những mô hình phổ biến cho mobile object detection. Theo đánh giá từ [TensorFlow Lite Object Detection Model Performance Comparison]:
-
Inference time khoảng 68ms trên CPU
-
Độ chính xác (mAP) ~60% trên COCO dataset
-
Dung lượng ~6MB, phù hợp để chạy offline trên smartphone
Model nhỏ như EfficientDet-Lite hoặc MobileDet cũng có giá trị nhưng thường cân bằng khác nhau giữa kích thước và độ chính xác.
Kết luận
Bạn vừa được hướng dẫn đầy đủ cách tích hợp mô hình .tflite ổn định vào ứng dụng Android để nhận diện vật thể từ ảnh tải lên. Từ việc tải model, xử lý ảnh, sử dụng Task API cho tới hiển thị kết quả, app của bạn sẽ hoạt động trơn tru offline mà không cần server.

