1、目标检测/多目标跟踪获取图片/视频输入中的行人检测框,模型方案为PP-YOLOE,详细文档参考PP-YOLOE。
2、通过行人检测框的坐标在输入图像中截取每个行人。
3、使用属性识别分析每个行人对应属性,属性类型与PA100k数据集相同,具体属性列表如下:
- 性别:男、女
- 年龄:小于18、18-60、大于60
- 朝向:朝前、朝后、侧面
- 配饰:眼镜、帽子、无
- 正面持物:是、否
- 包:双肩包、单肩包、手提包
- 上衣风格:带条纹、带logo、带格子、拼接风格
- 下装风格:带条纹、带图案
- 短袖上衣:是、否
- 长袖上衣:是、否
- 长外套:是、否
- 长裤:是、否
- 短裤:是、否
- 短裙&裙子:是、否
- 穿靴:是、否
4、属性识别模型方案为StrongBaseline,模型结构为基于ResNet50的多分类网络结构,引入Weighted BCE loss和EMA提升模型效果。
链接:
https://github.com/JDAI-CV/fast-reid/tree/master/projects/FastAttr
1、下载fast-reid项目:
https://github.com/JDAI-CV/fast-reid
2、下载pa-100k数据集
下载链接:
链接:https://pan.baidu.com/s/1Gjvg920nBrXFCiAQUrmbnA
提取码:8dq6
4、开始训练
修改预训练模型的路径。
配置文件路径:.projects/FastAttr/configs/Base-attribute.yml,预训练模型的路径改成红框里面的路径,然后把预训练权重放到项目的根目录。
运行命令:
python projects/FastAttr/train_net.py --config-file projects/FastAttr/configs/pa100.yml
运行结果:
Dataset | Accu | Prec | Recall | F1 | mA | metric |
---|---|---|---|---|---|---|
PA100K | 76.36 | 86.04 | 84.87 | 85.45 | 76.25 | 76.25 |
百度和京东开源的项目源于这个项目,链接:
https://github.com/valencebond/Rethinking_of_PAR
1、下载Rethinking_of_PAR,链接:
https://github.com/valencebond/Rethinking_of_PAR
2、下载数据集
下载链接:
链接:https://pan.baidu.com/s/1Gjvg920nBrXFCiAQUrmbnA
提取码:8dq6
3、将数据集放到Rethinking_of_PAR项目中。
将图片文件夹的名字改为data,复制到data/PA100k下面。
4、修改源码中的错误
有几处错误的地方需要修改。第一处在./tools/utils.py,将time_str函数修改为:
def time_str(fmt=None):
if fmt is None:
fmt = '%Y_%m_%d_%H_%M_%S'
return datetime.datetime.today().strftime(fmt)
还有一处是路径的问题,路径在./dataset/pedes_attr/pedes.py,在23行增加:
dataset_info = pickle.load(open(data_path, 'rb+'))
dataset_info.root="./data/PA100k/data"
root默认是原作者的,所以需要改一下。
5、安装库文件
pip install inplace_abn
pip install visdom -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install mmcv
6、开始训练
点击Terminal
,然后输入命令:
python train.py --cfg ./configs/pedes_baseline/pa100k.yaml
测试代码参照https://www.pudn.com/news/62fca7d3f97302478e6a8d18.html
修改的和调试的。
代码如下:
import argparse
import json
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
import pickle
from dataset.augmentation import get_transform
from dataset.multi_label.coco import COCO14
from metrics.pedestrian_metrics import get_pedestrian_metrics
from models.model_factory import build_backbone, build_classifier
import numpy as np
import torch
from PIL import Image
from configs import cfg, update_config
from models.base_block import FeatClassifier
from tools.function import get_model_log_path, get_reload_weight
from tools.utils import set_seed, str2bool
from models.backbone import resnet
set_seed(605)
clas_name = ['Hat','Glasses','ShortSleeve','LongSleeve','UpperStride',
'UpperLogo','UpperPlaid','UpperSplice','LowerStripe','LowerPattern',
'LongCoat','Trousers','Shorts','Skirt&Dress','boots','HandBag','ShoulderBag',
'Backpack','HoldObjectsInFront','AgeOver60','Age18-60',
'AgeLess18','Female','Front','Side','Back']
def main(cfg, args):
exp_dir = os.path.join('exp_result', cfg.DATASET.NAME)
model_dir, log_dir = get_model_log_path(exp_dir, cfg.NAME)
train_tsfm, valid_tsfm = get_transform(cfg)
print(valid_tsfm)
backbone, c_output = build_backbone(cfg.BACKBONE.TYPE, cfg.BACKBONE.MULTISCALE)
classifier = build_classifier(cfg.CLASSIFIER.NAME)(
nattr=26,
c_in=c_output,
bn=cfg.CLASSIFIER.BN,
pool=cfg.CLASSIFIER.POOLING,
scale =cfg.CLASSIFIER.SCALE
)
model = FeatClassifier(backbone, classifier)
if torch.cuda.is_available():
model = torch.nn.DataParallel(model).cuda()
model = get_reload_weight(model_dir, model, pth='ckpt_max_2023_01_11_13_40_16.pth') # 修改此处的模型名字
model.eval()
with torch.no_grad():
for name in os.listdir(args.test_img):
print(name)
img = Image.open(os.path.join(args.test_img,name))
img = valid_tsfm(img).cuda()
img = img.view(1, *img.size())
valid_logits, attns = model(img)
valid_probs = torch.sigmoid(valid_logits[0]).cpu().numpy()
valid_probs = valid_probs[0]>0.5
res = []
for i,val in enumerate(valid_probs):
if val:
res.append(clas_name[i])
if i ==14 and val==False:
res.append("male")
print(res)
def argument_parser():
parser = argparse.ArgumentParser(description="attribute recognition",
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument(
"--test_img", help="test images", type=str,
default="./test_imgs",
)
parser.add_argument(
"--cfg", help="decide which cfg to use", type=str,default='./configs/pedes_baseline/pa100k.yaml'
)
parser.add_argument("--debug", type=str2bool, default="true")
args = parser.parse_args()
return args
if __name__ == '__main__':
args = argument_parser()
update_config(cfg, args)
main(cfg, args)
行人轨迹和属性分析的解决方案,检测采用的是yolov5, 跟踪采用的是deepsort,属性分析采用的是deepmar,效果demo。github链接:https://github.com/lanmengyiyu/yolov5-deepmar。