1.需求描述:python
在一個地區,人流密度過大很容易形成踩踏事故,人流量統計動態版能夠統計圖像中的人體個數和流動趨勢,與監控技術結合起來,能夠提早預警,進而避免悲劇的發生。json
2.平臺接入安全
人流量統計動態版接入網址:https://console.bce.baidu.com/ai/?fromai=1#/ai/body/overview/index微信
界面以下圖所示:架構
點擊建立應用,輸入應用名,點擊確認。app
查看生成的應用,查看APIKEY和SecretKey,在後續的代碼中替換對應的內容便可執行。測試
3.調用攻略(Python3)及評測優化
3.1首先認證受權:url
在開始調用任何API以前須要先進行認證受權,具體的說明請參考:3d
http://ai.baidu.com/docs#/Auth/top
具體Python3代碼以下:
# -*- coding: utf-8 -*-
#!/usr/bin/env python
import urllib
import base64
import json
#client_id 爲官網獲取的AK, client_secret 爲官網獲取的SK
client_id =【百度雲應用的AK】
client_secret =【百度雲應用的SK】
#獲取token
def get_token():
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + client_id + '&client_secret=' + client_secret
request = urllib.request.Request(host)
request.add_header('Content-Type', 'application/json; charset=UTF-8')
response = urllib.request.urlopen(request)
token_content = response.read()
if token_content:
token_info = json.loads(token_content)
token_key = token_info['access_token']
return token_key
3.2人流量統計動態版分析接口調用:
詳細說明請參考:http://ai.baidu.com/docs#/Body-API/1a6628be
接口描述
對於輸入的一張圖片(可正常解碼,且長寬比適宜),識別和統計圖像當中的人體個數(靜態統計,不支持追蹤和去重)。
適用於3米以上的中遠距離俯拍,以頭部爲主要識別目標統計人數,無需正臉、全身照,適應各種人流密集場景(如:機場、車展、景區、廣場等);默認識別整圖中的人數,支持指定不規則區域的人數統計,同時可輸出渲染圖片。
攝像頭硬件選型無特殊要求,分辨率建議720p以上,更低分辨率的圖片也能識別,只是效果可能有差別。暫不適用夜間紅外監控圖片,後續會考慮擴展。
請求說明
HTTP 方法:POST
請求URL:https://aip.baidubce.com/rest/2.0/image-classify/v1/body_num
URL參數:
access_token: 經過API Key和Secret Key獲取的access_token,參考」Access Token獲取」
Header:
Content-Type: application/x-www-form-urlencoded
Body中放置請求參數,參數詳情以下:
返回說明
Python3調用代碼以下:
#保存圖片
def save_base_image(img_str,filename):
img_data = base64.b64decode(img_str)
with open(filename, 'wb') as f:
f.write(img_data)
#人流量統計
#filename:原圖片名(本地存儲包括路徑);resultfilename:處理後的文件保存名稱(每一個人打標)
def body_num(filename,resultfilename):
request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/body_num"
# 二進制方式打開圖片文件
f = open(filename, 'rb')
img = base64.b64encode(f.read())
params = dict()
params['image'] = img
params['show'] = 'true'
params = urllib.parse.urlencode(params).encode("utf-8")
#params = json.dumps(params).encode('utf-8')
access_token = get_token()
request_url = request_url + "?access_token=" + access_token
request = urllib.request.Request(url=request_url, data=params)
request.add_header('Content-Type', 'application/x-www-form-urlencoded')
response = urllib.request.urlopen(request)
content = response.read()
if content:
#print(content)
content=content.decode('utf-8')
#print(content)
data = json.loads(content)
#print(data)
person_num=data['person_num']
print ('person_num',person_num)
img_str=data['image']
save_base_image(img_str,resultfilename)
body_num('crowd1.jpg','crowd1_num.jpg')
3.3.功能評測:
選用不一樣的數據對圖片流量統計動態版的效果進行測試,具體效果以下:
person_num 4
person_num 8
針對不一樣場景進行測試,整體來看仍是很準確的。。
3.5 應用前景:
安防監控:實時監測機場、車站、展會、展館、景區、學校、體育場等公共場所的人流量,及時導流、限流,預警核心區域人羣過於密集等安全隱患
智能零售:統計商場、門店的進出人流量,分析消費者重點關注、停留的區域,支持店鋪規劃、客羣導流、貨品陳列優化、門店選址、進銷存管理等應用
駕駛監測:針對客運車輛,實時監控上下車和車內乘客數量,替代人工清點的方式,自動統計人數,分析空座、超載狀況,節省人力,提高安全性
4.應用方案:
4.1 總體方案
主要功能包括:
經過監控系統採集關鍵區域的照片。
經過百度AI對照片進行分析,判斷人數。
對區域人數進行分析、告警。若是須要,啓動應急預案。
經過短信網關,APP,電話,監控大屏等執行應急預案。
總體架構以下圖所示:
4.2 關鍵代碼:
代碼以下:
#保存圖片
def save_base_image(img_str,filename):
img_data = base64.b64decode(img_str)
with open(filename, 'wb') as f:
f.write(img_data)
#人流量統計
#filename:原圖片名(本地存儲包括路徑);resultfilename:處理後的文件保存名稱(每一個人打標)
def body_num(filename,resultfilename):
request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/body_num"
# 二進制方式打開圖片文件
f = open(filename, 'rb')
img = base64.b64encode(f.read())
params = dict()
params['image'] = img
params['show'] = 'true'
params = urllib.parse.urlencode(params).encode("utf-8")
#params = json.dumps(params).encode('utf-8')
access_token = get_token()
request_url = request_url + "?access_token=" + access_token
request = urllib.request.Request(url=request_url, data=params)
request.add_header('Content-Type', 'application/x-www-form-urlencoded')
response = urllib.request.urlopen(request)
content = response.read()
person_num=0
if content:
#print(content)
content=content.decode('utf-8')
#print(content)
data = json.loads(content)
#print(data)
person_num=data['person_num']
print ('person_num',person_num)
img_str=data['image']
save_base_image(img_str,resultfilename)
return person_num
#人數預警例代碼
#filename:原圖片名(本地存儲包括路徑);resultfilename:處理後的文件保存名稱(每一個人打標)
#warningnum告警人數
def crowd_num_warning(filename,resultfilename,warningnum):
person_num=body_num(filename,resultfilename)
if person_num>warningnum:
warningmessage="警告:人數過於擁擠,最大人數"+str(warningnum)+",當前人數:"+str(person_num)
print(warningmessage)
#TODO:增長其餘預警處理代碼,好比將信息經過短信,APP發佈給相關人
crowd_num_warning('crowd2.jpg','crowd2_num.jpg',30)
4.3 效果測試:
應用場景1:假設一個路口安全最大人數30人,則監控系統按期執行crowd_num_warning(監控圖片,處理後圖片名,30),測試結果以下:
警告信息以下:
警告:人數過於擁擠,最大人數30,當前人數:65。
應用場景2:假設一個候車室安全人數300人,則監控系統按期執行crowd_num_warning(監控圖片,處理後圖片名,300),測試結果以下:
警告信息以下:
警告:人數過於擁擠,最大人數300,當前人數:369
經過對不一樣視角,不一樣解析度的圖片進行測試,發現識別的效果都很好。再與自動呼叫,短信,微信等平臺結合起來就能夠造成對公共安全解決方案,在過於擁擠的時候儘快的通知相關人員,啓動疏散方案。