首页IT科技行人重识别模型用什么算法训练(ReID行人重识别(训练+检测,附代码),可做图像检索,陌生人检索等项目)

行人重识别模型用什么算法训练(ReID行人重识别(训练+检测,附代码),可做图像检索,陌生人检索等项目)

时间2025-05-05 15:59:53分类IT科技浏览3108
导读:利用ReID和目标检测对视频进行检测,可以对视频中的人进行重识别,支持更换数据集可以做车辆重识别等。可应用于图像、视频检索,行人跟踪...

利用ReID和目标检测对视频进行检测            ,可以对视频中的人进行重识别                ,支持更换数据集可以做车辆重识别等            。可应用于图像            、视频检索     ,行人跟踪

在以前学习ReID的时候            ,是跟着下面视频学习的                 ,该论文和代码也可以参考GitHub - michuanhaohao/ReID_tutorial_slides: 《深度学习与行人重识别》课程课件《深度学习和行人重识别》浙江大学罗浩博士_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Pg4y1q7sN?from=search&seid=12319613973768358764&spm_id_from=333.337.0.0

理论部分这里不在叙述     ,视频中讲解的很清楚      ,可以跟着视频学习                 ,这里只讲代码的使用                。

上述代码可以进行正常的训练           ,但没有视频或者图像检测代码      ,然后在查找相关资料的时候                 ,发现这篇文章中是用yolov3和ReID进行了结合           ,但这篇文章中没有训练代码https://zhuanlan.zhihu.com/p/82398949

为此,对上述两个项目的代码进行了整合                 ,感谢上述两位博主的贡献     。对代码稍加了一点修改                ,同时我也训练了se_renext50网络,可以正常检测            。可对视频或者图像进行检索            ,效果如下【可以看出即便遮挡以后                ,也可以继续检索】:

目录

训练 

检测

训练 

步骤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文件下)

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

--------------------------------------------------------------------------------------------------------------------------------

【原代码修改说明】

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()}

代码和权重百度云:https://pan.baidu.com/s/1p5C5mCVxGK61_eYc7HHpHA 

提取码:yypn 

或者访问github:https://github.com/YINYIPENG-EN/ReID.githttps://github.com/YINYIPENG-EN/ReID.git

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

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
starter package(starter包~mica-auto自动生成spring.factories等元文件)