0
点赞
收藏
分享

微信扫一扫

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

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

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

在网上搜集了很多帖子,想要白嫖可视化代码。但是发现并没有人分享,是视频重识别太小众了还单帧重识别太受宠了!!!!
为此在郑哲东的基础上改出了基于视频的行人重识别结果可视化。
郑哲东大佬的代码先放在这里: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')

结果

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

结束语

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

举报

相关推荐

0 条评论