Bài viết này hướng dẫn cách config solution để build darknet.exe chạy trên Windows 10. Việc config solution C++ sẽ khó khăn hơn viết code Python nhưng sau đó bạn sẽ được nhiều cái lợi như:
- Dễ dàng debug bằng Visual Studio, dễ dàng biết lỗi xảy ra ở chỗ nào và xem giá trị biến
- Có thể custom các project theo ý mình, dễ dàng đóng gói thành file DLL
- Có thể nhúng vào các project khác như C++ và C#
- Có thể tùy chọn build với CUDA hoặc OpenCV tùy ý
Ghi chú: OpenCV có thể chạy được YOLO nên bạn không cần build Darknet. Bạn chỉ nên build Darknet C++ khi nào muốn tích hợp vào sản phẩm phần mềm thương mại.
Darknet là project mã nguồn mở implement thuật toán YOLO với các ưu điểm như:
- Độ chính xác cao: khả năng nhận diện sai thấp và miss object thấp
- Bouding box linh động: có thể bao trọn đối tượng cho dù vật thể đứng hay nằm
- Vật thể có thể bị che khuất vẫn có thể phát hiện được
- Phát hiện ra nhiều loại vật thể chi trong 1 lần xử lý
Do đó YOLO được sử dụng nhiều trong các ứng dụng, điểm yếu của YOLO là tốc độ không nhanh lắm. Nhưng cộng các điểm cộng và điểm trừ thì YOLO vẫn là 1 trong các best choice
Bước 1: chuẩn bị các tool cần thiết
- Visual Studio 2017: để build source code (không nên chọn cũ hơn, còn 2019 thì không ổn định)
- CUDA 10.1: cài đặt thành công thì mới có thể build Darknet sử dụng CUDA. Nếu bạn chạy trên máy không có CUDA thì không cần cài. Lưu ý: CUDA 11.1 không ổn định bằng 10.1
Bước 2: chuẩn bị source code
Source code Darknet gốc ở link https://github.com/AlexeyAB/darknet. Tuy nhiên mình có fork ra repo riêng và config lại cho phù hợp cộng với 1 số example trong đó tại link https://github.com/thigiacmaytinh/darknet
Lưu ý: Darknet có thể build mà không cần OpenCV
Bước 3: config solution Visual Studio
Trong source code Darknet có sẵn các solution Visual Studio 2015 trong folder build\darknet, các bạn không cần tạo solution bằng Cmake mà chỉ cần config là chạy được. Do cách config khá phức tạp nên mình fork ra project riêng để config giùm các bạn. Link ở cuối bài viết.
Công việc config bao gồm thay CUDA 11.1 thành 10.1 (nếu bạn cài CUDA 11.1 thành công thì không cần sửa) và config 1 số folder chứa code.
STT | Solution | Output | CUDA | OpenCV |
---|---|---|---|---|
1 | darknet.slnFull code, không cần DLL | exe | ||
2 | darknet_no_gpu.slnFull code, không cần DLL | exe | ||
3 | yolo_console_dll.slnSử dụng DLL của project số 4 hoặc 5 | exe | Tùy theo DLL | |
4 | yolo_cpp_dll.slnBuild ra DLL cho project số 3 | dll | ||
5 | yolo_cpp_dll_no_gpu.slnBuild ra DLL cho project số 3 | dll |
Lưu ý:
- Các project chỉ build được với platform x64
- Các project mặc định build với OpenCV 4.5.0, nếu không muốn sử dụng OpenCV thì xóa cờ OPENCV đi. Có OpenCV thì sẽ hiện ra popup hình ảnh, không có OpenCV thì kết quả được save thành file predictions.jpg
- Nếu muốn dùng OpenCV thì build ra file opencv_world450.dll copy vào cạnh file darknet.exe để sử dụng. Download opencv450 dll cuối bài viết
- Khi các bạn cài phiên bản Visual Studio mới hơn 2015 sẽ hiện popup Retarget như hình dưới
- Ấn OK để upgrade platform toolset trong trường hợp bạn không cài platform toolset v140. Trong ảnh trên nếu ấn OK sẽ upgrade lên v141.
- Ấn Cancel để giữ nguyên platform toolset v140 của Visual Studio 2015 nếu bạn có cài v140
Test chương trình darknet.exe đã build thành công
- Các bạn compile darknet.sln xong các bạn sẽ được file darknet.exe
- Nếu bạn compile với cờ OpenCV thì download các file opencv_world450.dll ở link cuối bài để cùng folder với file darknet.exe
- Trong folder build\darknet\x64 mình để sẵn file 1.predict_yolo_v4_bike_plate.bat để phát hiện vị trí biển số xe trong ảnh. Chạy file này để test khả năng nhận diện biển số xe
Chạy được như hình bên dưới là thành công
Giải thích các tham số của command
darknet.exe detector test data/bike-plate.data cfg/yolov4-tiny-bike-plate.cfg backup/yolov4-tiny-bike-plate.weights bike_plate\0111_01678_b.jpg
- darknet.exe: tên chương trình cần gọi
- detector test: dùng để predict hình ảnh, muốn training thì dùng detector train
- data/bike-plate.data: file này chỉ định ra các file cần thiết
- bike-plate.names: chứa tên các class, trong ví dụ trên chỉ có 1 class là bike
- cfg/yolov4-tiny-bike-plate.cfg: chứa config của các layer, tìm hiểu tại đây: https://github.com/AlexeyAB/darknet/wiki/CFG-Parameters-in-the-%5Bnet%5D-section
- backup/yolov4-tiny-bike-plate.weights: file model biển số xe
- bike_plate\0111_01678_b.jpg: đường dẫn đến ảnh
Download
Repo Github: https://github.com/thigiacmaytinh/darknet
opencv_world450.dll: https://github.com/thigiacmaytinh/opencv450/tree/main/build/bin/release-x64