赛题
赛题源自 2024“大运河杯”数据开发应用创新大赛——城市治理。
简单而言,利用已有标注的违规(违规行为包括垃圾桶满溢、机动车违停、非机动车违停等)视频数据来有效对未标注视频标注,赛题提供了以下三个数据集:
训练集(有标注)、
训练集(无标注)、
测试集。
数据处理
由于视频数据为mp4格式,标注文件为json格式,每个视频对应一个json文件,需要将mp4等视频有效文件转化为图片形式保存(下面代码中给出作为train数据具体的注释和注意事项,val数据也类似):
import os, sys
import cv2, glob, json
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
anno_df = pd.read_json(anno_path)
# 读取json文件
cap = cv2.VideoCapture(video_path)
# 同时读取视频文件
### 这里需要自定义读取多少内容作为trai样本
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('./dataset/train/' + anno_path.split('/')[-1][:-5] + '_' + str(frame_idx) + '.jpg', frame)
if len(frame_anno) != 0:
with open('./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)
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
模型使用
YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版本,支持图像分类、物体检测和实例分割任务。
具体模型如下:
YOLOv8有以下几个版本:
以yolov8n(其中,yolov8n.pt需要下载)为例,具体配置如下官方说明:
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
model=YOLO('yolov8n.pt')
results = model.train(data="dataset/yolo.yaml", epochs=5, imgsz=1080, batch=32,plots=True)
训练完后即可测试结果。