1. Giới thiệu
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ị iOS.
Kiến thức bạn sẽ học được
- Cách tối ưu hoá mô hình bằng bộ chuyển đổi TFLite.
- Cách chạy tệp trong ứng dụng iOS được tạo sẵn bằng trình phiên dịch TFLite.
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.
Điều kiện tiên quyết
Nếu bạn đang thực hiện lớp học lập trình này trên phần cứng của riêng mình, hãy đảm bảo rằng bạn đã cài đặt các mục sau:
- Xcode 10 trở lên
- CocoaPods 1.8.0 trở lên
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
Lớp học lập trình này sẽ sử dụng Colaboratory và Xcode.
Mở Colab (sử dụng Trình tạo mô hình TensorFlow Lite để huấn luyện một thuật toán phân loại nhằm nhận dạng hoa bằng cách sử dụng công nghệ học chuyển giao và xuất mô hình TFLite để dùng trong ứng dụng di động).
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/tensorflow/examples.git
Bây giờ, hãy cd
vào gốc dự án Xcode của bản sao mà bạn vừa tạo. Đó là nơi bạn sẽ tiếp tục làm việc trong phần còn lại của lớp học lập trình này:
cd examples/lite/examples/image_classification/ios
4. Thiết lập ứng dụng iOS
Cài đặt phần phụ thuộc
Bằng cách sử dụng CocoaPods, hãy cài đặt các phần phụ thuộc của ứng dụng iOS (bao gồm cả TensorFlow Lite). Sau khi lệnh cài đặt hoàn tất, hãy mở ImageClassification.xcworkspace
để mở dự án trong Xcode.
pod install --repo-update open ImageClassification.xcworkspace
5. Chạy ứng dụng thử nghiệm
Để sử dụng máy ảnh, ứng dụng phải chạy trên thiết bị thực, vì Trình mô phỏng iOS không có quyền truy cập vào máy ảnh của máy Mac. Để xây dựng ứng dụng cho thiết bị iOS, bạn phải đăng ký tham gia Chương trình dành cho nhà phát triển của Apple hoặc có quyền truy cập vào thiết bị mà người khác đã cấp cho bạn.
Nếu muốn chạy lớp học lập trình này trong trình mô phỏng, bạn cần phải sao chép hình ảnh vào bảng dán từ Safari trong chính trình mô phỏng. Dưới đây là các bước xử lý hình ảnh trong trình mô phỏng:
- Xây dựng ứng dụng theo mục tiêu trình mô phỏng mà bạn chọn.
- Trong trình mô phỏng iOS, hãy nhấn tổ hợp phím Cmd+Shift+H để thu nhỏ ứng dụng.
- Nhấn vào Safari ở cuối màn hình chính và tìm kiếm một hình ảnh.
- Trong kết quả tìm kiếm của Google Hình ảnh, hãy nhấn vào một kết quả rồi nhấn và giữ hình ảnh đó. Trong hộp thoại bật lên, hãy chọn "Copy" (Sao chép).
- Quay lại ứng dụng TFL Classify. Hình ảnh được sao chép sẽ tự động hiển thị cùng với kết quả suy luận. Nếu không, hãy đảm bảo rằng bạn đã sao chép chính dữ liệu hình ảnh chứ không phải URL đến hình ảnh.
Kiểm thử bản dựng và cài đặt ứng dụng
Trước khi thay đổi bất cứ điều gì đối với ứng dụng, hãy chạy phiên bản đi kèm với kho lưu trữ. Chọn thiết bị iOS của bạn từ trình đơn thả xuống ở trên cùng bên trái:
Sau đó, nhấn Cmd+R hoặc nhấn nút Phát trong Xcode để tạo ứng dụng cho thiết bị của bạn. Ứng dụng sẽ tự động khởi chạy sau khi được cài đặt vào thiết bị của bạn.
Phiên bản này của ứng dụng sử dụng MobileNet tiêu chuẩn, được huấn luyện trước về 1000 danh mục ImageNet. Hàm này có dạng như sau:
6. Chạy ứng dụng tuỳ chỉnh
Chế độ thiết lập ứng dụng mặc định sẽ phân loại hình ảnh vào một trong 1000 lớp ImageNet, bằng cách sử dụng MobileNet tiêu chuẩn.
Bây giờ, hãy sửa đổi ứng dụng đó để ứng dụng đó sẽ sử dụng mô hình được huấn luyện lại cho các danh mục hình ảnh tuỳ chỉnh được huấn luyện trong Colab.
7. Chuyển đổi ứng dụng để chạy mô hình
Thêm tệp mô hình vào dự án
Tài nguyên mô hình của dự án nằm tại ImageClassification > Model
trong trình điều hướng dự án Xcode. Để thay thế các tệp đó, trước tiên, hãy xoá 2 tệp hiện có trong nhóm Model
. Khi được nhắc, hãy chọn "Chuyển vào Thùng rác":
Sau đó, hãy kéo các tệp model.tflite
và labels.txt
mà bạn đã tải xuống từ Colab vào Nhóm mô hình. Khi được nhắc, hãy đảm bảo bạn đã chọn cả Copy items if needed
và Add to targets
.
Sửa đổi mã của ứng dụng
Để ứng dụng hoạt động được, chúng ta cần cập nhật đường dẫn của logic tải mô hình để trỏ đến mô hình mới mà chúng ta đã thêm.
Mở ModelDataHandler.swift (đường dẫn điều hướng Xcode: ImageAnalysis -> ModelDataHandler -> ModelDataHandler.swift) và thay đổi dòng 36 thành
// before static let modelInfo: FileInfo = (name: "mobilenet_quant_v1_224", extension: "tflite") // after static let modelInfo: FileInfo = (name: "model", extension: "tflite")
Hãy đảm bảo lưu tất cả các thay đổi.
8. Chạy ứng dụng tuỳ chỉnh
Nhấn Cmd+B hoặc nhấn nút Phát trong Xcode để tạo ứng dụng cho thiết bị của bạn. Sau khi khởi chạy, ứng dụng sẽ có dạng như sau:
Bạn có thể giữ đồng thời nút nguồn và nút tăng âm lượng để chụp ảnh màn hình.
Bây giờ, hãy thử tìm kiếm hoa trên web, hướng máy ảnh về phía màn hình máy tính và xem những hình ảnh đó có được phân loại chính xác không.
Hoặc nhờ một người bạn chụp ảnh bạn và tìm ra loại TensorFlow mà bạn là
!
9. Cách thức hoạt động
Bây giờ, khi ứng dụng đã chạy, hãy xem đoạn mã dành riêng cho TensorFlow Lite.
TensorFlowLiteSwift
Ứng dụng này sử dụng thư viện TensorFlowLite Swift thông qua CocoaPods. Thư viện Swift là một trình bao bọc mỏng trên TFLite C API. Đây là một trình bao bọc của thư viện TFLite C++.
Các dòng sau trong tệp Podfile của mô-đun sẽ kéo phiên bản mới nhất của kho lưu trữ thông số kỹ thuật CocoaPods trên toàn cầu của nhóm vào dự án.
target 'ImageClassification' do
use_frameworks!
# Pods for ImageClassification
pod 'TensorFlowLiteSwift'
end
Sử dụng API TensorFlow Lite Swift
Tất cả mã tương tác với TensorFlow Lite đều có trong ModelDataHandler.swift.
Thiết lập
Khối quan tâm đầu tiên là trình khởi tạo cho ModelDataHandler
:
/// A failable initializer for `ModelDataHandler`. A new instance is created if the model and
/// labels files are successfully loaded from the app's main bundle. Default `threadCount` is 1.
init?(modelFileInfo: FileInfo, labelsFileInfo: FileInfo, threadCount: Int = 1) {
let modelFilename = modelFileInfo.name
// Construct the path to the model file.
guard let modelPath = Bundle.main.path(
forResource: modelFilename,
ofType: modelFileInfo.extension
) else {
print("Failed to load the model file with name: \(modelFilename).")
return nil
}
// Specify the options for the `Interpreter`.
self.threadCount = threadCount
var options = InterpreterOptions()
options.threadCount = threadCount
do {
// Create the `Interpreter`.
interpreter = try Interpreter(modelPath: modelPath, options: options)
// Allocate memory for the model's input `Tensor`s.
try interpreter.allocateTensors()
} catch let error {
print("Failed to create the interpreter with error: \(error.localizedDescription)")
return nil
}
// Load the classes listed in the labels file.
loadLabels(fileInfo: labelsFileInfo)
}
Có một số dòng mà bạn cần thảo luận chi tiết hơn.
Dòng sau đây sẽ tạo trình phiên dịch TFLite:
interpreter = try Interpreter(modelPath: modelPath, options: options)
Trình phiên dịch chịu trách nhiệm truyền dữ liệu thô đầu vào thông qua biểu đồ TensorFlow. Chúng ta truyền đường dẫn đến mô hình của trình thông dịch trên đĩa và sau đó trình thông dịch tải đường dẫn dưới dạng FlatBufferModel.
Dòng cuối cùng tải danh sách nhãn:
loadLabels(fileInfo: labelsFileInfo)
Tất cả những việc này chỉ là tải các chuỗi từ một tệp văn bản vào bộ nhớ.
Chạy mô hình
Khối quan tâm thứ hai là phương thức runModel
. Phương thức này sẽ lấy CVPixelBuffer
làm dữ liệu đầu vào, chạy trình phiên dịch và trả về văn bản cần in trong ứng dụng.
try interpreter.copy(rgbData, toInputAt: 0)
// ...
try interpreter.invoke()
// ...
outputTensor = try interpreter.output(at: 0)
10. 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:
- Tìm hiểu thêm về TFLite trong các tài liệu trên tensorflow.org và kho lưu trữ nguồn.
- 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.