本文主要是介绍ReID实战推荐——罗浩——常用的骨干网,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
课程中常用的代码句
1. pid, _ = map(int, pattern.search(img_path).groups())#当后面的语句返回多个东西时,我只想要一个值,就可以用‘_’来不取
2. from IPython import embed#加断点,查询网络的进展情况embed() #可同时加多个embed,用exit退出到下一个embed
3.in_size=x.size(0)#x会返回(b,c,w,h)这里返回第一个维度batch的大小
4.torch.cat(outputs,dim=1) #输出size[b,c,w,h],所以dim=1沿着第一个维度C拼接
5.input=torch.Tensor(input).view(1,1,5,5)#B*C*W*H压缩成4维f = x.view(x.size(0), -1)#将x变成2维,第一维大小为x.size(0)=batch,第二维(-1)自动压缩
6.x.shape#查看tensor的大小
7.conv_layer.weight.data = kernel.data #直接对某个层.weight.data赋值
8.self.base = nn.Sequential(*list(resnet50.children())[:-2])#不要restnet50的最后两行,自己添加下面两行
#用nn.Sequential来包裹model的两层参数,每次更新只更新这两层# optimizer = init_optim(args.optim, nn.Sequential([model.conv1,model.conv2])
9.调试代码时,可自己生成数据
只有torch.Tensor,torch.randn用来生成数据,torch.tensor(labels)是转化为tensor数据格式
imgs=torch.Tensor(32,3,256,128)#全0矩阵
x = torch.randn(32,2048)#均值为0的矩阵
labels=torch.Tensor(labels)#生成数据带点
labels=torch.tensor(labels)#生成数据不带点
10.assert len(x.size()) == 3#判断上面的输入是不是3维
11.调用要从最初的文件夹开始:from luohao_person_reid.AlignedReID_master.aligned.local_dist import *
12. # 保存网络训练最好的权重best_model_wts = copy.deepcopy(model.state_dict())best_acc = 0.0# 保存测试阶段,准确率最高的模型if phase == 'val' and epoch_acc > best_acc:best_acc = epoch_accbest_model_wts = copy.deepcopy(model.state_dict())model.load_state_dict(best_model_wts)# 最后网络导入最好的网络权重13.[model.state_dict()和model.parameters()两个方法的差异比较](https://blog.csdn.net/qq_33590958/article/details/103544175?biz_id=102&utm_term=model.state_dict%28%29%E5%92%8Ccnn.paramet&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-103544175&spm=1018.2118.3001.4187)14. a=torch.Size([32, 3, 128, 128]),a[0]=torch.Size([3, 128, 128])取出第一张图片的信息15. 两种save图片方式对比:数据类型不同,通道不同法1:image_PIL = transforms.ToPILImage()(image_tensor[0])#取出第一张图片image_tensor[0].shape=torch.Size([3, 128, 128]) image_PIL.save(os.path.join(config.result_path, 'img%d.png' % (i + 1)))type(image_PIL)=PIL.Image.Image <PIL.Image.Image image mode=RGB size=128x128 at 0x205F779ACF8>法2:cv2.imwrite(os.path.join(config.result_path, 'cam%d.png' % (i + 1)), result)#(128, 128, 3),result=numpy.ndarray
a=tensor a.numpy()变成numpy
罗浩github---------ReID课程教学
目录
- 1. Reid简介
- 难样本提取
- rank+map计算
- center loss
- 2. 表征学习
- 3. 度量学习
- 4. 全局特征+局部特征
- 1. 水平切块算法
- Aligned ReID
- PCB
- ICNN
- SCP NET
- 2. 姿态信息
- PIE
- SPINDLE NET
- PDC
- GLAD
- PABP
- 3. 分割信息
- 4. 网格特征
- 5. 序列重识别
- 6. 基于GAN
- GAN+LSRO
- Cycle Gan
- PTGAN
- PNGAN(生成8姿态)
- 7. Ptorch应用
- 8. 工程trick
1. Reid简介
数据集
一次投放5个样本,一个样本只检测出一次。
rank1+rank2+rank3+…=CMC
难样本提取
rank+map计算
center loss
2. 表征学习
3. 度量学习
度量学习不需要表征学习的FC(用来分类),直接对比特征图就行
python实现距离矩阵,用于难样本的选择
import torch
inputs=torch.tensor([[1.,1.,2.],#这里注意tensor数据类型数字要加点,否则后面运算会出现错误RuntimeError: log_vml_cpu not implemented for 'Long'[1,0,1],[1,2,1],[1,3,2]])
dist = torch.pow(inputs, 2).sum(dim=1, keepdim=True).expand(4, 4)
dist = dist + dist.t()
dist.addmm_(1, -2, inputs, inputs.t())dist=dist.clamp(min=1e-12).sqrt()#裁剪防止有0存在,梯度会存在问题
print(dist)
4. 全局特征+局部特征
- 全局
- 局部
1. 水平切块算法
Aligned ReID
这种情况更适合真实的环境(不对齐现象),而用的数据集是经过手动处理过的。
实现
我认为DMLI只用用于解释才产生的这个名词,代码直接将32x128x8变成32x8x128用于local distance训练,并未体现DMLI
PCB
Aligned和PCB都是经过水平池化生成g
不同之处Aligned用vector_h 生成距离矩阵,用于hard triple loss
PCB将vector_h 的多个分支送到FC,用于ID交叉熵loss
PCB_github
ICNN
SCP NET
2. 姿态信息
PIE
SPINDLE NET
PDC
GLAD
PABP
前面几种是part级别,PABP是像素级别
3. 分割信息
SPReID
4. 网格特征
5. 序列重识别
提取序列特征的方法
1.
2.
6. 基于GAN
不同GAN解决不同问题
应用于ReID
GAN+LSRO
Cycle Gan
PTGAN
PNGAN(生成8姿态)
7. Ptorch应用
tensorflow静态图,只能看到是结点,但是不知道结点里是啥
8. 工程trick
这篇关于ReID实战推荐——罗浩——常用的骨干网的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!