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.pswp.cn/news/528949.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/528949.shtml
英文地址,請注明出處:http://en.pswp.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、遺失物的接收。師生將拾得的遺失物…