前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >视频监控人员行为识别算法

视频监控人员行为识别算法

原创
作者头像
燧机科技
发布2023-09-22 09:11:48
5320
发布2023-09-22 09:11:48
举报
文章被收录于专栏:燧机科技-视频AI智能分析

视频监控人员行为识别算法通过opencv+python网络模型框架算法,视频监控人员行为识别算法可以识别和判断员工的行为是否符合规范要求,一旦发现不符合规定的行为,视频监控人员行为识别算法将自动发送告警信息。

一、行为识别

    在视频监控人员行为识别算法识别中,有很大一部分研究是针对于人体行为识别的,主要进行识别的也是一些家庭内的危险行为,如小孩、老人摔倒检测,外来人员闯入等,这些都可归为人体行为识别的范畴之内。

    视频监控人员行为识别算法(action recognition),即根据视频图像完成对于人体动作的区分,这其中包括但不限于摔倒等危险动作。

    在视频监控人员行为识别算法领域,主要包含以下几个子领域:

Untrimmed Video Classification:一段未修剪很长的视频序列,其中在时序上包含多个类型的动作,且其中很多动作并不需要特别关注,所以这类视频需要进行全局分析进行分类。

Trimmed Action Recognition:一段修剪的视频序列包含一类动作,序列时间长度不定,根据视频标签进行学习分类。

Temporal Action Proposal:在一段较长的视频序列中找到含有动作的视频段,并将其提取分类,类似于图像目标检测任务中的候选框提取分类。

Temporal Action Localization:与上述的类似,即在长视频序列中找到存在动作行为的视频段,然后对视频段进行分类研究。

Dense-Captioning Events:对于一段未经修剪的长视频序列,里面可能包含很多动作,找到存在的动作视频行为段,并对其进行视频行为描述。

    接下来,将对视频监控人员行为识别算法领域的相关技术研究现状进行简单的分析和总结。

1.1 视频监控人员行为识别算法相关数据集

    关于视频监控人员行为识别算法领域内的数据库有很多,而较为常用的主要是UCF101、HMDB51、Kinetics、THUMOS 2014和ActivityNet。

    前三个主要用于动作识别分类常用,主要包含大量不同类型的动作,其中UCF101含13320段视频及101类动作、HMDB51含7000段视频及51类动作、Kinetics含300k段视频及400类动作。

    后两个主要用于行为检测,数据来源为youtube,也较为常用。

1.2 视频监控人员行为识别算法研究现状

    考虑到对于视频监控人员行为识别算法的检测主要是实时的,需要对视频的每一帧进行检测分析,故对于视频序列的处理分析更符合于上述的Temporal Action Proposal、Temporal Action Localization以及Dense-Captioning Events相关领域,当然其他领域的相关研究也会在这里介绍。

首先进行密集采样特征,将视频的每一帧分为不同尺度,并对不同尺度的图片进行网格划分采集特征点,并在时间序列上跟踪特征点变化,形成轨迹;之后对提取的轨迹进行操作,得到轨迹描述子和运动/结构描述子(HOG,HOF,MBH),并对其使用Bag of Features的方法进行特征编码,并利用SVM分类器分类。

    可以看到,DT算法可对任意长度的视频序列进行特征提取,提取主要基于人体光流变化的相关特征。

    来源:论文Dense Trajectories and Motion Boundary Descriptors for Action Recognition

关于视频监控人员行为识别算法目标检测的方法,现在主流的算法可分为两类。一类是基于Region Proposal的R-CNN系算法,包括R-CNN,Fast R-CNN,Faster R-CNN等,它们都是two-stage的,即需要先产生目标候选框,也就是目标位置,然后再对候选框做分类与回归。另一类是Yolo,SSD这类one-stage算法,其仅仅使用一个卷积神经网络CNN直接预测不同目标的类别与位置。相对来说,第一类方法的准确度更高,但是速度慢,第二给算法速度快,但是准确性要低一些。

    视频监控人员行为识别算法针对于摔倒检测,现在有很多的研究都是基于可便携穿戴传感器检测实现的,而针对于计算机视觉的摔倒检测十分有限,接下来将介绍调研到的近些年关于通过视觉方法进行摔倒检测的研究。

代码语言:javascript
复制
"""
2023.1.1
该代码实现了labelme导出的json文件,批量转换成yolo需要的txt文件,且包含了坐标归一化
原来labelme标注之后的是:1.jpg  1.json
经过该脚本处理后,得到的是1.jpg 1.json 1.txt
"""
import os
import numpy as np
import json
from glob import glob
import cv2
from sklearn.model_selection import train_test_split
from os import getcwd
 
classes = ["NOFight", "Fight", "Person"]
# 1.标签路径
labelme_path = "Data20200108/"
isUseTest = False  # 是否创建test集
# 3.获取待处理文件
files = glob(labelme_path + "*.json")
files = [i.replace("\\", "/").split("/")[-1].split(".json")[0] for i in files]
print(files)
if isUseTest:
    trainval_files, test_files = train_test_split(files, test_size=0.1, random_state=55)
else:
    trainval_files = files
# split
train_files, val_files = train_test_split(trainval_files, test_size=0.1, random_state=55)
 
 
def convert(size, box):
    dw = 1. / (size[0])
    dh = 1. / (size[1])
    x = (box[0] + box[1]) / 2.0 - 1
    y = (box[2] + box[3]) / 2.0 - 1
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return (x, y, w, h)
 
 
wd = getcwd()
print(wd)
 
 
def ChangeToYolo5(files, txt_Name):
    if not os.path.exists('tmp/'):
        os.makedirs('tmp/')
    list_file = open('tmp/%s.txt' % (txt_Name), 'w')
    for json_file_ in files:
        json_filename = labelme_path + json_file_ + ".json"
        imagePath = labelme_path + json_file_ + ".jpg"
        list_file.write('%s/%s\n' % (wd, imagePath))
        out_file = open('%s/%s.txt' % (labelme_path, json_file_), 'w')
        json_file = json.load(open(json_filename, "r", encoding="utf-8"))
        height, width, channels = cv2.imread(labelme_path + json_file_ + ".jpg").shape
        for multi in json_file["shapes"]:
            points = np.array(multi["points"])
            xmin = min(points[:, 0]) if min(points[:, 0]) > 0 else 0
            xmax = max(points[:, 0]) if max(points[:, 0]) > 0 else 0
            ymin = min(points[:, 1]) if min(points[:, 1]) > 0 else 0
            ymax = max(points[:, 1]) if max(points[:, 1]) > 0 else 0
            label = multi["label"]
            if xmax <= xmin:
                pass
            elif ymax <= ymin:
                pass
            else:
                cls_id = classes.index(label)
                b = (float(xmin), float(xmax), float(ymin), float(ymax))
                bb = convert((width, height), b)
                out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
                print(json_filename, xmin, ymin, xmax, ymax, cls_id)
 
 
ChangeToYolo5(train_files, "train")
ChangeToYolo5(val_files, "val")
# ChangeToYolo5(test_files, "test")

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
视频理解
视频理解是基于腾讯领先的 AI 技术和丰富的内容运营经验,对视频内容输出涵盖人物、场景、物体、事件的高精度、多维度的优质标签内容。通过对视频内容进行细粒度的结构化解析,应用于媒资系统管理、素材检索、内容运营等业务场景中。其中一款产品是媒体智能标签(Intelligent Media Label Detection)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档