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),让两者同时达到最高,取得平衡。

Precision = \frac{TP}{TP+FP}

所有预测为真的物体中,实际也为真的物体占比

Recall = \frac{TP}{TP + FN}

所有实际为真的物体中,预测也为真的物体占比

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

float

0.015

0.0 - 1.0

指定图像的色调,引入颜色可变性。帮助模型在不同的光照条件下泛化。

hsv_s

float

0.7

0.0 - 1.0

指定图像的饱和度,影响颜色的强度,用于模拟不同的环境条件。

hsv_v

float

0.4

0.0 - 1.0

指定图像的亮度,帮助模型在各种光照条件下表现良好。

degrees

float

0.0

-180 - +180

指定图像做随机旋转的角度,提高模型对不同方向物体的识别能力。

translate

float

0.1

0.0 - 1.0

指定图像水平和垂直转换的程度,利于模型学习局部物体的检测。

scale

float

0.5

>=0.0

指定缩放图像程度,模拟距离相机不同距离的物体。

shear

float

0.0

-180 - +180

指定图像的剪切角度,模拟从不同角度观看物体的效果。

perspective

float

0.0

0.0 - 0.001

剪切图像的随机透视变换程度,增强模型在3D空间中理解物体的能力。

flipud

float

0.0

0.0 - 1.0

指定图像颠倒的概率,在不影响对象特征的情况下增加数据可变性。

fliplr

float

0.5

0.0 - 1.0

指定图像从左到右翻转的概率,利于学习对称特征和增加数据集多样性。

bgr

float

0.0

0.0 - 1.0

指定图像通道从RGB翻转到BGR的概率,有助于增加对错误通道排序数据集的鲁棒性。

mosaic

float

1.0

0.0 - 1.0

将四个训练图像合并为一个,模拟不同的场景组成。利于复杂场景的理解。

mixup

float

0.0

0.0 - 1.0

线性组合两张图像及其标签创造合成图像。通过引入标签噪声和视觉可变性来增强模型的泛化能力。

copy_paste

float

0.0

0.0 - 1.0

复制一个图像的随机区域并粘贴到另一个图像上,生成新的训练样本。

auto_augment

str

randaugment

-

自动应用预定义的增强策略(randaugment、autoaugment、augmix),通过多样化视觉特征来优化分类任务。

erasing

float

0.4

0.0 - 0.9

在分类训练中随机擦除一部分图像,鼓励模型关注不太明显的特征进行识别。

crop_fraction

float

1.0

0.1 - 1.0

将分类图像裁剪掉一部分,以突出中心特征并适应对象规模,减少背景干扰。

二、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>



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。