摘要:跌倒監(jiān)測(cè)系統(tǒng)用于智能化監(jiān)測(cè)是否有行人跌倒,通過YOLOv5的深度學(xué)習(xí)技術(shù)對(duì)視頻、圖片、攝像頭等畫面進(jìn)行跌倒檢測(cè),分析并安全提醒。在介紹算法原理的同時(shí),給出Python的實(shí)現(xiàn)代碼、PyQt的UI界面及訓(xùn)練數(shù)據(jù)集。跌倒監(jiān)測(cè)系統(tǒng)主要用于日常生活中行人跌倒情況的識(shí)別,監(jiān)測(cè)畫面中可能已經(jīng)出現(xiàn)跌倒的行人位置、數(shù)目、置信度等;模型易于更換和改進(jìn),系統(tǒng)設(shè)計(jì)有注冊(cè)登錄功能,方便用戶進(jìn)行管理和使用;跌倒監(jiān)測(cè)結(jié)果實(shí)時(shí)顯示,可用于安防監(jiān)控,也可用于跌倒情況自動(dòng)化分析。博文提供了完整的Python代碼和使用教程,適合新入門的朋友參考,完整代碼資源文件請(qǐng)轉(zhuǎn)至文末的下載鏈接。本博文目錄如下:
?點(diǎn)擊跳轉(zhuǎn)至文末所有涉及的完整代碼文件下載頁(yè)?
基于深度學(xué)習(xí)的跌倒檢測(cè)系統(tǒng)演示與介紹
前言
????????基于深度學(xué)習(xí)的跌倒檢測(cè)系統(tǒng)是指利用深度學(xué)習(xí)算法對(duì)監(jiān)控視頻中的人體動(dòng)作進(jìn)行實(shí)時(shí)分析和處理,以便實(shí)現(xiàn)對(duì)跌倒事件的檢測(cè)和預(yù)警。該系統(tǒng)主要通過使用深度學(xué)習(xí)模型對(duì)監(jiān)控視頻中的人體姿態(tài)、動(dòng)作等特征進(jìn)行學(xué)習(xí)和識(shí)別,以實(shí)現(xiàn)對(duì)跌倒事件的自動(dòng)檢測(cè)和識(shí)別。
????????跌倒檢測(cè)系統(tǒng)的主要功能包括實(shí)時(shí)監(jiān)測(cè)人體姿態(tài)和動(dòng)作,識(shí)別跌倒事件,及時(shí)預(yù)警,并提供相關(guān)的信息和數(shù)據(jù)支持,以便進(jìn)行后續(xù)的處理和分析。該系統(tǒng)可以廣泛應(yīng)用于醫(yī)療、養(yǎng)老、安防等領(lǐng)域,有助于提高老年人、殘障人士等弱勢(shì)群體的生活質(zhì)量和安全保障。同時(shí),基于深度學(xué)習(xí)的跌倒檢測(cè)系統(tǒng)還可以結(jié)合其他技術(shù)手段,如無線傳感器網(wǎng)絡(luò)、機(jī)器人等,實(shí)現(xiàn)更加智能化的監(jiān)測(cè)和預(yù)警,促進(jìn)智慧醫(yī)療、智慧養(yǎng)老等領(lǐng)域的發(fā)展。
????????這里給出博主設(shè)計(jì)的跌倒監(jiān)測(cè)系統(tǒng)界面,UI界面已做了一定美化,功能也可以滿足圖片、視頻和攝像頭的識(shí)別檢測(cè),初始界面如下圖:
????????檢測(cè)跌倒時(shí)的界面截圖如下,可識(shí)別畫面中存在的多個(gè)可能目標(biāo),也可開啟攝像頭或視頻檢測(cè):
???????? 詳細(xì)的功能演示效果參見博主的B站視頻或下一節(jié)的動(dòng)圖演示,覺得不錯(cuò)的朋友敬請(qǐng)點(diǎn)贊、關(guān)注加收藏!系統(tǒng)UI界面的設(shè)計(jì)工作量較大,界面美化更需仔細(xì)雕琢,大家有任何建議或意見和可在下方評(píng)論交流。
1. 效果演示
????????首先我們還是通過動(dòng)圖看一下監(jiān)測(cè)跌倒的效果,系統(tǒng)主要實(shí)現(xiàn)的功能是對(duì)圖片、視頻和攝像頭畫面中的人進(jìn)行識(shí)別,識(shí)別的結(jié)果可視化顯示在界面和圖像中,另外提供多個(gè)目標(biāo)的顯示選擇功能,演示效果如下。
(一)用戶注冊(cè)登錄界面
????????這里設(shè)計(jì)了一個(gè)登錄界面,可以注冊(cè)賬號(hào)和密碼,然后進(jìn)行登錄。界面還是參考了當(dāng)前流行的UI設(shè)計(jì),左側(cè)是一個(gè)動(dòng)圖,右側(cè)輸入賬號(hào)、密碼、驗(yàn)證碼等等。
(二)選擇跌倒圖片識(shí)別
????????系統(tǒng)中可選擇圖片文件進(jìn)行識(shí)別,點(diǎn)擊圖片選擇按鈕圖標(biāo)選擇圖片后,顯示所有跌倒識(shí)別的結(jié)果,可通過下拉選框查看單個(gè)的結(jié)果。本功能的界面展示如下圖所示:
(三)跌倒視頻識(shí)別效果展示
????????對(duì)于一段視頻中的跌倒情況,這里設(shè)點(diǎn)擊視頻按鈕選擇待檢測(cè)的視頻文件,系統(tǒng)會(huì)自動(dòng)解析視頻逐幀識(shí)別跌倒行為,并將結(jié)果記錄在下方表格中,效果如下圖所示:
2. 跌倒檢測(cè)模型訓(xùn)練
????????我們選取YoloV5作為網(wǎng)絡(luò)模型,一方面是因?yàn)閺淖罱K效果來看YOLOv5已經(jīng)相當(dāng)優(yōu)秀,是發(fā)展的比較完備、使用比較廣泛的一個(gè)版本;而更重要的是YOLOv5的調(diào)用、訓(xùn)練和預(yù)測(cè)都十分方便,為初學(xué)者提供了良好的練手工具。YOLOv5的另一個(gè)特點(diǎn)就是它為不同的設(shè)備需求和不同的應(yīng)用場(chǎng)景提供了大小和參數(shù)數(shù)量不同的網(wǎng)絡(luò)。
????????如下圖所示,大一點(diǎn)的模型比如YOLOv5l和YOLOv5x參數(shù)更多,在大規(guī)模的COCO數(shù)據(jù)集上有更高的預(yù)測(cè)準(zhǔn)確率;而小模型比如YOLOv5n或YOLOv5s占空間更小,適合部署在移動(dòng)設(shè)備上,且推理速度更快,適合于高幀 率視頻的實(shí)時(shí)檢測(cè)。
????????這里我們使用的跌倒數(shù)據(jù)集,取自網(wǎng)絡(luò)上收集的各類跌倒圖像并使用LabelImg工具進(jìn)行標(biāo)注,共計(jì)包含1440個(gè)圖像數(shù)據(jù)。每張圖片除包括類別標(biāo)簽外,還有一個(gè)標(biāo)注的物體邊框(Bounding Box),其中訓(xùn)練數(shù)據(jù)集包含1110張圖片,驗(yàn)證集330張圖片,部分圖像及標(biāo)注如下圖所示。
????????在訓(xùn)練模型之前,為了讓我們的數(shù)據(jù)能夠被YOLO找到,我們需要寫一個(gè)pedfal.yaml文件存儲(chǔ)在案例目錄下,在其中記錄下數(shù)據(jù)的路徑和模型要識(shí)別的標(biāo)記類別,文件內(nèi)容如下所示。YOLO通過讀取目錄下的pedfall.yaml文件,進(jìn)而找到我們數(shù)據(jù)集存儲(chǔ)的位置才能讀取數(shù)據(jù)進(jìn)行訓(xùn)練驗(yàn)證。
# 數(shù)據(jù)集存儲(chǔ)位置
train: ./PedFall/images/train
val: ./PedFall/images/val
nc: 1
names: ['fall']
????????訓(xùn)練模型通過調(diào)用模型文件夾下的train.py進(jìn)行,可以通過–batch參數(shù)和–epochs參數(shù)調(diào)整訓(xùn)練批次大小和訓(xùn)練輪數(shù)。YOLOv5提供了在COCO數(shù)據(jù)集上預(yù)訓(xùn)練后的參數(shù),我們可以通過參數(shù)–weights yolov5s.pt加載預(yù)訓(xùn)練參數(shù)進(jìn)行遷移學(xué)習(xí),或在訓(xùn)練大數(shù)據(jù)集(比如COCO)時(shí)用一個(gè)空的–weights ''參數(shù)從零開始訓(xùn)練。
python train.py --batch 32 --epochs 300
????????部分訓(xùn)練過程如圖所示:
????????在深度學(xué)習(xí)中,我們通常通過損失函數(shù)下降的曲線來觀察模型訓(xùn)練的情況。而YOLOv5訓(xùn)練時(shí)主要包含三個(gè)方面的損失:矩形框損失(box_loss)、置信度損失(obj_loss)和分類損失(cls_loss),在訓(xùn)練結(jié)束后,我們也可以在logs/目錄下找到生成對(duì)若干訓(xùn)練過程統(tǒng)計(jì)圖。
????????我們通過設(shè)定不同的置信度的閾值,可以得到在模型在不同的閾值下所計(jì)算出的p值和r值,一般情況下,p值和r值是負(fù)相關(guān)的,繪制出來可以得到如下圖所示的曲線,其中曲線的面積我們稱AP,目標(biāo)檢測(cè)模型中每種目標(biāo)可計(jì)算出一個(gè)AP值,對(duì)所有的AP值求平均則可以得到模型的mAP值。以下是模型的P-R曲線
3. 跌倒檢測(cè)識(shí)別
????????在訓(xùn)練完成后得到最佳模型,接下來我們將幀圖像輸入到這個(gè)網(wǎng)絡(luò)進(jìn)行預(yù)測(cè),從而得到預(yù)測(cè)結(jié)果,預(yù)測(cè)方法(predict.py)部分的代碼如下所示:
def predict(img):
img = torch.from_numpy(img).to(device)
img = img.half() if half else img.float()
img /= 255.0
if img.ndimension() == 3:
img = img.unsqueeze(0)
t1 = time_synchronized()
pred = model(img, augment=False)[0]
pred = non_max_suppression(pred, opt.conf_thres, opt.iou_thres, classes=opt.classes,
agnostic=opt.agnostic_nms)
t2 = time_synchronized()
InferNms = round((t2 - t1), 2)
return pred, InferNms
????????得到預(yù)測(cè)結(jié)果我們便可以將幀圖像中的跌倒行人框出,然后在圖片上用opencv繪圖操作,輸出類別和置信度值。以下是讀取一個(gè)跌倒視頻進(jìn)行檢測(cè)的腳本,首先將圖片數(shù)據(jù)進(jìn)行預(yù)處理后送predict進(jìn)行檢測(cè),然后計(jì)算標(biāo)記框的位置并在圖中標(biāo)注出來。
if __name__ == '__main__':
# video_path = 0
video_path = "./UI_rec/test_/跌倒測(cè)試視頻.mp4"
# 初始化視頻流
vs = cv2.VideoCapture(video_path)
(W, H) = (None, None)
frameIndex = 0 # 視頻幀數(shù)
try:
prop = cv2.CAP_PROP_FRAME_COUNT
total = int(vs.get(prop))
# print("[INFO] 視頻總幀數(shù):{}".format(total))
# 若讀取失敗,報(bào)錯(cuò)退出
except:
print("[INFO] could not determine # of frames in video")
print("[INFO] no approx. completion time can be provided")
total = -1
fourcc = cv2.VideoWriter_fourcc(*'XVID')
ret, frame = vs.read()
vw = frame.shape[1]
vh = frame.shape[0]
print("[INFO] 視頻尺寸:{} * {}".format(vw, vh))
output_video = cv2.VideoWriter("./results.avi", fourcc, 20.0, (vw, vh)) # 處理后的視頻對(duì)象
# 遍歷視頻幀進(jìn)行檢測(cè)
while True:
# 從視頻文件中逐幀讀取畫面
(grabbed, image) = vs.read()
# 若grabbed為空,表示視頻到達(dá)最后一幀,退出
if not grabbed:
print("[INFO] 運(yùn)行結(jié)束...")
output_video.release()
vs.release()
exit()
# 獲取畫面長(zhǎng)寬
if W is None or H is None:
(H, W) = image.shape[:2]
image = cv2.resize(image, (850, 500))
img0 = image.copy()
img = letterbox(img0, new_shape=imgsz)[0]
img = np.stack(img, 0)
img = img[:, :, ::-1].transpose(2, 0, 1) # BGR to RGB, to 3x416x416
img = np.ascontiguousarray(img)
pred, useTime = predict(img)
det = pred[0]
p, s, im0 = None, '', img0
if det is not None and len(det): # 如果有檢測(cè)信息則進(jìn)入
det[:, :4] = scale_coords(img.shape[1:], det[:, :4], im0.shape).round() # 把圖像縮放至im0的尺寸
number_i = 0 # 類別預(yù)編號(hào)
detInfo = []
for *xyxy, conf, cls in reversed(det): # 遍歷檢測(cè)信息
c1, c2 = (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3]))
# 將檢測(cè)信息添加到字典中
detInfo.append([names[int(cls)], [c1[0], c1[1], c2[0], c2[1]], '%.2f' % conf])
number_i += 1 # 編號(hào)數(shù)+1
label = '%s %.2f' % (names[int(cls)], conf)
# 畫出檢測(cè)到的目標(biāo)物
plot_one_box(image, xyxy, label=label, color=colors[int(cls)])
# 實(shí)時(shí)顯示檢測(cè)畫面
cv2.imshow('Stream', image)
image = cv2.resize(image, (vw, vh))
output_video.write(image) # 保存標(biāo)記后的視頻
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# print("FPS:{}".format(int(0.6/(end-start))))
frameIndex += 1
????????執(zhí)行得到的結(jié)果如下圖所示,圖中跌倒和置信度值都標(biāo)注出來了,預(yù)測(cè)速度較快?;诖四P臀覀兛梢詫⑵湓O(shè)計(jì)成一個(gè)帶有界面的系統(tǒng),在界面上選擇圖片、視頻或攝像頭然后調(diào)用模型進(jìn)行檢測(cè)。
????????博主對(duì)整個(gè)系統(tǒng)進(jìn)行了詳細(xì)測(cè)試,最終開發(fā)出一版流暢得到清新界面,就是博文演示部分的展示,完整的UI界面、測(cè)試圖片視頻、代碼文件,以及Python離線依賴包(方便安裝運(yùn)行,也可自行配置環(huán)境),均已打包上傳,感興趣的朋友可以通過下載鏈接獲取。
下載鏈接
????若您想獲得博文中涉及的實(shí)現(xiàn)完整全部程序文件(包括測(cè)試圖片、視頻,py, UI文件等,如下圖),這里已打包上傳至博主的面包多平臺(tái),見可參考博客與視頻,已將所有涉及的文件同時(shí)打包到里面,點(diǎn)擊即可運(yùn)行,完整文件截圖如下:
????在文件夾下的資源顯示如下,下面的鏈接中也給出了Python的離線依賴包,讀者可在正確安裝Anaconda和Pycharm軟件后,復(fù)制離線依賴包至項(xiàng)目目錄下進(jìn)行安裝,離線依賴的使用詳細(xì)演示也可見本人B站視頻:win11從頭安裝軟件和配置環(huán)境運(yùn)行深度學(xué)習(xí)項(xiàng)目、Win10中使用pycharm和anaconda進(jìn)行python環(huán)境配置教程。
注意:該代碼采用Pycharm+Python3.8開發(fā),經(jīng)過測(cè)試能成功運(yùn)行,運(yùn)行界面的主程序?yàn)閞unMain.py和LoginUI.py,測(cè)試圖片腳本可運(yùn)行testPicture.py,測(cè)試視頻腳本可運(yùn)行testVideo.py。為確保程序順利運(yùn)行,請(qǐng)按照requirements.txt配置Python依賴包的版本。Python版本:3.8,請(qǐng)勿使用其他版本,詳見requirements.txt文件;
完整資源中包含數(shù)據(jù)集及訓(xùn)練代碼,環(huán)境配置與界面中文字、圖片、logo等的修改方法請(qǐng)見視頻,項(xiàng)目完整文件下載請(qǐng)見參考博客文章里面,或參考視頻的簡(jiǎn)介處給出:???
參考博客文章:https://www.cnblogs.com/sixuwuxian/p/17227694.html
參考視頻演示:https://www.bilibili.com/video/BV1M24y1t7S7/
離線依賴庫(kù)下載鏈接:https://pan.baidu.com/s/1hW9z9ofV1FRSezTSj59JSg?pwd=oy4n (提取碼:oy4n )
界面中文字、圖標(biāo)和背景圖修改方法:
????????在Qt Designer中可以徹底修改界面的各個(gè)控件及設(shè)置,然后將ui文件轉(zhuǎn)換為py文件即可調(diào)用和顯示界面。如果只需要修改界面中的文字、圖標(biāo)和背景圖的,可以直接在ConfigUI.config文件中修改,步驟如下:
????????(1)打開UI_rec/tools/ConfigUI.config文件,若亂碼請(qǐng)選擇GBK編碼打開。
????????(2)如需修改界面文字,只要選中要改的字符替換成自己的就好。
????????(3)如需修改背景、圖標(biāo)等,只需修改圖片的路徑。例如,原文件中的背景圖設(shè)置如下:
mainWindow = :/images/icons/back-image.png
????????可修改為自己的名為background2.png圖片(位置在UI_rec/icons/文件夾中),可將該項(xiàng)設(shè)置如下即可修改背景圖:文章來源:http://www.zghlxwxcb.cn/news/detail-417152.html
mainWindow = ./icons/background2.png
結(jié)束語
????????由于博主能力有限,博文中提及的方法即使經(jīng)過試驗(yàn),也難免會(huì)有疏漏之處。希望您能熱心指出其中的錯(cuò)誤,以便下次修改時(shí)能以一個(gè)更完美更嚴(yán)謹(jǐn)?shù)臉幼?,呈現(xiàn)在大家面前。同時(shí)如果有更好的實(shí)現(xiàn)方法也請(qǐng)您不吝賜教。文章來源地址http://www.zghlxwxcb.cn/news/detail-417152.html
到了這里,關(guān)于基于深度學(xué)習(xí)的跌倒檢測(cè)系統(tǒng)(UI界面+YOLOv5+訓(xùn)練數(shù)據(jù)集)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!