yolo是一种运行速度很快的目标检测AI模型,目前最新版本是yolov5,最大可处理1280像素的图像。当我们检测出图像中目标后,把视频分解成多幅图像并逐帧执行时,可看到目标跟踪框随目标移动,看上去很酷吧。但是,如果视频帧中有多个目标,如何知道一帧中的目标和上一帧是同一个对象?这就是目标跟踪的工作,应用多个检测来识别特定目标随时间的变化,实现目标跟踪。
Deepsort是实现目标跟踪的算法,从sort(simple online and realtime tracking)演变而来,其使用卡尔曼滤波器预测所检测对象的运动轨迹,匈牙利算法将它们与新的检测目标相匹配。Deepsort易于使用且运行速度快,成为AI目标检测跟踪之热门算法。
源码在这里:Github
下面是安装和演示过程:
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模型,有很多文章可参考,此处只给出要点。训练完成后,用户数据集产生的权重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'
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却可以应付。