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