首頁  >  文章  >  科技週邊  >  AI已經把你看得明明白白,YOLO+ByteTrack+多標籤分類網絡

AI已經把你看得明明白白,YOLO+ByteTrack+多標籤分類網絡

PHPz
PHPz轉載
2023-04-14 18:25:031935瀏覽

今天跟大家分享一個行人屬性分析系統。從影片或相機的視訊串流中能辨識行人,並標記每個人的屬性。

AI已經把你看得明明白白,YOLO+ByteTrack+多標籤分類網絡

識別的屬性包括以下10 類別

AI已經把你看得明明白白,YOLO+ByteTrack+多標籤分類網絡

#有些類別有多個屬性,如果身體朝向有:正面、側面和背面,所以,最終訓練的屬性有26 個。

實現這樣的系統需要3 個步驟:

  • 用YOlOv5 辨識行人
  • 用ByteTrack 追蹤標記同一個人
  • 訓練多標籤圖像分類網絡,識別行人26 個屬性

1. 行人識別與追蹤

#行人識別使用YOLOv5目標檢測模型,可以自己訓練模型,也可以直接使用YOLOv5預訓練好的模型。

行人追蹤使用的是多目標追蹤技術(MOT)技術,影片是由一幅幅畫面組成,雖然我們人類能夠識別出不同畫面中的同一個人, 但如果不對行人做追踪, AI是無法辨識的。需要用MOT技術追蹤同一個人並給每個行人分配唯一的ID。

YOLOv5模型的訓練、使用,以及多目標追蹤技術(MOT)技術的原理、實現方案,在上一篇文章有​​詳細的教程,有興趣的朋友可以查看那邊文章《 YOLOv5 ByteTrack統計車流》。

2. 訓練多標籤分類網路

我們最開始接觸的圖像分類大部分是單標籤分類的,即:一張圖片歸為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位才是是否為女性。

AI已經把你看得明明白白,YOLO+ByteTrack+多標籤分類網絡

我們按照Paddle的要求調整下原始label位置即可,這樣我們後面推理會方便些。

下載PaddleClas

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/目錄下

AI已經把你看得明明白白,YOLO+ByteTrack+多標籤分類網絡

便可以使用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中文網其他相關文章!

陳述:
本文轉載於:51cto.com。如有侵權,請聯絡admin@php.cn刪除