行人重识别优化:Pose-Guided Feature Alignment for Occluded Person Re-Identification

文章记录了ICCV2019的一篇优化遮挡行人重识别论文的知识点:Pose-Guided Feature Alignment for Occluded Person Re-Identification
论文地址:
https://yu-wu.net/pdf/ICCV2019_Occluded-reID.pdf
在这里插入图片描述

Partial Feature Branch分支:

PCB结构,将特征图F按照垂直方向水平划分为6个part,每个part引入一个分类损失。

从全局特征中提取局部(未遮挡)人体的特征。将input(输入图像的shape为3x384x128)经过Resnet50 之后的feature map直接做horizontal partition,再average pooling以及1*1 conv之后,将每一个part都预测一个id(id表示每个局部部分的身份标识。它用于将每个局部特征映射到相应的身份。

细节点:

1.代码中用的Resnet50模型去掉了中global average pooling及以后的部分。

2.将最后一层feature map 分成 p个horizontal stripes。分别对p个horizontal stripes做global average pooling就得到了p个局部特征。(horizontal stripes 的个数 p 取6。)

3.因为 Resnet50 最后一层feature map的通道数为2048,作者又用1x1 conv将其降到256维.

在这里插入图片描述

​ 图1

图1中是全局特征提取,代码如下所示:

def extract_global_feature(model,input_):output=model(input_)return output

在这里插入图片描述

​ 图2:partial特征

代码:

def extract_partial_feature(model,global_feature,part_num):partial_feature=nn.AdaptiveAvgPool2d((part_num,1))(global_feature)partial_feature=torch.squeeze(partial_feature,-1)partial_feature=partial_feature.permute(0,2,1)return partial_feature

partial_feature: torch.Size([32, 3, 2048]),表示一个批次中有32个样本,在每个样本中有3个局部部分(这里做说明,这个3就是part_num变量的值,源代码的权重中应该是设置为3了)的特征。每个局部部分的特征是一个长度为2048的向量。

在这里插入图片描述

​ 图3

这里用nn.Linear(线性层)将输入特征从 num_bottleneck (256维)维度映射到 class_num (应该是表示数据集中行人ID个数,源代码训练数据集中有702个ID)维度,线性层的输出可以被看作是一个概率分布,用于表示输入特征属于每个类别的可能性(这个输出并不是直接的概率分布,而是未经过归一化的原始分数)

具体代码:

# Defines the new fc layer and classification layer
# |--Linear--|--bn--|--relu--|--Linear--|
class ClassBlock(nn.Module):def __init__(self, input_dim, class_num, relu=True, num_bottleneck=512):super(ClassBlock, self).__init__()add_block = []add_block += [nn.Conv2d(input_dim, num_bottleneck, kernel_size=1, bias=False)]add_block += [nn.BatchNorm2d(num_bottleneck)]if relu:#add_block += [nn.LeakyReLU(0.1)]add_block += [nn.ReLU(inplace=True)]add_block = nn.Sequential(*add_block)add_block.apply(weights_init_kaiming)classifier = []classifier += [nn.Linear(num_bottleneck, class_num)]classifier = nn.Sequential(*classifier)classifier.apply(weights_init_classifier)self.add_block = add_blockself.classifier = classifierdef forward(self, x):x = self.add_block(x)x = torch.squeeze(x)x = self.classifier(x)return x

Pose-Guided Global Feature Branch:

当一张query图像输入网络时候,预训练好的姿态估计模型会给出一个key points预测结果。然后对每个key point都生成一个heatmap。姿态估计模型预测时除了返回关键点的坐标之外还会返回一个置信度,对于置信度较低的关键点,可以认为该部分是处于遮挡状态中的。因此最后返回的heatmap,对于置信度很低的点,该点的heatmap应该是置0的。

将所有的heatmap叠加之后做max-pooling得到的feature vector和input经过resnet之后再max-pooling的feature vector 做concatenate,最后得到的feature vector即为该Pose-Guided分支的表征结果。用这个feature vector会得到一个id预测结果。

该分支具体代码:

def extract_pg_global_feature(model,global_feature,masks):pg_global_feature_1=nn.AdaptiveAvgPool2d((1,1))(global_feature)pg_global_feature_1=pg_global_feature_1.view(-1,2048)pg_global_feature_2=[]for i in range(18):  mask=masks[:,i,:,:]mask= torch.unsqueeze(mask,1)mask=mask.expand_as(global_feature)pg_feature_=mask*global_featurepg_feature_=nn.AdaptiveAvgPool2d((1,1))(pg_feature_)pg_feature_=pg_feature_.view(-1,2048,1)pg_global_feature_2.append(pg_feature_)pg_global_feature_2=torch.cat((pg_global_feature_2),2)pg_global_feature_2=nn.AdaptiveMaxPool1d(1)(pg_global_feature_2)pg_global_feature_2=pg_global_feature_2.view(-1,2048)pg_global_feature=torch.cat((pg_global_feature_1,pg_global_feature_2),1)pg_global_feature=model(pg_global_feature)return pg_global_feature

global_feature: torch.Size([32, 2048, 24, 8])

参考文章:

行人被遮挡问题怎么破?百度提出PGFA新方法,发布Occluded-DukeMTMC大型数据集 | ICCV 2019

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

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

相关文章

005、数据类型

1. 关于数据类型 Rust中,每个值都有其特定的数据类型,Rust会根据数据的类型来决定如何处理它们。 Rust是一门静态类型语言,它在编译程序的过程中就需要知道所有变量的具体类型。在大部分情况下,编译器可以根据我们如何绑定、使用变…

Apache SSI 远程命令执行漏洞

一、环境搭建 二、访问upload.php 三、写shell <!--#exec cmd"id" --> 四、访问 如图所示&#xff0c;即getshell成功&#xff01;​

Windows磁盘空间占用分析工具-WizTree

文章目录 WizTree作用WizTree树状分析图WizTree特点获取网址 WizTree作用 平时我们电脑用久了&#xff0c;产生很多文件&#xff0c;导致盘符空间不足&#xff0c;但是不知道那些文件占用比较多&#xff0c;这就需要磁盘空间分析工具-WizTree来分析文件占用情况 WizTree树状分…

Vue3-30-路由-嵌套路由的基本使用

什么是嵌套路由 嵌套路由 &#xff1a;就是一个组件内部还希望展示其他的组件&#xff0c;使用嵌套的方式实现页面组件的渲染。 就像 根组件 通过路由渲染 普通组件一样&#xff0c;嵌套路由也是一样的道理。 嵌套路由的相关关键配置 1、<router-view> 标签 声明 被嵌套组…

图像分割实战-系列教程2:Unet系列算法(Unet、Unet++、Unet+++、网络架构、损失计算方法)

图像分割实战-系列教程 总目录 语义分割与实例分割概述 Unet系列算法 1、Unet网络 1.1 概述 整体结构&#xff1a;概述就是编码解码过程简单但是很实用&#xff0c;应用广起初是做医学方向&#xff0c;现在也是 虽然用的不是很多&#xff0c;在16年特别火&#xff0c;在医学…

【头歌实训】PySpark Streaming 入门

文章目录 第1关&#xff1a;SparkStreaming 基础 与 套接字流任务描述相关知识Spark Streaming 简介Python 与 Spark StreamingPython Spark Streaming APISpark Streaming 初体验&#xff08;套接字流&#xff09; 编程要求测试说明答案代码 第2关&#xff1a;文件流任务描述相…

JavaScript 工具库 | PrefixFree给CSS自动添加浏览器前缀

新版的CSS拥有多个新属性&#xff0c;而标准有没有统一&#xff0c;有的浏览器厂商为了吸引更多的开发者和用户&#xff0c;已经加入了最新的CSS属性支持&#xff0c;这其中包含了很多炫酷的功能&#xff0c;但是我们在使用的时候&#xff0c;不得不在属性前面添加这些浏览器的…

node.js express框架开发入门教程

文章目录 前言一、Express 生成器&#xff08;express-generator&#xff09;二、快速安装1.express框架express-generator生成器安装2.使用pug视图引擎创建项目,projectName 为项目名称自定义 三、安装热更新插件 nodemon四、目录结构1. public文件夹2.routes路由其他请求方式…

开源radishes高仿网易云音乐完整源码,可试听和下载“灰色”歌曲,跨平台的无版权音乐平台

源码介绍 Radishes是项目名称&#xff0c;是由萝卜翻译而来。可以在这里试听和下载“灰色”歌曲&#xff0c;是一个可以跨平台的无版权音乐平台。 萝卜音乐界面和功能参考 windows 网易云音乐界面和 ios 的网易云音乐 安装依赖 cd radishes/ yarn bootstrap 运行项目 web:…

【面试】 Maven 的八大核心概念

Maven 的八大核心概念 在这里&#xff0c;举出这个标题&#xff0c;自然大家知道Maven是干啥的&#xff0c;就不过多进行赘述&#xff01;我们主要对于Maven的八大核心概念做一个解释补充&#xff0c;这也是我自己的一个学习历程&#xff0c;我们一起共勉&#xff01; 文章概述…

数据按分组显示固定数量,如某tr中固定显示几个td。

效果图&#xff1a; 具体方法&#xff1a; /*** 一行展示N个数据,可补全数组&#xff0c;如最后一行只有3个&#xff0c;那么数组会补全到指定数量* param int $type 默认1&#xff0c;可扩展* param int $num 一行显示的个数&#xff0c;可设置* param $arrs二维数组* return…

微服务(10)

目录 46.k8s中镜像的下载策略是什么&#xff1f; 47.image的状态有哪些&#xff1f; 48.如何控制滚动更新过程&#xff1f; 49.DaemonSet资源对象的特性&#xff1f; 50.说说你对Job这种资源对象的了解&#xff1f; 46.k8s中镜像的下载策略是什么&#xff1f; 可通过命令k…