读论文Beyond Part Models Person Retrieval with Refined Part Pooling

本文深入探讨了BeyondPartModels论文中的两大创新:PCB网络和RPP方法。PCB通过修改ResNet结构,引入更精细的部位划分,而RPP则优化了平均池化过程,解决了均匀分割中的异常值问题,实现更准确的人体部位特征提取。

论文名称:Beyond Part Models Person Retrieval with Refined Part Pooling

链接:论文链接代码链接

预备知识:关于outlier和inlier
https://blog.youkuaiyun.com/daigualu/article/details/73866250

 

​​​​​​懒得翻译了。。先说说梗概,此文章两个贡献,第一个是PCB网络(Part Level Basline),第二个是RPP方法(Refined Part Pooling)

先说PCB,结构如下图,backbone网络取的是ResNet(在试了许多网络以后),相当于ResNet稍微更改了几个部分

更改的部分有:1.把averge pooling改成了RPP方法,2.结尾的下采样rate改小了(实验证明更好),3.最后的分类器没有共享权值(实验证明更好),4.卷积出来的tensorT(如图)被分为6个部分(作者说实验证明6个部分效果最好)

说说RPP,RPP是解决uniform partition会有outlier值的,或者说解决partition不精确的问题,也使得原本的粗暴分割加上变成'soft partition',出来的效果是这样子的

 

具体做法是把原来的AP(averge pooling)替换为RPP,用softmax分类器,预测T内的每个特征column在部位Parti上的概率

P(Parti | f)的大小。最终每个部位的采样是从全部列向量f(column vector)乘以权重P(也就是前面说的在部位Part上的概率大小)来计算的,

2019年1月11日10:38:20,正在看代码。后续把网络结构贴出来

以下是代码中PCB的结构,调用了torchvision.nn.models中的resnet50的结构,至于是否更改了resnet50的结构,还没看,下面这张图也没画完全,如下链接是解析pytorch中resnet结构,后续需要移植这个网络到其他地方

 

将Resnet网络更改成PCB结构在代码中的体现就是

class PCB(nn.Module):
    def __init__(self, class_num ):
        super(PCB, self).__init__()

        self.part = 6 # We cut the pool5 to 6 parts
        model_ft = models.resnet50(pretrained=True)
        self.model = model_ft
        #4.将averge pooling改成切分pooling成self.part=6块的特征g
        self.avgpool = nn.AdaptiveAvgPool2d((self.part,1))#
        self.dropout = nn.Dropout(p=0.5)
        # 2.remove the final downsample
        self.model.layer4[0].downsample[0].stride = (1,1)
        self.model.layer4[0].conv2.stride = (1,1)
        # 4.和3.define 6 classifiers,6个分类器,送给6个part使用
        for i in range(self.part):
            name = 'classifier'+str(i)
            setattr(self, name, ClassBlock(2048, class_num, droprate=0.5, relu=False, bnorm=True, num_bottleneck=256))

pytorch的resnet50大概封装成这样

 def forward(self, x):
        x = self.model.conv1(x)
        x = self.model.bn1(x)
        x = self.model.relu(x)
        x = self.model.maxpool(x)
      
        x = self.model.layer1(x)
        x = self.model.layer2(x)
        x = self.model.layer3(x)
        x = self.model.layer4(x)

至于resnet原本的结构:resnet50结构,emmm..pytorch中的resnet50实现把后面的几层封装成bottleneck,纯粹靠代码一层层阅读有点麻烦

还对训练和测试的网络差别弄不太懂:与训练的网络不同,PCB_test网络中没有dropout层,没有6个部位特征classifier

大型语言模型(LLMs)在文档理解和检索领域取得了显著进展,尤其是在多模态文档处理、基于语义的检索和高效索引技术方面。以下是一些具有代表性的论文和技术信息,涵盖用户提到的 DSE、mPLUG-DocOwl、LLaVAR 和 ColPali 等模型。 ### DSE(Document Structure Embedding) DSE 是一种将文档结构信息嵌入到向量空间中的方法,旨在提升文档检索和理解的准确性。该方法通过图神经网络(GNN)建模文档的层次结构,如段落、标题和列表等,从而捕捉文档的逻辑布局。实验表明,DSE 在文档检索任务中显著优于传统的基于词袋(BoW)的方法,并且在跨文档语义理解任务中也表现出色 [^1]。 ### mPLUG-DocOwl mPLUG-DocOwl 是一种多模态预训练模型,专注于文档理解和视觉问答(VQA)任务。该模型结合了文本和图像信息,能够有效处理扫描文档、PDF 文件等包含复杂布局的文档类型。mPLUG-DocOwl 的架构包括文本编码器、图像编码器以及跨模态融合模块,支持端到端的训练和推理。在 DocVQA 和文档分类等任务中,mPLUG-DocOwl 展示了卓越的性能 [^2]。 以下是一个简化的 mPLUG-DocOwl 架构示例: ```python class MPLUGDocOwlModel: def __init__(self): self.text_encoder = TextEncoder() self.image_encoder = ImageEncoder() self.cross_modal_fusion = CrossModalFusion() def forward(self, text_input, image_input): text_features = self.text_encoder(text_input) image_features = self.image_encoder(image_input) fused_features = self.cross_modal_fusion(text_features, image_features) return fused_features ``` ### LLaVAR(Large Language and Vision Assistant for Retrieval) LLaVAR 是一种结合大型语言模型与视觉模型的文档检索系统,旨在通过多模态理解提升文档检索效率。该系统利用视觉模型提取文档图像的特征,并结合语言模型对文档内容进行语义解析。LLaVAR 在处理包含图像和文本的混合文档时表现优异,尤其在复杂查询和模糊语义匹配方面具有显著优势 [^3]。 ### ColPali ColPali 是一种高效的文档检索方法,基于视觉语言模型(VLM)实现大规模文档集合的快速检索。该方法通过将文档内容转换为向量表示,并采用倒排索引结构进行高效查询。ColPali 的核心创新在于其高效的向量化策略和基于 GPU 的相似度计算,使其在大规模文档检索场景中具有较低的延迟和较高的召回率 [^4]。 以下是一个 ColPali 向量化和检索的简化示例: ```python import numpy as np from sklearn.metrics.pairwise import cosine_similarity class ColPaliRetriever: def __init__(self, documents): self.documents = documents self.vectors = self._vectorize_documents() def _vectorize_documents(self): # 假设有一个预训练的 VLM 模型 vectors = [vlm_model.encode(doc) for doc in self.documents] return np.array(vectors) def retrieve(self, query_vector, top_k=5): similarities = cosine_similarity(query_vector, self.vectors) top_indices = np.argsort(similarities[0])[-top_k:][::-1] return [self.documents[i] for i in top_indices] ``` ##
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值