CLIP-ReID阅读以及调试记录

论文
code
很详细的解说链接

论文主要工作

  • 首次将clip用于reid任务。
  • 提出了clip-reid,充分挖掘clip跨模型表达能力。在clip-reid中,每个id独立的token与模糊的文本描述集合,通过一个2stage的训练策略训练文本编码器。
  • 证明clip-reid在多个reid数据集(行人/汽车)到达sota结果。

训练流程

在这里插入图片描述
简要描述训练过程:

  • 将一个batch的图像以及对应的文本作为输入。 基于每个训练集中的id设置一系列可学习的文本tokens(x1, x2,…,xm)。
  • 设定一个图像编码器和文本编码器,以及线性层gv和gt。
  1. 下载预训练clip模型,初始化两个编码器、线性层,随机初始化可学习的文本token。
  2. 在第一stage训练时,计算文本与图像特征编码器的相似度。
  3. 通过eq5的损失函数前向传播优化,这一阶段只训练文本token,text encoder也是frozen的。
  4. 在第二stage训练,frozen文本token,只训练图像编码。

Clip-Reid算法框架

作者说明该算法的codebase为transReid、clip和CoOp。文章中将该算法与clip、CoOp进行了个对比,图画的蛮漂亮。
**加粗样式
**
主要说下clip-reid的不同之处:

  1. 借鉴了clip和coop的text 和image encoder,将完整语句替换为语义模糊的句子,每个句子长度是fixed,中间图像的描述词语是learnable tokens,这个作者做过实验,用四个token学习是效果最好的。
  2. stage1:text 和image encoder都是frozen的,只输入learnable的token送入text encoder学习,image encoder是采用imagenet预训练的模型,将数据送入encoder,只优化tokens。(A photo of x x x x person.)这个阶段与clip处理方法一致,用损失函数Loss(img2text)和Loss(text2img)。此外,在Loss(text2img),在同一batch的不同图像很可能属于同一个行人id,所以对loss进行了优化:
    同一batch中属于yi的所有正例索引
  3. stage2:该训练阶段只有image encoder中的参数进行优化。reid部分代码借鉴object reid,用triplet loss和加入label smooth 的id loss进行优化。为了充分利用clip,就用第一阶段的文本特征计算img2text的交叉熵。这一部分也粘贴下调试过程中的重点部分:
#processor/process_clipreid_stage2.py --line:55
#train
    batch = cfg.SOLVER.STAGE2.IMS_PER_BATCH
    i_ter = num_classes // batch
    left = num_classes-batch* (num_classes//batch)
    if left != 0 :
        i_ter = i_ter+1
    text_features = []
    # text feature extract
    with torch.no_grad():
        for i in range(i_ter):
            if i+1 != i_ter:
                l_list = torch.arange(i*batch, (i+1)* batch)
            else:
                l_list = torch.arange(i*batch, num_classes)
            with amp.autocast(enabled=True):
                text_feature = model(label = l_list, get_text = True)
            text_features.append(text_feature.cpu())
        text_features = torch.cat(text_features, 0).cuda()
    #image encoder optimize
    for epoch in range(1, epochs + 1):
        start_time = time.time()
        loss_meter.reset()
        acc_meter.reset()
        evaluator.reset()

        scheduler.step()

        model.train()
        for n_iter, (img, vid, target_cam, target_view) in enumerate(train_loader_stage2):
            optimizer.zero_grad()
            optimizer_center.zero_grad()
            img = img.to(device)
            target = vid.to(device)
            if cfg.MODEL.SIE_CAMERA:
                target_cam = target_cam.to(device)
            else: 
                target_cam = None
            if cfg.MODEL.SIE_VIEW:
                target_view = target_view.to(device)
            else: 
                target_view = None
            with amp.autocast(enabled=True):
                score, feat, image_features = model(x = img, label = target, cam_label=target_cam, view_label=target_view)
                #image-text match 
                logits = image_features @ text_features.t()
                loss = loss_fn(score, feat, target, target_cam, logits)

            scaler.scale(loss).backward()

            scaler.step(optimizer)
            scaler.update()

            if 'center' in cfg.MODEL.METRIC_LOSS_TYPE:
                for param in center_criterion.parameters():
                    param.grad.data *= (1. / cfg.SOLVER.CENTER_LOSS_WEIGHT)
                scaler.step(optimizer_center)
                scaler.update()

            acc = (logits.max(1)[1] == target).float().mean()

由于我训练的数据集较大,stage2常因为内存出问题,因此直接将stage1部分的模型保存。再次训练时,跳过1st的训练,load模型权重,直接进行2次训练,非常节省时间。

0516补充

网络部署

图像和文本的特征提取用的CLIP的visual encoder和text encoder,并且提供了两种方式:(1)transformer(vit-B16);(2)CNN以及global attention。训练细节包含学习率、warmingup策略设置、batch_size以及num_instance,推荐阅读原文和代码。

实验结果分析

  1. 两阶训练的必要性:CLIP可以融合文本和图像领域的嵌入特征。由于Reid数据集不会给不同的人id给特定的文本分析,因此该算法提供了被与训练过的一系列可学习的tokens。在第一阶段训练中,在训练image encoder的同时用对比损失训练text tokens。在第二阶段,将第一阶段训练的text tokens用来计算图像与文本匹配的交叉熵损失。消融实验的结果表明,可学习的text tokens虽然不能描述图像,但是会影响到image encoder的优化。
  2. 分析损失函数的权重:在stage2训练中,text encoder被冻,损失函数由id的交叉熵损失、triplet loss和image2text损失构成,在vit中,将各损失函数的权重设置为1、1、0.25;CNN设置为1、1和1。

代码调试

这个项目的代码并不难调,复现应该是比较简单的。但是分布式训练写的代码不太好,特别是load数据部分,百万数据集竟能load6个小时,后面根据fast reid的框架进行了修改,同时修改了num_workers,才稍好一点。就结果而言,在我配置的环境和自己的训练集,效果并没有fast reid好,但也有可能是没有加很多的数据增强,以及SIE信息没有加入。后续如果有很大的提升tricks会继续补充。或者后续将该训练策略移植到fast reid上做做对比实验,观察实验效果。
240605补充:
1 数据增强加了效果不好。分析原因:clip训练时只用了简单的数据增强,在finetune时使用一致的数据增强更容易收敛。
2将text_prompt部分移植到fast reid上,二阶段没用clip的visual部分,而是用了backbone+head与text prompt对齐,效果不如单纯backbone+head。

  • 10
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
### 回答1: DukeMTMC-reID是一个用于行人重识别研究的数据集,该数据集由Duke University的Multimedia Lab创建。它包含超过36,000个身份的超过16,000个视频序列和8个摄像头视角的4410个身份的超过2万个图像。这些数据由不同的摄像头拍摄,其中许多图像和视频序列包含遮挡,模糊或低光条件。 DukeMTMC-reID数据集已成为行人重识别领域的基准数据集之一,许多最新的研究工作都在该数据集上进行评估。 ### 回答2: DukeMTMC-reID 数据集是一个用于行人重识别任务的开放源数据集。该数据集是在DukeMTMC数据库的基础上构建而成,该数据库是一个用于多目标追踪和多目标计数的数据库,其中包含数个摄像头下的行人图像序列。DukeMTMC-reID 数据集的目的是提供一个用于行人重识别算法研究和评估的标准基准。 DukeMTMC-reID 数据集包含8个身份标注的行人图像序列,其中有拍摄角度变化和遮挡等挑战因素。这些序列分为训练集和测试集,训练集包含16,522个图像,测试集包含19,842个图像。每个图像都有相应的标签,表示图像所属的行人身份。 除了行人图像序列,DukeMTMC-reID 数据集还提供了行人图像的边界框注释和行人测距注释,这些注释可以用于算法的性能评估和验证。 使用DukeMTMC-reID 数据集进行行人重识别算法的研究和评估,可以帮助改进行人重识别算法的性能。该数据集的挑战在于拍摄角度变化、遮挡和尺度变化等现实场景中常见的问题,因此对于算法的鲁棒性和准确性提出了更高的要求。 总之,DukeMTMC-reID 数据集是一个用于行人重识别算法研究和评估的标准基准,提供了具有挑战性的行人图像序列以及相应的标签和注释,对于改进行人重识别算法的性能具有重要意义。 ### 回答3: DukeMTMC-reID数据集是一个用于行人重识别(reID)研究的数据集。它由杜克大学多个监控摄像头拍摄的8个监控摄像头中的行人图像组成,这些图像涵盖多个场景和条件。数据集中包含了16,522个行人身份的2,228,339张图像,使其成为一个非常大规模的reID数据集。 这个数据集的特点之一是它的复杂性和挑战性。由于摄像头的不同视角、拍摄距离、光照条件和行人之间的遮挡,行人的外观可能在不同的图像中有很大的差异。此外,数据集中还存在一些行人的重复出现,也就是同一个行人在不同的时间和地点出现了多次,这增加了重识别任务的难度。鉴于这些挑战,使用DukeMTMC-reID数据集进行reID研究可以更好地模拟实际监控场景中的情况。 该数据集还提供了行人的标注框和行人身份的标签,使研究人员能够使用这些信息进行模型训练和性能评估。此外,数据集还提供了用于训练和测试集划分的预定义分组,以及用于评估reID性能的指标,如CMC曲线和mAP。 DukeMTMC-reID数据集已经在行人重识别算法的研究中得到了广泛的应用。通过使用该数据集,研究人员可以开发和评估各种reID方法的性能,以提升行人重识别的效果。此外,该数据集还可以用于其他目标检测、行人跟踪和行为识别等相关研究领域。总之,DukeMTMC-reID数据集是一个有价值且挑战性的资源,为行人重识别研究提供了良好的基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值