今天给大家分享一个行人属性分析系统。可以从视频或摄像头视频流中识别行人,并标记每个人的属性。公认的属性包括以下10类。有些类别有多个属性,如果身体面向:正面,侧面和背面,所以最终训练有26个属性。实现这样一个系统需要3个步骤:使用YOLOv5识别行人使用ByteTrack跟踪和标记同一个人训练一个多标签图像分类网络来识别行人的26个属性1.行人识别和跟踪行人识别使用YOLOv5目标检测模型,你可以自己训练模型,也可以直接使用YOLOv5预训练模型。行人跟踪使用多目标跟踪技术(MOT)技术。视频由图片组成。虽然我们人类可以从不同的图片中识别出同一个人,但如果我们不跟踪行人,AI就无法识别他们。.需要使用MOT技术来跟踪同一个人,并为每个行人分配一个唯一的ID。YOLOv5模型的训练和使用,以及多目标跟踪技术(MOT)技术的原理和实现,在之前的文章中有详细介绍。有兴趣的朋友可以看看那边的文章《YOLOv5+ByteTrack统计车流》。2.训练一个多标签分类网络我们最开始接触的图像分类大多是单标签分类,即:一张图片被归为1类,类别可以是二分类也可以是多分类.假设有三个类别,每张图片对应的label可能是下面的通用格式:001.jpg010002.jpg100003.jpg100label只有一个位置是1。今天我们要训练的多标签分类网络是同时包含多个类别的图片。标签格式如下:001.jpg011002.jpg111003.jpg100label1的位置可以有多个。训练这样的网络有两种选择。一种是将每个类别看成一个单标签分类,分别计算损失,汇总总和,计算梯度来更新网络参数。另一个可以直接训练,但是需要注意网络的细节。以ResNet50为例resnet50=ResNet50(include_top=False,weights='imagenet')#迁移学习,不要重新训练卷积层forlayerinresnet50.layers:layer.trainable=False#newfullyconnectedlayerx=Flatten()(resnet50.output)x=Dense(1024)(x)x=Activation('relu')(x)x=BatchNormalization()(x)x=Dropout(0.5)(x)#输出多类别标签与26attributesx=Dense(26,activatinotallow='sigmoid')(x)model=Model(inputs=resnet50.input,outputs=x)最后输出层的激活函数必须是sigmoid,因为概率需要每个属性单独计算。同样,训练时的损失函数也需要使用binary_crossentropybinary_crossentropy。其实以上两种方式的原理是差不多的,只是开发的工作量不同而已。这里为了方便起见,我使用PaddleCls进行训练。Paddle的配置简单,缺点是有点黑盒子,只能根据自己的set使用,自定义地方比较麻烦。PA100K数据集用于模型训练。需要注意的是,PA100K数据集定义的原始label和Paddle虽然含义相同,但顺序不同。例如:原标签的第1位代表是否是女性,而Paddle要求第1位代表是否戴帽子,第22位代表是否女性。我们可以根据Paddle的要求调整原来的label位置,这样后面我们的推理就更方便了。下载PaddleClasgitclonehttps://github.com/PaddlePaddle/PaddleClas,将下载的数据集解压,放到PaddleClas的数??据集目录下。找到ppcls/configs/PULC/person_attribute/PPLCNet_x1_0.yaml配置文件,配置image和label路径。DataLoader:Train:dataset:name:MultiLabelDatasetimage_root:"dataset/pa100k/"#指定训练图片的根路径cls_label_path:"dataset/pa100k/train_list.txt"#指定训练列表文件的位置label_ratio:Truetransform_ops:eval:dataset:name:MultiLabelDatasetimage_root:"dataset/pa100k/"#指定评估图像的根路径cls_label_path:"dataset/pa100k/val_list.txt"#指定评估列表文件的位置label_ratio:True格式oftransform_ops:train_list.txt为00001.jpg0,0,1,0,....配置后可以直接训练python3tools/train.py\-c./ppcls/configs/PULC/person_attribute/PPLCNet_x1_0。yaml训练后导出模型python3tools/export_model.py\-c./ppcls/configs/PULC/person_attribute/PPLCNet_x1_0.yaml\-oGlobal.pretrained_model=output/PPLCNet_x1_0/best_model\-oGlobal.save_inference_dir=deploy/models/PPLCNet_x1_0_person_attribute_infer将结果导出到~/.paddleclas/inference_model/PULC/person_attribute/目录,可以使用PaddleCls提供的函数直接调用importpaddleclasmodel=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','Noboots'],'输出':[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'}]模型训练过程到此结束,整个项目的数据集和源码已经打包完成
