FastReID使用教程、踩坑记录

近期在尝试使用FastReID,期间对FastReID架构、损失函数、数据集准备、模型训练/评估/可视化/特征向量输出、调试debug记录等进行记录。

FastReID架构理解

关于FastReID的介绍,可点击此链接前往查询。

ReID和FastReID架构

对于模型架构、损失函数、实验Tricks可点击访问下述两个链接:

行人重识别02-03:fast-reid(BoT)-白话给你讲论文-翻译无死角_reid bot算法-CSDN博客
详解ReID的各部分组成及Trick——基于FastReID_fastreid trick-CSDN博客

ReID网络训练和测试的输出不同

注:ReID网络训练和测试的输出不同:训练的输出执行到最后一步,进行Triplet loss+Center loss+ID lossID损失函数的计算并反向梯度传播,从而迭代更新网络参数;测试inference阶段只执行到特征向量的输出(可见上图inference stage),这也对应后文的demo.py脚本所执行的操作。

一般神经网络训练和测试的输出是同一个东西,但是基于表征学习的ReID方法比较特殊:ReID训练时候的输出是每张图片对应不同ID的预测概率(也就是输出此图片识别的ID/类别),测试模式输出的是每张图片ReID的特征向量(比如对于多个摄像头,用不同摄像头检测到的多个物体进行ReID后的特征向量进行后续运算,特征向量相似的给定同一个ID,ReID测试网络不直接输出识别的ID/分类)

损失函数

笔者没有扒源代码,但从上图FastReID架构可以看出,其损失函数有三部分组成:Triplet loss + Center loss + ID loss。其中Triplet loss和Center loss属于基于度量学习的ReID方法范畴,因为其度量的是特征向量的距离/相似度;ID loss属于基于表征学习的ReID方法范畴,类似softmax层后的分类损失。

Triplet loss和Cicle loss

数据集准备

复制数据集到fast-reid\datasets下

用户自定义数据集训练参考:

How to train Custom Dataset · Issue #220 · JDAI-CV/fast-reid (github.com)

模型训练

直接训练

键入:

python tools\train_net.py --config-file .\configs\VeRi\sbs_R50-ibn.yml

使用预训练模型权重训练

键入:

python tools\train_net.py --config-file .\configs\VeRi\sbs_R50-ibn.yml MODEL.WEIGHTS model_weights/veri_sbs_R50-ibn.pth

下载地址:

在fast-reid/MODEL_ZOO.md文件下提供了不同数据集下不同方法得到的sota模型。

不同数据集训练权重下载

增加预训练模型权重地址

.yml文件增加中文注释

修改:注释不能写中文,否则会报错

.yml文件增加中文注释报错

.yml文件去除中文注释

模型评估eval-only

键入:

python tools/train_net.py --config-file .\logs\veri\sbs_R50-ibn\config.yaml --eval-only MODEL.WEIGHTS model_weights/veri_sbs_R50-ibn.pth  MODEL.DEVICE "cuda:0"

模型评估

细节理解:

行人重识别02-09:fast-reid(BoT)-pytorch编程规范(fast-reid为例)6-模型测试评估-1_rexnet fast-reid-CSDN博客

fastreid\engine\defaults.py,找到类class DefaultTrainer(SimpleTrainer) 中的函数 def test(self),该函数就是对数据进行评估的总体逻辑。

对datasets.test进行评估。

结果可视化

visualize_result.py 可视化结果

参考理解:

行人重识别02-11:fast-reid(BoT)-实用技巧分享(1)-visualize_result,demo_visualize_result.py 特征距离约大-CSDN博客

键入:

python demo/visualize_result.py --config-file .\logs\veri\sbs_R50-ibn\config.yaml --parallel --vis-label  --output logs/mgn_duke_vis --dataset-name VeRi --opts MODEL.WEIGHTS .\model_weights\veri_sbs_R50-ibn.pth

行人识别fastreid项目官方数据训练测试 - 知乎 (zhihu.com)

文件生成在logs/mgn_duke_vis

结果可视化,别人训练好的结果,可对照理解图片上方的参数

结果可视化,自己尝试的结果(没训练,加载的权重也不对,所以这个图并不对)

为何识别效果如此之差呢,查看下图报错信息,因为下载的预训练权重不包含head.weights,因此要用上还是需要重新train一下,但是我理解的是这并不会影响demo.py输出的特征向量,因为那个不需要用到head.weights。

visualize_result.py加载预训练权重情况

demo.py 输出query图片的特征向量

针对某一张图片

键入:

python demo/demo.py --config-file .\logs\veri\sbs_R50-ibn\config.yaml  --parallel  --input .\datasets\VeRi\image_query\xx.jpg --output ./logs/demo_output --opts MODEL.WEIGHTS .\model_weights\veri_sbs_R50-ibn.pth

在./logs/demo_output/文件夹下,可以看到如下特征向量文件(.npy格式)

注:以下示例只对.\datasets\VeRi\image_query文件夹下的两张图片进行操作出,所以示例只有2个.npy文件。执行--input .\datasets\VeRi\image_query\*.jp,文件夹中有几张图片,输出几个特征向量(每个的尺寸为:1x2048)。

特征向量输出

针对指定文件夹下的所有jpg图片

键入:

python demo/demo.py --config-file .\logs\veri\sbs_R50-ibn\config.yaml  --parallel  --input .\datasets\VeRi\image_query --output ./logs/demo_output --opts MODEL.WEIGHTS .\model_weights\veri_sbs_R50-ibn.pth

输出结果为:

特征向量输出

调试debug

CUDA out of memory

要修改Batch size或者输入图片尺寸,具体修改config文件夹下:

sbs_R50-ibn.yml文件中的IMS_PER_BATCH、SIZE_TRAIN

Base-SBS.yml中的NUM_INSTANCE

ZeroDivisionError: integer division or modulo by zero

这里要保证num_pids_per_batch不为0,也就是说sbs_R50-ibn.yml文件中的IMS_PER_BATCH要大于Base-SBS.yml中的NUM_INSTANCE

报错提示

理解:

给定batch size,随机采集P个ID,然后每个ID选择K(num_instances)个实例图像。

num_pids_per_batch = batch_size // self.num_instances指每个batch需要采集多少个(P个)身份ID,因此num_pids_per_batch必须大于1.

ReID中的Batch Size设置与其他的深度学习任务有一些区别,它涉及到两个参数P(一个batch中涉及到的不同类别的样本数量)和K(一个batch中涉及到的同一个类别的样本的样本数量)。在BoT的工作中,对Batch Size的大小和P、K的设置做了探究,实验如下表,不同的数值对最终的实验结果还是有很大的影响的。

Batch size中P、K探究实验

理论理解可点击链接,前往b站查看。

Triplet loss理解

AssertionError: No inf checks were recorded for this optimizer.

报错提示

问题解决可参考:

No inf checks were recorded for this optimizer. · Issue #700 · JDAI-CV/fast-reid (github.com)

解决办法1:

在defaults.py文件中增加 contiguous=False

解决办法2:

安装低版本的Pytorch,未实践。

tools/train_net.py --eval-only报错no module

解决方法1:编译make

使用eval前要先编译make(核心是文件夹下的makefile文件),而make需要gcc

可查询本人之前文章链接,查询Windows具体编译makefile文件流程。

GettingStarted文档编译要求

在windows下,用MinGW代替gcc,可参考:

Windows安装g++和gcc,含环境变量配置(图文教程)_windows系统 gcc g++-CSDN博客

修改makefile文件,否则一直报错:

  1. 将python3改为python
  2. 去掉rm这句话,因为不是linux系统,没这个命令,可改为del

原makefile文档

修改后的makefile文档

虽然编译成功,但后续运行还是会报错,ValueError: Buffer dtype mismatch, expected 'long' but got 'long long' · Issue #74 · JDAI-CV/fast-reid (github.com),可能需要在linux下编译才行(我的wsl没装Cython.Build,故放弃了此方法,后续可以在wsl下安装pip、Cython,然后执行python setup.py build_ext --inplace)。

成功编译后仍报错

解决方法2:不使用cython

No module named ‘fastreid.evaluation.rank_cylib.rank_cy‘_no module named 'fastreid-CSDN博客

如果成功make,不需要注释此处

将use_cython改为False,虽然速度变慢,但解决了很多麻烦

demo.py--input .\*.jpg 报错

当键入下式,会报错:

python demo/demo.py --parallel  --input .\datasets\VeRi\image_query\*.jpg

报错提示

究其原因,是因为在demo.py原代码中,args.input为\image_query\*.jpg,无法使用for path in args.input,无法遍历此文件夹下的所有jpg图片。

原文件demo.py

因此,更改代码的if else逻辑,实现需求。

修改后的文件

注:目前代码仅可以遍历所有jpg文件,对于png文件的话需要改动上图line 95。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/323593.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进程间通信 管道

前言 ubuntu系统的默认用户名不为root的解决方案(但是不建议):轻量应用服务器 常见问题-文档中心-腾讯云 (tencent.com) 进程间通信的基本概念 进程间通信目的:进程间也是需要协同的,比如数据传输、资源共享、通知事件…

PG的事务ID回卷逻辑

PG到目前为止使用的事务ID仍然是32位的,在内存计算时虽然已经使用64位事务ID,但是存储在页中tuple仍然使用32位事务ID,这就是说,事务ID回卷仍然是必须处理的问题。 所谓PG事务ID回卷,简单地说,就是在数据库…

基于FPGA实现的HDMI TO MIPI扩展显示器方案

FPGA方案,HDMI IN接收原始HDMI 信号,输出显示到LCD 屏上 客户应用:扩展显示器 主要特性: 1.支持2K以下任意分辨率显示 2.支持OSD 叠加多个图层 3.支持MIPI/EDP/LVDS/RGB屏 4.支持放大缩小匹配屏分辨率 5.零延时,输…

【vue-echarts】 报错问题解决 “Error: Component series.pie not exists. Load it first.“

目录 问题描述解决【解决1】【解决2】 问题描述 使用 vue-echarts 时导入的文件 import VChart from vue-echarts/components/ECharts import echarts/lib/chart/line import echarts/lib/chart/bar import echarts/lib/chart/pie import echarts/lib/component/legend impor…

文心一言 VS 讯飞星火 VS chatgpt (255)-- 算法导论18.3 1题

一、请说明依次从图18-8(f)中删除C、P和V后的结果。如果要写代码,请用go语言。 文心一言: 首先,让我们明确一点:由于您没有提供具体的图18-8(f)的内容,我只能假设它是一个数据结构(可能是图、树或列表等&…

Wireshark下载安装和使用教程

Wireshark下载安装和使用教程 Wireshark(前身 Ethereal)是一个网络包分析工具。该工具主要是用来捕获网络数据包,并自动解析数据包,为用户显示数据包的详细信息,供用户对数据包进行分析。 它可以运行在 Windows 和 L…

JavaScript初了解

JS的三种书写位置:行内,内嵌,外部 JS的注释的书写:单行注释:// ctrl/ 多行注释:/**/ ShiftAltA JavaScript输入输出语句

【Java orm 框架比较】九 新增wood框架对比

【Java orm 框架比较】九 新增wood框架对比 本次新增wood 框架测试 测试数据存储、分页查询,文档及框架比较稳定半天时间加入测试使用 迁移到(https://gitee.com/wujiawei1207537021/spring-orm-integration-compare) orm框架使用性能比较…

Linux环境下部署vsftp+mysql用户认证

安装mysql(不要使用红帽的RPM版的mysql) 使用编译或静态库安装mysql 1、编译安装pam_mysql 下载软件: http://downloads.sourceforge.net/project/pam-mysql/pam-mysql/0.7RC1/pam_mysql-0.7RC1.tar.gz?rhttp%3A%2F%2Fsourceforge.net%2Fprojects%2Fpam-mysql%2F…

Verilog复习(三)| Verilog语言基础

四种基本的逻辑值 0&#xff1a;逻辑0或“假”1&#xff1a;逻辑1或“真”x&#xff1a;未知z&#xff1a;高阻 三类常量 整型数&#xff1a;简单的十进制格式&#xff0c;基数格式&#xff08;5’O37&#xff0c;4’B1x_01&#xff09; 格式&#xff1a; <size><’b…

Spring Gateway的核心功能:路由、过滤、限流一网打尽

Spring Gateway的简介 在微服务架构的世界里&#xff0c;如同繁星点点的服务需要一个指挥家&#xff0c;将它们有序地组织起来&#xff0c;让它们能够和谐地协同工作。这个指挥家&#xff0c;就是Spring Gateway。它是一个基于Spring Framework 5、Project Reactor和Spring Bo…

AI 资料汇总专栏

包含AI资料、大模型资料、AI最新行业发展 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一门研究如何使计算机能够具备智能行为的科学与技术。它致力于开发出能够像人类一样思考、学习、理解和决策的计算机系统。自20世纪50年代以来&#xff…

Spring与AI结合-spring boot3整合AI组件

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 目录 写在前面 spring ai简介 单独整合al接口 整合Spring AI组件 起步条件 ​编辑 进行必要配置 写在最后 写在前面 本文介绍了springboot开发后端服务中&#xff0c;AI组件(Spring A…

学生管理系统初级

根据题目要求生成大纲 总结: 1.在书写时&#xff0c;考虑到了书写时id可是是abc... 类型是String&#xff0c;但在根据id获取集合中元素时 list.get() &#xff0c;get&#xff08;&#xff09;里面是int类型。 2.在书写还有一点功能并不完全&#xff0c; 2.1查找时是打印所有…

软件系统安全设计规范(word原件)

1.1安全建设原则 1.2 安全管理体系 1.3 安全管理规范 1.4 数据安全保障措施 1.4.1 数据库安全保障 1.4.2 操作系统安全保障 1.4.3 病毒防治 1.5安全保障措施 1.5.1实名认证保障 1.5.2 接口安全保障 1.5.3 加密传输保障 1.5.4终端安全保障 软件资料清单列表部分文档…

SpringCloud 集成consul,消费者报I/O error on GET request for...

创建消费者微服务&#xff0c;去调用生产者微服务的请求过程中&#xff0c;出现以下错误&#xff1a; 报错原因 因为在使用SpringCloudAlibaba中的Nacos框架时&#xff0c;自动整合了SpringCloud中的Ribbon框架中的负载均衡&#xff0c;因为微服务提供者有两个&#xff0c;在消…

使用apache和htaccess对目录访问设置密码保护配置教程

对目录设置密码保护配置说明 我们有时候访问某些网站的时候&#xff0c;要求输入用户名和密码才能访问。这是为了保护隐私&#xff0c;只让经过许可的人访问。 在本教程中主要介绍两种方法&#xff0c;一种是通过apache httpd.conf配置文件对管理后台目录设置密码保护&#xff…

BS架构 数据权限--字段级权限 设计与实现

一、需求场景 1. 销售发货场景 销售出库单上 有 商品名称、发货数量、单价、总金额 等信息。 销售人员 关注 上述所有信息&#xff0c;但 仓管人员 不需要知道 单价、总金额 信息。 2. 配方、工艺保密 场景 配方研发人员 掌握核心配方&#xff0c; 但 交给车间打样、生产时…

变色龙Ultra:IC、ID卡读+写+模拟的开源项目

虽然已经很多年没用过刷卡的东西了&#xff0c;确实没有破解或者模拟卡片的需求&#xff0c;但是看到这个开源项目的时候&#xff0c;还是觉得有点意思&#xff0c;值得一看。 这是ultra版本的原理框图&#xff0c;可知ultra体现在加了一个射频卡芯片&#xff0c;南京中科微的C…

亚信安慧AntDB新篇章:数据库技术飞跃

随着大数据时代的到来&#xff0c;对数据库的需求愈发强烈。在这一背景下&#xff0c;国产数据库逐渐崭露头角&#xff0c;亚信安慧AntDB作为重要的代表产品之一正积极参与到激烈的市场竞争中。亚信安慧AntDB不仅追求技术的革新和突破&#xff0c;同时也致力于满足用户日益增长…