#Datawhale AI夏令营 #CV赛道 #目标检测 #视频处理方法 #物体检测模型
优快云社区的各位朋友们好久不见了,本次AI夏令营笔记将专注于违规问题智能检测的解决方案,希望能给你一些启示和参考,以作为官方讲解的有益补充
由于datawhale更改了笔记发布政策,本次笔记分享将分为三个部分发布,我将逐步介绍违规问题智能检测任务的实现过程。在本次分享中,我将对赛题进行简单解读,并着重介绍视频文件的处理方法以及物体检测模型,而第二次和第三次分享我将着重介绍YOLO检测框架的原理、调参方法以及上分经验与技巧。
研究背景与意义
研究意义
本次赛题求选手研究开发高效可靠的计算机视觉算法,提升违规行为检测识别的准确度,降低对大量人工的依赖,提升检测效果和效率,从而推动城市治理向更高效、更智能、更文明的方向发展,为居民创造一个安全、和谐、可持续的居住环境。
初赛任务则是根据给定的城管视频监控数据集,进行城市违规行为的检测。选手需要能够从视频中分析并标记出违规行为,提供违规行为发生的时间和位置信息。违规行为包括垃圾桶满溢、机动车违停、非机动车违停等。
数据格式
视频数据为mp4格式,标注文件为json格式,每个视频对应一个json文件。
json文件的内容是每帧检测到的违规行为,包括以下字段:
frame_id | 违规行为出现的帧编号 |
event_id | 违规行为ID |
category | 违规行为类别 |
bbox | 检测到的违规行为矩形框的坐标,[xmin,ymin,xmax,ymax]形式 |
评估指标
【初赛】
使用F1score、MOTA指标来评估模型预测结果。
对每个json文件得到两个指标的加权求和,最终得分为所有文件得分取均值。
注1:若真实目标框与预测框IOU大于0.5,则判定目标正确识别。若MOTA指标为负,则该类别精度得分为0。
注2:若该视频中没有某个类别的目标,则此类别计算均值时,忽略该视频。
【复赛】
复赛需同时评估模型的准确度与效率。
模型准确率评估指标与初赛一致,使用F1score、MOTA进行评估。
模型效率使用FPS(每秒钟能够处理的帧数)等进行评估。
违法标准
这个其实是在数据标注阶段的时候起作用;
就我所知,与专家系统不同,真正进行模型训练时,深度学习模型构建的系统并不太好将规则反映在模型参数中;
这也是进一步研究的一个重要方向;
【机动车违停】
机动车在设有禁止停车标志、标线的路段停车,或在非机动车道、人行横道、施工地段等禁止停车的地方停车。具体包含以下:
1、无论有无禁停标志,机动车道禁止车辆停放;
2、距路口、桥梁50米以内禁止车辆停放;
3、距公交车站、消防栓、消防队、医院30米以内禁止使用上述设施以外的车辆停放;
4、禁止车辆双排停放、靠左侧停放、横向停放、逆向停放;
5、人行道仅允许在已设置的停车泊位内停车,禁止在停车泊位外停车;
6、在设有禁停标志、标线的路段,人行横道、施工路段,不得停车。
【非机动车违停】
非机动车(如自行车、电动车等)未按照规定停放在指定的非机动车停车泊位或停车线内,而是在非机动车禁停区域或未划定的区域(消防通道、盲道、非机动车停车区线外、机动车停车区等)随意停放。
【垃圾满溢】
生活垃圾收集容器内垃圾超过三分之二以上即为满溢。垃圾桶无法封闭、脏污且周边有纸屑、污渍、塑料、生活垃圾及杂物堆放。
【占道经营】
经营者占用城市道路、桥梁、城市广场等公共场所进行盈利性买卖商品或服务的行为。
baseline代码详解
1.安装依赖
本次实验主要包含opencv-python、pandas 、matplotlib、ultralytics这四个依赖,其中OpenCV是一个功能强大的计算机视觉库,它提供了大量的图像和视频处理算法,包括但不限于对象检测、图像识别、图像处理等;而Ultralytics 是一个专注于计算机视觉领域的库,它提供了 YOLOv8 模型的一个最新版本,在速度和准确性上都有显著提升,非常适合实时应用。
!/opt/miniconda/bin/pip install opencv-python pandas matplotlib ultralytics
# 首先,导入库
import os, sys
import cv2, glob, json
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
2.数据下载与读取
(1)数据下载
!apt install zip unzip -y
!apt install unar -y
!wget "https://comp-public-prod.obs.cn-east-3.myhuaweicloud.com/dataset/2024/%E8%AE%AD%E7%BB%83%E9%9B%86%28%E6%9C%89%E6%A0%87%E6%B3%A8%E7%AC%AC%E4%B8%80%E6%89%B9%29.zip?AccessKeyId=583AINLNMLDRFK7CC1YM&Expires=1739168844&Signature=9iONBSJORCS8UNr2m/VZnc7yYno%3D" -O 训练集\(有标注第一批\).zip
!unar -q 训练集\(有标注第一批\).zip
!wget "https://comp-public-prod.obs.cn-east-3.myhuaweicloud.com/dataset/2024/%E6%B5%8B%E8%AF%95%E9%9B%86.zip?AccessKeyId=583AINLNMLDRFK7CC1YM&Expires=1739168909&Signature=CRsB54VqOtrzIdUHC3ay0l2ZGNw%3D" -O 测试集.zip
!unar -q 测试集.zip
(2)数据读取的基本思路
在这里,有必要说明一下数据读取的基本思路:
官方给出的数据具有这样的结构,有多个批次,每个批次包含一段mp4格式的视频文件和一个json格式的标注文件;
而我们读取数据的基本思路就是,首先查看一个批次里面的数据,具体包括mp4格式的视频文件(也可以看做多个连续帧的图形集合(这个理解对不对,有没有数字媒体专业的大佬指点一下))和标注文件,查看标注是否与官方叙述格式一致,并尝试可视化前几个帧的图片和标注;
然后,我们对多个批次运用同样的处理方式进行处理;
最后,我们通过整合将文件整合为YOLO v8或其他框架可以识别的文件形式;这样,我们就可以认为是完成了数据读取的基本过程。
(3)尝试读取一个批次的数据
让我们尝试读取第45个批次的视频数据和标注数据
先读取标注文件
train_anno = json.load(open('训练集(有标注第一批)/标注/45.json', encoding='utf-8'))
train_anno[0], len(train_anno)
pd.read_json('训练集(有标注第一批)/标注/45.json')
再读取视频文件
video_path = '训练集(有标注第一批)/视频/45.mp4'
cap = cv2.VideoCapture(video_path)
while True:
# 读取下一帧
ret, frame = cap.read()
if not ret:
break
break
frame.shape
int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
cv2是我们之前导入的一个用于处理视频的第三方包,cv2.VideoCapture() 方法返回两个值:一个布尔值表示是否成功读取帧,和一个 ndarray 对象,该对象是读取的帧本身。
最后我们尝试对第45批次的视频和标注进行简单的可视化
bbox = [746,