文章目录
- 平台
- 参赛平台
- 云平台
- Task 1 从零上手CV竞赛
- 下载baseline相关文件
- 一键运行baseline!(大约需要25分钟)
- 赛题解析
- 数据集
- 提交结果
- 违法标准
- 注意事项
- 下载生成的文件
- 结果如图
- 最后要记得关机 不然一直消耗算力
- Task 2 建模方案解读与进阶
- 物体检测
- 物体检测的一些关键概念和步骤
- 物体检测算法
- One-Stage模型
- Two-Stage模型
- 选择One-Stage还是Two-Stage模型?
- 小结:
- YOLO
- YOLO算法的特点
- YOLO算法的网络结构
- YOLO 数据集格式
- YOLO 训练日志
- 查看训练日志
- Baseline 进阶思路
- 增加训练的数据集,可以增加更多的视频到训练集中进行训练。
- 切换不同的模型预训练权
平台
参赛平台
MARS大数据服务平台
云平台
厚德云
Task 1 从零上手CV竞赛
通关 Baseline
下载baseline相关文件
apt install git-lfs
git lfs install
git clone https://www.modelscope.cn/datasets/Datawhale/AI_Camp5_baseline_CV.git
下载ing
一键运行baseline!(大约需要25分钟)
一键运行
趁着训练的时间了解一下赛题
赛题解析
【初赛】
初赛提供城管视频监控数据与对应违规行为标注。违规行为包括垃圾桶满溢、机动车违停、非机动车违停等。
数据集
视频数据为mp4格式,标注文件为json格式,每个视频对应一个json文件。
json文件的内容是每帧检测到的违规行为,包括以下字段:
frame_id:违规行为出现的帧编号
event_id:违规行为ID
category:违规行为类别
bbox:检测到的违规行为矩形框的坐标,[xmin,ymin,xmax,ymax]形式
标注示例如下:
[{"frame_id": 20,"event_id": 1,"category": "机动车违停","bbox": [200, 300, 280, 400]},{"frame_id": 20,"event_id": 2,"category": "机动车违停","bbox": [600, 500, 720, 560]},{"frame_id": 30,"event_id": 3,"category": "垃圾桶满溢","bbox": [400, 500, 600, 660]}]
提交结果
选手需要生成result文件夹,文件夹中包含每个视频对应的json结果文件,文件名与视频名对应。选手需要将文件夹打包成result.zip进行上传。
json文件中包含了检测到的违规行为列表,若未检测到违规行为,则列表为空。
每个违规行为包含的字段如下:
frame_id:违规行为出现的帧编号
event_id:违规行为ID
category:违规行为类别
bbox:检测到的违规行为矩形框的坐标,[xmin,ymin,xmax,ymax]形式 confidence:置信度
提交的json示例如下:
[{"frame_id": 20,"event_id": 1,"category": "机动车违停","bbox": [200, 300, 280, 500],"confidence": 0.85},{"frame_id": 20,"event_id": 2,"category": "垃圾桶满溢","bbox": [600, 500,720, 560],"confidence": 0.90},{"frame_id": 30,"event_id": 3,"category": "垃圾桶满溢","bbox": [400, 500, 500, 560],"confidence": 0.78}]
违法标准
【机动车违停】
机动车在设有禁止停车标志、标线的路段停车,或在非机动车道、人行横道、施工地段等禁止停车的地方停车。具体包含以下:
1、无论有无禁停标志,机动车道禁止车辆停放;
2、距路口、桥梁50米以内禁止车辆停放;
3、距公交车站、消防栓、消防队、医院30米以内禁止使用上述设施以外的车辆停放;
4、禁止车辆双排停放、靠左侧停放、横向停放、逆向停放;
5、人行道仅允许在已设置的停车泊位内停车,禁止在停车泊位外停车;
6、在设有禁停标志、标线的路段,人行横道、施工路段,不得停车。
【非机动车违停】
非机动车(如自行车、电动车等)未按照规定停放在指定的非机动车停车泊位或停车线内,而是在非机动车禁停区域或未划定的区域(消防通道、盲道、非机动车停车区线外、机动车停车区等)随意停放。
【垃圾满溢】
生活垃圾收集容器内垃圾超过三分之二以上即为满溢。垃圾桶无法封闭、脏污且周边有纸屑、污渍、塑料、生活垃圾及杂物堆放。
【占道经营】
经营者占用城市道路、桥梁、城市广场等公共场所进行盈利性买卖商品或服务的行为。
注:赛题禁止对测试集数据进行人工标注,用于训练或结果提交。初赛审核阶段,会对此类情况严格审核,一经发现,即取消复赛晋级资格。
注意事项
- 评审失败也会消耗次数
- 每天只有三次机会啊
下载生成的文件
result.zip
结果如图
最后要记得关机 不然一直消耗算力
Task 2 建模方案解读与进阶
物体检测
物体检测是计算机视觉领域的一个重要任务,它的目标是在图像或视频帧中识别和定位感兴趣的物体。物体检测算法不仅要识别图像中的对象属于哪个类别,还要确定它们在图像中的具体位置,通常以边界框(bounding box)的形式表示。
总结就是识别物体类别 位置 用边界框框起来
物体检测的一些关键概念和步骤
以下是物体检测的一些关键概念和步骤:
- 输入: 物体检测算法的输入通常是一张图像或视频帧。
- 特征提取: 算法使用深度学习模型(如卷积神经网络CNN)来提取图像的特征。这些特征捕捉了图像中的视觉信息,为后续的物体识别和定位提供基础。
- 候选区域生成: 在某些检测算法中,如基于区域的卷积神经网络(R-CNN)及其变体,首先需要生成图像中的候选区域,这些区域可能包含感兴趣的物体。
- 区域分类和边界框回归: 对于每个候选区域,算法需要判断它是否包含特定类别的物体,并预测物体的边界框。这通常涉及到分类任务和回归任务的结合。
- 非极大值抑制(NMS): 在检测过程中,可能会产生多个重叠的边界框,用于表示同一物体。NMS是一种常用的技术,用于选择最佳的边界框并去除多余的框。
基本步骤: 输入 →特征提取 → 候选区域生成 →区域分类和边界框回归→非极大值抑制(NMS)
物体检测算法
物体检测算法主要分为两类:One-Stage(一阶段)和Two-Stage(两阶段)模型。
One-Stage模型
如YOLO(You Only Look Once)和SSD(Single Shot Detection)
直接在单次网络评估中预测图像中所有物体的类别和位置信息。这种方法的优点是速度快,适合实时应用,但可能在精度上不如Two-Stage模型 。
Two-Stage模型
如Faster R-CNN
首先使用区域提议网络(Region Proposal Network, RPN)生成候选区域,然后对这些区域进行分类和边界框的精细调整。这种方法的优点是精度高,但速度相对较慢 。
选择One-Stage还是Two-Stage模型?
One-Stage模型通常在单个卷积网络中同时预测类别和位置,而Two-Stage模型则将检测任务分解为两个阶段:区域提议和候选区域的分类与定位。
One-Stage模型因为省略了区域提议步骤,所以能够实现更快的检测速度,但这可能会以牺牲一些精度为代价。
Two-Stage模型通过两步过程提高了检测的准确性,但同时也增加了计算的复杂性和时间消耗 。
小结:
如果对速度有较高要求,如视频流处理或实时监控,One-Stage模型可能更合适。
如果对精度有更高要求,如在需要高精度识别的科研或专业领域,Two-Stage模型可能更加适用 。
YOLO
YOLO 是 You Only Live Once 的缩写,意思是人生只有一次,用来表达珍惜生命、大胆尝试的态度。[doge]
YOLO,全称为"You Only Look Once",是一种流行的实时目标检测算法,由Joseph Redmon等人于2015年首次提出。
YOLO的核心思想是将目标检测任务视为一个单一的回归问题,直接从图像像素到边界框坐标和类别概率的映射。这种设计使得YOLO能够以非常快的速度进行目标检测,同时保持较高的精度,特别适合需要实时处理的应用场景。
YOLO算法的特点
- 显著特点是在单个网络评估中同时预测多个边界框和类别概率,而不是像传统的滑动窗口方法那样多次评估。
- YOLO用一个卷积神经网络(CNN)来提取图像特征,然后使用这些特征来预测边界框和类别概率。
YOLO算法的网络结构
YOLO的网络结构通常包括多个卷积层和池化层。
YOLO 为每个边界框预测一个置信度,这个置信度反映了边界框包含目标的概率以及预测的类别。
置信度的计算公式是:Pr(Object) * IOU(pred, truth)
其中Pr(Object)表示格子中存在目标的概率,IOU(pred, truth)表示预测框和真实框的交并比。
YOLO 数据集格式
YOLO算法的标注格式主要使用.txt文件来存储图像中物体的标注信息。每个图像都有一个对应的.txt文件,文件中的每行表示一个物体的标注,包括物体的类别索引和边界框(bounding box)的坐标。
YOLO数据集格式是一种常用的目标检测数据集格式。它包含了每个图像中的目标的位置和类别信息。每个图像的标注信息存储在一个文本文件中,文件的每一行对应一个目标的标注。
信息 | 格式 |
---|---|
类别索引 | 整数索引,表示每个物体的类别。索引对应于预先定义的类别列表。 |
边界框坐标 | 边界框由中心点坐标(x_center, y_center)和宽度width、高度height组成。这些值通常是归一化到图像宽度和高度的比例值,范围在0到1之间。 |
坐标格式 | 边界框坐标通常按照 [class_index x_center y_center width height] 的格式记录 其中class_index是类别索引,x_center和y_center是边界框中心点的x和y坐标,width和height是边界框的宽度和高度。 |
每行格式如下:
<class_id> <x> <y> <width> <height>
其中:- `class_id`是目标的类别标签,用数字表示。
- `(x, y)`是目标框的中心坐标。
- `width`和`height`是目标框的宽度和高度。
示例:
0 0.35 0.49 0.15 0.30
1 0.75 0.60 0.20 0.40
表示两个目标:
第一个目标的类别标签是0,中心坐标是(0.35, 0.49),宽度为0.15,高度为0.30。
第二个目标的类别标签是1,中心坐标是(0.75, 0.60),宽度为0.20,高度为0.40。
需要注意的是,坐标和尺寸是相对于图像宽度和高度的比例,取值范围通常在0到1之间。
在YOLO的训练过程中,这样的配置文件允许用户轻松地指定数据集的位置和类别信息,从而无需硬编码在训练脚本中。
参数 | 描述 |
---|---|
path | 指定数据集的根目录路径,即所有数据子文件夹的上级目录。这里的路径是相对于当前配置文件的路径或者相对于执行训练脚本的工作目录。 |
train | 定义训练集图像的相对路径。在训练模型时,程序会在指定的路径下查找图像文件。 |
val | 定义验证集图像的相对路径。验证集用于在训练过程中评估模型性能,避免过拟合。 |
nc | 表示类别的数量,这里设置为2,意味着数据集中有两类物体需要被识别。 |
names | 是一个列表,包含了每个类别的名称。这里有两个类别,名称分别是"0"和"1"。这些名称在训练和测试过程中用于引用特定的类别。 |
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../dataset/ # dataset root dir
train: images/train/ # train images (relative to 'path') 128 images
val: images/val/ # train images (relative to 'path') 128 images# Classes
nc: 2 # number of classes
names: ["0", '1'] # class names
YOLO 训练日志
在使用YOLO进行训练时,生成的exp/detect/train类型的文件夹是训练过程中的一个关键组成部分。
文件类型 | 描述 |
---|---|
模型权重 | 训练过程中保存的模型权重,可用于后续的测试或继续训练。 |
日志文件 | 包含训练过程中的所有输出信息,如损失值、精度、速度等。 |
配置文件 | 训练时使用的配置文件副本,记录了数据路径、类别名、模型架构等设置。 |
图表和可视化 | 可能生成训练过程中的性能图表,如损失曲线、精度曲线等。 |
测试结果 | 如果训练过程中包括了测试阶段,可能会保存测试结果,如检测结果的图片或统计数据。 |
文件名 | 说明 |
---|---|
F1_curve.png | F1分数曲线图 |
PR_curve.png | 精确率-召回率曲线图 |
P_curve.png | 精确率曲线图 |
R_curve.png | 召回率曲线图 |
results.csv | 模型训练或测试结果数据的CSV文件 |
results.png | 包含训练结果汇总图表或图像 |
train_batch*.jpg | 不同训练批次的图像和标注 |
val_batch0_labels.jpg | 验证集批次的图像的真实标签可视化 |
val_batch0_pred.jpg | 验证集批次的图像的模型预测可视化 |
weights/ | 保存模型训练过程中的权重文件的目录 |
查看训练日志
在训练过程中和训练完成后,都可以查看训练日志。
可以优先查看results.png,图像的内容类似如下。
从验证集上的损失 (val/box_loss, val/cls_loss, val/dfl_loss) 和性能指标可以评估模型在未见数据上的泛化能力。
在下面的训练日志中,我们发现模型在验证集发生了过拟合。
名称 | 描述 |
---|---|
epoch | 表示模型在整个训练数据集上进行了一次前向和后向传播的完整周期 |
train/box_loss | 衡量模型预测的边界框与真实边界框之间差异的损失值 |
train/cls_loss | 衡量模型预测的类别与真实类别之间差异的损失值 |
train/dfl_loss | 衡量模型对难分类样本的关注程度,减少易分类样本的影响 |
metrics/precision(B) | 在训练过程中,预测为正类别中实际为正类别的比例 |
metrics/recall(B) | 在训练过程中,所有实际正类别中被模型正确预测为正类别的比例 |
metrics/mAP50(B) | 在50%的IoU阈值下计算,衡量模型的整体性能 |
metrics/mAP50-95(B) | 在0.5到0.95的IoU阈值范围内计算,提供更全面的模型性能评估 |
val/box_loss | 模型在未见过的验证集上的边界框损失,用于监控模型的泛化能力 |
val/cls_loss | 模型在验证集上的分类损失,用于监控模型的泛化能力 |
val/dfl_loss | 模型在验证集上的难易样本平衡损失 |
Baseline 进阶思路
如果想要在原有代码上提高模型思路,可以有如下操作:
增加训练的数据集,可以增加更多的视频到训练集中进行训练。
貌似效果甚微
切换不同的模型预训练权
!wget http://mirror.coggle.club/yolo/yolov8s-v8.2.0.pt -O yolov8s.pt
🤔好像这两个方案分数都没有提升呢
引用:
Datawhale https://linklearner.com/activity/16/16/68