假期來啦!技術(shù)人如何用 Python 實(shí)現(xiàn)景區(qū)安防系統(tǒng)
?本設(shè)計中,利用YOLO目標(biāo)檢測算法、Openpose姿態(tài)識別算法、deepsort跟蹤算法、MSCNN人群密度估計算法實(shí)現(xiàn)了火災(zāi)監(jiān)測、吸煙監(jiān)測、行為安全監(jiān)測、人群密度監(jiān)測、口罩率監(jiān)測、人員定位監(jiān)測六大功能。系統(tǒng)運(yùn)用智能視覺交互技術(shù),用戶可以通過手勢操作系統(tǒng),用戶操作方便簡潔。在多角度多方位輔助景區(qū)安防管理,消減了景區(qū)存在的隱形安全隱患,推動景區(qū)智慧化建設(shè)。本套系統(tǒng)各類功能之間實(shí)現(xiàn)了數(shù)據(jù)的實(shí)時傳輸與反饋,保證了信息的有效性,可以運(yùn)行在手機(jī)端、電腦端和物聯(lián)網(wǎng)平臺多個平臺,同時也真正意義上實(shí)現(xiàn)了“多平臺應(yīng)用”。
結(jié)合多種算法設(shè)計的多功能的智能安防系統(tǒng),主要應(yīng)用于景區(qū)中火災(zāi)預(yù)防與監(jiān)測、疫情防控、游客安全定位等,對景區(qū)安全防護(hù)與景區(qū)智能化建設(shè)具有重要的應(yīng)用價值。
基本介紹
該系統(tǒng)以計算機(jī)多媒體技術(shù)、智能圖像分析技術(shù)、數(shù)據(jù)挖掘技術(shù)等為基礎(chǔ),建設(shè)旅游景區(qū)綜合安防管理系統(tǒng)。針對景區(qū)公共活動區(qū)域的人身安全,森林防火管理,疫情防控管理等需求,要求建設(shè)全方位、全天候、高清化、智能化的視頻監(jiān)控系統(tǒng),以滿足現(xiàn)代旅游景區(qū)安全管理的需求,實(shí)現(xiàn)大場景全景監(jiān)控,對景區(qū)火災(zāi)、游客危險行為等突發(fā)情況進(jìn)行檢測。實(shí)現(xiàn)對人員實(shí)時定位、軌跡查詢,當(dāng)發(fā)生緊急情況時聯(lián)動地圖進(jìn)行閃爍警示,并便于應(yīng)急指揮。同時滿足人員管理與客流分析系統(tǒng),需要對出入口客流量進(jìn)行統(tǒng)計和分析,當(dāng)景區(qū)超過一定的客流容量之后可及時預(yù)警停止游客進(jìn)入并進(jìn)行適當(dāng)?shù)挠慰头至魈幹谩=Y(jié)合實(shí)際需求及智慧景區(qū)的系統(tǒng)架構(gòu)規(guī)劃,旅游景區(qū)綜合安防系統(tǒng)由智能監(jiān)控系統(tǒng)、智能視覺交互、多角度多方位、多平臺應(yīng)用四個模塊構(gòu)成,整合火災(zāi)監(jiān)測、吸煙監(jiān)測、行為安全監(jiān)測、人群密度監(jiān)測、口罩率監(jiān)測、人員定位監(jiān)測異構(gòu)安防子系統(tǒng)。系統(tǒng)總體設(shè)計架構(gòu)如下圖:
基本功能展示
1、系統(tǒng)概述
本智能監(jiān)控系統(tǒng)開發(fā)平臺為Pycharm,使用python語言,共分為六大系統(tǒng)。
2、火災(zāi)監(jiān)測系統(tǒng)
本模塊通過實(shí)時的視頻監(jiān)控,分析視頻是否有火災(zāi)產(chǎn)生。如圖中所示,如果景區(qū)發(fā)生火災(zāi),系統(tǒng)會及時的發(fā)出預(yù)警信息,反饋給調(diào)度室,使得火災(zāi)得到有效控制,極大的提高應(yīng)對火災(zāi)的效率。
3、吸煙監(jiān)測系統(tǒng)?
為了防止景區(qū)發(fā)生火災(zāi),景區(qū)多數(shù)區(qū)域?yàn)榻麩焻^(qū)。本模塊通過實(shí)時的視頻監(jiān)控,分析視頻是否存在吸煙行為。如圖中所示,如果有游客存在吸煙行為,系統(tǒng)會及時的發(fā)出預(yù)警信息,反饋給調(diào)度室,第一時間發(fā)現(xiàn)游客吸煙的安全隱患,預(yù)防火災(zāi)發(fā)生,確保景區(qū)安全。
4、行為安全監(jiān)測系統(tǒng)
景區(qū)旅游過程中,游客人身安全須受到保障。本模塊通過實(shí)時的視頻監(jiān)控,分析視頻中人的軀體動作,如果發(fā)生異常行為如圖中“摔倒”等危險行為可以及時的發(fā)出預(yù)警信息。能夠大大縮短救援時間,減少突發(fā)事件造成的損失,保護(hù)游客的生命財產(chǎn)安全。
5、人群密度監(jiān)測系統(tǒng)
受新冠疫情的影響,景區(qū)需要合理控制景區(qū)內(nèi)的人口密度。通過本模塊可以實(shí)現(xiàn)對景區(qū)游客人口密度的動態(tài)監(jiān)控,通過智能分析,將人群密度實(shí)時的展現(xiàn)在系統(tǒng)頁面上,幫助用戶管理景區(qū),切實(shí)保障廣大游客、員工的身體健康和生命安全,維護(hù)景區(qū)和社會穩(wěn)定大局。
6、口罩率監(jiān)測系統(tǒng)?
為防止新冠病毒的傳播,根據(jù)景區(qū)相關(guān)規(guī)定,進(jìn)入景區(qū)之前需要確定乘客。本模塊通過實(shí)時的視頻監(jiān)控,分析視頻中游客是否佩戴口罩,將標(biāo)記每個游客是否佩戴口罩,將結(jié)果顯示在系統(tǒng)上,并實(shí)時的顯示場景佩戴口罩率。用于景區(qū)疫情防疫工作,保護(hù)游客,保護(hù)景區(qū)。
7、人員跟蹤定位監(jiān)測
本模塊對景區(qū)進(jìn)行實(shí)時的視頻監(jiān)控,分析并識別視頻中游客,自動生成識別標(biāo)簽,將游客標(biāo)簽在場景中的位置實(shí)時記錄下來,并顯示在系統(tǒng)頁面中,并且可以對場景中人數(shù)進(jìn)行監(jiān)測,動態(tài)顯示在系統(tǒng)頁面左側(cè)。輔助用戶管理景區(qū)。
8、智能視覺交互
本系統(tǒng)可代替了傳統(tǒng)鼠標(biāo)點(diǎn)擊模塊應(yīng)用的方法,用戶可以不需要使用鼠標(biāo)等輸入設(shè)備即可完成與系統(tǒng)之間的信息交互。用戶通過肢體動作就可以完成模塊的選擇工作,系統(tǒng)操作更加簡潔,用戶使用更加方便。(這里只設(shè)計了火災(zāi)檢測功能,其他功能可以根據(jù)代碼參考寫入。)
涉及算法
1、目標(biāo)檢測算法?
本項(xiàng)目使用的目標(biāo)檢測算法主要為YOLO算法,分別應(yīng)用在火災(zāi)監(jiān)測、吸煙行為監(jiān)測、人員定位跟蹤以及口罩率監(jiān)測上。YOLO目標(biāo)檢測算法是考慮到雙階段目標(biāo)檢測算法的檢測效率比較低,所以一些學(xué)者提出了單階段目標(biāo)檢測。由JosephRedmon等人在2016年提出。
2、目標(biāo)跟蹤算法
本項(xiàng)目在人員定位跟蹤系統(tǒng)中使用到了deepsort目標(biāo)跟蹤算法。本系統(tǒng)跟蹤的流程如下:
(1)使用卷積神經(jīng)網(wǎng)絡(luò)對視頻中的行人進(jìn)行檢測和跟蹤。
(2)視頻幀輸入之后首先進(jìn)入YOLOv3目標(biāo)檢測的網(wǎng)絡(luò),經(jīng)過Darknet-53提取特征;
(3)其次,進(jìn)行上采樣和特征融合,再進(jìn)行回歸分析;
(4)再次,把得出的預(yù)測框信息輸入SORT算法進(jìn)行目標(biāo)特征建模,匹配和跟蹤;
(5)最后,輸出結(jié)果。下圖為定位跟蹤算法流程圖:
3、人群密度估計算法?
人群密度計數(shù)是指估計圖像或視頻中人群的數(shù)量、密度或分布,它是智能視頻監(jiān)控分析領(lǐng)域的關(guān)鍵問題和研究熱點(diǎn),也是后續(xù)行為分析、擁塞分析、異常檢測和事件檢測等高級視頻處理任務(wù)的基礎(chǔ)。本項(xiàng)目通過采用深度學(xué)習(xí)方法獲取人群密度圖已估計人群數(shù)量,使用python語言搭建MSCNN網(wǎng)絡(luò)實(shí)現(xiàn)實(shí)時生成人群密度圖以達(dá)到估計人群數(shù)量的目的。
4、姿態(tài)估計算法?
本項(xiàng)目在人體行為安全監(jiān)測系統(tǒng)上使用了Openpose的人體姿態(tài)識別算法。通過Openpose的姿態(tài)識別技術(shù)對不同肢體之間的協(xié)調(diào)關(guān)系搭建分類算法,并通過不同的分類算法比較,選擇出最優(yōu)模型搭建多目標(biāo)的分類方法,其可以實(shí)現(xiàn)多個目標(biāo)的姿態(tài)顯示、目標(biāo)檢測和分類的實(shí)時顯示。
部分界面操作代碼如下:
cap = cv2.VideoCapture(0)
cap.set(3, 1280)
cap.set(4, 720)
detector = HandDetector(detectionCon=0.8)
keys = [["火災(zāi)檢測", "吸煙檢測", "行為安全監(jiān)測", "人群密度監(jiān)測", "口罩率檢測", "行人定位跟蹤"]]
finalText = ""
while True:
success, img = cap.read()
img = detector.findHands(img)
lmList, bboxInfo = detector.findPosition(img)
img = drawAll(img, buttonList)
if lmList:
for button in buttonList:
x, y = button.pos
w, h = button.size
if x < lmList[8][0] < x + w and y < lmList[8][1] < y + h:
cv2.rectangle(img, (x - 5, y - 5), (x + w + 5, y + h + 5), (175, 0, 175), cv2.FILLED)
if l < 30:
if press_state:
cv2.rectangle(img, button.pos, (x + w, y + h), (0, 255, 0), cv2.FILLED)
cv2.putText(img, "start", (x + 20, y + 65),cv2.FONT_HERSHEY_PLAIN, 4, (255, 255, 255), 4)
finalText += button.text
sleep(0.15)
press_state=False
state=True
print(button.text)
text=button.text
else:
press_state=True
if state:
if os.path.exists("img.txt"):
try:
img2 = cv2.imread("img.jpg")
img2 = cv2.resize(img2, (img.shape[1], img.shape[0]))
img = cv2.addWeighted(img, alpha, img2, beta, gamma)
except:
pass
if state:
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
draw = ImageDraw.Draw(img)
myfont0 = ImageFont.truetype(r'./HGDH_CNKI.TTF', 50)
for button in buttonList:
x, y = button.pos
w, h = button.size
draw.text((500, 180), text, font=myfont0, fill=(0, 0, 0))
img = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
cv2.imshow("Image", img)
cv2.waitKey(1)