python图像人类检测_OpenCV人类行为识别(3D卷积神经网络)

1. 3D卷积神经网络

相比于2D 卷积神经网络,3D卷积神经网络更能很好的利用视频中的时序信息。因此,其主要应用视频、行为识别等领域居多。3D卷积神经网络是将时间维度看成了第三维。

人类行为识别的实际应用:

安防监控。(检测识别异常行为:如打架,偷东西等)

监视和培训新人工作来确保任务执行正确。(例如,鸡蛋灌饼制作程序:和面,擀面团,打鸡蛋,摊饼等动作)

判断检测食品服务人员是否按规定洗手。

自动对视频数据分类。

人类的行为识别,在实际生活环境中,在不同的场景会存在着背景杂乱、遮挡和视角变化等等情况,对于人来说,是很容易就可以辨识出来,但对于计算机,就不是一件简单的事了,比如目标尺度变化和视觉改变等。

2. 人类行为识别模型

abseiling

air drumming

answering questions

applauding

applying cream

archery

arm wrestling

arranging flowers

assembling computer

auctioning

baby waking up

baking cookies

balloon blowing

bandaging

barbequing

bartending

beatboxing

bee keeping

belly dancing

bench pressing

bending back

bending metal

biking through snow

blasting sand

blowing glass

blowing leaves

blowing nose

blowing out candles

bobsledding

bookbinding

bouncing on trampoline

bowling

braiding hair

breading or breadcrumbing

breakdancing

brush painting

brushing hair

brushing teeth

building cabinet

building shed

bungee jumping

busking

canoeing or kayaking

capoeira

carrying baby

...

import os

import numpy as np

import cv2 as cv

import argparse

from common import findFile

parser = argparse.ArgumentParser(description='Use this script to run action recognition using 3D ResNet34',

formatter_class=argparse.ArgumentDefaultsHelpFormatter)

parser.add_argument('--input', '-i', help='Path to input video file. Skip this argument to capture frames from a camera.')

parser.add_argument('--model', required=True, help='Path to model.')

parser.add_argument('--classes', default=findFile('action_recongnition_kinetics.txt'), help='Path to classes list.')

# To get net download original repository https://github.com/kenshohara/video-classification-3d-cnn-pytorch

# For correct ONNX export modify file: video-classification-3d-cnn-pytorch/models/resnet.py

# change

# - def downsample_basic_block(x, planes, stride):

# - out = F.avg_pool3d(x, kernel_size=1, stride=stride)

# - zero_pads = torch.Tensor(out.size(0), planes - out.size(1),

# - out.size(2), out.size(3),

# - out.size(4)).zero_()

# - if isinstance(out.data, torch.cuda.FloatTensor):

# - zero_pads = zero_pads.cuda()

# -

# - out = Variable(torch.cat([out.data, zero_pads], dim=1))

# - return out

# To

# + def downsample_basic_block(x, planes, stride):

# + out = F.avg_pool3d(x, kernel_size=1, stride=stride)

# + out = F.pad(out, (0, 0, 0, 0, 0, 0, 0, int(planes - out.size(1)), 0, 0), "constant", 0)

# + return out

# To ONNX export use torch.onnx.export(model, inputs, model_name)

def get_class_names(path):

class_names = []

with open(path) as f:

for row in f:

class_names.append(row[:-1])

return class_names

def classify_video(video_path, net_path):

SAMPLE_DURATION = 16

SAMPLE_SIZE = 112

mean = (114.7748, 107.7354, 99.4750)

class_names = get_class_names(args.classes)

net = cv.dnn.readNet(net_path)

net.setPreferableBackend(cv.dnn.DNN_BACKEND_INFERENCE_ENGINE)

net.setPreferableTarget(cv.dnn.DNN_TARGET_CPU)

winName = 'Deep learning image classification in OpenCV'

cv.namedWindow(winName, cv.WINDOW_AUTOSIZE)

cap = cv.VideoCapture(video_path)

while cv.waitKey(1) < 0:

frames = []

for _ in range(SAMPLE_DURATION):

hasFrame, frame = cap.read()

if not hasFrame:

exit(0)

frames.append(frame)

inputs = cv.dnn.blobFromImages(frames, 1, (SAMPLE_SIZE, SAMPLE_SIZE), mean, True, crop=True)

inputs = np.transpose(inputs, (1, 0, 2, 3))

inputs = np.expand_dims(inputs, axis=0)

net.setInput(inputs)

outputs = net.forward()

class_pred = np.argmax(outputs)

label = class_names[class_pred]

for frame in frames:

labelSize, baseLine = cv.getTextSize(label, cv.FONT_HERSHEY_SIMPLEX, 0.5, 1)

cv.rectangle(frame, (0, 10 - labelSize[1]),

(labelSize[0], 10 + baseLine), (255, 255, 255), cv.FILLED)

cv.putText(frame, label, (0, 10), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0))

cv.imshow(winName, frame)

if cv.waitKey(1) & 0xFF == ord('q'):

break

if __name__ == "__main__":

args, _ = parser.parse_known_args()

classify_video(args.input if args.input else 0, args.model)

3.代码

环境:

win10

pycharm

anaconda3

python3.7

文件结构:

代码:

from collections import deque

import numpy as np

import argparse

import imutils

import cv2

# 构造参数

ap = argparse.ArgumentParser()

ap.add_argument("-m", "--model", required=True, help="path to trained human activity recognition model")

ap.add_argument("-c", "--classes", required=True, help="path to class labels file")

ap.add_argument("-i", "--input", type=str, default="", help="optional path to video file")

args = vars(ap.parse_args())

# 类别,样本持续时间(帧数),样本大小(空间尺寸)

CLASSES = open(args["classes"]).read().strip().split("\n")

SAMPLE_DURATION = 16

SAMPLE_SIZE = 112

print("处理中...")

# 创建帧队列

frames = deque(maxlen=SAMPLE_DURATION)

# 读取模型

net = cv2.dnn.readNet(args["model"])

# 待检测视频

vs = cv2.VideoCapture(args["input"] if args["input"] else 0)

writer = None

# 循环处理视频流

while True:

# 读取每帧

(grabbed, frame) = vs.read()

# 判断视频是否结束

if not grabbed:

print("无视频读取...")

break

# 调整大小,放入队列中

frame = imutils.resize(frame, width=640)

frames.append(frame)

# 判断是否填充到最大帧数

if len(frames) < SAMPLE_DURATION:

continue

# 队列填充满后继续处理

blob = cv2.dnn.blobFromImages(frames, 1.0, (SAMPLE_SIZE, SAMPLE_SIZE), (114.7748, 107.7354, 99.4750),

swapRB=True, crop=True)

blob = np.transpose(blob, (1, 0, 2, 3))

blob = np.expand_dims(blob, axis=0)

# 识别预测

net.setInput(blob)

outputs = net.forward()

label = CLASSES[np.argmax(outputs)]

# 绘制框

cv2.rectangle(frame, (0, 0), (300, 40), (255, 0, 0), -1)

cv2.putText(frame, label, (10, 25), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 2)

# cv2.imshow("Activity Recognition", frame)

# 检测是否保存

if writer is None:

# 初始化视频写入器

# fourcc = cv2.VideoWriter_fourcc(*"MJPG")

fourcc = cv2.VideoWriter_fourcc(*"mp4v")

writer = cv2.VideoWriter("E:\\work\\activity-recognition-demo\\videos\\output\\xishou1.mp4", fourcc, 30, (frame.shape[1], frame.shape[0]), True)

writer.write(frame)

# 按 q 键退出

# key = cv2.waitKey(1) & 0xFF

# if key == ord("q"):

# break

print("结束...")

writer.release()

vs.release()

4. 测试

测试1:洗手

OpenCV人类行为检测-洗手

https://www.bilibili.com/video/av96440536/

视频左上角打上了“washing hands”(洗手)标签。

测试2:瑜伽

上图视频测试地址:https://www.bilibili.com/video/BV13E411c7QK/

检测到视频中是“yoga”(瑜伽),同时又识别到执行的动作是“stretching leg”(伸腿)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/528949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud Feign作为HTTP客户端调用远程HTTP服务

如果你的项目使用了SpringCloud微服务技术,那么你就可以使用Feign来作为http客户端来调用远程的http服务。当然,如果你不想使用Feign作为http客户端,也可以使用比如JDK原生的URLConnection、Apache的Http Client、Netty的异步HTTP Client或者Spring的RestTemplate。 那么,为…

java查看weblogic服务器_java判断服务器是那种,例如区分tomcat和weblogic | 学步园

package com.geostar.query.util;import org.apache.log4j.Logger;/*** author likehua* 服务器类型探测* Date 2011/04/13* **/public class ServerUtil {public static final String GERONIMO_CLASS "/org/apache/geronimo/system/main/Daemon.class";public s…

拼接的option会多出空行_Word空格,空行,页眉横线等问题,我只花一分钟就全解决了...

从网上复制下来的资料粘贴到Word文档上&#xff0c;出现了许多空格、空行、页眉横线等问题&#xff0c;这时候我们该如何快速地解决这些问题&#xff0c;看看下面的操作你就知道了。一、删除空格1、空格案例从网上复制下来的文字到Word文档中&#xff0c;出现字与字之间有好多空…

基于java高校教师管理系统_基于SSM框架下的JAVA高校教师业务水平综合管理系统...

每天记录学习&#xff0c;每天会有好心情。*^_^*今天和一个朋友共同完成了一个高校教师业务水平综合管理系统项目&#xff0c;我们在开发时选用的框架是SSM(MYECLIPSE)框架。我这个朋友知识有限&#xff0c;只会这个框架&#xff0c;哈哈&#xff0c;都是为了方便他。和往常一样…

oracle连接工具_扯一扯Tableau软件配置数据源系列之Oracle

作者&#xff1a;扯蛋君编辑&#xff1a;齐天大圣声明&#xff1a;本文章仅用于Taleau软件的应用、学习沟通&#xff0c;不代表Taleau公司&#xff1b;文中所示截图来源Taleau官方及软件公开内容&#xff0c;相应著作权归Tableau所有。 今天给大家介绍Tableau工具如何连接数据库…

在java中原始时间_Java 日期时间

Java 日期时间java.util包提供了Date类来封装当前的日期和时间。 Date类提供两个构造函数来实例化Date对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数&#xff0c;该参数是从1970年1月1日起的微秒数。Date(long millisec)Date对象创建…

如何和后台接触的_后台产品,不只是做支持

最近在招聘后台产品经理&#xff0c;面试过程中提到一个问题&#xff0c;这个问题之前也困扰了我很久&#xff1a;你做的后台产品&#xff0c;价值体现在哪里&#xff1f;只是做业务支持么&#xff1f;今天就来聊聊这个话题。我是做后台产品出身&#xff0c;最开始入行做的是云…

java手写的html转图片格式_(Java实现)HTML转JPG,TIFF等图片格式和TIFF图片合并功能解决方案。...

上一篇文章说到了HTML转PDF的实现方式&#xff0c;而就在那个需求的另外一个方面&#xff0c;项目要求要实现页面转图片的需求&#xff0c;主要是JPG&#xff0c;TIFF&#xff0c;PNG等格式。弄得我有点囧&#xff0c;上次一直没搞定。也没找到合适的工具进行转换。前一小段时间…

云计算呼叫中心_干货|云呼叫中心系统和传统呼叫中心系统的区别在哪?

随着社会的发展&#xff0c;呼叫中心由传统的呼叫中心逐渐发展为云呼叫中心。然而关于这两者的区别&#xff0c;您知道吗&#xff1f;跟随畅远技术一同来了解一下吧......一、购买、安装不同传统呼叫中心软件在配置方面有几个特点&#xff1a;一次购买终身使用&#xff1b;安装…

java从键盘为数组赋值,java给数组赋值

java 动态数组赋值,java对象数组详解,java二维数组赋值,java给数组赋值java数组动态赋值,从零学java笔录-第24篇 图解一维数组在内存中,java二维数组赋值,java给数组赋值java 数组动态赋值,从零学java笔录-第24篇 图解一维数组在内存中,java二维数组赋值,java给数组赋值数组的基…

隔一段时间查找一次 golang_剑指 offer-04 二维数组中的查找

算法名称&#xff1a;二维数组中的查找题目内容&#xff1a;在一个二维数组中&#xff0c;每一行都按照从左到右递增的顺序排序&#xff0c;每一列都按照从上到下递增的顺序排序。请完成一个函数&#xff0c;输入这样的一个二维数组和一个整数&#xff0c;判断数组中是否含有该…

decorator php,php设计模式 Decorator(装饰模式)

/*** 装饰模式** 动态的给一个对象添加一些额外的职责,就扩展功能而言比生成子类方式更为灵活*/header("Content-type:text/html;charsetutf-8");abstract class MessageBoardHandler{public function __construct(){}abstract public function filter($msg);}class …

python中format函数用法简书_增强的格式化字符串format函数

自python2.6开始&#xff0c;新增了一种格式化字符串的函数str.format()&#xff0c;可谓威力十足。那么&#xff0c;他跟之前的%型格式化字符串相比&#xff0c;有什么优越的存在呢&#xff1f;让我们来揭开它羞答答的面纱。它通过{}和:来代替%。“映射”示例通过位置In [1]: …

在线电脑配置PHP源码,域名授权系统PHP源码 V2.7.0 支持盗版追踪

最新漂亮简洁大气的域名授权系统PHP源码&#xff0c;域名授权系统PHP版&#xff0c;功能强大带有后台&#xff0c;经过版本升级&#xff0c;全新美观大气的UI洁面&#xff01;支持盗版追踪&#xff0c;与卡密系统对接购买卡密对域名进行授权&#xff0c;支持授权代码、到期时间…

python分词代码_中文分词--最大正向匹配算法python实现

最大匹配法&#xff1a;最大匹配是指以词典为依据&#xff0c;取词典中最长单词为第一个次取字数量的扫描串&#xff0c;在词典中进行扫描(为提升扫描效率&#xff0c;还可以跟据字数多少设计多个字典&#xff0c;然后根据字数分别从不同字典中进行扫描)。例如&#xff1a;词典…

python输出所有组合数_python – GridSearchCV是否存储了所有参数组合的所有分数?...

GridSearchCV使用“评分”来选择最佳估算器.训练GridSearchCV后,我希望看到每个组合的得分. GridSearchCV是否存储每个参数组合的所有分数&#xff1f;如果它如何获得分数&#xff1f;谢谢.这是我在另一篇文章中使用的示例代码.from sklearn.feature_extraction.text import Co…

php 504网关,504 gateway timeout什么意思

504 gateway time-out(504网关超时错误)是HTTP状态代码&#xff0c;这意味着一个服务器在尝试加载网页或填写浏览器的另一个请求时未从其访问的另一台服务器收到及时响应。换句话说&#xff0c;504错误通常表明不同的计算机&#xff0c;即您正在获取504消息的网站无法控制但依赖…

python 二维数组长度_剑指offer二维数组中的查找【Java+Python】

点击上方"蓝字"&#xff0c;关注了解更多二维数组中的查找1. 题目描述在一个二维数组中(每个一维数组的长度相同)&#xff0c;每一行都按照从左到右递增的顺序排序&#xff0c;每一列都按照从上到下递增的顺序排序。请完成一个函数&#xff0c;输入这样的一个二维数组…

php 静态变量 引用,PHP的返回引用(方法名前加)和局部静态变量(static)

先阅读手册从函数返回一个引用&#xff0c;必须在函数声明和指派返回值给一个变量时都使用引用操作符 & &#xff1a;例子 17-13. 由函数返回一个引用有关引用的更多信息, 请查看引用的解释。在来看一段很多开源代码喜欢用的单例注册模式 class a{} class b{} function &am…

失物招领小程序_通知 | 保卫部拟设置失物招领处

保卫部拟设置失物招领处为规范对遗失物品的接收、登记、发放等工作&#xff0c;切实维护师生利益&#xff0c;保卫部拟设置失物招领处&#xff0c;现将有关失物招领的流程明确如下&#xff1a;1、失物招领地点&#xff1a;保卫部二楼中厅。2、遗失物的接收。师生将拾得的遗失物…