行人社交距離風(fēng)險提示Demo | 基于ModelArts AI Gallery與HiLens Kit聯(lián)合開發(fā)
前情提要
聽到行人社交距離風(fēng)險提示是不是覺得有點不太明白,簡單來說,就是通過某一角度的視覺信息,判斷行人的社交距離情況,讓我們直接看視頻來領(lǐng)會吧。
這是在華為HiLens Kit上部署推理保存的視頻,通過計算行人間社交距離給出“High Risk” 或“Low Risk”的提示,下面來具體介紹一下。
社交距離檢測介紹
本Demo使用YOLOv3_Resnet18模型來檢測的視頻流中的行人,獲取行人坐標(即圖中藍色方框),然后計算所有檢測到的人之間的相互“距離”。這里要注意的是和現(xiàn)實生活中使用的長度單位來衡量距離不一樣的是,在計算機視覺世界中使用的是“像素”,一種簡單的方法是根據(jù)行人坐標來計算檢測到的兩個人的質(zhì)心,也就是根據(jù)檢測到的目標框的中心之間相隔的像素值作為計算視覺世界中的“距離”來衡量視頻中的人之間的距離是否超過安全距離。
Demo主要分為兩部分:行人檢測和社交距離計算,大體流程如下:
1. 使用YOLOv3_Resnet18算法檢測輸入視頻或視頻流中的所有行人,得到行人坐標,并根據(jù)此計算位置信息和質(zhì)心位置;
2. 根據(jù)第1步的信息,計算所有檢測到的行人的人質(zhì)心之間的相互距離;
3. 根據(jù)上一步計算得到的社交距離,對比預(yù)先設(shè)置的安全距離,從而計算每個人之間的距離對,檢測兩個人之間的距離是否小于N個像素,小于則處于安全距離,反之則不處于安全距離。
這里使用的是YOLOv3_Resnet18算法來進行行人檢測,事實上,可替換為任何一種目標檢測算法,只要輸出行人坐標符合本Demo要求順序即可,比如性能更為優(yōu)良的YOLOv4,甚至YOLOv5等等,值得一提的是在PC端的實現(xiàn)是基于最新的、訓(xùn)練和推理性能最佳的YOLOv5-s模型實現(xiàn)的,如果需要可以參考本文最下面參考部分的[1] 或[2]([1]比[2]更加詳細具體,容易上手,推薦使用)。但YOLOv5是基于PyTorch實現(xiàn)的,不方便轉(zhuǎn)換為HiLens需要的om模型使用,慶幸的是可以通過PyTorch——>onnx——>om來使用,這一點我正在嘗試,也期待有優(yōu)秀的同學(xué)加入進來。
上述的YOLOv3_Resnet18、原版YOLOv3_Darknet53以及最新的YOLOv5算法都可以在ModelArts AI Gallery找到哦,不僅提供了預(yù)訓(xùn)練模型,同時也很方便使用,小白也能起送上手,奉上鏈接:
YOLOv3_Resnet18 GPU版本 TensorFlow:https://marketplace.huaweicloud.com/markets/aihub/modelhub/detail/?id=948196c8-3e7a-4729-850b-069101d6e95c
YOLOv3_Resnet18 Ascend 910版本 TensorFlow:https://marketplace.huaweicloud.com/markets/aihub/modelhub/detail/?id=7087008a-7eec-4977-8b66-3a7703e9fd22
YOLOv3_Darknet53 GPU版本 TensorFlow:https://marketplace.huaweicloud.com/markets/aihub/modelhub/detail/?id=2d52a07e-ccbd-420f-8999-2ea7b4bdd691
YOLOv3 Ascend 910版本 TensorFlow:https://marketplace.huaweicloud.com/markets/aihub/modelhub/detail/?id=ff4d1e46-256e-4a76-b355-65bdf52f9a82
YOLOv5 GPU PyTorch:https://marketplace.huaweicloud.com/markets/aihub/modelhub/detail/?id=d89bf587-ed85-476a-a579-5eb3915e2753
怎么樣,是不是非常豐富,選擇多多呀?可以試手一下哦,會發(fā)現(xiàn)使用起來也是很簡單的,注意ModelArts和OBS花費哦。
本Demo選擇的是第一個——YOLOv3_Resnet18 GPU版本 TensorFlow,因為本Demo只需要對行人進行檢測,所以選擇了模型結(jié)構(gòu)簡單,訓(xùn)練和推理速度快的YOLOv3_Resnet18,節(jié)省訓(xùn)練時間,也就是節(jié)省訓(xùn)練成本呀。在訓(xùn)練方面,使用了來自開源行人數(shù)據(jù)集整理的數(shù)據(jù)集,因為只有person這一個標簽,相比于COCO數(shù)據(jù)集80個標簽,訓(xùn)練和部署推理更加具有優(yōu)勢,這里奉上 AI Gallery的數(shù)據(jù)集鏈接,沒想到吧, AI Gallery不僅有算法,還有數(shù)據(jù)集,滿足你的一切需要,有沒有哆啦A夢的口袋的感覺(我承認我有一點夸張)
Person-4192數(shù)據(jù)集鏈接:https://marketplace.huaweicloud.com/markets/aihub/datasets/detail/?content_id=3d67fd03-2e16-4c70-908f-feb8f50334b9
如果你還想訓(xùn)練包含其他類別的情況,比如Person and Car,可參照如下。當(dāng)然,一般來說,數(shù)據(jù)集越大,魯棒性越好,這里的數(shù)據(jù)集較小,可以自行使用更大的數(shù)據(jù)集。
實操介紹
主要麻煩的部分是行人檢測模型的訓(xùn)練,如果為了方便,可以使用基于COCO的預(yù)訓(xùn)練模型,在GitHub有很多。這里希望是從數(shù)據(jù)集準備開始,到訂閱算法,完成訓(xùn)練,到HiLens Studio調(diào)試,并最終部署,體驗下基于ModelArts和HiLens Kit的完整開發(fā)流程,因為以前介紹過,這里就不在贅述,詳情可參考我的博文——開發(fā)教程 | 基于ModelArts與HiLens端云協(xié)同開發(fā)行人檢測與跟蹤方案,博文介紹的較為詳細,如果有問題,可以聯(lián)系我。值得注意的是這篇博文是介紹行人跟蹤以及行人計數(shù)的,如果有興趣的話,可以結(jié)合這篇博文與本博文,實現(xiàn)更加完善行人檢測、跟蹤以及社交距離檢測的方案,相信在社交距離檢測的基礎(chǔ)上加入跟蹤和多種人數(shù)統(tǒng)計方案會更加切合實用,性能更加強大。
對了,我把技能發(fā)布到技能市場了,名字是Social-Distancing-using-YOLOv3-HDMI,審核通過后,大家就能夠訂閱使用了,技能市場匯集了官方和第三方開發(fā)的技能,能夠高效便捷地將自己開發(fā)的技能分享給他人使用,而且從分享到他人訂閱以及部署到HiLens使用,完全基于網(wǎng)絡(luò)實現(xiàn),非常方便,極大促進了技能的共享。
開發(fā)體驗
整體基于ModelArts和HiLens Stuio 1.5.0開發(fā),參考開源代碼實現(xiàn),很慚愧的是大部分內(nèi)容都是人家的,自主創(chuàng)新性很少。不過整體開發(fā)還是很順利的,從得到模型到在HiLens Studio調(diào)試完成來說,不到一個下午就能搞定了,這是極致效率的體現(xiàn),這得益于在線IDE HiLens Studio的使用,作為一款線上IDE,提供了開發(fā),調(diào)試的完整功能,甚至可以在線運行調(diào)試,直接得到程序運行的可視化結(jié)果展示。同時提供了豐富的模板,基于模板開發(fā),大大提高開發(fā)效率。
總的來說,仿佛在線有了一個自己的HiLens Kit一樣,只要連接到網(wǎng)絡(luò),開發(fā)HiLens Stduio就能開發(fā)了,調(diào)試成功后還可以一鍵安裝到自己的HiLens Kit上,讓開發(fā)變成一件很爽的事情,而且HiLens Studio也在不斷完善中,與我第一次使用最初版本相比,穩(wěn)定性和性能都有了很大的提升,比如下圖中紅色剪頭所指部分,就是后來添加的,方便開發(fā)者調(diào)試,相信研發(fā)人員也是付出了不少心血和努力,非常感謝。
ModelArts也在飛快成長,開發(fā)環(huán)境除了最初的NoteBook,也有了界面和功能更加完善的Jupyter Lab,最新測試的在線切換硬件配置,可以進行CPU和GPU,以及不同配置CPU和GPU的在線切換功能,這一點一滴地改變方便可開發(fā)者的使用,拉近了開發(fā)者與ModelArts的距離,相信ModelArts在未來會更加茁壯地成長。
注意的是,我是用的是HiLens Studio基礎(chǔ)版,多人共用,所以有時候可能因為資源緊張,導(dǎo)致占用,從而運行出錯,這時候可以通過創(chuàng)建官方案例模板運行來判斷是否資源占用,一般來說,如果官方模板也運行報錯,可能就是資源占用,可以考慮使用付費版,但需要額外費用哦。
下圖是HiLens Studio的開發(fā)界面,有沒有一種熟悉的感覺,和VS Code有些類似,這對熟悉VS Code的同學(xué)是一個福音哦。
YOLO淺談
YOLOv4在YOLOv3的基礎(chǔ)上在網(wǎng)絡(luò)結(jié)構(gòu)和預(yù)處理等很多方面進行了很多的創(chuàng)新,融合了當(dāng)時得到驗證的很多trick,性能得到了很大的提升。比如輸入端采用mosaic數(shù)據(jù)增強,Backbone上采用了CSPDarknet53、Mish激活函數(shù)、Dropblock等方式,Neck中采用了SPP、FPN+PAN的結(jié)構(gòu),輸出端則采用CIOU_Loss、DIOU_nms操作。
這里給出YOLO V4的網(wǎng)絡(luò)結(jié)構(gòu)圖(圖片來自網(wǎng)絡(luò)):
YOLOv5共有s,m,l,x四個模型,相同的數(shù)據(jù)集上,YOLOv5-s模型訓(xùn)練和推理性能最佳,YOLOv5-x模型mAP指標最佳。其結(jié)構(gòu)其實和YOLOv4的結(jié)構(gòu)還是有一定的相似之處的,但也有一些不同,這里給出YOLOv5-s的網(wǎng)絡(luò)結(jié)構(gòu)圖:
下面簡單介紹YOLOv5的部分改進,更多詳情可參考[3]和[4]
1. 自適應(yīng)Anchors計算
在YOLOv3、YOLOv4中,訓(xùn)練不同的數(shù)據(jù)集時,計算初始錨框的值是通過單獨的程序運行的。但YOLOv5中將此功能嵌入到代碼中,每次訓(xùn)練時,自適應(yīng)的計算不同訓(xùn)練集中的最佳錨框值。
2. CSP結(jié)構(gòu)
相比于YOLOv4中只有主干網(wǎng)絡(luò)使用了CSP結(jié)構(gòu),YOLOv5中設(shè)計了兩種CSP結(jié)構(gòu),以YOLOv5-s網(wǎng)絡(luò)為例,以CSP1_X結(jié)構(gòu)應(yīng)用于Backbone主干網(wǎng)絡(luò),另一種CSP2_X結(jié)構(gòu)則應(yīng)用于Neck中。
相關(guān)代碼如下:
class Conv(nn.Module): # Standard convolution def __init__(self, c1, c2, k=1, s=1, g=1, act=True): # ch_in, ch_out, kernel, stride, groups super(Conv, self).__init__() self.conv = nn.Conv2d(c1, c2, k, s, k // 2, groups=g, bias=False) self.bn = nn.BatchNorm2d(c2) self.act = nn.LeakyReLU(0.1, inplace=True) if act else nn.Identity() def forward(self, x): return self.act(self.bn(self.conv(x))) def fuseforward(self, x): return self.act(self.conv(x)) class Bottleneck(nn.Module): # Standard bottleneck def __init__(self, c1, c2, shortcut=True, g=1, e=0.5): # ch_in, ch_out, shortcut, groups, expansion super(Bottleneck, self).__init__() c_ = int(c2 * e) # hidden channels self.cv1 = Conv(c1, c_, 1, 1) self.cv2 = Conv(c_, c2, 3, 1, g=g) self.add = shortcut and c1 == c2 def forward(self, x): return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x)) class BottleneckCSP(nn.Module): # CSP Bottleneck https://github.com/WongKinYiu/CrossStagePartialNetworks def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5): # ch_in, ch_out, number, shortcut, groups, expansion super(BottleneckCSP, self).__init__() c_ = int(c2 * e) # hidden channels self.cv1 = Conv(c1, c_, 1, 1) self.cv2 = nn.Conv2d(c1, c_, 1, 1, bias=False) self.cv3 = nn.Conv2d(c_, c_, 1, 1, bias=False) self.cv4 = Conv(c2, c2, 1, 1) self.bn = nn.BatchNorm2d(2 * c_) # applied to cat(cv2, cv3) self.act = nn.LeakyReLU(0.1, inplace=True) self.m = nn.Sequential(*[Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)]) def forward(self, x): y1 = self.cv3(self.m(self.cv1(x))) y2 = self.cv2(x) return self.cv4(self.act(self.bn(torch.cat((y1, y2), dim=1))))
結(jié)語
基于ModelArts和HiLens(在線IDE HiLens Studio和硬件HiLens Kit )可以高效地從零開始完成一個項目的落地應(yīng)用全流程,二者的無縫銜接大大提高了效率,但是真正的落地應(yīng)用需要根據(jù)具體應(yīng)用行業(yè)和場景實際分析,對癥下藥,并非如此簡單,本Demo也是僅供學(xué)習(xí)使用,性能不做保證。不過相信隨著ModelArts和HiLens的不斷完善和發(fā)展,一切都會越來越好,匯集更多開發(fā)者,共建良好生態(tài)。
郵箱 tjulitianyi@163.com
參考
[1] https://github.com/ChargedMonk/Social-Distancing-using-YOLOv5
[2] https://github.com/Akbonline/Social-Distancing-using-YOLOv5
[3] https://github.com/ultralytics/yoloV5
[4] https://mp.weixin.qq.com/s/LE4XbU67jLWW2TQJcdXJKA
AI開發(fā)平臺ModelArts 華為HiLens 昇騰 EI智能體 AI
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。