目录
一、SJTU-VideoAnalysis-master
上海交通大学智能视频分析2020春:视频目标检测,视频人群计数
1.1 说明
- 上海交通大学2020春智能视频分析课程作业
1.1.1 Project1
- 使用了帧差法、中值滤波法、高斯混合模型实现了视频前景检测
- 使用了Faster R-CNN实现了视频目标检测
1.1.2 Project2
- 使用了YOLO v3、MCNN、LSC-CNN、12-in-1
- 4种模型实现了视频人群计数
1.2 Project2
1.2.1 说明
- 使用了YOLO v3、MCNN、LSC-CNN、12-in-1,4种模型
- 实现了高密度人群及低密度人群视频人群计数
1.2.2 YOLO v3
- YOLO v3是一种One-Stage的目标检测算法
- 这类检测算法不需要Region Proposal阶段
- 可以通过一个Stage直接产生物体的类别概率和位置坐标值。
- YOLO v3使用了
darknet-53
作为特征提取的backbone - 在精度上与Resnet相当,在计算速度上却得到了很大的提升
为了加强算法对小目标检测的精确度:
- YOLO v3中采用了类似FPN的upsample和融合做法
- 在多个scale的feature map上做检测。
此外,在loss function
中:
- 作者替换了原有的用softmax获取类别得分并用最大得分的标签来表示包含在边界框内的目标
- 而对图像中检测到的对象执行多标签分类,就是对每种类别使用二分类的logistic回归。
从效果来看,YOLO v3可以取得和SSD同样的精度,速度却提升了3倍,是精度与速度兼顾的模型。
1.2.2.1 Coding
- 首先下载预训练好的model
- 并将模型转为Keras model
- 参考link
wget https://pjreddie.com/media/files/yolov3.weights
python convert.py yolov3.cfg yolov3.weights model_data/yolo.h5
使用YOLO v3对视频进行人群计数
- 运行
flow.py
文件
python flow.py [需要计数的视频路径] [计数后的视频输出路径]
- 示例:
python flow.py F:/SJTU_VideoAnalysis/input_video/demo.avi F:/SJTU_VideoAnalysis/YOLOv3/output/demo_output.avi
1.2.2.2 效果
- 低密度人群
- 高密度人群
1.2.3 MCNN
- MCNN是一种简单有效的多列卷积神经网络结构
- 可以将图像映射到对应的人群密度图上
- 允许输入任意尺寸或分辨率的图像
- 每列CNN学习得到的特征可以自适应由于透视或图像分辨率引起的人头大小的变化.
- 并能在不需要输入图的透视先验情况下,通过几何自适应的核来精确计算人群密度图。
1.2.4 LSC-CNN
- LSC-CNN是一个利用检测的方法进行人群计数的模型
- 它设计了一个新颖的CNN框架,可以在高分辨率图像上精确定位人头
此外,作者还设计了一个与从上到下反馈结构相融合的方案
- 使得网络可以联合处理多尺度信息,方便网络更好地定位人头。
- 在仅有点标注信息的情况下,可以预测每个人头的bounding box
- 并且在GWTA模块使用了新设计的winner-take-all的loss,有利于在高分辨率的图像上进行训练。
1.2.5 12-in-1
- 12-in-1模型是通过多任务训练来学习视觉语言联合表示的一种跨模态模型
- 该模型涉及了四类任务
- 视觉问题回答 (Visual Question Answering)
- 基于图像描述的图像检索 (Caption-based Image Retrieval)
- 看图识物 (Grounding Referring Expressions)
- 多模态验证 (Multi-modal Verification)
- 并在12 个不同的数据集上进行联合训练。
通过多任务的学习可以获得更广泛的视觉语言联合表示,并用于不同的下游任务中
在本次人群计数的实验中:
- 将12-in-1模型应用到VQA这个下游任务中
- 输入视频的帧图像,以及问题“How many people are there in the picture?”
- 从而获得画面中人物的数量。
二、unbox_yolov5_deepsort_counting
2.1 介绍
yolov5 deepsort 行人 车辆 跟踪 检测 计数
- 实现了
出/入
分别计数。 - 默认是 南/北 方向检测
若要检测不同位置和方向,可在main.py
文件第13行和21行,修改2个polygon的点。
list_pts_blue = [[204, 305], [227, 431], [605, 522], [1101, 464], [1900, 601], [1902, 495], [1125, 379], [604, 437], [299, 375], [267, 289]]
list_pts_yellow = [[181, 305], [207, 442], [603, 544], [1107, 485], [1898, 625], [1893, 701], [1101, 568], [594, 637], [118, 483], [109, 303]]
# 初始化2个撞线polygon
list_pts_blue = [[204, 305], [227, 431], [605, 522], [1101, 464], [1900, 601], [1902, 495], [1125, 379], [604, 437],
[299, 375], [267, 289]]
ndarray_pts_blue = np.array(list_pts_blue, np.int32)
polygon_blue_value_1 = cv2.fillPoly(mask_image_temp, [ndarray_pts_blue], color=1)
polygon_blue_value_1 = polygon_blue_value_1[:, :, np.newaxis]
# 填充第二个polygon
mask_image_temp = np.zeros((1080, 1920), dtype=np.uint8)
list_pts_yellow = [[181, 305], [207, 442], [603, 544], [1107, 485], [1898, 625], [1893, 701], [1101, 568],
[594, 637], [118, 483], [109, 303]]
ndarray_pts_yellow = np.array(list_pts_yellow, np.int32)
polygon_yellow_value_2 = cv2.fillPoly(mask_image_temp, [ndarray_pts_yellow], color=2)
polygon_yellow_value_2 = polygon_yellow_value_2[:, :, np.newaxis]
- 默认检测类别:行人、自行车、小汽车、摩托车、公交车、卡车。
- 检测类别可在
detector.py
文件第60行修改。
for *x, conf, cls_id in det:
lbl = self.names[int(cls_id)]
if lbl not in ['person', 'bicycle', 'car', 'motorcycle', 'bus', 'truck']:
continue
pass
x1, y1 = int(x[0]), int(x[1])
x2, y2 = int(x[2]), int(x[3])
boxes.append(
(x1, y1, x2, y2, lbl, conf))
2.2 bilibili_video
yolov5 deepsort 行人车辆 双向计数 跟踪检测
2.3 Coding & Run
- 安装pytorch
$ pip install torch==1.7.1+cu110 torchvision==0.8.2+cu110 torchaudio===0.7.2 -f https://download.pytorch.org/whl/torch_stable.html
根据你的操作系统、安装工具以及CUDA版本,在 pytorch官网 找到对应的安装命令。
这里的环境是 ubuntu 18.04.5、pip、CUDA 11.0。
- 安装软件包
$ pip install -r requirements.txt
- 设置要检测的视频文件路径
capture = cv2.VideoCapture('./video/test.mp4')
在 main.py
文件中第66行,设置要检测的视频文件路径,默认为 ‘./video/test.mp4’
140MB的测试视频可以在这里下载 (提取码: 8ufq)
- 运行程序
python main.py