AI已經(jīng)把你看得明明白白,YOLO+ByteTrack+多標(biāo)簽分類(lèi)網(wǎng)絡(luò)
今天給大家分享一個(gè)行人屬性分析系統(tǒng)。從視頻或者相機(jī)的視頻流中能識(shí)別行人,并標(biāo)記每個(gè)人的屬性。
識(shí)別的屬性包括以下 10 類(lèi)
有些類(lèi)別有多個(gè)屬性,如果身體朝向有:正面、側(cè)面和背面,所以,最終訓(xùn)練的屬性有 26 個(gè)。
實(shí)現(xiàn)這樣的系統(tǒng)需要 3 個(gè)步驟:
- 用 YOlOv5 識(shí)別行人
- 用 ByteTrack 跟蹤標(biāo)記同一個(gè)人
- 訓(xùn)練多標(biāo)簽圖像分類(lèi)網(wǎng)絡(luò),識(shí)別行人 26 個(gè)屬性
1. 行人識(shí)別與追蹤
行人識(shí)別使用YOLOv5?目標(biāo)檢測(cè)模型,可以自己訓(xùn)練模型,也可以直接使用YOLOv5預(yù)訓(xùn)練好的模型。
行人追蹤使用的是多目標(biāo)跟蹤技術(shù)(MOT)?技術(shù),視頻是由一幅幅畫(huà)面組成,雖然我們?nèi)祟?lèi)能夠識(shí)別出不同畫(huà)面中的同一個(gè)人, 但如果不對(duì)行人做追蹤,AI?是無(wú)法識(shí)別的。需要用MOT技術(shù)追蹤同一個(gè)人并給每個(gè)行人分配唯一的ID。
YOLOv5?模型的訓(xùn)練、使用,以及多目標(biāo)跟蹤技術(shù)(MOT)?技術(shù)的原理、實(shí)現(xiàn)方案,在上一篇文章有詳細(xì)的教程,感興趣的朋友可以查看那邊文章《YOLOv5+ByteTrack統(tǒng)計(jì)車(chē)流》。
2. 訓(xùn)練多標(biāo)簽分類(lèi)網(wǎng)絡(luò)
我們最開(kāi)始接觸的圖像分類(lèi)大部分是單標(biāo)簽分類(lèi)?的,即:一張圖片歸為1類(lèi),類(lèi)別可以是二分類(lèi)?也可以是多分類(lèi)?。假設(shè)有三個(gè)類(lèi)別,每一張圖片對(duì)應(yīng)的label可能是下面這總格式:
label?只有一個(gè)位置是1。
而我們今天要訓(xùn)練的多標(biāo)簽分類(lèi)網(wǎng)絡(luò)?是一張圖片同時(shí)包含多個(gè)類(lèi)別,label格式如下:
label?可以有多個(gè)位置是1。
訓(xùn)練這樣的網(wǎng)絡(luò),有兩種方案。一種是把每個(gè)類(lèi)別看成是單標(biāo)簽分類(lèi),單獨(dú)計(jì)算損失,匯總總,計(jì)算梯度更新網(wǎng)絡(luò)參數(shù)。
另一種可以直接訓(xùn)練,但對(duì)需要注意網(wǎng)絡(luò)細(xì)節(jié),以ResNet50為例
最后輸出層的激活函數(shù)?必須要sigmoid?,因?yàn)樾枰總€(gè)屬性單獨(dú)計(jì)算概率。同理,訓(xùn)練時(shí)的損失函數(shù)也需要用二分類(lèi)?交叉熵binary_crossentropy。
實(shí)際上,上面兩種方法原理都是類(lèi)似的,只不過(guò)開(kāi)發(fā)的工作量不同。
這里為了方便,我使用的是PaddleCls?進(jìn)行訓(xùn)練。Paddle的配置簡(jiǎn)單,缺點(diǎn)是有點(diǎn)黑盒,只能按照他那一套來(lái),需要自定義的地方就比較麻煩。
模型訓(xùn)練使用的是PA100K?數(shù)據(jù)集,需要注意的是,PA100K?數(shù)據(jù)集定義的原始label與Paddle雖然含義相同,但順序不同。
如:原始label?第1位代表是否是女性?,而Paddle?要求第1位代表是否戴帽子?,第22位才是是否是女性。
我們按照Paddle?的要求調(diào)整下原始label位置即可,這樣我們后面推理會(huì)方便些。
下載PaddleClas
將下載的數(shù)據(jù)集解壓,放到PaddleClas的dataset目錄。
找到ppcls/configs/PULC/person_attribute/PPLCNet_x1_0.yaml?配置文件,配置圖片和label路徑。
train_list.txt的格式為
配置好后,就可以直接訓(xùn)練了
訓(xùn)練完后,導(dǎo)出模型
將導(dǎo)出的結(jié)果放在~/.paddleclas/inference_model/PULC/person_attribute/目錄下
便可以使用PaddleCls提供的函數(shù)直接調(diào)用
輸出結(jié)果如下:
模型訓(xùn)練過(guò)程就到這里了,數(shù)據(jù)集和整個(gè)項(xiàng)目的源碼已經(jīng)打包好了。