人工智能綜合項目開發- 課件 項目六 客流統計分析系統模擬實驗_第1頁
人工智能綜合項目開發- 課件 項目六 客流統計分析系統模擬實驗_第2頁
人工智能綜合項目開發- 課件 項目六 客流統計分析系統模擬實驗_第3頁
人工智能綜合項目開發- 課件 項目六 客流統計分析系統模擬實驗_第4頁
人工智能綜合項目開發- 課件 項目六 客流統計分析系統模擬實驗_第5頁
已閱讀5頁,還剩22頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

人工智能綜合項目開發項目六客流統計分析系統模擬實驗成都職業技術學院項目分析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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論