




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
人工智能綜合項目開發項目六客流統計分析系統模擬實驗成都職業技術學院項目分析01任務一目標跟蹤02任務二人臉檢測模型部署03項目六
客流統計分析系統模擬實驗項目分析人臉檢測和目標跟蹤算法以及人臉檢測和目標跟蹤模型部署,構建客流統計分析預
警系統,實現人群計數的預警功能。(1)了解人臉檢測算法和目標跟蹤算法,模型部署。(2)了解人群計數的預警系統的構建。(3)掌握利用人臉檢測與目標跟蹤模型推理框架實現基于人群計數的預警系統。人臉檢測算法實現人臉檢測是指對于任意一幅給定的圖像,采用一定的策略對其進行搜索以確定其中
是否含有人臉,如果是則返回一臉的位置、大小和姿態。人臉檢測主要指檢測并定位輸
入圖像中所有的人臉,同時輸出精確的人臉位置和精度,是人臉信息處理中重要的一環。人臉檢測是一個復雜的具有挑戰性的模式檢測問題,其主要的難點有兩方面,一方面是
由于人臉內在的變化所引起:1)人臉具有相當復雜的細節變化,不同的外貌如臉形、膚色等,不同的表情如眼、
嘴的開與閉等;2)人臉的遮擋,如眼鏡、頭發和頭部飾物以及其他外部物體等;另外一方面由于外在條件變化所引起:1)由于成像角度的不同造成人臉的多姿態,如平面內旋轉、深度旋轉以及上下旋轉,
其中深度旋轉影響較大2)光照的影響,如圖像中的亮度、對比度的變化和陰影等。3)圖像的成像條件,如攝像設備的焦距、成像距離,圖像獲得的途徑等等。這些困難都為解決人臉問題造成了難度。如果能找到一些相關的算法并能在應用過
程中達到實時,將為成功構造出具有實際應用價值的人臉檢測與跟蹤系統提供保證。到目前為止,人臉檢測技術早已融入人們的日常生活中,如移動支付、安防監控、
視頻追蹤等應用都以人臉目標被成功檢測識別為前提。2.
人臉檢測算法簡介人臉識別算法的原理:系統輸入一般是一張或者一系列含有未確定身份的人臉圖像,
以及人臉數據庫中的若干已知身份的人臉圖像或者相應的編碼,而其輸出則是一系列相
似度得分,表明待識別的人臉的身份。圖
6.1
人臉檢測算法分類如圖
6.1
所示,按維數分類,人臉檢測方法主要集中在二維圖像方面,二維人臉檢
測主要利用分布在人臉上從低到高
80
個節點或標點,通過測量眼睛、顴骨、下巴等之間
的間距來進行身份認證。人臉檢測算法主要有:基于模板匹配的方法、基于奇異值特征
方法、子空間分析法、局部保持投影、主成分分析。另外,二維人臉檢測方法的最大不
足是在面臨姿態、光照條件不同、表情變化以及臉部化妝等方面較為脆弱,識別的準確
度受到很大限制,而這些都是人臉在自然狀態下會隨時表現出來的。三維人臉檢測可以
極大地提高識別精度,真正的三維人臉檢測是利用深度圖像進行研究,自
90
年代初期開
始,已經有了一定的進展。三維人臉檢測方法有:基于圖像特征的方法、基于模型可變
參數的方法。按機理分類,人臉檢測算法有:基于人臉特征點的識別算法、基于整幅人臉圖像的
識別算法、基于模板的識別算法、利用神經網絡進行識別的算法、利用支持向量機進行
識別的算法。盡管在不受控制的人臉檢測方面已經取得了巨大的進步,但低成本的高效人臉檢測
和高精度仍然是一個有待解決的問題。任務一
目標跟蹤目標跟蹤是計算機視覺研究領域的熱點之一,并得到廣泛應用。相機的跟蹤對焦、
無人機的自動目標跟蹤等都需要用到目標跟蹤技術。另外還有特定物體的跟蹤,比如人
體跟蹤,交通監控系統中的車輛跟蹤,人臉跟蹤和智能交互系統中的手勢跟蹤等。簡單來說,目標跟蹤就是在連續的視頻序列中,建立所要跟蹤物體的位置關系,得
到物體完整的運動軌跡。給定圖像第一幀的目標坐標位置,計算在下一幀圖像中目標的
確切位置。在運動的過程中,目標可能會呈現一些圖像上的變化,比如姿態或形狀的變
化、尺度的變化、背景遮擋或光線亮度的變化等。目標跟蹤算法的研究也圍繞著解決這
些變化和具體的應用展開。在計算機視覺中,目標檢測是在圖像和視頻(一系列的圖像)中掃描和搜尋目標,概括來說就是在一個場景中對目標進行定位和識別,如下圖中展示的,我們要檢測圖像
中的車輛,這就是典型的目標檢測實例。圖
6.2
目標檢測實例目標跟蹤就是跟蹤一個目標,一直尾隨著目標。例如在動畫圖像(.gif)或者視頻
中跟蹤一個目標是如何移動的,目標要到哪里去,以及目標的速度。實時鎖定一個(一
些)特定的移動目標。跟蹤是一系列的檢測。假設在交通錄像中,想要檢測一輛車或者一個人,使用錄像
不同時刻的快照(通過暫停鍵)來檢測目標,一輛車或一個人。然后通過檢查目標是如何在錄像不同的畫面中移動(對錄像每一幀進行目標檢測,比如
YOLO
算法,就能知道目
標在不同的畫面里的坐標),由此實現對目標的追蹤。比如要計算目標的速度,就可以
通過兩幀圖像中目標坐標的變化來計算目標移動距離,除以兩幀畫面的間隔時間。因為要處理錄像所有的快照(每一幀)的像素,這些算法需要密集的跟蹤方法
(dense
method
of
tracking)來實現,對于每一幀畫面圖像,都要進行目標檢測,就拿
滑窗法來舉例,需要處理圖像中的所有像素,所以這種方法進行目標跟蹤,計算量將會
非常大。(1)目標跟蹤算法概述早期的目標跟蹤算法主要是根據目標建模或者對目標特征進行跟蹤,大致分為兩種:1)基于目標模型建模的方法通過對目標外觀模型進行建模,
然后在之后的幀中找到目標.例如,
區域匹配、特征
點跟蹤、基于主動輪廓的跟蹤算法、光流法等.最常用的是特征匹配法,
首先提取目標特征,
然后在后續的幀中找到最相似的特征進行目標定位,
常用的特征有:
SIFT
特征、SURF
特征、Harris
角點等。2)基于搜索的方法隨著研究的深入,人們發現基于目標模型建模的方法對整張圖片進行處理,實時性
差。人們將預測算法加入跟蹤中,
在預測值附近進行目標搜索,
減少了搜索的范圍。常
見一類的預測算法有
Kalman
濾波、粒子濾波方法。另一種減小搜索范圍的方法是內核方
法:運用最速下降法的原理,向梯度下降方向對目標模板逐步迭代,直到迭代到最優位
置。諸如,Meanshift、Camshift
算法。隨著深度學習方法的廣泛應用,人們開始考慮將其應用到目標跟蹤中。人們開始使
用深度特征并取得了很好的效果。之后,人們開始考慮用深度學習建立全新的跟蹤框架,
進行目標跟蹤。在大數據背景下,利用深度學習訓練網絡模型,得到的卷積特征輸出表達能力更強。在目標跟蹤上,初期的應用方式是把網絡學習到的特征,直接應用到相關濾波或
Struck
的跟蹤框架里面,從而得到更好的跟蹤結果,比如
DeepSORT
方法。本質上卷積輸出得到
的特征表達,更優于
HOG
或
CN
特征,這也是深度學習的優勢之一,但同時也帶來了計
算量的增加。(2)Deep
SORT
算法概述Deep
SORT
算法的前身是
SORT,
全稱是
Simple
Online
and
Realtime
Tracking。
簡
單介紹一下,SORT
最大特點是基于
Faster
R-CNN
的目標檢測方法,并利用卡爾曼濾波算
法+匈牙利算法,極大提高了多目標跟蹤的速度,同時達到了
SOTA
的準確率。在《DEEP
LEARNING
IN
VIDEO
MULTI-OBJECT
TRACKING:
A
SURVEY》這篇基于深度學
習的多目標跟蹤的綜述中,描述了
MOT
問題中四個主要步驟:1)給定視頻原始幀;2)運行目標檢測器如
Faster
R-CNN、YOLOv3、SSD
等進行檢測,獲取目標檢測框;3)將所有目標框中對應的目標摳出來,進行特征提取(包括表觀特征或者運動特
征);進行相似度計算,計算前后兩幀目標之間的匹配程度(前后屬于同一個目標之間
的距離比較小,不同目標的距離比較大);4)數據關聯,為每個對象分配目標的
ID。以上就是四個核心步驟,其中核心是檢測,SORT
論文的摘要中提到,僅僅換一個更
好的檢測器,就可以將目標跟蹤表現提升
18.9%。圖
6.0-1
Deep
SORT
算法流程任務二
人臉檢測模型部署人臉數據集
神經網絡
神經網絡
神經網絡
神經網絡標注及預處理模型搭建模型訓練模型轉換模型部署圖
6.4
模型部署流程如圖
6.4
所示,人臉檢測模型部署需要以上五個步驟:人臉數據集標注及預處理,
神經網絡模型搭建,神經網絡模型訓練,神經網絡模型轉換,神經網絡模型部署。1.模型部署流程(1)加載模型ONNXRuntime
是微軟推出的一款推理框架,用戶可以非常便利地運行
onnx
模型。
ONNXRuntime
支持多種運行后端包括
CPU,GPU,TensorRT,DML
等。可以說
ONNXRuntime
是對
ONNX
模型最原生的支持。總體來看,整個
ONNXRuntime
的運行可以分為三個階段,Session
構造,模型加載與
初始化和運行。和其他所有主流框架相同,ONNXRuntime
最常用的語言是
python,而實際負責執行框架運行的則是
C++。1)第一階段
Session
構造構造階段即創建一個
InferenceSession
對象。在
python
前端構建
Session
對象時,
python
端會通過
http://onnxruntime_pybind_state.cc
調用
C++中的
InferenceSession
類構造函數,得到一個
InferenceSession
對象。InferenceSession
構造階段會進行各個成員的初始化,成員包括負責
OpKernel
管理
的
KernelRegistryManager
對象,持有
Session
配置信息的
SessionOptions
對象,負責
圖分割的
GraphTransformerManager,負責
log
管理的
LoggingManager
等。當然,這個
時候
InferenceSession
就是一個空殼子,只完成了對成員對象的初始構建。(2)模型加載與初始化在完成
InferenceSession
對象的構造后,會將
onnx
模型加載到
InferenceSession
中并進行進一步的初始化。1)模型加載模型加載時,會在
C++后端會調用對應的
Load()函數,InferenceSession
一共提供
了
8
種
Load
函數。包括從
url,ModelProto,void*
model
data,model
istream
等讀取
ModelProto。InferenceSession
會對
ModelProto
進行解析然后持有其對應的
Model
成員。2)
Providers
注冊在
Load
函
數
結
束
后
,InferenceSession
會
調
用
兩
個
函
數
:RegisterExecutionProviders()和
sess->Initialize();RegisterExecutionProviders
函數會完成
ExecutionProvider
的注冊工作。這里解
釋一下
ExecutionProvider,ONNXRuntime
用
Provider
表示不同的運行設
備
比
如
CUDAProvider
等。目前
ONNXRuntimev1.0
支持了包括
CPU,CUDA,TensorRT,MKL
等七種
Providers。通過調用
sess->RegisterExecutionProvider()函數,InferenceSession
通
過一個
list
持有當前運行環境中支持的
ExecutionProviders。3)
InferenceSession
初始化即
sess->Initialize(),這時
InferenceSession
會
根
據
自
身
持
有
的
model
和
execution
providers
進行進一步的初始化(在第一階段
Session
構造時僅僅持有了空殼
子成員變量)。該步驟是
InferenceSession
初始化的核心,一系列核心操作如內存分配,
model
partition,kernel
注冊等都會在這個階段完成。首先,session
會根據
level
注
冊
graph
optimization
transformers,并通過
GraphTransformerManager
成員進行持有。
接下來
session
會進行
OpKernel
注冊,OpKernel
即定義的各個
node
對應在不同運行設
備上的計算邏輯。這個過程會將持有的各個
ExecutionProvider
上定義的所有
node
對應
的
Kernel
注冊到
session
中,session
通過
KernelRegistryManager
成員進行持有和管
理。然后
session
會對
Graph
進行圖變換,包括插入
copy
節點,cast
節點等。接下來是
model
partition,也就是根運行設備對
graph
進行切分,決定每個
node
運行在哪個
provider
上。最后,為每個
node
創建
ExecutePlan,運行計劃主要包含了各個
op
的執行順序,內存申請管理,內存復用管理等操作。
3)模型運行模型運行即
InferenceSession
每次讀入一個
batch
的數據并進行計算得到模型的最
終輸出。然而其實絕大多數的工作早已經在
InferenceSession
初始化階段完成。細看下
源碼就會發現
run
階段主要是順序調用各個
node
的對應
OpKernel
進行計算。
import
onnxruntime
as
ortPOSENET_MODEL
=
'../../resource/model_zoo/scrfd_500m_bnkps_shape160x160.onnx'#
加載
ONNX
模型class
OnnxRun:def
init
(self,
model_name="face_detect",
model_path=POSENET_MODEL):"""model_name:
模型名稱model_path:
模型路徑"""self.model_name
=
model_nameself.ort_session
=
ort.InferenceSession(model_path)self.input_name
=
self.ort_session.get_inputs()[0].nameinput
=
self.ort_session.get_inputs()output
=
self.ort_session.get_outputs()print(self.model_name
+
"_input_shape",
input[0])
(3)模型推理訓練是通過從已有的數據中學習到某種能力,而推理是簡化并使用該能力,使其能
快速、高效地對未知的數據進行操作,以獲得預期的結果。訓練是計算密集型操作,模型一般都需要使用大量的數據來進行訓練,通過反向傳
播來不斷地優化模型的參數,以使得模型獲取某種能力。在訓練的過程中,我們常常是
將模型在數據集上面的擬合情況放在首要位置的。而推理過程在很多場景下,除了模型
的精度外,還更加關注模型的大小和速度等指標。這就需要對訓練的模型進行一些壓縮、for
shape
in
output:#
獲取輸出數據的形狀print(self.model_name
+
"_output_shape",
shape)print("outpput",
len(output))def
inference(self,
img):input_data
=
imgreturn
self.ort_session.run(None,
{self.input_name:
input_data})if
name
==
"
main
":onnx_run
=
OnnxRun()剪枝或者是操作上面的計算優化。def
inference(self,
img):input_data
=
self.imgPreprocessing(img)net_outs
=
self.onnx_run.inference(input_data)bboxes,
kpss
=
getFaceBoxs(img,
net_outs,
input_size=(ai_cfg.INPUT_SIZE))tracked_boxes
=
self.ds.update(bboxes,
img)self.predictions
=
[tracked_boxes,
kpss]return
self.predictions如圖
6.0-1
所示,將一張圖片輸入到模型,在經過圖像預處理、模型推理之后得到勾畫出人臉框的結果圖。圖
6.0-1
人臉檢測算法推理結果2.目標檢測模型部署class
DeepSort(object):def
init
(self,
model_path,
max_dist=0.2,
min_confidence=0.3,
nms_max_overlap=1,
max_iou_distance=0.7,
max_age=70,
n_init=3,
nn_budget=100,
use_cuda=True):self.min_confidence
=
min_confidence
self.nms_max_overlap
=
nms_max_overlap
self.extractor
=
Extractor(model_path)
max_cosine_distance
=
max_dist
nn_budget
=
100metric
=
NearestNeighborDistanceMetric("cosine",
max_cosine_distance,
nn_budget)self.tracker
=
Tracker(metric,
max_iou_distance=max_iou_distance,
max_age=max_age,
n_init=n_init)def
update(self,
bbox_xywh,
ori_img):
self.height,
self.width
=
ori_img.shape[:2]
try:#
generate
detectionsfeatures
=
self._get_features(bbox_xywh,
ori_img)
bbox_tlwh
=
self._xywh_to_tlwh(np.array(bbox_xywh))detections
=
[Detection(bbox_tlwh[i],
features[i])
for
i,
box
in
enumerate(bbox_xywh)]#
update
tracker
self.tracker.predict()
self.tracker.update(detections)
#
output
bbox
identities
outputs
=
[]for
track
in
self.tracker.tracks:if
not
track.is_confirmed()
or
track.time_since_update
>
1:
continuebox
=
track.to_tlwh()#
x1,y1,x2,y2
=
self._tlwh_to_xyxy(box)
x,
y,
w,
h
=
boxtrack_id
=
track.track_idoutputs.append(np.array([x,
y,
w,
h,
track_id],
dtype=16))if
len(outputs)
>
0:outputs
=
np.stack(outputs,
axis=0)except:outputs
=
[]return
outputs該插件的輸入是人臉框和人臉檢測模型推理后的圖像(在這定義為原圖像),在原圖像經過讀取高和寬、提取特征、轉換人臉框位置表達方式后,最后對每個檢測到的人臉框實現目標跟蹤,解決目標檢測中出現的重復計數問題。如圖
6.6
所示,最終函數輸
出跟蹤結果。圖
6.6
目標跟蹤模型推理結果3.系統整體框架基于人群計數的預警系統使用深度學習目標檢測算法實現人臉檢測,通過目標跟蹤
算法避免重復計數,并結合可視化數據分析交互界面構建出客流統計分析系統,實現客
流統計功能,整體架構如圖
6.7
所示。圖
6.7
系統整體架構4.基于人群計數的預警系統功能插件構建(1)基于人群計數的預警系統開發采用
python
多進程實現圖像獲取,圖像識別,
與硬件交互,結果可視化等任務。#
新建消息隊列q_flask
=
mp.Manager().Queue(2)
#
傳遞識別結果到網頁
q_img
=
mp.Manager().Queue(1)
#
獲取攝像頭圖像
q_rec
=
mp.Manager().Queue(1)
#
識別結果mapOpenPlugin
=
dict()
#
插件mapClosePlugin
=
dict()mapOpenPlugin[TaskType.IMAGE_GET_TASK]
=
(imgGetPluginRegist,(q_flask,
q_img,
q_rec,
full_dict))
#
圖像獲取
mapOpenPlugin[TaskType.IMAGE_REC_TASK]
=
(imgRecPluginRegist,(q_img,
q_rec))#
圖像識別mapOpenPlugin[TaskType.FLASK_TASK]
=
(flaskPluginRegist,(htop,
port,
q_flask,
full_dict))
#
網頁端傳遞圖像for
plugin
in
mapOpenPlugin:(str(plugin)
+
"啟動成功~")taskFunc,
taskArgs
=
mapOpenPlugin[plugin]taskFunc(*taskArgs)
workFlow.busStart()#
提交任務
#
啟動插件線程(2)目標檢測功能插件實現在目標檢測功能插件中實現了人臉檢測模型部署,利用深度學習目標檢測算法實現了人臉檢測任務,現將模型推理結果傳遞到人群計數的預警功能插件實現識別結果繪制。class
VideoThread(threading.Thread):def
init
(self,
camera="0",
q_flask:Queue=None,q_img:Queue=None,
q_rec:Queue=None):threading.Thread.
init
(self)self.cap
=
setCamera(camera)
#
網絡攝像頭self.q_flask
=
q_flask
self.q_img
=
q_img
self.q_rec
=
q_recdef
run(self):
face_detect_pricet
=
[]
face_num
=
0
out_num
=
0in_num
=
0while
True:
if
self.cap
!=
"":#
消息隊列傳遞#
消息隊列傳遞原始圖像到識別插件
#
消息隊列傳遞
AI
模型的推理結果ret,
frame
=
self.cap.read()frame
=
cv2.resize(frame,
(ai_cfg["cam_width"],
ai_cfg["cam_height"]))
#
原始圖像傳遞if
not
self.q_img.full()
and
not
frame
is
None:
self.q_img.put(bytearray(frame))#
識別結果繪制if
not
self.q_rec.empty():
face_detect_pricet
=
self.q_rec.get()frame,
face_num,
out_num,
in_num
=
recImgDis(frame,
face_detect_pricet,
face_num,
out_num,
in_num)
#
if
in_num
!=
0
or
out_num
!=
0:#
("face_num:"
+
str(face_num))#
("out_num:"
+
str(out_num))#
("in_num:"
+
str(in_num))
(3)目標跟蹤功能插件實現在目標跟蹤功能插件中實現了目標檢測跟蹤模型部署,利用深度學習目標跟蹤算法
實現了目標跟蹤任務,現將模型推理結果傳遞到人群計數的預警功能插件實現識別結果
繪制。
#
傳遞圖像if
not
self.q_flask.full()
and
not
frame
is
None:self.q_flask.put(bytearray(frame))if
config.IMG_DIS_FLAGE:cv2.imshow("frame",
frame)c
=
cv2.waitKey(25)
&
0xffif
c
==
27:breakclass
DeepSort(object):def
init
(self,
model_path,
max_dist=0.2,
min_confidence=0.3,
nms_max_overlap=1,
max_iou_distance=0.7
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 七年級語文上冊 第六單元 12童區寄傳教學設計 北師大版
- 人教版地理八上第一章第2節《人口》教學設計
- 人教版三年級音樂下冊(簡譜)《可愛的家》教學設計
- 九年級數學下冊 第二章 二次函數2 二次函數的圖象與性質第2課時 二次函數y=ax2+c的圖象與性質教學設計 (新版)北師大版
- 九年級物理下冊 第十六章 電磁轉換 五 電磁感應 發電機教學設計 (新版)蘇科版
- 人教A版 (2019)選擇性必修 第一冊1.2 空間向量基本定理教案設計
- 三年級英語上冊 Unit 6 Happy birthday Part A 第三課時教學設計 人教PEP
- 九年級化學上冊 第六單元 碳和碳的氧化物 課題1 金剛石、石墨和C60教學設計(新版)新人教版
- 人教版七年級下冊歷史(2016新編版)第2課《從“貞觀之治”到“開元盛世”》教學設計
- 六年級下冊有趣的平衡教案及反思
- 高中班會 國家安全日主題班會-強化安全意識 提升安全素養 課件
- CJJ 169-2012城鎮道路路面設計規范
- 腰椎間盤突出疑難病例討論
- 責任制整體護理護理
- 金融機構資管產品模板報數指引(2022年)
- 人工智能的風險與挑戰
- 月度能耗分析報告
- 北京鏈家地產經紀有限公司簡介演示文稿
- 物理建模思想方法課件
- 家族性腺瘤性息肉病學習課件
- 中國電力資產重組現狀及未來發展趨勢研究
評論
0/150
提交評論