Darknet自带的tracker跟踪功能

一、编译选项的修改

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,才被认为是相同的目标,大小比例差距太大,就不是相同的目标

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值