1. Giới thiệu
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.
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
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:
- Mở Android Studio . 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:
- 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.
- 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".
- 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.
- 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 trên thanh công cụ:
- Bây giờ, hãy cho phép Bản minh hoạ Tensorflow truy cập vào camera của bạn:
- 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.
5. Thêm TensorFlow Lite vào ứng dụng Android
- Chọn mô-đun
start
trong trình khám phá dự án ở phía bên trái:
- Nhấp chuột phải vào mô-đun
start
hoặc nhấp vàoFile
, sau đó nhấp vàoNew
>Other
>TensorFlow Lite Model
- 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.
- Nhấp vào
Finish
. - 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.
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ể:
- 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
- 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
- Mở rộng tất cả mục trong mô-đun bắt đầu:
7. Chạy mô hình tuỳ chỉnh bằng TensorFlow Lite
- 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)
...
}
- 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ànhBitmap
và tạo đối tượngTensorImage
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))
...
}
- 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
...
}
- 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))
}
...
}
- 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.
- 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 trên thanh công cụ:
- 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ị:
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.
- 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'
- 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()
}
...
}
- 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)
}
}
- 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 trên thanh công cụ:
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:
- Hãy dùng thử các mô hình TFLite khác tương thích với liên kết mô hình học máy trên tfhub.dev.
- Tìm hiểu thêm về TFLite trong các tài liệu trên tensorflow.org và kho lưu trữ mã.
- Hãy dùng thử một số mô hình TFLite được huấn luyện trước khác, bao gồm cả trình phát hiện cụm từ kích hoạt bằng lời nói và phiên bản trả lời thông minh trên thiết bị.
- Tìm hiểu thêm về TensorFlow nói chung qua tài liệu bắt đầu của chúng tôi.