1. 赛事解读
1.1 赛事链接
https://www.marsbigdata.com/competition/details?id=3839107548872
1.2 赛事任务
- 赛题目标 利用图像处理和计算机视觉技术开发一套智能识别系统,自动检测和分类摄像头捕获的视频中,城市管理中的违规行为。
- 社会价值 通过对摄像头捕获的视频进行分析,自动准确识别违规行为,并及时向管理部门发出告警,以实现更高效的城市管理。
1.3 数据集等赛事资源分析
初赛提供城管视频监控数据与对应违规行为标注。违规行为包括垃圾桶满溢、机动车违停、非机动车违停等。视频数据为
mp4
格式,标注文件为
json
格式,每个视频对应一个
json
文件。
frame_id
:违规行为出现的帧编号event_id
:违规行为IDcategory
:违规行为类别bbox
:检测到的违规行为矩形框的坐标,[xmin, ymin, xmax, ymax]
形式
1.4 评分规则介绍
当然是分数越高越好辣
使用
F1score
、
MOTA
指标来评估模型预测结果,如下图所示。
对每个
json
文件得到两个指标的加权求和,最终得分为所有文件得分取均值。
- 注1:若真实目标框与预测框
IOU
大于0.5,则判定目标正确识别。若MOTA
指标为负,则该类别精度得分为0。 - 注2:若该视频中没有某个类别的目标,则此类别计算均值时,忽略该视频。
看到这里,就开始迷糊了,啥是
F1score
,
MOTA
又是啥?哈哈,其实这两个就是两个指标,简单来说就是用来衡量一个任务完成好坏的评判标准。就拿我们这个比赛任务来讲,就是评判你对对应违规行为的检测情况,你的最终
score
越高,就说明你对违规行为检测的越准确。下面我们来详细看一下这个指标以及所需参数的含义。
IOU
:交叉比(Intersection over union
),顾名思义,标准框 (标准答案) 与预测框 (预测结果) 的交集 / 标准框与预测框的并集,描述了预测框与真实框的重合度,是预测框是否准确的量化指标。 -I
:intersection
实际的矩形框与预测矩形框的交集-U
:uinon
实际的矩形框与预测矩形框的并集
那我们如何量化预测的结果对不对呢?看两个条件
- 物体的类别与实际的类别是否匹配?
- 预测的矩形框与实际的矩形框是否足够接近?
可以根据IOU的数值,判断预测框是否接近。交集和并集的比值越接近1,说明真实框与预测框越接近。
例如设定一个阈值,当
IOU < 0.5
时代表预测框与标准框不够重合,是一个错误的预测。
只要有一个条件不满足, 说明是一个错误的预测。如下图所示:
预测结果可以进一步根据有无预测框进行划分, 假定我们要检测是猫这个类别。
指标描述真 (True) / 假 (False)真 :类别正确,IOU大于阈值; 假 :任一条件不满足则为假正 (Positive) / 负 (Negative)正 :有预测框; 负 :没有预测框
上面猫猫的四种情况就可以写成一个简单的混淆矩阵,混淆矩阵并不像我们之前印象中的某种结果的非黑即白,而是考虑多种结果的更为客观的衡量标准,以下就是一个简单的混淆矩阵:
两两组合一共有四种情况
- 真正例 (True Positive,简称
TP
) - 假正例 (False Positive,简称
FP
)有预测框,但是满足下面三个条件的任意一个则为假正例1. 类别错误- 将猫检测为其他类别- 将其他类别对象检测为猫2. IOU小于阈值3. 没有交叉 (IOU小于阈值的一种特殊情况) - 假负例 (False Negative,简称
FN
)有物体但是没有识别出来,没有预测框。俗称漏检 - 真负例 (True Negative)如果是负例,代表没有预测框。没有预测框怎么可能是正确的呢,因此这种情况是不存在的。
注:目标检测问题中不存在真负例,但是分类问题里真负例是存在的。
F1score
:F1
分数(F1 Score
),是统计学中用来衡量二分类(或多任务二分类)模型精确度的一种指标。它同时兼顾了分类模型的准确率和召回率。F1
分数可以看作是模型准确率和召回率的一种加权平均,它的最大值是1,最小值是0,值越大意味着模型越好。-Recall
:这个参数是量化的目标检测模型中特定类的检出 (不漏检) 概率。公式为:-Precision
:精准率这个指标是针对某个特定的类别 (Class) 来讲的。在检出的某个类的预测中,正确的概率。公式为:MOTA
:MOTA
(Multiple Object Tracking Accuracy)多目标跟踪的一种评价指标,由于参数太多不好理解,就不写在这里了,这里就贴一篇文章,讲的很详细。MOTA详解
1.5 任务提交格式说明
1.5.1 格式要求
- 初赛需提交: 初赛任务是根据给定的城管视频监控数据集,进行城市违规行为的检测。违规行为主要包括垃圾桶满溢、机动车违停、非机动车违停等。选手需要能够从视频中分析并标记出违规行为,提供违规行为发生的时间和位置信息。
- 注意事项- 如果评测失败,大概率是提交格式不符合要求,请按照规定的格式提交- 每天可提交3次,需注意评测失败也计入次数
2. baseline代码
2.1 YOLO简介
YOLO,全称为“You Only Look Once”(你只看一眼),是一种流行的实时目标检测系统,由Joseph Redmon等人在2015年提出。YOLO模型的核心思想是将目标检测任务视为一个单一的回归问题,通过一个卷积神经网络(CNN)直接从图像像素到边界框坐标和类别概率的映射。YOLO模型经过了多次迭代,包括YOLOv2(YOLO9000)、YOLOv3和YOLOv4等版本,每个版本都在性能和速度上有所提升,同时也引入了一些新的技术,如更深的网络结构、更好的锚框机制、多尺度特征融合等。
2.2 YOLO图像训练格式
Yolo框架在模型训练时,使用的图像标注格式称为Yolo格式。
Yolo格式的文件为
txt
格式,一个物体的标注信息就是一行。如果是画面中有多个物体就是多行。
每行的标注信息格式如下:
CLASS_ID CX CY W H
CLASS_ID
类的IDCX
矩形框中心点的 坐标 (百分比)CY
矩形框中心点的 坐标 (百分比)W
矩形框的宽度 (百分比)H
矩形框的高度 (百分比)
2.3 baseline代码详解
下载baseline相关文件
apt install git-lfs
git lfs install
git clone https://www.modelscope.cn/datasets/Datawhale/AI_Camp5_baseline_CV.git
前面数据处理的部分就不详细介绍了,大家可以借助AI来帮助理解,我们主要看一下核心代码。
2.3.1 制作训练数据
# 读取训练集视频# 将标注文件和训练视频进行配对for anno_path, video_path inzip(train_annos[:5], train_videos[:5]):print(video_path)# 打印当前处理的视频路径
anno_df = pd.read_json(anno_path)# 读取标注文件,将其存储为DataFrame
cap = cv2.VideoCapture(video_path)# 利用opencv打开视频文件
frame_idx =0# 初始化帧索引# 读取视频所有画面,逐帧读取whileTrue:
ret, frame = cap.read()# 从视频中读取每一帧,ret表示是否成功读取,frame帧本身,也可以理解为图片ifnot 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)# 将当前帧保存为JPEG图像# 如果存在标注,打开文件写入标注信息iflen(frame_anno)!=0:withopen('./yolo-dataset/train/'+ anno_path.split('/')[-1][:-5]+'_'+str(frame_idx)+'.txt','w')as up:# 遍历标注信息中的类别和边界框for category, bbox inzip(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
# 检查中心点坐标是否超出范围,如果超出则打印边界框信息if x_center >1:print(bbox)
up.write(f'{category_idx}{x_center}{y_center}{width}{height}\n')# 将YOLO格式的标注写入文件
frame_idx +=1# 更新帧索引
2.3.2 训练模型
Ultraalytics 是一个提供多种计算机视觉模型的库,包括 YOLO 系列。训练模型的方式其实主要有两种,命令行和代码。对于我们的习惯来讲,代码更直观好用一些。
from ultralytics import YOLO
# 设置模型版本,yolov8n.pt是预先训练好的模型权重,用于初始化模型
model = YOLO("yolov8n.pt")# 设定数据集和训练参数# data="yolo-dataset/yolo.yaml":指定了数据集配置文件的路径# epochs=2:设置训练的总轮数为2轮,每轮训练都会遍历一次数据集。# imgsz=1080:设置输入图像的尺寸为1080像素。# batch=16:设置每个训练批次包含16张图像。# results:存储训练过程中的结果
results = model.train(data="yolo-dataset/yolo.yaml", epochs=2, imgsz=1080, batch=16)
这样我们就可以开始快乐的训练模型了(bushi)。
2.3.3 训练过程相关参数介绍
box_loss
(边界框回归损失) 用于衡量预测的边界框(bounding box)与真实边界框之间的差异。它通常计算预测框的坐标(例如中心点坐标、宽度和高度)与真实框的坐标之间的差异。常见的边界框回归损失包括IoU(交并比)损失、Smooth L1损失等。cls_loss
(分类损失) 分类损失用于评估模型对目标类别的预测准确性。在多类别分类问题中,计算预测类别概率分布与真实类别标签之间的差异。常用的分类损失函数包括交叉熵损失(Cross-Entropy Loss)或其变体。dfl_loss
(防御性损失) 防御性损失旨在提高模型对输入扰动的鲁棒性,从而增强模型的泛化能力。这种损失会在训练过程中引入噪声或扰动,并要求模型在这些扰动存在的情况下仍能做出准确的预测。mAP50
指的是在0.5的置信度阈值下计算的平均精度。也就是说,只有当模型预测的置信度大于或等于0.5时,预测才会被认为是正样本(positive)。mAP50用于评估模型在较高置信度下的检测性能。mAP50-95
: 这个指标是在置信度从0.5到0.95的范围内计算的平均精度。它考虑了模型在不同置信度阈值下的表现,从而提供了一个更全面的评估。mAP50-95
能够反映出模型在不同置信度水平上的稳定性和鲁棒性。
以上就是Task1的所有内容了,咱们Task2再见。
版权归原作者 飞哥飞哥大飞哥 所有, 如有侵权,请联系我们删除。