Reconocimiento de atributos de peatones 1: conjunto de datos de entrenamiento PA100k

Prefacio

Recientemente he estado trabajando en tareas relacionadas con el reconocimiento de atributos de peatones. Este artículo se utiliza para registrar el proceso de capacitación para revisión futura.

Actualmente hay muchos almacenes de reconocimiento de atributos de peatones disponibles en Internet, como el reconocimiento de atributos humanos PP-Human de código abierto de Baidu , el reconocimiento de atributos humanos PULC y JDAI-CV/fast-reid de JD.com son excelentes trabajos, pero no lo son. disponible aquí. Planeo usar el proyecto anterior y rastrearlo hasta la fuente. Descubrí que el reconocimiento de atributos de peatones de Baidu y JD.com se basa en el proyecto Rethinking_of_PAR , por lo que puedo estudiar directamente este proyecto. Este artículo también será capacitado basado en este proyecto, así como modificaciones posteriores al modelo y Entrene su propio conjunto de datos.

Últimos indicadores del conjunto de datos de reconocimiento de atributos de peatones: https://paperswithcode.com/task/pedestrian-attribute-recognition/

Otros proyectos relacionados:

1. Preparación del conjunto de datos

La capacitación se basa en el conjunto de datos PA100k , que es el conjunto de datos más grande para el reconocimiento de atributos de peatones hasta la fecha y contiene un total de 100.000 imágenes de peatones recopiladas de cámaras de vigilancia exteriores, cada una con 26 atributos comunes. Según la configuración oficial, todo el conjunto de datos se divide aleatoriamente en 80.000 imágenes de entrenamiento, 10.000 imágenes de verificación y 10.000 imágenes de prueba.

Aquí empaqueto el conjunto de datos y lo coloco en mi disco en la nube de Baidu para descargarlo. Enlace: https://pan.baidu.com/s/1WLWCZujhENVAL0Iz0BXnQQ Contraseña: iulh . Después de descargar, descomprima la imagen y el archivo de etiqueta .mat. Cambie el nombre carpeta release_data a los datos y déjela a un lado primero.

Clona el repositorio de entrenamiento:

git clone https://github.com/valencebond/Rethinking_of_PAR.git
cd Rethinking_of_PAR

Este almacén proporciona muchos métodos de entrenamiento para conjuntos de datos de atributos de peatones. Los indicadores de precisión de cada entrenamiento de conjuntos de datos son los siguientes:
Insertar descripción de la imagen aquí
Aquí solo entreno en PA100k. Los métodos de preparación para otros conjuntos de datos son similares porque el autor no proporciona modelos previamente entrenados. (Google Cloud Disk no es válido), por lo que si desea probarlo, primero debe ejecutar el entrenamiento usted mismo y el tiempo de entrenamiento no es muy largo.

Debido a que este proyecto lee archivos de anotaciones en formato .pkl, necesita analizar el .mat descargado anteriormente y guardarlo como un archivo .pkl. Afortunadamente, el autor también proporciona el script preparado en dataset/pedes_attr/preprocess/format_pa100k .py, antes Usando el archivo de script format_pa100k.py, debe leer dataset/pedes_attr/annotation.md. El contenido general del archivo es simplemente que necesita ordenar los atributos del conjunto de datos de arriba a abajo de acuerdo con los siguientes estándares. El orden de atributos unificados es:

  1. región de la cabeza
  2. región superior
  3. región inferior
  4. región del pie
  5. accesorio/bolsa
  6. edad
  7. género
  8. otros

Para pa100k, el nuevo orden después de ordenar los 26 atributos es:

núm_en_grupo = [2, 6, 6, 1, 4, 7]

'Sombrero','Gafas', [7,8] 2
'Manga corta','Manga larga','UpperStride','UpperLogo','UpperPlaid','UpperSplice', [13,14,15,16,17,18 ] 6
'Banda Inferior','Patrón Inferior','Abrigo Largo','Pantalones','Shorts','Falda y Vestido', [19,20,21,22,23,24] 6 '
botas' [25] 1
'Bolso' ,'ShoulderBag','Backpack','HoldObjectsInFront', [9,10,11,12] 4
'AgeOver60','Age18-60','AgeLess18', [1,2,3] 3
'Mujer' [0 ] 1
'Frente', 'Lateral', 'Atrás', [4,5,6] 3

permutación = [7,8,13,14,15,16,17,18,19,20,21,22,23,24,25,9,10,11,12,1,2,3,0,4 ,5,6]

Por lo tanto, será mucho más claro leer el archivo format_pa100k.py nuevamente. De acuerdo con la ruta del conjunto de datos que acaba de descargar, modifique la configuración relevante y luego ejecútela para obtener el archivo dataset_all.pkl. Cabe señalar que si el conjunto de datos no está almacenado en ./data/ Si está en PA100k y está almacenado en una carpeta externa, se informará un error al cargar el conjunto de datos. Debe modificar tools/function.py aquí: cámbielo a la ruta de su conjunto de
Insertar descripción de la imagen aquí
datos , de lo contrario se cargará de forma predeterminada en ./data. Solo observa la modificación.

2. Empieza a entrenar

Modifique las configuraciones relevantes en el archivo de configuración configs/pedes_baseline/pa100k.yaml, como el tamaño del lote, largo y ancho, columna vertebral, etc. Ejecute directamente en la terminal después de la modificación:

python train.py --cfg ./configs/pedes_baseline/pa100k.yaml

Aparece la siguiente interfaz, es decir, comienza el entrenamiento:
Insertar descripción de la imagen aquí
Si cree que el intervalo de impresión es demasiado largo, puede modificar el intervalo de impresión en el archivo:
Insertar descripción de la imagen aquí
Después del entrenamiento, el modelo se guarda en pa100k/img_model en la carpeta exp_result. Solo hay un modelo porque el nombre del modelo está en el entrenamiento. El tiempo está determinado por la marca de tiempo, por lo que los modelos posteriores guardados con mayor precisión sobrescribirán este modelo. Si desea modificar el nombre del modelo guardado, puede modificar Esta línea de código: el nombre del modelo guardado tiene la época óptima y la precisión óptima
Insertar descripción de la imagen aquí
. La información parece un poco más simple y clara.

La precisión óptima obtenida mediante el entrenamiento es:
Insertar descripción de la imagen aquí

3. Prueba de modelo

Debido a que el autor no proporcionó el código para probar una determinada imagen individualmente, lo modifiqué según el archivo infer.py y obtuve el archivo demo.py, que se utiliza para probar la función de una sola imagen o de varias imágenes en una carpeta. :

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 torch.utils.data import DataLoader
from tqdm import tqdm
from PIL import Image
from configs import cfg, update_config
from dataset.pedes_attr.pedes import PedesAttr
from metrics.ml_metrics import get_map_metrics, get_multilabel_metrics
from models.base_block import FeatClassifier
# from models.model_factory import model_dict, classifier_dict

from tools.function import get_model_log_path, get_reload_weight
from tools.utils import set_seed, str2bool, time_str
from models.backbone import swin_transformer, resnet, bninception,repvgg

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='best_11_0.8044.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)
            print()

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,
    )
    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)

Ejecute el comando: python demo.py --cfg ./configs/pedes_baseline/pa100k.yaml --test_img ./test_imgs y obtenga resultados similares a los siguientes:
Insertar descripción de la imagen aquí

Mi resultado aquí es traducir el inglés de la lista al chino para su visualización y procesamiento. En este punto, la capacitación ha terminado. El próximo artículo escribirá sobre cómo modificar y agregar una nueva red para la capacitación.

Supongo que te gusta

Origin blog.csdn.net/qq_39056987/article/details/126385564
Recomendado
Clasificación