ReID行人重识别(训练+检测,附代码),可做图像检索,陌生人检索等项目

本文涉及的产品
图像搜索,7款服务类型 1个月
简介: 笔记

训练

步骤1:


config文件夹:


       defaults.py中(一些默认配置)


GPU设置:


       _C.MODEL.DEVICE = "cuda" 是否使用GPU


       _C.MODEL.DEVICE_ID = '0' GPU ID


网络设置:


        _C.MODEL.NAME = 'resnet50_ibn_a'


       _C.MODEL.PRETRAIN_PATH =r'./pretrained.pth' # 预权重路径(选择的权重要和上面你的模型对应上)


超参设置:


        _C.SOLVER.OPTIMIZER_NAME = "Adam"  # 选择优化器

       _C.SOLVER.MAX_EPOCHS = 120 # 训练最大epoch数

       _C.SOLVER.BASE_LR = 3e-4  # 初始学习率


步骤2:


configs文件夹:


       softmax_triplet_with_center.yml中


       softmax_triplet.yml中#(本代码训练用的这个损失函数)


MODEL:


       PRETRAIN_PATH: # 预训练权重(这个权重我是放在ReID/weights/r50_ibn_2.pth,这个可以根据自己实际情况更改)


SOLVER:


       OPTIMIZER_NAME: 'Adam' # 优化器


       MAX_EPOCHS: 120 # 最大epoch


       BASE_LR: 0.00035 # 初始学习率


主要设置权重保存周期和记录log和eval周期【我设置的是1,这样每轮都会保存一次日志、权重,每轮都计算一次mAP和rank】


       CHECKPOINT_PERIOD: 1


       LOG_PERIOD: 1


       EVAL_PERIOD: 1


OUTPUT_DIR:r'./logs'  # 输出路径


步骤3:


data文件夹用来存放Market1501数据集


步骤4:


输入命令开始训练:

tools/train.py --config_file='configs/softmax_triplet.yml' MODEL.DEVICE_ID "('0')" DATASETS.NAMES "('market1501')" DATASETS.ROOT_DIR "(r'./data')" OUTPUT_DIR "('E:/ReID/logs')"
=> Market1501 loaded
Dataset statistics:
  ----------------------------------------
  subset   | # ids | # images | # cameras
  ----------------------------------------
  train    |   751 |    12936 |         6
  query    |   750 |     3368 |         6
  gallery  |   751 |    15913 |         6
  ----------------------------------------
Loading pretrained ImageNet model......
2022-02-18 16:17:54,983 reid_baseline.train INFO: Epoch[1] Iteration[1/1484] Loss: 7.667, Acc: 0.000, Base Lr: 3.82e-05
2022-02-18 16:17:55,225 reid_baseline.train INFO: Epoch[1] Iteration[2/1484] Loss: 7.671, Acc: 0.000, Base Lr: 3.82e-05
2022-02-18 16:17:55,436 reid_baseline.train INFO: Epoch[1] Iteration[3/1484] Loss: 7.669, Acc: 0.003, Base Lr: 3.82e-05
2022-02-18 16:17:55,646 reid_baseline.train INFO: Epoch[1] Iteration[4/1484] Loss: 7.663, Acc: 0.002, Base Lr: 3.82e-05
2022-02-18 16:17:55,856 reid_baseline.train INFO: Epoch[1] Iteration[5/1484] Loss: 7.663, Acc: 0.002, Base Lr: 3.82e-05
2022-02-18 16:17:56,069 reid_baseline.train INFO: Epoch[1] Iteration[6/1484] Loss: 7.658, Acc: 0.002, Base Lr: 3.82e-05
2022-02-18 16:17:56,277 reid_baseline.train INFO: Epoch[1] Iteration[7/1484] Loss: 7.654, Acc: 0.002, Base Lr: 3.82e-05
2022-02-18 16:17:56,490 reid_baseline.train INFO: Epoch[1] Iteration[8/1484] Loss: 7.660, Acc: 0.002, Base Lr: 3.82e-05
2022-02-18 16:17:56,699 reid_baseline.train INFO: Epoch[1] Iteration[9/1484] Loss: 7.653, Acc: 0.002, Base Lr: 3.82e-05
2022-02-18 16:17:56,906 reid_baseline.train INFO: Epoch[1] Iteration[10/1484] Loss: 7.651, Acc: 0.002, Base Lr: 3.82e-05
2022-02-18 16:17:57,110 reid_baseline.train INFO: Epoch[1] Iteration[11/1484] Loss: 7.645, Acc: 0.002, Base Lr: 3.82e-05
2022-02-18 16:17:57,316 reid_baseline.train INFO: Epoch[1] Iteration[12/1484] Loss: 7.643, Acc: 0.002, Base Lr: 3.82e-05
2022-02-18 16:17:57,526 reid_baseline.train INFO: Epoch[1] Iteration[13/1484] Loss: 7.644, Acc: 0.002, Base Lr: 3.82e-05
2022-02-18 16:17:57,733 reid_baseline.train INFO: Epoch[1] Iteration[14/1484] Loss: 7.638, Acc: 0.002, Base Lr: 3.82e-05
2022-02-18 16:17:57,942 reid_baseline.train INFO: Epoch[1] Iteration[15/1484] Loss: 7.634, Acc: 0.002, Base Lr: 3.82e-05
2022-02-18 16:17:58,148 reid_baseline.train INFO: Epoch[1] Iteration[16/1484] Loss: 7.630, Acc: 0.002, Base Lr: 3.82e-05
2022-02-18 16:17:58,355 reid_baseline.train INFO: Epoch[1] Iteration[17/1484] Loss: 7.634, Acc: 0.002, Base Lr: 3.82e-05
2022-02-18 16:17:58,564 reid_baseline.train INFO: Epoch[1] Iteration[18/1484] Loss: 7.627, Acc: 0.002, Base Lr: 3.82e-05
2022-02-18 16:17:58,770 reid_baseline.train INFO: Epoch[1] Iteration[19/1484] Loss: 7.629, Acc: 0.002, Base Lr: 3.82e-05
2022-02-18 16:17:58,980 reid_baseline.train INFO: Epoch[1] Iteration[20/1484] Loss: 7.624, Acc: 0.002, Base Lr: 3.82e-05
2022-02-18 16:17:59,186 reid_baseline.train INFO: Epoch[1] Iteration[21/1484] Loss: 7.619, Acc: 0.002, Base Lr: 3.82e-05
2022-02-18 16:17:59,397 reid_baseline.train INFO: Epoch[1] Iteration[22/1484] Loss: 7.614, Acc: 0.002, Base Lr: 3.82e-05
2022-02-18 16:17:59,605 reid_baseline.train INFO: Epoch[1] Iteration[23/1484] Loss: 7.608, Acc: 0.002, Base Lr: 3.82e-05
··············································

训练好以后会在logs文件中保存训练好的权重


注:


我使用的是softmax_triplet.yml,如果你用这个,只需要将该文件中的  PRETRAIN_PATH 预权重更改成你路径即可,由于我选择的是resnet50_ibn_a模型(模型的选择在ReID/config/defaults.py/中的_C.MODEL.NAME修改),因此PRETRAIN_PATH填写的是r50_ibn_2.pth权重,如果你选择的是resnet50网络,那么你的预权重也应该选择对应的权重【附上一些权重的官方链接】。代码里其实有自动下载权重地方,但有些人从pytorch官网下会导致网不好,如果通过自带url你能下载下来,权重会默认存在C盘下。所以我把代码改了一下,自己下载下来以后放自己项目中,加载的时候直接在配置文件中修改路径就行了。

'resnet50': 'https://download.pytorch.org/models/resnet50-19c8e357.pth',
'resnet101': 'https://download.pytorch.org/models/resnet101-5d3b4d8f.pth',
'resnet152': 'https://download.pytorch.org/models/resnet152-b121ed2d.pth',

检测


进入person_search文件夹


检测图片:


将待检测图像放入query文件夹,在data/sampes/下放入需要检测图像或者视频【注意这里的待检测和query图像是不一样的,就好比你要从一堆图片或者视频中找一个人,你现在有了这个人的照片,就放入query中,那么程序就可以从sampers文件下的一堆图或者视频中检索到这个人】,


设置search.py。images是需要检测的图或者视频,dist_thres是ReID度量匹配中计算两个样本之间的距离,小于这个距离就说明相似度很高,这个需要根据不同的视频手动调试一下。

def detect(cfg,
           data,
           weights,
           images='data/samples',  # input folder
           output='output',  # output folder
           fourcc='mp4v',  # video codec
           img_size=416,
           conf_thres=0.5,
           nms_thres=0.5,
           dist_thres=1.0,  # 距离阈值
           save_txt=False,
           save_images=True):

运行search.py


最终检索的结果会输出到output中【注意:如果在query中放入图片,命名格式需要和market1501一样】


检测视频:


query_get.py 中先设置好视频路径


运行后,按空格键(按帧)继续播放视频,按鼠标左键截图(图像会自动保存并自动命名到query文件下)

10.png

同样,将待检测视频放入data/samples中,设置好参数后运行search.py,会将检测后的结果输出到person_search/output文件中。

11.png

【原代码修改说明】


engine文件夹: trainer.py主要是定义一些训练函数 在原代码的基础上增加了保存网络权重,原代码的权重是将优化器等参数设置都保存成权重,加载到原网络中是不需要这些的,会报keys错误,所以我直接保存网络权重,方便加载


modeling文件夹 baseline.py 如果对主干网络进行修改【方便以后魔改网络】,再加载权重的时候会报keys错误,所以增加了如下代码可以解决该问题

pretrained_dict = {k: v for k, v in pretrained_dict.items() if k in model_dict.keys() == pretrained_dict.keys()}

这里还要再强调一下!!!训练中的ReID/config/defaults.py和person_search/reid/config/defaults.py配置文件有些不一样,在运行search.py文件中一定要注意一下,不然会报错!



目录
相关文章
|
8月前
|
数据采集 机器学习/深度学习 算法框架/工具
探究肺癌患者的CT图像的图像特征并构建一个诊断模型
探究肺癌患者的CT图像的图像特征并构建一个诊断模型
|
机器学习/深度学习 人工智能 算法
AI Earth有没有相关文档或论文介绍平台地物分类、目标提取、变化检测等算法的原理呢?
AI Earth有没有相关文档或论文介绍平台地物分类、目标提取、变化检测等算法的原理呢?
361 1
|
机器学习/深度学习 编解码 自动驾驶
联合训练2D-3D多任务学习 | 深度估计、检测、分割、3D检测通吃
联合训练2D-3D多任务学习 | 深度估计、检测、分割、3D检测通吃
375 0
|
机器学习/深度学习 自然语言处理 算法
CVPR 2022 | 大幅减少零样本学习所需的人工标注,马普所和北邮提出富含视觉信息的类别语义嵌入
CVPR 2022 | 大幅减少零样本学习所需的人工标注,马普所和北邮提出富含视觉信息的类别语义嵌入
147 0
|
机器学习/深度学习 存储 自然语言处理
大规模蛋白质翻译后修饰提取模型BioBERT,具有远程监督和置信度校准
大规模蛋白质翻译后修饰提取模型BioBERT,具有远程监督和置信度校准
305 0
|
机器学习/深度学习 计算机视觉 Python
实时交通标志检测和分类(附代码)
实时交通标志检测和分类(附代码)
|
PyTorch 算法框架/工具 计算机视觉
|
机器学习/深度学习 编解码 人工智能
2022最新综述!一文详解多目标跟踪方法最新进展(单帧/多帧/特征/相关性)
多目标跟踪(MOT)旨在跨视频帧关联目标对象,以获得整个运动轨迹。随着深度神经网络的发展和对智能视频分析需求的增加,MOT在计算机视觉领域的兴趣显著增加。嵌入方法在MOT中的目标位置估计和时间身份关联中起着至关重要的作用,与其他计算机视觉任务(如图像分类、目标检测、重识别和分割)不同,MOT中的嵌入方法有很大的差异,并且从未被系统地分析和总结。本综述首先从七个不同的角度对MOT中的嵌入方法进行了全面概述和深入分析,包括补丁级嵌入、单帧嵌入、跨帧联合嵌入、相关嵌入、顺序嵌入、小轨迹嵌入和跨轨迹关系嵌入。论文进一步总结了现有广泛使用的MOT数据集,并根据其嵌入情况分析了现有最先进方法的优势策略。
2022最新综述!一文详解多目标跟踪方法最新进展(单帧/多帧/特征/相关性)
|
开发工具 计算机视觉 git
yolov5_reid【附代码,行人重识别,可做跨视频人员检测】
该项目利用yolov5+reid实现的行人重识别功能,可做跨视频人员检测。 应用场景: 可根据行人的穿着、体貌等特征在视频中进行检索,可以把这个人在各个不同摄像头出现时检测出来。可应用于犯罪嫌疑人检索、寻找走失儿童等。
697 0
|
机器学习/深度学习 算法 计算机视觉
【阿旭机器学习实战】【23】特征降维实战---人脸识别降维建模,并选出最有模型进行未知图片预测
【阿旭机器学习实战】【23】特征降维实战---人脸识别降维建模,并选出最有模型进行未知图片预测