今天跟大家分享一個行人屬性分析系統。從影片或相機的視訊串流中能辨識行人,並標記每個人的屬性。
識別的屬性包括以下10 類別
#有些類別有多個屬性,如果身體朝向有:正面、側面和背面,所以,最終訓練的屬性有26 個。
實現這樣的系統需要3 個步驟:
#行人識別使用YOLOv5目標檢測模型,可以自己訓練模型,也可以直接使用YOLOv5預訓練好的模型。
行人追蹤使用的是多目標追蹤技術(MOT)技術,影片是由一幅幅畫面組成,雖然我們人類能夠識別出不同畫面中的同一個人, 但如果不對行人做追踪, AI是無法辨識的。需要用MOT技術追蹤同一個人並給每個行人分配唯一的ID。
YOLOv5模型的訓練、使用,以及多目標追蹤技術(MOT)技術的原理、實現方案,在上一篇文章有詳細的教程,有興趣的朋友可以查看那邊文章《 YOLOv5 ByteTrack統計車流》。
我們最開始接觸的圖像分類大部分是單標籤分類的,即:一張圖片歸為1類,類別可以是二分類也可以是多分類。假設有三個類別,每一張圖片對應的label可能是下面這總格式:
001.jpg010 002.jpg100 003.jpg100
label只有一個位置是1。
而我們今天要訓練的多標籤分類網路是一張圖片同時包含多個類別,label格式如下:
001.jpg011 002.jpg111 003.jpg100
label可以有多個位置是1。
訓練這樣的網絡,有兩種方案。一種是把每個類別看成是單標籤分類,單獨計算損失,匯總總,計算梯度更新網路參數。
另一種可以直接訓練,但對需要注意網路細節,以ResNet50為例
resnet50 = ResNet50(include_top=False, weights='imagenet') # 迁移学习,不重新训练卷积层 for layer in resnet50.layers: layer.trainable = False # 新的全连接层 x = Flatten()(resnet50.output) x = Dense(1024)(x) x = Activation('relu')(x) x = BatchNormalization()(x) x = Dropout(0.5)(x) # 输出 26 个属性的多分类标签 x = Dense(26, activatinotallow='sigmoid')(x) model = Model(inputs = resnet50.input, outputs=x)
最後輸出層的激活函數必須要sigmoid,因為需要每個屬性單獨計算機率。同理,訓練時的損失函數也需要用二分類交叉熵binary_crossentropy。
實際上,上面兩種方法原理都是類似的,只不過開發的工作量不同。
這裡為了方便,我使用的是PaddleCls進行訓練。 Paddle的配置簡單,缺點是有點黑盒,只能按照他那一套來,需要自訂的地方就比較麻煩。
模型訓練使用的是PA100K資料集,需要注意的是,PA100K資料集定義的原始label與Paddle雖然意義相同,但順序不同。
如:原始label第1位代表是否為女性,而Paddle要求第1位代表是否戴帽子,第22位才是是否為女性。
我們按照Paddle的要求調整下原始label位置即可,這樣我們後面推理會方便些。
git clone https://github.com/PaddlePaddle/PaddleClas
將下載的資料集解壓縮,放到PaddleClas的dataset目錄。
找到ppcls/configs/PULC/person_attribute/PPLCNet_x1_0.yaml設定文件,設定圖片和label路徑。
DataLoader: Train: dataset: name: MultiLabelDataset image_root: "dataset/pa100k/" #指定训练AI已經把你看得明明白白,YOLO+ByteTrack+多標籤分類網絡所在根路径 cls_label_path: "dataset/pa100k/train_list.txt" #指定训练列表文件位置 label_ratio: True transform_ops: Eval: dataset: name: MultiLabelDataset image_root: "dataset/pa100k/" #指定评估AI已經把你看得明明白白,YOLO+ByteTrack+多標籤分類網絡所在根路径 cls_label_path: "dataset/pa100k/val_list.txt" #指定评估列表文件位置 label_ratio: True transform_ops:
train_list.txt的格式為
00001.jpg0,0,1,0,....
配置好後,就可以直接訓練了
python3 tools/train.py -c ./ppcls/configs/PULC/person_attribute/PPLCNet_x1_0.yaml
訓練完後,匯出模型
python3 tools/export_model.py -c ./ppcls/configs/PULC/person_attribute/PPLCNet_x1_0.yaml -o Global.pretrained_model=output/PPLCNet_x1_0/best_model -o Global.save_inference_dir=deploy/models/PPLCNet_x1_0_person_attribute_infer
將導出的結果放在~/.paddleclas/inference_model/PULC/person_attribute/目錄下
便可以使用PaddleCls提供的函數直接呼叫
import paddleclas model = paddleclas.PaddleClas(model_name="person_attribute") result = model.predict(input_data="./test_imgs/000001.jpg") print(result)
輸出結果如下:
[{'attributes': ['Female', 'Age18-60', 'Front', 'Glasses: False', 'Hat: False', 'HoldObjectsInFront: True', 'ShoulderBag', 'Upper: ShortSleeve', 'Lower:Trousers', 'No boots'], 'output': [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0], 'filename': './test_imgs/000001.jpg'}]
模型訓練過程就到這裡了,資料集和整個專案的原始碼已經打包好了。
以上是AI已經把你看得明明白白,YOLO+ByteTrack+多標籤分類網絡的詳細內容。更多資訊請關注PHP中文網其他相關文章!