一个更加强力的ReID Baseline,训练代码过程记录

一个更加强力的ReID Baseline
Bag of Tricks and A Strong Baseline for Deep Person Re-identification

arXiv:https://arxiv.org/abs/1903.07071

https://github.com/michuanhaohao/reid-strong-baseline
工程下的文件很多看着可能有点复杂,项目采用的是config yml,的方式进行多种情况的设置,训练,有利于实验,yml方式不理解的如下链接
https://blog.csdn.net/m0_37192554/article/details/103024960

1、模型结构过程

resnet50结构到layer4卷积层,经过全局平均池化,再reshape,代替全连接层,得到全局特征,用来tripletloss的输入
然后,全局特征接BNNeck 结构得到归一化后的特征(不用l2直接进行归一化)接入全连接的分类输出层
训练模型返回的是一个全局特征,和 分类输出层(全连接层)
测试返回的是特征层

        self.gap = nn.AdaptiveAvgPool2d(1)
        # self.gap = nn.AdaptiveMaxPool2d(1)
        self.num_classes = num_classes
        self.neck = neck
        self.neck_feat = neck_feat

        if self.neck == 'no':
            self.classifier = nn.Linear(self.in_planes, self.num_classes)
            # self.classifier = nn.Linear(self.in_planes, self.num_classes, bias=False)     # new add by luo
            # self.classifier.apply(weights_init_classifier)  # new add by luo
        elif self.neck == 'bnneck':
            self.bottleneck = nn.BatchNorm1d(self.in_planes)
            self.bottleneck.bias.requires_grad_(False)  # no shift
            self.classifier = nn.Linear(self.in_planes, self.num_classes, bias=False)

            self.bottleneck.apply(weights_init_kaiming)
            self.classifier.apply(weights_init_classifier)
    def forward(self, x):

        global_feat = self.gap(self.base(x))  # (b, 2048, 1, 1) #resnet50 的卷积层模型输入,
        global_feat = global_feat.view(global_feat.shape[0], -1)  # flatten to (bs, 2048)

        if self.neck == 'no':
            feat = global_feat
        elif self.neck == 'bnneck':
            feat = self.bottleneck(global_feat)  # normalize for angular softmax

        if self.training:
            cls_score = self.classifier(feat)
            return cls_score, global_feat  # global feature for triplet loss
        else:
            if self.neck_feat == 'after':
                # print("Test with feature after BN")
                return feat
            else:
                # print("Test with feature before BN")
                return global_feat

2、损失函数过程

损失函数,用到了函数嵌套,的一个使用,嵌套实例调用讲解
https://www.cnblogs.com/xiaxiaoxu/p/9785687.html

...
    elif cfg.MODEL.IF_WITH_CENTER == 'yes':
        print('Train with center loss, the loss type is', cfg.MODEL.METRIC_LOSS_TYPE)
        loss_func, center_criterion = make_loss_with_center(cfg, num_classes)  # modified by gu,损失函数,是一个嵌套函数,会调用子函数,
        optimizer, optimizer_center = make_optimizer_with_center(cfg, model, center_criterion) #优化器
        # scheduler = WarmupMultiStepLR(optimizer, cfg.SOLVER.STEPS, cfg.SOLVER.GAMMA, cfg.SOLVER.WARMUP_FACTOR,
        #                               cfg.SOLVER.WARMUP_ITERS, cfg.SOLVER.WARMUP_METHOD)


######## make_loss_with_center(cfg, num_classes),函数代码,这里是函数嵌套
### 最后return loss_func, center_criterion  这里外部接收后跟踪,调用子函数,loss = loss_fn(score, feat, target),是直接加子函数的括号参数就可以

    if cfg.MODEL.IF_LABELSMOOTH == 'on':
        xent = CrossEntropyLabelSmooth(num_classes=num_classes)     # new add by luo
        print("label smooth on, numclasses:", num_classes)
def make_loss_with_center(cfg, num_classes):    # modified by gu
    if cfg.MODEL.NAME == 'resnet18' or cfg.MODEL.NAME == 'resnet34':
        feat_dim = 512
    else:
        feat_dim = 2048

    if cfg.MODEL.METRIC_LOSS_TYPE == 'center':
        center_criterion = CenterLoss(num_classes=num_classes, feat_dim=feat_dim, use_gpu=True)  # center loss

    elif cfg.MODEL.METRIC_LOSS_TYPE == 'triplet_center':
        triplet = TripletLoss(cfg.SOLVER.MARGIN)  # triplet loss
        center_criterion = CenterLoss(num_classes=num_classes, feat_dim=feat_dim, use_gpu=True)  # center loss

    else:
        print('expected METRIC_LOSS_TYPE with center should be center, triplet_center'
              'but got {}'.format(cfg.MODEL.METRIC_LOSS_TYPE))

    if cfg.MODEL.IF_LABELSMOOTH == 'on':
        xent = CrossEntropyLabelSmooth(num_classes=num_classes)     # new add by luo
        print("label smooth on, numclasses:", num_classes)

    def loss_func(score, feat, target):
        if cfg.MODEL.METRIC_LOSS_TYPE == 'center':
            if cfg.MODEL.IF_LABELSMOOTH == 'on':
                return xent(score, target) + \
                        cfg.SOLVER.CENTER_LOSS_WEIGHT * center_criterion(feat, target)
            else:
                return F.cross_entropy(score, target) + \
                        cfg.SOLVER.CENTER_LOSS_WEIGHT * center_criterion(feat, target)

        elif cfg.MODEL.METRIC_LOSS_TYPE == 'triplet_center':
            if cfg.MODEL.IF_LABELSMOOTH == 'on':
                return xent(score, target) + \
                        triplet(feat, target)[0] + \
                        cfg.SOLVER.CENTER_LOSS_WEIGHT * center_criterion(feat, target)
            else:
                return F.cross_entropy(score, target) + \
                        triplet(feat, target)[0] + \
                        cfg.SOLVER.CENTER_LOSS_WEIGHT * center_criterion(feat, target)

        else:
            print('expected METRIC_LOSS_TYPE with center should be center, triplet_center'
                  'but got {}'.format(cfg.MODEL.METRIC_LOSS_TYPE))
    return loss_func, center_criterion

   
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: person_reid_baseline_pytorch是一个基于PyTorch框架的人员识别基线模型。它可以用于训练和测试人员识别模型,以识别不同人员之间的差异和相似之处。该模型提供了一些基本的功能,如数据加载、模型训练、模型测试等,可以帮助用户快速搭建和测试自己的人员识别模型。 ### 回答2: person_reid_baseline_pytorch是一个基于PyTorch框架的人体重识别模型。该模型采用卷积神经网络(Convolutional Neural Network,简称CNN)架构,采用多个卷积层和池化层进行特征提取,最后经过全连接层得到人物特征向量,实现了对人体进行识别。 该模型的训练数据集一般采用Market1501数据集,它包含超过1501个不同身份的超过32000张图片,是一个非常大且具有代表性的数据集,训练出的模型能够具有很好的泛化能力。 在训练过程中,除了使用标准的交叉熵损失作为损失函数外,还使用Triplet Loss作为损失函数的一种变形。该损失函数能够比较好地处理重识别中的最大间隔问题,并且能够实现对同一身份的多张图片之间的特征相似度比较。 对于测试集的预测部分,该模型采用的是余弦相似度进行特征向量相似度计算,相似度越高则说明两个图片中的人物越有可能是同一个人,可以实现良好的识别结果。 总的来说,person_reid_baseline_pytorch基于PyTorch框架实现的人体重识别模型,通过CNN架构进行特征提取,使用Triplet Loss进行训练,使用余弦相似度进行特征向量相似度计算,能够实现对人体进行高效准确的识别。 ### 回答3: person_reid_baseline_pytorch 是一个基于 PyTorch 框架的行人重识别算法基线模型,它实现了一个简单但功能齐全的行人重识别框架,可以训练和测试基于清晰照片的行人重识别任务。 该模型包含了基本卷积神经网络(CNN)的搭建和训练,其中包括几个关键部分:数据加载、模型定义、训练和测试。它使用数据增强技术和三元损失函数来训练模型,目的是使相同人的图像对与不同人的图像对之间的距离最大化。 person_reid_baseline_pytorch 采用 Market-1501 数据集进行测试,并在该数据集上取得了不错的结果。该数据集包含 1501 个行人,共有 12936 张图像,其中包括 6 种视角和多种行为。该算法读取图像数据并将之前处理后的行人图像输入神经网络,以便为每个图像计算行人的特征向量。然后,使用相关算法来比较图像对的距离,并确定它们是否属于同一人。该算法的性能指标包括准确度、精度和召回率等。 总之,person_reid_baseline_pytorch 提供了一个简单但完整的框架和基线模型,可以作为进一步解决行人重识别问题的基础。无论是学术界还是商业界,这种算法都有广泛的应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值