赛题
再来回顾一下赛题,赛题源自 2024“大运河杯”数据开发应用创新大赛——城市治理。
简单而言,利用已有标注的违规(违规行为包括垃圾桶满溢、机动车违停、非机动车违停等)有效视频数据来对未标注视频标注,赛题提供了以下三个数据集:
训练集(有标注)、训练集(无标注)、测试集。
Baseline && yolov8
Baseline中最重要的部分为读取视频文件以及使用yolov8来训练部分。
读取文件
由于视频数据为mp4格式,标注文件为json格式,每个视频对应一个json文件,需要将mp4等视频有效文件转化为图片形式保存(在这里,需要使用python的cv2,json等重要的模块进行处理。下面代码中给出作为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进行训练
配置模块等基础文件:
mkdir -p ~/.config/Ultralytics/
wget http://mirror.coggle.club/yolo/Arial.ttf -O ~/.config/Ultralytics/Arial.ttf
以yolov8n(其中,yolov8n.pt需要下载)为例,具体配置如下官方说明:
import os
# 指定gpu
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)
识别
训练完后即可测试结果。
model = YOLO("runs/detect/train/weights/best.pt")
for path in glob.glob('测试集/*.mp4'):
submit_json = []
results = model(path, conf=0.05, imgsz=1088, verbose=False)
for idx, result in enumerate(results):
boxes = result.boxes
masks = result.masks
keypoints = result.keypoints
probs = result.probs
obb = result.obb
if len(boxes.cls) == 0:
continue
xywh = boxes.xyxy.data.cpu().numpy().round()
cls = boxes.cls.data.cpu().numpy().round()
conf = boxes.conf.data.cpu().numpy()
for i, (ci, xy, confi) in enumerate(zip(cls, xywh, conf)):
submit_json.append(
{
'frame_id': idx,
'event_id': i+1,
'category': category_labels[int(ci)],
'bbox': list([int(x) for x in xy]),
"confidence": float(confi)
}
)
with open('./result/' + path.split('/')[-1][:-4] + '.json', 'w', encoding='utf-8') as up:
json.dump(submit_json, up, indent=4, ensure_ascii=False)
关于yolov8
YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版本,支持图像分类、物体检测和实例分割任务。
具体模型如下:
YOLOv8有以下几个版本:
同时,在训练时涉及众多参数,官网提供给的部分参数如下:
几个重要的参数部分介绍如下,详细介绍可以参考yolov8的部署,训练,测试(利用ultralytics)或者官方文件:
model: 模型文件的路径。这个参数指定了所使用的模型文件的位置,例如 yolov8n.pt 或 yolov8n.yaml。
data: 数据文件的路径。该参数指定了数据集文件的位置,例如 coco128.yaml。数据集文件包含了训练和验证所需的图像、标签。
epochs: 训练的轮数。这个参数确定了模型将会被训练多少次,每一轮都遍历整个训练数据集。训练的轮数越多,模型对数据的学习就越充分,但也增加了训练时间。
patience: 早停的等待轮数。在训练过程中,如果在一定的轮数内没有观察到模型性能的明显提升,就会停止训练。这个参数确定了等待的轮数,如果超过该轮数仍没有改进,则停止训练。
batch: 每个批次中的图像数量。在训练过程中,数据被分成多个批次进行处理,每个批次包含一定数量的图像。这个参数确定了每个批次中包含的图像数量。特殊的是,如果设置为-1,则会自动调整批次大小,至你的显卡能容纳的最多图像数量。
imgsz: 输入图像的尺寸。这个参数确定了输入图像的大小。可以指定一个整数值表示图像的边长,也可以指定宽度和高度的组合。例如1080表示图像的宽度和高度均为1080像素。
save: 是否保存训练的检查点和预测结果。当训练过程中保存检查点时,模型的权重和训练状态会被保存下来,以便在需要时进行恢复或继续训练。预测结果也可以被保存下来以供后续分析和评估。
save_period: 保存检查点的间隔。这个参数确定了保存检查点的频率,例如设置为10表示每隔10个训练轮数保存一次检查点。如果设置为负数(如-1),则禁用保存检查点功能。