ModelArts 與HiLens Kit聯合開發丨行人社交距離風險提示Demo

華為雲開發者社群發表於2021-02-02
摘要:本Demo使用YOLOv3_Resnet18模型來檢測的視訊流中的行人,獲取行人座標(即圖中藍色方框),然後計算所有檢測到的人之間的相互“距離”。

前情提要

聽到行人社交距離風險提示是不是覺得有點不太明白,簡單來說,就是通過某一角度的視覺資訊,判斷行人的社交距離情況,讓我們直接看視訊來領會吧。

ModelArts 與HiLens Kit聯合開發丨行人社交距離風險提示Demo

這是在華為HiLens Kit上部署推理儲存的視訊,通過計算行人間社交距離給出“High Risk” 或“Low Risk”的提示,下面來具體介紹一下。

社交距離檢測介紹

本Demo使用YOLOv3_Resnet18模型來檢測的視訊流中的行人,獲取行人座標(即圖中藍色方框),然後計算所有檢測到的人之間的相互“距離”。這裡要注意的是和現實生活中使用的長度單位來衡量距離不一樣的是,在計算機視覺世界中使用的是“畫素”,一種簡單的方法是根據行人座標來計算檢測到的兩個人的質心,也就是根據檢測到的目標框的中心之間相隔的畫素值作為計算視覺世界中的“距離”來衡量視訊中的人之間的距離是否超過安全距離。

Demo主要分為兩部分:行人檢測和社交距離計算,大體流程如下:

1. 使用YOLOv3_Resnet18演算法檢測輸入視訊或視訊流中的所有行人,得到行人座標,並根據此計算位置資訊和質心位置;

2. 根據第1步的資訊,計算所有檢測到的行人的人質心之間的相互距離;

3. 根據上一步計算得到的社交距離,對比預先設定的安全距離,從而計算每個人之間的距離對,檢測兩個人之間的距離是否小於N個畫素,小於則處於安全距離,反之則不處於安全距離。

這裡使用的是YOLOv3_Resnet18演算法來進行行人檢測,事實上,可替換為任何一種目標檢測演算法,只要輸出行人座標符合本Demo要求順序即可,比如效能更為優良的YOLOv4,甚至YOLOv5等等,值得一提的是在PC端的實現是基於最新的、訓練和推理效能最佳的YOLOv5-s模型實現的,如果需要可以參考本文最下面參考部分的[1] 或[2]([1]比[2]更加詳細具體,容易上手,推薦使用)。但YOLOv5是基於PyTorch實現的,不方便轉換為HiLens需要的om模型使用,慶幸的是可以通過PyTorch——>onnx——>om來使用,這一點我正在嘗試,也期待有優秀的同學加入進來。

ModelArts 與HiLens Kit聯合開發丨行人社交距離風險提示Demo

上述的YOLOv3_Resnet18、原版YOLOv3_Darknet53以及最新的YOLOv5演算法都可以在ModelArts AI Gallery找到哦,不僅提供了預訓練模型,同時也很方便使用,小白也能起送上手,奉上鍊接:

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

怎麼樣,是不是非常豐富,選擇多多呀?可以試手一下哦,會發現使用起來也是很簡單的,注意ModelArts和OBS花費哦。

本Demo選擇的是第一個——YOLOv3_Resnet18 GPU版本 TensorFlow,因為本Demo只需要對行人進行檢測,所以選擇了模型結構簡單,訓練和推理速度快的YOLOv3_Resnet18,節省訓練時間,也就是節省訓練成本呀。在訓練方面,使用了來自開源行人資料集整理的資料集,因為只有person這一個標籤,相比於COCO資料集80個標籤,訓練和部署推理更加具有優勢,這裡奉上 AI Gallery的資料集連結,沒想到吧, AI Gallery不僅有演算法,還有資料集,滿足你的一切需要,有沒有哆啦A夢的口袋的感覺(我承認我有一點誇張)

Person-4192資料集連結:https://marketplace.huaweicloud.com/markets/aihub/datasets/detail/?content_id=3d67fd03-2e16-4c70-908f-feb8f50334b9

如果你還想訓練包含其他類別的情況,比如Person and Car,可參照如下。當然,一般來說,資料集越大,魯棒性越好,這裡的資料集較小,可以自行使用更大的資料集。

ModelArts 與HiLens Kit聯合開發丨行人社交距離風險提示Demo

實操介紹

主要麻煩的部分是行人檢測模型的訓練,如果為了方便,可以使用基於COCO的預訓練模型,在GitHub有很多。這裡希望是從資料集準備開始,到訂閱演算法,完成訓練,到HiLens Studio除錯,並最終部署,體驗下基於ModelArts和HiLens Kit的完整開發流程,因為以前介紹過,這裡就不在贅述,詳情可參考我的博文——開發教程 | 基於ModelArts與HiLens端雲協同開發行人檢測與跟蹤方案,博文介紹的較為詳細,如果有問題,可以聯絡我。值得注意的是這篇博文是介紹行人跟蹤以及行人計數的,如果有興趣的話,可以結合這篇博文與本博文,實現更加完善行人檢測、跟蹤以及社交距離檢測的方案,相信在社交距離檢測的基礎上加入跟蹤和多種人數統計方案會更加切合實用,效能更加強大。

對了,我把技能釋出到技能市場了,名字是Social-Distancing-using-YOLOv3-HDMI,稽核通過後,大家就能夠訂閱使用了,技能市場彙集了官方和第三方開發的技能,能夠高效便捷地將自己開發的技能分享給他人使用,而且從分享到他人訂閱以及部署到HiLens使用,完全基於網路實現,非常方便,極大促進了技能的共享。

ModelArts 與HiLens Kit聯合開發丨行人社交距離風險提示Demo

開發體驗

整體基於ModelArts和HiLens Stuio 1.5.0開發,參考開原始碼實現,很慚愧的是大部分內容都是人家的,自主創新性很少。不過整體開發還是很順利的,從得到模型到在HiLens Studio除錯完成來說,不到一個下午就能搞定了,這是極致效率的體現,這得益於線上IDE HiLens Studio的使用,作為一款線上IDE,提供了開發,除錯的完整功能,甚至可以線上執行除錯,直接得到程式執行的視覺化結果展示。同時提供了豐富的模板,基於模板開發,大大提高開發效率。

總的來說,彷彿線上有了一個自己的HiLens Kit一樣,只要連線到網路,開發HiLens Stduio就能開發了,除錯成功後還可以一鍵安裝到自己的HiLens Kit上,讓開發變成一件很爽的事情,而且HiLens Studio也在不斷完善中,與我第一次使用最初版本相比,穩定性和效能都有了很大的提升,比如下圖中紅色剪頭所指部分,就是後來新增的,方便開發者除錯,相信研發人員也是付出了不少心血和努力,非常感謝。

ModelArts也在飛快成長,開發環境除了最初的NoteBook,也有了介面和功能更加完善的Jupyter Lab,最新測試的線上切換硬體配置,可以進行CPU和GPU,以及不同配置CPU和GPU的線上切換功能,這一點一滴地改變方便可開發者的使用,拉近了開發者與ModelArts的距離,相信ModelArts在未來會更加茁壯地成長。

注意的是,我是用的是HiLens Studio基礎版,多人共用,所以有時候可能因為資源緊張,導致佔用,從而執行出錯,這時候可以通過建立官方案例模板執行來判斷是否資源佔用,一般來說,如果官方模板也執行報錯,可能就是資源佔用,可以考慮使用付費版,但需要額外費用哦。

下圖是HiLens Studio的開發介面,有沒有一種熟悉的感覺,和VS Code有些類似,這對熟悉VS Code的同學是一個福音哦。

ModelArts 與HiLens Kit聯合開發丨行人社交距離風險提示Demo

YOLO淺談

YOLO系列是經典的目標檢測網路,在效能和速度上取得了較好的平衡,應用廣泛。雖然原作者只做到了YOLOv3,但在愛好者的努力下,後續發展了YOLOv4, 已經發展到了最新的YOLOv5(暫時稱為YOLOv5),注意YOLOv5的作者並沒有發表論文,因此只能從程式碼的角度理解。

YOLOv4在YOLOv3的基礎上在網路結構和預處理等很多方面進行了很多的創新,融合了當時得到驗證的很多trick,效能得到了很大的提升。比如輸入端採用mosaic資料增強,Backbone上採用了CSPDarknet53、Mish啟用函式、Dropblock等方式,Neck中採用了SPP、FPN+PAN的結構,輸出端則採用CIOU_Loss、DIOU_nms操作。

ModelArts 與HiLens Kit聯合開發丨行人社交距離風險提示Demo

這裡給出YOLO V4的網路結構圖(圖片來自網路):

ModelArts 與HiLens Kit聯合開發丨行人社交距離風險提示Demo

YOLOv5共有s,m,l,x四個模型,相同的資料集上,YOLOv5-s模型訓練和推理效能最佳,YOLOv5-x模型mAP指標最佳。其結構其實和YOLOv4的結構還是有一定的相似之處的,但也有一些不同,這裡給出YOLOv5-s的網路結構圖:

ModelArts 與HiLens Kit聯合開發丨行人社交距離風險提示Demo

下面簡單介紹YOLOv5的部分改進,更多詳情可參考[3]和[4]

1. 自適應Anchors計算

在YOLOv3、YOLOv4中,訓練不同的資料集時,計算初始錨框的值是通過單獨的程式執行的。但YOLOv5中將此功能嵌入到程式碼中,每次訓練時,自適應的計算不同訓練集中的最佳錨框值。

2. CSP結構

相比於YOLOv4中只有主幹網路使用了CSP結構,YOLOv5中設計了兩種CSP結構,以YOLOv5-s網路為例,以CSP1_X結構應用於Backbone主幹網路,另一種CSP2_X結構則應用於Neck中。

ModelArts 與HiLens Kit聯合開發丨行人社交距離風險提示Demo

相關程式碼如下:

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))))

結語

基於ModelArts和HiLens(線上IDE HiLens Studio和硬體HiLens Kit )可以高效地從零開始完成一個專案的落地應用全流程,二者的無縫銜接大大提高了效率,但是真正的落地應用需要根據具體應用行業和場景實際分析,對症下藥,並非如此簡單,本Demo也是僅供學習使用,效能不做保證。不過相信隨著ModelArts和HiLens的不斷完善和發展,一切都會越來越好,彙集更多開發者,共建良好生態。

郵箱 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

本文分享自華為雲社群《行人社交距離風險提示Demo | 基於ModelArts AI Gallery與HiLens Kit聯合開發》,原文作者:Tianyi_Li。

 

點選關注,第一時間瞭解華為雲新鮮技術~

相關文章