Datawhale AI 夏令营第五期 CV方向Task01笔记

赛题解读

赛题目标

利用图像处理和计算机视觉技术开发一套智能识别系统,自动检测和分类摄像头捕获的视频中,城市管理中的违规行为

数据集

初赛提供城管视频监控数据与对应违规行为标注。违规行为包括垃圾桶满溢、机动车违停、非机动车违停等。视频数据为mp4格式,标注文件为json格式,每个视频对应一个json文件。

  • frame_id:违规行为出现的帧编号
  • event_id:违规行为ID
  • category:违规行为类别
  • bbox:检测到的违规行为矩形框的坐标,[xmin,ymin,xmax,ymax]形式

评分规则

在这里插入图片描述

YOLO

是什么

YOLO(You Only Look Once)是一种流行的计算机视觉算法,用于实现物体检测任务。YOLO的主要特点是速度快,能够实现实时物体检测。它将整个图像放在一个实例中,并预测这些框的边界框坐标和及所属类别概率。它的CNN模型接收原始图像的像素作为输入,并直接输出一系列预测的边界框和相应的类别概率,而不需要任何中间步骤(如候选区域生成)。每个边界框由一组参数定义,包括边界框的位置(通常是中心坐标和大小)和它包含的物体的类别概率。

标注格式

YOLO使用的标注格式是每张图像一个文本文件,文件名与图像文件名相对应。文本文件中每一行对应一个边界框,格式为:< class > < x_center > < y_center > < width > < height >
其中,< class >是类别索引,< x_center >和< y_center >是边界框中心点相对于图像宽度和高度的比例,< width >和< height >是边界框的宽度和高度相对于图像宽度和高度的比例。

具体原理

步骤如下:
首先,输入图像:
在这里插入图片描述
然后,YOLO将输入图像划分为网格形式(例如3 X 3):
在这里插入图片描述
最后,对每个网格应用图像分类和定位处理,获得预测对象的边界框及其对应的类概率。

在每个网格中预测:
1)边界框(Bounding Box)
查找落入网格的目标中心点,每个格子预测B个检测框
2)边界框的置信度(Confidence)
置信度是一个结合了物体存在概率和边界框精度的指标。在YOLO算法中,边界框的置信度是通过以下公式计算的:
置信度 = Pr(object)×IoU
其中,Pr(object)是边界框内包含物体的概率,是一个二分类问题,它只关心网格内是否有目标物体,而不关心目标的具体类别。只有当单元格内有目标物体时,Pr(object) 才为1,否则为0;IoU是预测边界框与真实边界框之间的交并比。

非极大值抑制

在实际应用中,YOLO的输出还会经过非极大值抑制(NMS),以去除那些高度重叠的边界框,确保每个物体只保留一个最佳的边界框。简单说就是在 IoU 较高的几个边界框中只保留概率最大的。举例

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

                    if x_center > 1:
                        print(bbox)
                    up.write(f'{category_idx} {x_center} {y_center} {width} {height}\n')
        
        frame_idx += 1

这段代码将视频的每一帧及其标注保存为YOLO训练所需的图像和文本文件。每个文本文件对应一个图像文件,并包含该图像中物体的边界框标注。

from ultralytics import YOLO
model = YOLO("yolov8n.pt")
results = model.train(data="yolo-dataset/yolo.yaml", epochs=2, imgsz=1080, batch=16)

这段代码使用Ultralytics的YOLO库来训练一个YOLO模型。
目前还没有对模型做微调。

  • 14
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值