Datawhale AI 夏令营 第五期 CV方向 学习笔记
qq_51962151 2024-09-20 16:31:13 阅读 60
引言
这是参加Datawhale 第五期 AI 夏令营 CV方向的一些学习笔记,CV方向的学习模式为以赛促学,在 “大运河杯”数据开发应用创新大赛——城市治理 中学习计算机视觉相关的知识,笔记中若存在不足之处,还望各位读者不吝指出。
Task1:跑通YOLO方案baseline
一、赛事解读
1.赛事链接
https://www.marsbigdata.com/competition/details?id=3839107548872
2024“大运河杯”数据开发应用创新大赛——城市治理
|
2.赛事任务
利用图像处理和计算机视觉技术开发一套智能识别系统,自动检测和分类摄像头捕获的视频中,城市管理中的违规行为。初赛任务是从给定的城管监控视频中分析并标记出违规行为,提供违规行为的类别、发生的时间以及位置信息。
3.数据分析
违规行为包括垃圾桶满溢、机动车违停、非机动车违停等数种,需通过视频正确识别。视频数据为mp4格式,标注文件为json格式,每个视频对应一个json文件。json文件的内容是每帧检测到的违规行为,包括以下字段:
frame_id:违规行为出现的帧编号event_id:违规行为IDcategory:违规行为类别bbox:检测到的违规行为矩形框的坐标,[xmin,ymin,xmax,ymax] 形式
违规行为1:垃圾桶满溢
违规行为2:机动车违停
违规行为3:非机动车违停
训练集中包含:已标注视频52个、未标注视频53个。测试集中包含:视频39个。视频时长不等,从几秒到1分钟。
4.评价规则
使用F1score、MOTA指标来评估模型预测结果,得分越高越好
要理解F1score和MOTA指标,首先理解TP,TN,FN,TN的概念,其通俗的表示为:
TP:预测为真,实际为真,预测正确。
FP:预测为真,实际为假,预测错误。
FN:预测为假,实际为真,预测错误。
TN:预测为假,实际为假,预测正确。
F1score指标:同时考虑精确率(Precision)和召回率(Recall),让两者同时达到最高,取得平衡。
所有预测为真的物体中,实际也为真的物体占比
所有实际为真的物体中,预测也为真的物体占比
MOTA指标:用于评估多目标跟踪任务性能,通过衡量目标检测、关联和定位的准确性来评估跟踪器的性能。
GT:视频所有帧中标注框的总数。
IDSW:将检测框与标注框进行匹配,基于上一帧统计检测框的跳变次数。比如:第t帧时,物体1被检测框1所标出,到第t+1帧时,物体1变成了被检测框2所标出,此时则表明发生了一次跳变,IDSW等于1;而第t+2帧时,物体1仍被检测框2所标出,与t+1帧相比,检测框没有发生跳变,IDSW仍等于1。
5.难点分析
已标注的样本数据量较少。模型可能没有足够多的样本概括学习违规行为特征,可能会导致测试集的错误率远大于训练集。
任务复杂。准确识别违规行为,不仅仅要识别出物体的类别,还要判别出其状态是否符合要求(比如:识别出了小汽车,还要判断出小汽车是不是停在了人行道上),比一般的目标检测任务更加复杂。
二、baseline运行及解释
step1: 在Ubuntu系统中下载git,克隆教程中魔搭仓库中的代码
<code>apt install git-lfs
git lfs install
git clone https://www.modelscope.cn/datasets/Datawhale/AI_Camp5_baseline_CV.git
step2:进入 AI_Camp5_baseline_CV文件夹
step3:双击进入task1.ipynb文件
step4:浏览task1文件。核心代码解释如下:
以下代码主要对视频进行了逐帧抽取处理,同时把每帧的标注文件改写成了符合YOLO模型的格式。
通过openCV的cv2库读取mp4视频的所有帧,通过pandas库读取json格式的标注文件,json文件涵盖了对视频每一帧的标注。从第0帧开始顺序处理,抽出视频的每帧图像,判断该帧图像有没有对应的json标注内容,如果有,则将json格式的标注转写成YOLO格式的标注,并保存。
<code># 读取训练集视频
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
if x_center > 1:
print(bbox)
up.write(f'{category_idx} {x_center} {y_center} {width} {height}\n')
frame_idx += 1
以下是调用YOLO模型并设置训练参数的关键代码。从直接从ultralytics库中导入已搭建好的YOLO模型,使用yolov8n.pt作为预训练权重。
.train() 表示开启训练。data="yolo-dataset/yolo.yaml" 指明数据集及其描述文件所在位置。epochs=2 表示设置训练次数为2遍imgsz=1080 表示设置输入图像的长边大小不超过1080px,若超过该值,则会自动下采样。batch=16 表示批量大小为16
<code>from ultralytics import YOLO
model = YOLO("yolov8n.pt")
results = model.train(data="yolo-dataset/yolo.yaml", epochs=2, imgsz=1080, batch=16)code>
step5:运行完成,右键download result压缩包 ,提交上传至比赛官方页面
三、YOLO补充知识
YOLO是一种单阶段目标检测算法,其核心思想在于:将目标检测任务视为一个单一的回归问题,通过一个卷积神经网络(CNN)直接从图像像素到边界框坐标和类别概率的映射。经过多年迭代,目前已更新到YOLOv9。YOLOv8模型算法较新、使用率较高、实用性强,baseline中也使用的是YOLOv8。
YOLOv8网络结构
YOLO使用的标注格式是每张图像一个文本文件,文件名与图像文件名相对应。文本文件中每一行对应一个边界框,格式为:<code><class> <x_center> <y_center> <width> <height>。
其中,
<class>
是类别索引,<x_center>
和<y_center>
是边界框中心点相对于图像宽度和高度的比例,<width>
和<height>
是边界框的宽度和高度相对于图像宽度和高度的比例。
Task2:建模方案解读与进阶
一、模型介绍
1.目标检测流程
目标检测算法主要分为两类: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)生成候选区域,然后对这些区域进行分类和边界框的精细调整。这种方法的优点是精度高,但速度相对较慢 。
2.非极大值抑制(NMS)
在检测过程中,可能会产生多个重叠的边界框,用于表示同一物体。NMS是一种常用的技术,用于选择最佳的边界框并去除多余的框。
NMS核心原理:首先按照置信度或者其他标准对候选框进行排序,然后选择得分最高的候选框作为最终的预测结果。对于每个保留的候选框,如果两个候选框重叠区域超过一定范围,通常设置为某个固定的值(如IOU大于0.5),则将置信度较小的候选框抑制,即不显示。
IOU交并比:两个候选框重叠部分的面积除以两个候选框所占的总面积
二、进阶方法
将yolov8n的预训练权重更换成yolov8s。
根据官方文档,yolov8一共有5种预选训练权重,从n到x,速度越来越慢,但是预测效果越来越好,在COCO数据集上的性能对比如下:
三、训练日志解读
F1_curve:描绘F1分数与置信度之间的关系。对于该结果来说,一般效果好的模型应该是置信度和F1分数都比较高,可以看出,这种训练方法下的模型能力并没有达到令人满意的效果。
P_curve:描绘精确度和置信度之间的关系,一般来说,置信度越高准确率也逐渐上升,可以看出,这种训练方法下的模型能一定程度地进行正确预测,但准确率很不稳定。
R_curve:描绘召回率和置信度之间的关系,可以看出,总体的召回率比较低,随着置信度升高,召回率越来越低,尽管还处于一个低置信度很低的位置,召回率也几乎要跌为0了,表明目标检测模型目前还很难找到全部的正确目标。
PR_curve:PR曲线中的P代表的是precision(精准率),R代表的是recall(召回率),描绘了精准率与召回率之间的关系。曲线和x、y轴共同围成的面积越大,表面目标检测模型的性能越高,从下图可以看出,该模型的目标检测能力还很有限。
Task3:上分思路
一、数据增强
常见的增强技术包括翻转、旋转、缩放和颜色调整等。
常用的图像数据增强库有:Albumentations、Imgaug 和 TensorFlow的 ImageDataGenerator等。
数据增强方法 | 描述 |
几何变换 | |
Random Horizontal Flip | 沿水平轴随机翻转图像,增加对镜像变化的不变性。 |
Random Affine Transformations | 包括图像的随机旋转、缩放、平移和剪切,增加对几何变换的鲁棒性。 |
像素变换 | |
Copy-Paste Augmentation | 复制一个图像的随机区域并粘贴到另一个图像上,生成新的训练样本。 |
MixUp Augmentation | 线性组合两张图像及其标签创造合成图像,增加特征空间的泛化。 |
Mosaic Augmentation | 将四张训练图像组合成一张,增加物体尺度和位置的多样性。 |
色彩变换 | |
HSV Augmentation | 对图像的色相、饱和度和亮度进行随机变化,改变颜色属性。 |
Random Noise Augmentation
| 随机向图像中添加噪声,常用的噪声模式是椒盐噪声和高斯噪声。 |
ultralytics开源的YOLOv8自带有数据增强的设置,如下所示。
参数 | 数据类型 | 默认值 | 数据范围 | 功能解释 |
<code>hsv_h
|
|
|
| 指定图像的色调,引入颜色可变性。帮助模型在不同的光照条件下泛化。 |
|
|
|
| 指定图像的饱和度,影响颜色的强度,用于模拟不同的环境条件。 |
|
|
|
| 指定图像的亮度,帮助模型在各种光照条件下表现良好。 |
|
|
|
| 指定图像做随机旋转的角度,提高模型对不同方向物体的识别能力。 |
|
|
|
| 指定图像水平和垂直转换的程度,利于模型学习局部物体的检测。 |
|
|
|
| 指定缩放图像程度,模拟距离相机不同距离的物体。 |
|
|
|
| 指定图像的剪切角度,模拟从不同角度观看物体的效果。 |
|
|
|
| 剪切图像的随机透视变换程度,增强模型在3D空间中理解物体的能力。 |
|
|
|
| 指定图像颠倒的概率,在不影响对象特征的情况下增加数据可变性。 |
|
|
|
| 指定图像从左到右翻转的概率,利于学习对称特征和增加数据集多样性。 |
|
|
|
| 指定图像通道从RGB翻转到BGR的概率,有助于增加对错误通道排序数据集的鲁棒性。 |
|
|
|
| 将四个训练图像合并为一个,模拟不同的场景组成。利于复杂场景的理解。 |
|
|
|
| 线性组合两张图像及其标签创造合成图像。通过引入标签噪声和视觉可变性来增强模型的泛化能力。 |
|
|
|
| 复制一个图像的随机区域并粘贴到另一个图像上,生成新的训练样本。 |
|
|
| -
| 自动应用预定义的增强策略(randaugment、autoaugment、augmix),通过多样化视觉特征来优化分类任务。 |
|
|
|
| 在分类训练中随机擦除一部分图像,鼓励模型关注不太明显的特征进行识别。 |
|
|
|
| 将分类图像裁剪掉一部分,以突出中心特征并适应对象规模,减少背景干扰。 |
二、YOLO模型训练参数调优
在 YOLO 中绝大部分参数都可以使用默认值。
参数 | 解释 |
save_period
| 保存模型检查点的频率(周期数),-1 表示禁用。
|
device
| 用于训练的计算设备,可以是单个或多个 GPU,CPU 或苹果的 MPS。
|
optimizer
| 训练中使用的优化器,如 SGD、Adam 等,或 'auto' 以根据模型配置自动选择。
|
momentum
| SGD 的动量因子或 Adam 优化器的 beta1。
|
weight_decay
| L2 正则化项。
|
warmup_epochs
| 学习率预热的周期数。
|
warmup_momentum
| 预热阶段的初始动量。
|
warmup_bias_lr
| 预热阶段偏置参数的学习率。
|
box
| 边界框损失在损失函数中的权重。
|
cls
| 分类损失在总损失函数中的权重。
|
dfl
| 分布焦点损失的权重。
|
三、YOLO模型预测行为参数调优
参数名 | 类型 | 默认值 | 解释 |
conf | float | 0.25 | 置信度阈值,用于设置检测对象的最小置信度。低于此阈值的检测对象将被忽略。调整此值有助于减少误报。 |
iou | float | 0.7 | 非最大值抑制(NMS)的交并比(IoU)阈值。较低的值通过消除重叠的边界框来减少检测数量,有助于减少重复项。 |
imgsz | int 或 tuple | 640 | 推理时定义图像的大小。可以是单个整数(如640),用于将图像大小调整为正方形,或(height, width)元组。合适的尺寸可以提高检测精度和处理速度。 |
augment | bool | FALSE | 启用预测时的数据增强(TTA),可能通过牺牲推理速度来提高检测的鲁棒性。 |
四、参数的修改方法
1.修改配置文件
在Yolov8模型开源代码项目中,ultralytics-main/ultralytics/cfg文件夹下的default.yaml是项目的配置文件,可以直接在 default.yaml文件中修改,或者新建一个与default.yaml包含相同参数的文件如new.yaml,在调用模型的代码中将文件路径传入cfg参数,如下所示:
<code>from ultralytics import YOLO
model = YOLO("yolov8m.pt")
results = model.train(data="yolo-dataset/yolo.yaml", cfg="ultralytics/cfg/new.yaml")code>
2.在调用模型的代码中传入要修改的参数
from ultralytics import YOLO
model = YOLO("yolov8m.pt")
results = model.train(data="yolo-dataset/yolo.yaml", epochs=20, imgsz=1080, batch=16, conf=0.3, mixup=0.5, optimizer="SGD")code>
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。