【训练源码】
/yjh0410/YOWOv2
【参考源码】
/hpc203/YOWOv2-video-action-detect-onnxrun
【算法介绍】
YOWOv2算法是一个高效且实时的时空动作检测框架,下面是对其的详细介绍:
一、算法背景与特点
- 全称:You Only Watch Once version 2,简称YOWOv2。
- 定位:专为追求速度与精度平衡的视频分析任务设计,尤其适用于资源受限的环境。
- 特点:
- 多级检测:通过结合3D和2D骨干网络,YOWOv2能够高效地识别多种尺度的动作实例,提高了对小动作实例的检测能力。
- 无锚点设计:摒弃了传统的锚框机制,简化了检测流程,减少了冗余计算。
- 适应性强:提供不同的配置,适合各种计算资源限制的设备。
- 实时性能:在保证精度的同时,确保在GPU上达到高效的运行速度。
二、网络架构与机制
- 核心组件:
- 3D骨干网络:用于提取视频的时空特征。YOWOv2采用了现有的高效3D CNN架构来节省开发时间。
- 2D骨干网络:用于提取视频帧的空间特征。YOWOv2构建了一个简单高效的2D骨干网,带有特征金字塔网络(FPN),以提取不同级别的分类特征和回归特征。
- 多级检测通道:YOWOv2设计了多级检测通道,以检测不同规模的动作实例。这些通道利用从3D和2D骨干网络中提取的特征,进行置信度预测、分类预测和回归预测。
- 特征融合策略:YOWOv2采用了创新的特征融合策略,将3D骨干输出的时空特征与2D骨干输出的每一层空间特征进行对齐和融合。这种融合提高了特征的表达能力和检测的准确性。
三、性能表现
- 数据集与指标:YOWOv2在多个主流动作检测数据集上进行了测试和验证,包括UCF101-24和AVA等。
- 检测结果:
- 在UCF101-24数据集上,YOWOv2以超过20 FPS的速度实现了87.0%的视频帧mAP和52.8%的全视频mAP。
- 在AVA数据集上,YOWOv2在提速20 FPS的同时实现了21.7%的视频帧mAP。
四、应用场景
- 安防监控:实时监控系统中,对异常行为进行快速识别和报警。
- 体育分析:在体育赛事中,对运动员的动作进行实时分析和统计。
- 人机交互:在虚拟现实或增强现实中,实现基于动作的交互控制。
- 自动驾驶:在自动驾驶系统中,对周围环境的动作进行实时识别,提高安全性。
五、总结
YOWOv2算法是一个强大而高效的实时时空动作检测框架。它通过结合3D和2D骨干网络、采用多级检测机制和无锚点设计等特点,实现了对小动作实例的高效检测。同时,YOWOv2提供了不同的配置选项和详细的文档及预训练模型,方便开发者快速上手和实际应用。无论是智能监控系统、体育赛事分析还是自动驾驶等领域,YOWOv2都展现出了广阔的应用前景和价值。
【演示界面】
【效果演示】
【测试环境】
vs2019
netframework4.7.2
opencvsharp==4.8.0
notallow==1.16.3
【项目编号】mbd.pub/o/bread/Z5qckpdw
【调用代码】
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OpenCvSharp;
namespace FIRC
{
public partial class Form1 : Form
{
string videoPath = null;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "视频文件(*.*)|*.mp4;*.avi;*.3gp;*.flv";
openFileDialog.RestoreDirectory = true;
openFileDialog.Multiselect = false;
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
videoPath = openFileDialog.FileName;
}
}
private void button2_Click(object sender, EventArgs e)
{
if(videoPath==null)
{
MessageBox.Show("请先选择视频!","温馨提示");
return;
}
Yowov2Manager detector = new Yowov2Manager(Application.StartupPath+ "\\weights\\yowo_v2_nano_ava.onnx", "ava");
VideoCapture cap = new VideoCapture(videoPath);
List<Mat> Clips = new List<Mat>();
int index = 0;
Mat frame = new Mat();
int len_clip = detector.len_clip;
float vis_thresh = 0.2f;
while (cap.Read(frame))
{
if (frame.Empty())
{
Console.WriteLine("视频运行完毕!");
break;
}
if (Clips.Count <= 0)
{
for (int i = 0; i < len_clip; i++)
{
Clips.Add(frame);
}
}
Clips.Add(frame);
Clips.RemoveAt(0);
if (detector.multi_hot)
{
List<Bbox> boxes = new List<Bbox>();
List<float> det_conf = new List<float>();
List<List<float>> cls_conf = new List<List<float>>();
List<int> keep_inds = detector.detect_multi_hot(Clips, boxes, det_conf, cls_conf);
Mat resultImage = detector.vis_multi_hot(frame, boxes, det_conf, cls_conf, keep_inds, vis_thresh);
//Cv2.ImShow("result", resultImage);
pictureBox1.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(resultImage);
int key = Cv2.WaitKey(10);
if (key == 27) break;
}
else
{
List<Bbox> boxes = new List<Bbox>();
List<float> det_conf = new List<float>();
List<int> cls_id = new List<int>();
List<int> keep_inds = detector.detect_one_hot(Clips, boxes, det_conf, cls_id);
Mat resultImage = detector.vis_one_hot(frame, boxes, det_conf, cls_id, keep_inds, vis_thresh, 0.4f);
//Cv2.ImShow("result", resultImage);
pictureBox1.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(resultImage);
int key = Cv2.WaitKey(10);
if (key == 27) break;
}
}
cap.Release();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button3_Click(object sender, EventArgs e)
{
Yowov2Manager detector = new Yowov2Manager(Application.StartupPath + "\\weights\\yowo_v2_nano_ava.onnx", "ava");
VideoCapture cap = new VideoCapture(0);
List<Mat> Clips = new List<Mat>();
int index = 0;
Mat frame = new Mat();
int len_clip = detector.len_clip;
float vis_thresh = 0.2f;
while (cap.Read(frame))
{
if (frame.Empty())
{
Console.WriteLine("视频运行完毕!");
break;
}
if (Clips.Count <= 0)
{
for (int i = 0; i < len_clip; i++)
{
Clips.Add(frame);
}
}
Clips.Add(frame);
Clips.RemoveAt(0);
if (detector.multi_hot)
{
List<Bbox> boxes = new List<Bbox>();
List<float> det_conf = new List<float>();
List<List<float>> cls_conf = new List<List<float>>();
List<int> keep_inds = detector.detect_multi_hot(Clips, boxes, det_conf, cls_conf);
Mat dstimg = detector.vis_multi_hot(frame, boxes, det_conf, cls_conf, keep_inds, vis_thresh);
Cv2.ImShow("result", dstimg);
int key = Cv2.WaitKey(10);
if (key == 27) break;
}
else
{
List<Bbox> boxes = new List<Bbox>();
List<float> det_conf = new List<float>();
List<int> cls_id = new List<int>();
List<int> keep_inds = detector.detect_one_hot(Clips, boxes, det_conf, cls_id);
Mat dstimg = detector.vis_one_hot(frame, boxes, det_conf, cls_id, keep_inds, vis_thresh, 0.4f);
Cv2.ImShow("result", dstimg);
int key = Cv2.WaitKey(10);
if (key == 27) break;
}
}
cap.Release();
}
}
}
【演示视频】
C#winform基于yowov2深度学习算法部署时空动作检测演示_哔哩哔哩_bilibili