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.
Les attributs identifiés comprennent les 10 catégories suivantes
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 :
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 ».
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
labelUne 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.
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.
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
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!