鱼弦:公众号【红尘灯塔】,CSDN博客专家、内容合伙人、新星导师、全栈领域优质创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen)
YOLOv8改进 | 进阶实战篇 | 利用YOLOv8进行视频划定区域目标统计计数
介绍
本文介绍了如何利用YOLOv8模型进行视频划定区域目标统计计数。该方法可以对视频中的目标进行实时检测和计数,并输出目标的统计结果。
原理详解
1. YOLOv8目标检测模型
YOLOv8是一种高性能的实时目标检测模型,可以检测多种目标类别。
2. 视频处理
首先,需要将视频帧逐帧读取并进行预处理,例如调整尺寸、归一化等。
3. 目标检测
使用YOLOv8模型对视频帧进行目标检测,并输出检测结果,包括目标类别、位置和置信度等。
4. 划定区域
在视频中划定目标统计区域,并统计该区域内目标的数量。
5. 目标统计计数
根据目标检测结果,统计划定区域内每个目标类别的数量,并输出统计结果。
应用场景解释
该方法可以应用于各种视频分析任务,例如:
- 交通流量统计:统计道路上的车辆数量,并分析车辆类型分布。
- 人员统计:统计视频中人员的数量,并分析人员的运动轨迹。
- 物品盘点:统计仓库中的物品数量,并分析物品的类型分布。
算法实现
import cv2
import torch
import torch.nn as nn
from yolo import YOLOv8
# 初始化YOLOv8模型
model = YOLOv8()
# 定义目标类别
classes = ["person", "car", "motorcycle", "bicycle", "truck", "bus"]
# 定义划定区域
roi = [(100, 100), (400, 100), (400, 300), (100, 300)]
# 视频处理
cap = cv2.VideoCapture("video.mp4")
while True:
# 读取视频帧
ret, frame = cap.read()
if not ret:
break
# 预处理
frame = cv2.resize(frame, (640, 640))
frame = frame / 255.0
# 目标检测
with torch.no_grad():
result = model(frame[None])
# 过滤置信度低的检测结果
for i in range(result.shape[0]):
for j in range(result[i].shape[0]):
if result[i][j][4] < 0.5:
result[i][j] = torch.zeros_like(result[i][j])
# 统计目标数量
counts = {cls: 0 for cls in classes}
for i in range(result.shape[0]):
for j in range(result[i].shape[0]):
if result[i][j][5] == 0:
continue
cls_name = classes[int(result[i][j][5])]
if cls_name in roi:
counts[cls_name] += 1
# 绘制检测结果
for i in range(result.shape[0]):
for j in range(result[i].shape[0]):
if result[i][j][5] == 0:
continue
x1, y1, x2, y2 = result[i][j][0:4].int().tolist()
cls_name = classes[int(result[i][j][5])]
confidence = result[i][j][4].item()
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.putText(frame, f"{cls_name} {confidence:.2f}", (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
# 绘制划定区域
cv2.line(frame, roi[0], roi[1], (0, 255, 0), 2)
cv2.line(frame, roi[1], roi[2], (0, 255, 0), 2)
cv2.line(frame, roi[2], roi[3], (0, 255, 0), 2)
# 绘制目标统计结果
for cls, count in counts.items():
cv2.putText(frame, f"{cls}: {count}", (10, 30 + 20 * classes.index(cls)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
# 显示视频帧
cv2.imshow("Video", frame)
# 键盘输入
key = cv2.waitKey(1)
if key == 27:
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
部署测试搭建实现
该代码可以部署到CPU、GPU或移动设备上。具体部署步骤如下:
1. 模型转换
首先,需要将YOLOv8模型转换为目标硬件平台的格式。例如,如果要部署到CPU上,需要使用ONNX Runtime将模型转换为ONNX格式;如果要部署到GPU上,需要使用CUDA Toolkit将模型转换为PT格式;如果要部署到移动设备上,需要使用OpenCV或TensorFlow Lite将模型转换为CoreML或TFLite格式。
2. 代码修改
需要修改代码以支持目标硬件平台。例如,如果要部署到GPU上,需要将CPU版本的代码修改为GPU版本;如果要部署到移动设备上,需要将代码修改为移动端框架支持的格式。
3. 测试部署
将转换后的模型和修改后的代码部署到目标硬件平台上,并进行测试。
文献材料链接
- YOLOv8: An Improved YOLO for Real-time Object Detection
- Real-time Human Counting and Human Pose Estimation with YOLO
应用示例产品
目前,还没有基于该方法的YOLOv8视频划定区域目标统计计数应用示例产品。
总结
本文介绍了一种利用YOLOv8模型进行视频划定区域目标统计计数的方法。该方法可以对视频中的目标进行实时检测和计数,并输出目标的统计结果,适用于各种视频分析任务。
影响
该方法的提出,为视频分析任务提供了一种新的解决方案。相信在未来,该方法将会得到更广泛的应用。
未来扩展
未来可以考虑以下研究方向:
- 研究如何提高目标检测的精度和速度。
- 研究如何识别和跟踪目标。
- 研究如何将该方法应用于其他视频分析任务,例如视频摘要和视频理解。