一、编译选项的修改
1、darknet/src/yolo_console_dll.cpp
取消注释 #define TRACK_OPTFLOW
2、Makefile 编译选项
打开开关 LIBSO=1
二、编译
make clean
make -j4
三、遇到的Error
编译时可能会遇到:
cannot find the file opencv_cudaoptflow.h
1、彻底的解决方法是重新安装编译带CUDA的OpenCV
2、简单的一种解决方法是
修改 #if defined(TRACK_OPTFLOW )&& defined(OPENCV) && defined(GPU)
成为#if defined(TRACK_OPTFLOW )&& defined(OPENCV) && defined(NOTUSED)
详情见:https://github.com/AlexeyAB/darknet/issues/907
四、调用命令
LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./uselib /root/work/darknet-windows-lb/track_test/lights/weights/crop.names /root/work/darknet-windows-lb/track_test/lights/weights/crop.cfg /root/work/darknet-windows-lb/track_test/lights/weights/crop_best.weights /root/work/darknet-windows-lb/track_test/lights/light_2/
LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./uselib /root/work/darknet-windows-lb/track_test/lights/weights/crop.names /root/work/darknet-windows-lb/track_test/lights/weights/crop.cfg /root/work/darknet-windows-lb/track_test/lights/weights/crop_best.weights /root/work/darknet-windows-lb/track_test/lights/light_4/
LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./uselib /root/work/darknet-windows-lb/track_test/lights/weights/crop.names /root/work/darknet-windows-lb/track_test/lights/weights/crop.cfg /root/work/darknet-windows-lb/track_test/lights/weights/crop_best.weights /root/work/darknet-windows-lb/track_test/lights/light_6/
LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./uselib /root/work/darknet-windows-lb/track_test/signs/weights/ni.names /root/work/darknet-windows-lb/track_test/signs/weights/yolov4-ni.cfg /root/work/darknet-windows-lb/track_test/signs/weights/yolov4-ni_best.weights /root/work/darknet-windows-lb/track_test/signs/sign_2/
五、原理
具体的理论原理见:质心跟踪算法
Darknet代码的实现:
在./darknet/include/yolo_v2_class.hpp定义了换一个Tracker类
1、在591到615行,is_in_tracking_area函数
这个函数是定义了一个跟踪区域,区域外的,不进行跟踪,当然,如果你需要跟踪整张图,那可以注释掉这个函数
2、633行,用到了一个frames_story
这个代表记忆距离,如果大于这个记忆距离,就不进行跟踪了。也就是说只往后跟踪记忆个距离
3、核心代码在,639行到651行
计算前后两帧中跟踪目标之间的欧氏距离;
if (cur_dist<max_dist && (k.track_id == 0 || dist_vec[m]>cur_dist)){
# 欧式距离小于阈值,并且是第一个被标记的最小欧氏距离或者比前面标记的最小欧式距离还要小
dist_vec[m]=cur_dist;
cur_index=m;
# 更新最小欧式距离和匹配ID号
}
4、在664行,设置了一个ratio
如果上一帧的目标区域/当前帧的目标区域<2.0,才被认为是相同的目标,大小比例差距太大,就不是相同的目标