利用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 |         6query    |   750 |     3368 |         6gallery  |   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 folderoutput='output',  # output folderfourcc='mp4v',  # video codecimg_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文件中一定要注意一下,不然会报错!

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

  1. 行人重识别-姿态检测

    行人重识别-姿态检测 前言 从抽取图像特征进行分类, 行人重识别的方法可以分为基于全局特征 (Global feature) 和基于局部特征 (Local feature) 的方法. 全局特征比较简单 ...

  2. BMVC18|无监督深度关联学习大幅提高行人重识别性能(附Github地址)

    (欢迎关注"我爱计算机视觉"公众号,一个有价值有深度的公众号~) 本文选自BMVC2018的论文<Deep Association Learning for Unsuperv ...

  3. Person Re-Identification(ReID行人重识别)

    ReID? ReID是图像检索的子任务,它主要的目的是:利用计算机视觉技术对特定行人进行跨视域匹配和检索.所谓跨视域即是图片来自于不同的摄像头,这样可以用于智能视频监控(如无人超市).刑侦(追捕嫌疑人 ...

  4. 云从的多粒度网络(MGN)的结构设计与技术实现-ReID行人重识别

    云从的多粒度网络(MGN)的结构设计与技术实现-ReID 1.简介 全局特征和局部特征的结合是提高人的再识别(re-ID)任务识别性能的一种有效方法.以前的基于部分的方法主要集中在定位具有特定预定义语 ...

  5. 行人重识别实验笔记2-mmdetection代码配置(人体骨架结构分析)

    1. 错误处理 首先出现了什么错误,如图所示,我解决的办法是:将报错的所有AT_CHECK全部改为TORCH_CHECK. 解决方案:AT_CHECK错误 当你修改大概40多处的问题就可以安装上那个可 ...

  6. 行人重识别(ReID)概述

    什么是Re-ID? 行人重识别(Person Re-identification也称行人再识别,简称为ReID,是利用计算机视觉技术判断图像或者视频序列中是否存在特定行人的技术.广泛被认为是一个图像检 ...

  7. 行人重识别技术(Re-ID)概述、研究现状以及相关数据集下载

    ReID技术概述 什么是ReID 一般流程 Re-ID特点 研究现状 难点 数据集 reid常用数据集以及下载链接 评价指标 实现思路 研究方式 基于表征学习 基于度量学习 基于局部特征 全局特征 切 ...

  8. 行人重识别-REID

    行人重识别-REID 一.REID 二.为什么使用REID 三.REID应用场景 四.REID研究形式 五.REID存在的挑战 一.REID 行人重识别-REID(person re-identifi ...

  9. REID计算机网络,什么是行人重识别(ReID)?为什么要ReID?

    原标题:什么是行人重识别(ReID)?为什么要ReID? 什么是Re-ID? 行人重识别(Person Re-identification,也称行人再识别,简称为ReID),是利用计算机视觉技术判断图 ...

最新文章

  1. 怎么使图表居中显示_文字怎么排版又精美又好看?
  2. Windows 软件推荐2020
  3. NSIS 打包.net2.0
  4. SSH连接服务器报错(WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED)的解决方案
  5. java数组按照大小排列_Java怎么让数组中元素按照牌值从小到大的顺序排列
  6. 解神者php奥义高阶,《解神者》角色月曦九攻略技能解析和兽主推荐
  7. B-M求线性移位寄存器
  8. Git教程--基于廖雪峰的教程,最通俗易懂
  9. ps教程|photoshop入门教程|ps高阶段精通教程附百度云资源
  10. 支付宝登录java_支付宝开发平台之第三方授权登录与获取用户信息
  11. 微博吃瓜总是晚一步才知道,程序员直接写了一个热搜提醒工具
  12. 微信小程序项目实例——二维码生成器
  13. 公路多孔箱涵设计_箱涵结构设计.pdf
  14. 杨振宁100岁:一个公式统治世界
  15. HTML常用的转义字符汇总
  16. 支持OneNote for Window10代码高亮工具
  17. 江苏省计算机二级vb知识点,江苏省2019年9月计算机等级二级考试教程:VB上机考试新版题库+全真模拟试卷(共2本)...
  18. Java实现数据大小转换(B-KB-MB-GB)
  19. Arduino基础入门篇24—继电器控制
  20. 网易关于区块链的发展历程

热门文章

  1. Python利用Face++实现身份证件图片识别
  2. Spring事务管理 1
  3. 一步步带你了解分布式数据库的架构演变之路!
  4. FTP、FTPS和SFTP
  5. 构造方法的作用和特点
  6. Java的Unicode编码转化(多种情况处理方法)
  7. 做数据分析需要学什么?这几项技能你掌握了吗?
  8. 自动驾驶决策规划算法第一章笔记 忠厚老实的老王
  9. 数字图像处理-常考算法代码-详细注释
  10. F-散度(F-divergence)