基于视频的行人重识别结果可视化

基于视频的行人重识别结果可视化

在网上搜集了很多帖子,想要白嫖可视化代码。但是发现并没有人分享,是视频重识别太小众了还单帧重识别太受宠了!!!!
为此在郑哲东的基础上改出了基于视频的行人重识别结果可视化。
郑哲东大佬的代码先放在这里:https://github.com/layumi/Person_reID_baseline_pytorch
单帧可视化的代码就是里面的demo.py
言归正传,开始向视频方向延申。

数据集读取

我们这里用的是Mars数据集,就不再赘述了,想要了解详情的去看余慈reid大佬的帖子:基于视频的行人再识别(2):数据集管理data_manager

标准的loader流程

#######################################################################
# dataleader
def data_loader():
    dataset = data_manager.init_dataset(name=args.dataset)
    
    transform_test = T.Compose([
        T.Resize((args.height, args.width)),
        T.ToTensor(),
        T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
    ])

    pin_memory = True if use_gpu else False
    
    queryloader = DataLoader(
        VideoDataset(dataset.query, seq_len=args.seq_len, sample='dense', transform=transform_test),
        batch_size=args.test_batch, shuffle=False, num_workers=args.workers,
        pin_memory=pin_memory, drop_last=False,
    )

    galleryloader = DataLoader(
        VideoDataset(dataset.gallery, seq_len=args.seq_len, sample='dense', transform=transform_test),
        batch_size=args.test_batch, shuffle=False, num_workers=args.workers,
        pin_memory=pin_memory, drop_last=False,
    )
    return dataset, trainloader, queryloader, galleryloader
#######################################################################

test结果保存

苦于测试耗时太长,因此将测试的结果保存,用于后续Rank可视化。保存cam是为了对齐,然而在实际操作中发现是多余的,可以省略,当然label还是要存的。

torch.save(qf, 'query_feature.pt')
torch.save(gf, 'gallery_feature.pt')
io.savemat('save_result.mat', {'query_cam':q_camids,
                               'query_label':q_pids,
                               'gallery_cam':g_camids,
                               'gallery_label':g_pids,
                              })

结果读取

接下来当然是读取了。

image_datasets = data_loader()[0]
# print(image_datasets)

result = scipy.io.loadmat('save_result.mat')
query_feature = torch.load('query_feature.pt')
gallery_feature = torch.load('gallery_feature.pt')

query_cam = result['query_cam'][0]
query_label = result['query_label'][0]
gallery_cam = result['gallery_cam'][0]
gallery_label = result['gallery_label'][0]

query_feature = query_feature.cuda()
gallery_feature = gallery_feature.cuda()

gallery排序

因为都是按照label做的排序,所以这里还是沿用的郑大佬的方法,没有做修改,具体流程就是在排除掉相同ID和相同cam的情况下,按照CMC曲线做降序排序,返回的index就是Rank排序的list。

#######################################################################
# sort the images
def sort_img(qf, ql, qc, gf, gl, gc):
    query = qf.view(-1, 1)
    # print(query.shape)
    score = torch.mm(gf, query)
    score = score.squeeze(1).cpu()
    score = score.numpy()
    # predict index
    index = np.argsort(score)  # from small to large
    index = index[::-1]
    query_index = np.argwhere(gl == ql)
    # same camera
    camera_index = np.argwhere(gc == qc)
    
    junk_index1 = np.argwhere(gl == -1)
    junk_index2 = np.intersect1d(query_index, camera_index)
    junk_index = np.append(junk_index2, junk_index1)

    mask = np.in1d(index, junk_index, invert=True)
    index = index[mask]
    return index
#######################################################################

然后丢一个id进行排序就可以了,说白了就是在gallery里找与query_indel相似度最高的排序。

i = opts.query_index
index = sort_img(query_feature[i], query_label[i], query_cam[i], gallery_feature, gallery_label, gallery_cam)

结果可视化

这里做6帧的Rank-4可视化,当然想做的其他的可以自行修改,为了美观嘛,做成两排的,每排3帧

########################################################################
# Visualize the rank result
img_paths, pid, camid = image_datasets.query[i]
query_label = query_label[i]
try:  # Visualize Ranking Result
    # Graphical User Interface is needed
    fig = plt.figure(figsize=(16, 4))
    for i in range(2):
        for j in range(3):
            ax = plt.subplot(2, 15, (1 if i == 0 else 16) + j)
            ax.axis('off')
            imshow(img_paths[(0 if i == 0 else 2) + j], 'query')
    
    for i in range(4):	# 要做其他Rank排序,将range(4)改成想要的list就行
        for j in range(2):
            for k in range(3):
                ax = plt.subplot(2, 15, (1 if j == 0 else 16) + i * 3 + k + 3)
                ax.axis('off')
                img_path, pid, camid = image_datasets.gallery[index[i]]
                label = gallery_label[index[i]]
                imshow(img_path[(0 if j == 0 else 2) + k])
                if label == query_label:
                    ax.set_title('%d' % (i + 1), color='green')
                else:
                    ax.set_title('%d' % (i + 1), color='red')

结果

能达到效果就行了,要什么自行车,样式就懒得改了,想找个有错误检索的还挺不容易,哈哈。
在这里插入图片描述
在这里插入图片描述

结束语

基于视频的行人重识别结果可视化就介绍到这里。
若有问题,欢迎大家和我交流。

### 行人重识别可视化实现方法 行人重识别(Person Re-ID)不仅涉及复杂的模型训练过程,还依赖有效的结果可视化来评估性能和理解模型行为。对于基于视频行人重识别结果可视化[^2],通常会涉及到以下几个方面: #### 数据处理与准备 为了能够有效地进行行人重识别结果可视化,首先需要准备好测试数据集并加载到环境中。这一步骤包括但不限于读取测试结果、保存结果以及读取画廊(gallery)中的图片用于后续排序和展示。 #### 结果分析与呈现 在完成行人重识别之后,可以通过多种方式来进行结果可视化。一种常见的方式是对激活映射(activation maps)进行计算,并打印输出其形状变化情况以供调试之用。例如,在某些情况下可能会看到如下代码片段: ```python print("output before shape :{}".format(outputs.shape)) outputs = (outputs**2).sum(1) print("outputs shape :{}".format(outputs.shape)) b, h, w = outputs.size() ``` 这段代码展示了如何获取特征图(feature map)的信息及其维度变换后的状态[^4]。 #### 使用预训练模型进行演示 当采用特定框架如MGN-PyTorch时,则需按照说明调整配置文件`demo.sh`内的参数设置,比如指定数据目录路径(`--datadir`)、使用的GPU ID (`CUDA_VISIBLE_DEVICES`) 和 GPU 数量(`--nGPU`)等信息以便顺利运行示例程序[^3]。 #### 训练自定义模型 如果想要构建自己的行人重识别系统,可以参照官方文档执行相应的命令启动训练流程。例如,下面这条指令可用于启动ResNet50架构下的全网重新训练模式: ```bash python train.py --gpu_ids 0 --name ft_ResNet50 --train_all --batchsize 32 --data_dir your_data_path ``` 上述操作均有助于更好地理解和优化行人重识别系统的性能表现,同时也提供了丰富的手段让用户直观感受算法的效果[^5]。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值