行人属性识别开源项目

Posted AI浩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了行人属性识别开源项目相关的知识,希望对你有一定的参考价值。

文章目录

1、百度的行人属性识别项目

PP-Human属性识别

方案说明

1、目标检测/多目标跟踪获取图片/视频输入中的行人检测框,模型方案为PP-YOLOE,详细文档参考PP-YOLOE
2、通过行人检测框的坐标在输入图像中截取每个行人。
3、使用属性识别分析每个行人对应属性,属性类型与PA100k数据集相同,具体属性列表如下:

- 性别:男、女
- 年龄:小于1818-60、大于60
- 朝向:朝前、朝后、侧面
- 配饰:眼镜、帽子、无
- 正面持物:是、否
- 包:双肩包、单肩包、手提包
- 上衣风格:带条纹、带logo、带格子、拼接风格
- 下装风格:带条纹、带图案
- 短袖上衣:是、否
- 长袖上衣:是、否
- 长外套:是、否
- 长裤:是、否
- 短裤:是、否
- 短裙&裙子:是、否
- 穿靴:是、否

4、属性识别模型方案为StrongBaseline,模型结构为基于ResNet50的多分类网络结构,引入Weighted BCE loss和EMA提升模型效果。

2、京东的JDAI-CV/fast-reid

链接:
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

3、将数据集放到fast-reid项目中。

4、开始训练
修改预训练模型的路径。
配置文件路径:.projects/FastAttr/configs/Base-attribute.yml,预训练模型的路径改成红框里面的路径,然后把预训练权重放到项目的根目录。

运行命令:

python projects/FastAttr/train_net.py --config-file projects/FastAttr/configs/pa100.yml

3、Rethinking_of_PAR

百度和京东开源的项目源于这个项目,链接:
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

就可以开始训练了。

训练100epoch的结果:

DatasetAccuPrecRecallF1mAmetric
PA100K76.3686.0484.8785.4576.2576.25

测试

测试代码参照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)

运行结果如下:

4、yolov5-deepmar

行人轨迹和属性分析的解决方案,检测采用的是yolov5, 跟踪采用的是deepsort,属性分析采用的是deepmar,效果demo。github链接:https://github.com/lanmengyiyu/yolov5-deepmar。

以上是关于行人属性识别开源项目的主要内容,如果未能解决你的问题,请参考以下文章

行人属性识别

CVPR2021 行人重识别/Person Re-identification 论文+开源代码汇总

行人属性识别数据集总结

国自图像识别算法团队夺得PRCV2020大规模行人检索竞赛双冠!

喜报国自图像识别算法团队夺得PRCV2020大规模行人检索竞赛双冠!

行人属性识别数据集总结