【训练源码】

/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都展现出了广阔的应用前景和价值。

【演示界面】

[C#]winform基于yowov2算法实现时空动作检测实时检测实现_List

【效果演示】

 

[C#]winform基于yowov2算法实现时空动作检测实时检测实现_System_02

【测试环境】

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