Hướng dẫn detect object bằng YOLOv7 trên Windows Form C#

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:

  1. Training model YOLOv7: được file best.pt
  2. Convert file best.pt thành file onnx
  3. Load file onnx và inference bằng OpenCV C++
  4. 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
  • Sửa file reparameterization_yolov7.py, sửa 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 custom_weight_reparameterized.pt nằm trong folder yolov7-u5\cfg\deploy\
  • Export file custom_weight_reparameterized.pt sang ONNX bằng lệnh
  • 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

Cuối cùng bạn được file yolov7-u5\cfg\deploy\custom_weight_reparameterized.onnx dùng để chạy với YoloCs

Lưu ý: khi convert sang onnx thì –img-size sẽ tương ứng với input width và input height trên form.

Ghi chú:

  1. Folder yolov7-u5 clone từ https://github.com/WongKinYiu/yolov7/tree/u5
  2. File yolov7-u5\cfg\deploy\yolov7_custom_weight.yaml là file yolov7.yaml mà các bạn dùng để training
  3. File reparameterization_yolov7.py lấy từ link

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.