Bài viết này hướng dẫn các bạn convert file model best.pt thành dạng *.onnx, sau đó sử dụng OpenCV để inference. Ưu điểm của việc này là các bạn có thể giấu code, giấu file model hoặc là giúp người dùng dễ sử dụng hơn.
Tổng quát các bước thực hiện:
- Training model YOLOv7: được file best.pt
- Convert file best.pt thành file onnx
- Load file onnx và inference bằng OpenCV C++
- Viết wrapper bằng C++/CLI để đóng gói thành file DLL mà C# có thể inference
Bài viết này tập trung vào bước số 2 vì bước 1,3,4 đã viết ở những bài khác. Trong repo https://github.com/thigiacmaytinh/YOLOcs đã có sẵn code convert và code Example viết bằng C#.
YOLOv7 là 1 trong những giải thuật về Object Detection tốt nhất hiện nay. Với ưu điểm là chính xác, khai thác tốt hiệu suất GPU nên YOLOv7 được sử dụng rộng rãi trong nghiên cứu, học tập cũng như dự án thương mại.
Onnx (Open Neural Network Exchange) là 1 chuẩn thống nhất các mô hình Deep Learning. VD các bạn có thể training model bằng Pytorch, Tensorflow, Keras,… với nhiều format khác nhau như .h5, .pt, .pb,… thành .onnx. Do OpenCV không đọc được trực tiếp file .pt được nên chúng ta cần convert sang onnx để OpenCV đọc được.
Danh sách model hỗ trợ các bạn có thể tham khảo ở đây: https://github.com/onnx/models
Bước 1: training model YOLOv7
Các bạn chuẩn bị file weight *.pt bằng cách tự training model hoặc download pretrain:
yolov7.pt: https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7.pt
yolov7-tiny.pt: https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-tiny.pt
Bước 2: convert file best.pt sang onnx
Khi bạn training YOLO thành công thì bạn sẽ có được file best.pt, làm theo các bước bên dưới để convert sang ONNX:
- Vào folder yolov7-u5. Folder này clone từ https://github.com/WongKinYiu/yolov7/tree/u5.
- Copy file yolov7.yaml vào folder yolov7-u5\cfg\deploy\ và đổi tên thành yolov7_custom_weight.yaml (Đã commit sẵn)
- Download file reparameterization_yolov7.py bỏ vào folder yolov7-u5 (Cũng đã commit sẵn)
- Sửa file reparameterization_yolov7.p, sửa biến nc thành số class bạn đã training
- Copy file best.pt của bạn vào folder yolov7-u5\cfg\training\
- Sau đó chạy file reparameterization_yolov7.py, kết quả được file yolov7-u5\cfg\deploy\custom_weight_reparameterized.pt
- Export file custom_weight_reparameterized.pt sang ONNX
- Cuối cùng bạn được file custom_weight_reparameterized.onnx
python export.py --weights cfg/deploy/custom_weight_reparameterized.pt --topk-all 100 --iou-thres 0.65 --conf-thres 0.35 --img-size 224 224
Lưu ý khi convert sang onnx thì –img-size sẽ tương ứng với input width và input height trên form.
Bước 3: build OpenCV để inference bằng file onnx
Bạn làm theo bài viết sau để build OpenCV: Hướng dẫn build lib OpenCV 4.8.0 trên Windows 10. Bài viết này đã làm sẵn bước 3 cho bạn nên bạn bỏ qua bước 3 cũng được.
Bước 4: viết wrapper để reference vào project C#
Cài đặt Visual Studio 2017 trở lên và phải cài đặt C++ Development. Sau đó vào folder ExampleYOLOcs, build Example_YOLOv7_cs_CV480_x64.sln, lưu ý chỉ có mode x64.
Bên dưới là model được build riêng cho dự án phát hiện xe ra vào với làn xe hỗn hợp.
Tổng kết
Tốc độ predict bằng CPU khoảng 700ms, tốc độ này đủ làm các project nhỏ. Nếu cần nhanh hơn các bạn cần build với CUDA
Chúc các bạn thành công.