yolo是一种运行速度很快的目标检测AI模型,目前最新版本是yolov5,最大可处理1280像素的图像。当我们检测出图像中目标后,把视频分解成多幅图像并逐帧执行时,可看到目标跟踪框随目标移动,看上去很酷吧。但是,如果视频帧中有多个目标,如何知道一帧中的目标和上一帧是同一个对象?这就是目标跟踪的工作,应用多个检测来识别特定目标随时间的变化,实现目标跟踪。
Deepsort是实现目标跟踪的算法,从sort(simple online and realtime tracking)演变而来,其使用卡尔曼滤波器预测所检测对象的运动轨迹,匈牙利算法将它们与新的检测目标相匹配。Deepsort易于使用且运行速度快,成为AI目标检测跟踪之热门算法。

yolov5+DeepSort

源码在这里:Github

注:*mikel-brostrom 提供的github代码已经更新,添加了多个REID,因此,用原来的ckpt.t7模型不能直接使用。使用新版yolov5+DeepSort,移步另一篇博文

这个这个…, mikel大侠过于勤奋地更新github,使本博文过期。下面的博文适用于v3.0,请从mikel github网页的右侧去下载不同的版本。
在这里插入图片描述
点击“+ 4 releases”可寻找对应的版本。
此外,REID模型ckpt.t7需要google drive,不方便。需要的朋友可从百度网盘下载
提取码:gchf

下面是安装和演示过程:

1 克隆github到本地

git clone https://github.com/mikel-brostrom/Yolov5_DeepSort_Pytorch

其中,yolo5目录是一个链接,不能直接克隆下来,需要另行下载,并将内容放入yolo5。

下载yolo5模型权重,放入目录your-dir/yolo5/weights

下载yolo5权重地址

yolov5网站发布的权重有如下几个
yolov5-P5: yolo5s.pt, yolo5m.pt, yolo5l.pt, yolo5x.pt
yolov5-P6: yolo5s6.pt, yolo5m6.pt, yolo5l6.pt, yolo5x6.pt
yolov5-P5可处理640像素图像,从s到x精度逐渐提升,yolov5-P6可处理1280像素图像,同样,从s到x精度逐渐提升。demo程序track.py默认用yolo5s.pt最简单的权重。

下载Deepsort模型权重 ckpt.t7,放入目录:
your-dir/deep_sort_pytorch/deep_sort/deep/checkpoint
下载地址

2 安装所需的运行环境
建立一个虚拟环境吧,免得与其他环境冲突

conda create -n deepsort python=3.7

激活虚拟环境,安装所需模块

conda activate deepsort
cd your-dir
pip install -r requirements.txt

3 运行目标检测跟踪程序,my_demo.mp4为演示视频mp4文件

python track.py --source my_demo.mp4

如果安装一切顺利,则很快看到目标跟踪的演示视频。但事情或许并不一帆风顺,总有几个缺失的模块需要另外安装。于是,可在安装完成后,试运行:

python track.py -h

它会告诉你缺失的模块,用pip逐个安装就好了。
另外,演示程序track.py给出的目标框灰常粗大。修改track.py中draw_boxes方法,把粗框改成细框,大字符改小字符,这样就美观许多啦:

def draw_boxes(img, bbox, identities=None, offset=(0, 0)):
    for i, box in enumerate(bbox):
        x1, y1, x2, y2 = [int(i) for i in box]
        x1 += offset[0]
        x2 += offset[0]
        y1 += offset[1]
        y2 += offset[1]
        # box text and bar
        id = int(identities[i]) if identities is not None else 0
        color = compute_color_for_labels(id)
        label = '{}{:d}'.format("", id)
        t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 0, 1)[0]  #修改字符,原设置: 2,2
        cv2.rectangle(img, (x1, y1), (x2, y2), color, 1)  # 修改线框为1, 原设置:3
        cv2.rectangle(img, (x1, y1), (x1 + t_size[0] + 3, y1 + t_size[1] + 4), color, -1)
        cv2.putText(img, label, (x1, y1 +
                t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 1, [255, 255, 255], 1) #修改 2,.,2
    return img

说明1,yolo5可检测多种类型的目标,而Deepsort目标跟踪只能跟踪一种类型目标,例如行人类,或小汽车类。所以,跟踪需要把yolo5的目标检测类型数量限制成单个类型检测。coco数据集定义的行人类型数=0,小汽车类型数=2。

行人跟踪:

python track.py --classes 0 --source demo_person.mp4  

小汽车跟踪:

python track.py --classes 2 --source demo_car.mp4

说明2,yolo5提供不同检测精度的权重文件,yolo5x.pt比yolo5s.pt精度高。应用跟踪时,当两个目标重叠后再分离,yolo5s.pt会出现标注数改变。举个栗子,目标10和目标20发生重叠后分离,目标10变成了目标15,而目标20不变(目标20遮挡了目标10)。此情况用yolo5x.pt就会好很多,维持目标10不变。

说明3,yolov5-P5可处理640像素图像,这并不要求输入视频尺寸不得大于640。此时输入视频可以是1920x1080,不会报错,yolov5在处理时将大图像resize到640。

在这里插入图片描述
在这里插入图片描述

yolov5训练自己的数据集

有关如何用自己的数据集训练yolov5模型,有很多文章可参考,此处只给出要点。训练完成后,用户数据集产生的权重best.pt取代yolov5s.pt,看看跟踪目标的效果如何。
训练自己数据集的参考在这里:
Pytorch 版YOLOV5训练自己的数据集

DeepSort目录下训练yolov5,自己的数据集。因为是DeepSort跟踪,故yolov5目录建立在DeepSort之下。那么当工作目录是DeepSort时,yolov5下面的某些模块目录需要有所变化。
数据集:DeepSort\paper_data,在此目录下建立图片目录train,标注xml目录Annotatiaons,把图片JPG和xml文件分别拷贝进入。
split_train_val.py划分train集和val集,建立ImageSets目录,用txt文件划分train和val,而没有重新建立train目录和val目录。
voc_label.py产生label目录,把原来xml文件转成label形式的txt文件,这是yolov模型与其他torch模型不同之处。
配置训练文件,在paper_data下生成custom_yolov5s.yaml文件
custom_yolov5s.yaml中指定训练集和验证集的标签,类型数,类型名称:

train:  ~/DeepSort/paper_data/train.txt  
val:    ~/DeepSort/paper_data/val.txt  
# number of classes
nc: 2   #训练的类别
# class names
names: ['car', 'person']

修改模型文件,如yolov5s.yaml文件。通常只修改目标类型,若只有一个目标car,则类型数为1。这与torch模型也不同,torch模型中背景占一个类型,故只有一个目标car的类型数为2,一个背景类型和一个目标类型car。
yolov5模型的配置文件采用yolov5s.yaml,将nc数改为2。
训练:

python yolov5/train.py --data paper_data/custom_yolov5s.yaml  \
--cfg yolov5/models/yolov5s.yaml --weights 'yolov5/weights/yolov5s.pt' \
--batch-size 16 --epochs 100

预训练模型yolov5加载初始权重yolov5s.pt,训练完成后在工作目录DeepSort下产生runs目录,保存weight(exp5)和tensorboard运行参数。可用tensorboard观看可视化结果:

tensorboard --logdir=runs

经过epoch=100训练,产生只有两个类“car”和“person”的权重,runs/train/exp5/weights/best.pt,其类型“car”的数字为0,person为1。将best.pt用作yolov5推理而加载的模型权重,classes参数与yolov5原来定义的类型不同,要特别注意,否则无法检测出目标类型。

因此,用yolov5+DeepSort运行目标跟踪时,classes参数需选择0或1,对应car目标或行人目标,weights用自己的best.pt。

python track.py --classes 0 --source demo_car.mp4  --weights 'runs/train/exp5/weights/best.pt'

yolov5和faster rcnn resnet50 fpn比较

pytorch目标检测提供了预训练模型faster rcnn resnet50 fpn,博主试图用faster rcnn替代yolov5实现目标检测和跟踪,结果得不偿失,未敢尝试Deepsort。
1 yolov5可以定义限制性类型,比如“行人”,“小汽车”等,限定为单个类型,用于跟踪,而不需要重新训练。 faster rcnn resnet50也可以限定检测类型数量,但需要重新训练。
2 速度,yolov5明显速度优于faster rcnn,且消耗GPU资源少。用faster rcnn,还没有用到deepsort,只看逐帧检测,速度比 yolov5+deepsort逐帧目标跟踪还要慢,且GPU用尽全力达95%,很快温升达到80度。两者处理1280x736图像,使用yolov5x.pt,GPU占用65%,温升只有60度。
3 启用voc2007-2008数据集,提取car类型,共549幅图片,取出480幅训练,64幅测试。
yolov5:
batch = 16, GPU占用 4320GB, 99%; batch = 32, GPU占用 7240GB, 99%
batch = 16, epoch=100, 耗时10min。

faster rcnn resnet50 fpn:
batch = 2, GPU占用6112GB, 95%
epoch = 32, 耗时25min

显然,yolov5训练过程很快,比faster rcnn resnet50 fpn快很多。
本人单机GPU rtx2060supper 8GB,属简陋型,对resnet50实在力不从心,而yolov5却可以应付。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐