赛题
视频物体检测
赛题目标
利用图像处理和计算机视觉技术 开发一套智能识别系统,自动检测和分类摄像头捕获的视频中,城市管理中的违规行为
赛事链接
https://www.marsbigdata.com/competition/details?id=3839107548872
数据集
初赛提供城管视频监控数据与对应违规行为标注。违规行为包括垃圾桶满溢、机动车违停、非机动车违停等。视频数据为mp4格式,标注文件为json格式,每个视频对应一个json文件。
frame_id:违规行为出现的帧编号
event_id:违规行为ID
category:违规行为类别
bbox:检测到的违规行为矩形框的坐标,[xmin,ymin,xmax,ymax]形式
了解YOLO
YOLO 的核心思想就是把目标检测转变成一个回归问题。一次前向传播就能完成整个图像的物体检测,不需要复杂的后处理步骤。
主要优点:速度快,可以实时预测
工作流程
(1)输入一个图像,将图像分成s*s大小
(2)对于每个网络,预测多个边框
(3)预测窗口,非极大值抑制去除冗余
标注
<class>
是类别索引
<x_center>
和<y_center>
是边界框中心点相对于图像宽度和高度的比例
<width>
和<height>
是边界框的宽度和高度相对于图像宽度和高度的比例
baseline代码
# 读取训练集视频
for anno_path, video_path in zip(train_annos[:5], train_videos[:5]):
print(video_path)
#注解文件
anno_df = pd.read_json(anno_path)
#对应的视频路径
cap = cv2.VideoCapture(video_path)
frame_idx = 0
# 读取视频所有画面
#获取每个帧的注解信息
while True:
ret, frame = cap.read()
if not ret:
break
img_height, img_width = frame.shape[:2]
# 将画面写为图
frame_anno = anno_df[anno_df['frame_id'] == frame_idx]
cv2.imwrite('./yolo-dataset/train/' + anno_path.split('/')[-1][:-5] + '_' + str(frame_idx) + '.jpg', frame)
# 如果存在标注
if len(frame_anno) != 0:
with open('./yolo-dataset/train/' + anno_path.split('/')[-1][:-5] + '_' + str(frame_idx) + '.txt', 'w') as up:
for category, bbox in zip(frame_anno['category'].values, frame_anno['bbox'].values):
category_idx = category_labels.index(category)
# 计算yolo标注格式
x_min, y_min, x_max, y_max = bbox
x_center = (x_min + x_max) / 2 / img_width
y_center = (y_min + y_max) / 2 / img_height
width = (x_max - x_min) / img_width
height = (y_max - y_min) / img_height
#x_center值大于1,代码打印出这个异常值,
#这可能是坐标转换的问题或者是数据错误
if x_center > 1:
print(bbox)
up.write(f'{category_idx} {x_center} {y_center} {width} {height}\n')
#frame_idx递增,表示进入下一张图片的处理
frame_idx += 1