如何使用YOLOv8训练视频行为检测数据集_打斗场景视频数据集 将视频数据集转换为图像帧 使用OpenCV来提取视频中的每一帧
以下文章及代码仅供参考。
打斗场景视频数据集
一共有四个数据集,
UBI-Fight(异常事件检测数据集),SurveillanceCameraFightDataset(监控摄像头下的打架检测),HockeyFightVidoes(曲棍球比赛打架数据集),RealLifeViolenceSituationsDataset(真实街头斗殴数据集)
使用YOLOv8训练打斗场景视频数据集,我们需要将这些视频数据转换为适合YOLO模型训练的图像帧,并确保它们按照YOLO格式进行标注。
数据准备
将视频数据集转换为图像帧,并为每个帧创建对应的标签文件。以下是如何处理的一个示例:
视频转图像帧
可以使用OpenCV来提取视频中的每一帧:
import cv2
import os
def video_to_frames(video_path, output_folder):
# 创建输出文件夹
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# 开始读取视频
cap = cv2.VideoCapture(video_path)
count = 0
while True:
ret, frame = cap.read()
if not ret:
break
frame_filename = os.path.join(output_folder, f"frame_{count}.jpg")
cv2.imwrite(frame_filename, frame)
count += 1
cap.release()
# 示例调用
video_to_frames('path/to/video.mp4', 'path/to/output/folder')
对于每个数据集,重复上述过程以生成所有视频帧。
组织数据集目录结构
确保你的数据按照如下结构组织:
fight_detection_dataset/
├── UBI_Fight/
│ ├── images/
│ │ ├── train/
│ │ ├── val/
│ │ └── test/
│ └── labels/
│ ├── train/
│ ├── val/
│ └── test/
├── SurveillanceCameraFightDataset/
│ ├── images/
│ │ ├── train/
│ │ ├── val/
│ │ └── test/
│ └── labels/
│ ├── train/
│ ├── val/
│ └── test/
├── HockeyFightVideos/
│ ├── images/
│ │ ├── train/
│ │ ├── val/
│ │ └── test/
│ └── labels/
│ ├── train/
│ ├── val/
│ └── test/
└── RealLifeViolenceSituationsDataset/
├── images/
│ ├── train/
│ ├── val/
│ └── test/
└── labels/
├── train/
├── val/
└── test/
data_fight.yaml
data_fight.yaml
文件内容示例:
train: [./fight_detection_dataset/UBI_Fight/images/train, ./fight_detection_dataset/SurveillanceCameraFightDataset/images/train, ./fight_detection_dataset/HockeyFightVideos/images/train, ./fight_detection_dataset/RealLifeViolenceSituationsDataset/images/train]
val: [./fight_detection_dataset/UBI_Fight/images/val, ./fight_detection_dataset/SurveillanceCameraFightDataset/images/val, ./fight_detection_dataset/HockeyFightVideos/images/val, ./fight_detection_dataset/RealLifeViolenceSituationsDataset/images/val]
test: [./fight_detection_dataset/UBI_Fight/images/test, ./fight_detection_dataset/SurveillanceCameraFightDataset/images/test, ./fight_detection_dataset/HockeyFightVideos/images/test, ./fight_detection_dataset/RealLifeViolenceSituationsDataset/images/test]
nc: 2 # 假设二分类:fight和non-fight
names: ['non-fight', 'fight']
安装依赖项
确保安装了必要的库:
pip install ultralytics pillow opencv-python-headless tensorboard
训练模型
创建一个Python脚本来开始训练过程:
from ultralytics import YOLO
import yaml
def main_train():
# 加载YOLOv8模型
model = YOLO('yolov8n.yaml') # 或者直接加载预训练权重
with open('./data_fight.yaml', 'r') as file:
data_yaml = yaml.safe_load(file)
results = model.train(
data=data_yaml,
epochs=100, # 根据需要调整
imgsz=640,
batch=16,
project='./runs/detect',
name='fight_detection',
optimizer='SGD',
device='0', # 使用GPU编号
save=True,
cache=True,
)
if __name__ == '__main__':
main_train()
模型评估
训练完成后,可以使用验证集或测试集评估模型性能:
from ultralytics import YOLO
model = YOLO('./runs/detect/fight_detection/weights/best.pt')
metrics = model.val(data='./data_fight.yaml')
print(metrics.box.map) # 输出mAP值等指标
推理与结果可视化
编写推理脚本对新图像进行预测,并可视化结果:
import cv2
from PIL import Image
from ultralytics import YOLO
model = YOLO('./runs/detect/fight_detection/weights/best.pt')
def detect_objects(image_path):
results = model.predict(source=image_path)
img = cv2.imread(image_path)
for result in results:
boxes = result.boxes.numpy()
for box in boxes:
r = box.xyxy
x1, y1, x2, y2 = int(r[0]), int(r[1]), int(r[2]), int(r[3])
label = result.names[int(box.cls)]
confidence = box.conf
if confidence > 0.5: # 设置置信度阈值
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) # 绘制矩形框
cv2.putText(img, f'{label} {confidence:.2f}', (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
return img
# 示例调用
result_image = detect_objects('your_test_image.jpg') # 确保测试图像路径正确
Image.fromarray(cv2.cvtColor(result_image, cv2.COLOR_BGR2RGB)).show() # 使用PIL显示图像
可视化界面
使用TensorBoard监控训练过程:
tensorboard --logdir runs/
然后在浏览器中访问 http://localhost:6006
查看训练进度和结果。
通过t步骤,你可以有效地使用YOLOv8架构来训练打斗场景视频数据集,实现目标检测任务。