Maison  >  Article  >  Périphériques technologiques  >  L'IA vous a clairement vu, YOLO+ByteTrack+réseau de classification multi-étiquettes

L'IA vous a clairement vu, YOLO+ByteTrack+réseau de classification multi-étiquettes

PHPz
PHPzavant
2023-04-14 18:25:031994parcourir

Aujourd'hui, je vais partager avec vous un système d'analyse des attributs des piétons. Les piétons peuvent être identifiés à partir de flux vidéo ou de caméras et les attributs de chaque personne peuvent être marqués.

LIA vous a clairement vu, YOLO+ByteTrack+réseau de classification multi-étiquettes

Les attributs identifiés comprennent les 10 catégories suivantes

LIA vous a clairement vu, YOLO+ByteTrack+réseau de classification multi-étiquettes

Certaines catégories ont plusieurs attributs, si l'orientation du corps est : avant, côté et arrière, il y a donc 26 attributs dans l'entraînement final.

Il faut 3 étapes pour mettre en œuvre un tel système :

  • Utilisez YOlOv5 pour identifier les piétons
  • Utilisez ByteTrack pour suivre et marquer la même personne
  • Formez un réseau de classification d'images multi-étiquettes pour identifier 26 attributs des piétons

1. Identification et suivi des piétons

La reconnaissance des piétons utilise le modèle de détection de cible YOLOv5. Vous pouvez entraîner le modèle vous-même ou utiliser directement le modèle pré-entraîné YOLOv5.

Le suivi des piétons utilise la technologie MOT (Multi-Object Tracking Technology). La vidéo est composée d'une seule image. Bien que nous, les humains, puissions identifier la même personne sur différentes images, si le piéton n'est pas suivi, l'IA ne peut pas l'identifier. La technologie MOT est nécessaire pour suivre la même personne et attribuer un identifiant unique à chaque piéton.

La formation et l'utilisation du modèle YOLOv5, ainsi que les principes et les solutions de mise en œuvre de la technologie de suivi multi-objets (MOT), sont détaillés dans l'article précédent. Les amis intéressés peuvent consulter l'article « Statistiques YOLOv5+ByteTrack ». " Flux de circulation ».

2. Former un réseau de classification multi-étiquettes

La plupart des classifications d'images avec lesquelles nous sommes entrés en contact pour la première fois étaient une classification à étiquette unique, c'est-à-dire : une image est classée en 1 catégorie, et la catégorie peut être composée de deux catégories ou de plusieurs catégories. . En supposant qu'il existe trois catégories, le label correspondant à chaque image peut être au format général suivant :

001.jpg010
002.jpg100
003.jpg100

label​Une seule position vaut 1.

Le réseau de classification multi-étiquettes que nous allons entraîner aujourd'hui est une image qui contient plusieurs catégories en même temps. Le format de l'étiquette est le suivant :

001.jpg011
002.jpg111
003.jpg100

l'étiquette​ peut avoir plusieurs positions de 1.

Il existe deux options pour former un tel réseau. La première consiste à traiter chaque catégorie comme une classification à étiquette unique, à calculer la perte séparément, à résumer le total et à calculer le gradient pour mettre à jour les paramètres du réseau.

L'autre peut être formé directement, mais vous devez faire attention aux détails du réseau. Prenez ResNet50 comme exemple

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)

La fonction d'activation de la couche de sortie finale doit être sigmoïde, car la probabilité doit être calculée séparément pour. chaque attribut. De la même manière, la fonction de perte lors de l'entraînement doit également utiliser binaire_crossentropy.

En fait, les principes des deux méthodes ci-dessus sont similaires, mais la charge de travail de développement est différente.

Pour plus de commodité ici, j'utilise PaddleCls pour l'entraînement. La configuration de Paddle est simple, mais son inconvénient est qu'il s'agit un peu d'une boîte noire, vous ne pouvez suivre que ses propres règles, et il est plus difficile de la personnaliser.

La formation du modèle utilise l'ensemble de données PA100K. Il convient de noter que bien que l'étiquette d'origine définie par l'ensemble de données PA100K ait la même signification que Paddle, l'ordre est différent.

Par exemple : le 1er chiffre de l'étiquette d'origine indique si l'étiquette est féminine, tandis que Paddle requiert le 1er chiffre pour indiquer si l'étiquette porte un chapeau, et le 22e chiffre représente si l'étiquette est féminine.

LIA vous a clairement vu, YOLO+ByteTrack+réseau de classification multi-étiquettes

Il nous suffit d'ajuster la position originale de l'étiquette en fonction des exigences de Paddle, afin qu'il nous soit plus facile de raisonner plus tard.

Téléchargez PaddleClas

git clone https://github.com/PaddlePaddle/PaddleClas

Décompressez l'ensemble de données téléchargé et placez-le dans le répertoire de l'ensemble de données de PaddleClas.

Recherchez le fichier de configuration ppcls/configs/PULC/person_attribute/PPLCNet_x1_0.yaml et configurez les chemins d'image et d'étiquette. Le format de

DataLoader:
Train:
dataset:
name: MultiLabelDataset
image_root: "dataset/pa100k/" #指定训练LIA vous a clairement vu, YOLO+ByteTrack+réseau de classification multi-étiquettes所在根路径
cls_label_path: "dataset/pa100k/train_list.txt" #指定训练列表文件位置
label_ratio: True
transform_ops:

Eval:
dataset:
name: MultiLabelDataset
image_root: "dataset/pa100k/" #指定评估LIA vous a clairement vu, YOLO+ByteTrack+réseau de classification multi-étiquettes所在根路径
cls_label_path: "dataset/pa100k/val_list.txt" #指定评估列表文件位置
label_ratio: True
transform_ops:

train_list.txt est

00001.jpg0,0,1,0,....

Après la configuration, vous pouvez directement entraîner

python3 tools/train.py 
-c ./ppcls/configs/PULC/person_attribute/PPLCNet_x1_0.yaml

Après l'entraînement, exporter le modèle

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

et placer les résultats exportés dans ~/.paddleclas/inference_model/PULC/person_attribute/ In le répertoire

LIA vous a clairement vu, YOLO+ByteTrack+réseau de classification multi-étiquettes

vous pouvez utiliser la fonction fournie par PaddleCls pour appeler directement

import paddleclas

model = paddleclas.PaddleClas(model_name="person_attribute")

result = model.predict(input_data="./test_imgs/000001.jpg")

print(result)

Les résultats de sortie sont les suivants :

[{'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'}]

Le processus de formation du modèle se termine ici, l'ensemble de données et le code source de l'ensemble du projet ont été emballé.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer