行人重识别02-13:fast-reid(BoT)-实用技巧分享(3)-精度提升,训练超大数据集randperson

行人重识别 专栏收录该内容
30 篇文章 13 订阅

以下链接是个人关于fast-reid(BoT行人重识别) 所有见解,如有错误欢迎大家指出,我会第一时间纠正。有兴趣的朋友可以加微信:17575010159 相互讨论技术。若是帮助到了你什么,一定要记得点赞!因为这是对我最大的鼓励。 文 末 附 带 \color{blue}{文末附带} 公 众 号 − \color{blue}{公众号 -} 海 量 资 源 。 \color{blue}{ 海量资源}。
行人重识别02-00:fast-reid(BoT)-目录-史上最新无死角讲解

极 度 推 荐 的 商 业 级 项 目 : \color{red}{极度推荐的商业级项目:} 这是本人落地的行为分析项目,主要包含(1.行人检测,2.行人追踪,3.行为识别三大模块):行为分析(商用级别)00-目录-史上最新无死角讲解

前言

    对于行人重识别来说,其类似于人脸识别。需要超级大数据集才能获得比较好的效果。但是行人重识别的数据获取难度是很大的。不像人脸的数据集,就公开的而言,都有好些大数据集。但是行人从识别的大数据集,几乎可以说是没有的。但是最近公开了一个虚拟的行人从识别数据集,虽然说是虚拟的,但是根据作者的介绍,该数据集能够大幅度增加行人重识别的准确率。相关链接如下:
论文链接:https://arxiv.org/abs/2006.12774
项目数据链接:https://github.com/VideoObjectSearch/RandPerson
请大家先下载好数据集,本人下载之后显示如下:
在这里插入图片描述
但是后续我们只需要其中的 images 部分,本人的分布如下:
在这里插入图片描述
其每个文件具体代表什么,就不在进行介绍了,因为前面给出的链接,官方有详细的介绍。大家下载好之后呢,如下所示摆放好数据:
在这里插入图片描述
我们分别进入 images 中的每一个文件夹,如 scene00,scene01…,然后在每个文件夹下面都执行解压指令:

for tar in ca*.tar.gz;  do tar xvf $tar; done

如本人解压 scene00 之后显示如下图:
在这里插入图片描述
解压完所有的 cameraxx.tar.gz 之后,我们就可以进行训练了。

数据读取代码

首先,我们需要编写一个编写一个读取数据的代码,其类似于fastreid\data\datasets\market1501.py,本人改写代码为 fastreid\data\datasets\randperson.py,内容如下(大家复制即可):
另 外 注 意 , 记 得 : \color{red}{另外注意,记得:} 文件fastreid\data\datasets_init_.py,添加内容from .randperson import RandPerson

# encoding: utf-8
"""
@author:  sherlock
@contact: sherlockliao01@gmail.com
"""

import glob
import os.path as osp
import re
import warnings

from .bases import ImageDataset
from ..datasets import DATASET_REGISTRY


@DATASET_REGISTRY.register()
class RandPerson(ImageDataset):
    """Market1501.

    Reference:
        Zheng et al. Scalable Person Re-identification: A Benchmark. ICCV 2015.

    URL: `<http://www.liangzheng.org/Project/project_reid.html>`_

    Dataset statistics:
        - identities: 1501 (+1 for background).
        - images: 12936 (train) + 3368 (query) + 15913 (gallery).
    """
    _junk_pids = [0, -1]
    dataset_dir = 'randperson' # 数据集目录,默认为空
    dataset_url = 'https://github.com/VideoObjectSearch/RandPerson' # 数据集现在地址
    dataset_name = 'randperson' # 数据集名称

    def __init__(self, root='datasets', **kwargs):
        # self.root = osp.abspath(osp.expanduser(root))
        # 数据集根目录
        self.root = root
        # 拼接数据集路径
        self.dataset_dir = osp.join(self.root, self.dataset_dir)

        # allow alternative directory structure  # 允许替换目录结构
        self.data_dir = self.dataset_dir

        # 获得数据集目录
        data_dir = osp.join(self.data_dir, 'images')
        # 判断是否为一个目录。如果是则复制给self.data_dir
        if osp.isdir(data_dir):
            self.data_dir = data_dir
        # 否则给出警告
        else:
            warnings.warn('The current data structure is deprecated. Please '
                          'put data folders such as "bounding_box_train" under '
                          '"Market-1501-v15.09.15".')

        self.train_dir = self.data_dir
        self.query_dir = self.data_dir
        #“bounding_box_test”——用于测试集的 750 人,包含 19,732 张图像,前缀为 0000 表示在提取这 750 人的过程中DPM检测错的图
        # (可能与query是同一个人),-1 表示检测出来其他人的图(不在这 750 人中)
        self.gallery_dir = osp.join(self.data_dir, 'bounding_box_test')
        # 额外画廊的数据,可以理解为为bounding_box_test添加额外的数据
        self.extra_gallery_dir = osp.join(self.data_dir, 'images')

        # 获取目录下的所有jpg文件
        from pathlib import Path
        img_paths = []
        for img_path in Path(self.data_dir).glob('**/*.jpg'):
            img_paths.append(img_path)

        train = self.process_dir(img_paths)

        # 调用父类的初始化函数
        super().__init__(train, [], [], **kwargs)

    def process_dir(self, img_paths, is_train=True):
        # 用于正则表达式
        pattern = re.compile(r'([-\d]+)_s[\d]+_c(\d+)_f')

        data = []
        # 对每一张图片进行处理
        # 以 '007488_s03_c00_f081012.jpg' 为例
        # 1) 007488 表示每个人的id编号,从0001到1501;
        # 4) s03 表示第一个录像片段(sequece3),每个摄像机都有数个录像段;
        # 3) c00 表示第一个摄像头(camera0),共有个摄像头;
        # 4) f081012 表示 帧的数目
        for img_path in img_paths:
            img_name = img_path.name
            # 获得图片对应的pid(身份ID)以及摄像头编号
            # print('='*100)
            # print(img_name)
            # print(pattern.search(img_name).groups())
            pid, camid = map(int, pattern.search(img_name).groups())
            # -1表示身份不在1051中,则忽略不进行处理
            if pid == -1:
                continue  # junk images are just ignored
            # 检测id是否正确,不正确则报错
            #assert 0 <= pid <= 1501  # pid == 0 means background
            # 检测摄像头标号是否正确,不正确则报错
            #assert 1 <= camid <= 6
            # 摄像头的标号默认从0开始
            #camid -= 1  # index starts from 0

            # 如果进行训练,则在前面加上'market1501',因为默认支持多个数据集训练,
            # 所以每个身份ID都会加上对应的数据集前缀
            if is_train:
                pid = self.dataset_name + "_" + str(pid)
            # 把单张名称路径,身份ID,以及摄像头标号放置到data中
            data.append((img_path, pid, camid))

        return data

配置config

完成上面的操作之后,我们还需要修改配置文件,如(示例) configs\Market1501\bagtricks_R50.yml bagtricks_R50.yml ,只需要把其中的:

DATASETS:
  NAMES: ("Market1501",)
  TESTS: ("Market1501",)

OUTPUT_DIR: "logs/market1501/sbs_R50"

修改成:

DATASETS:
  NAMES: ("Market1501","RandPerson")
  TESTS: ("Market1501",)
  
OUTPUT_DIR: "logs/Market1501+RandPerson/sbs_R50"

这样我们就可以按照之前的博客开始训训练了。不过本人发现其并没有提高精度,至于为什么我也不太清楚,还在排查原因之中。

在这里插入图片描述

  • 3
    点赞
  • 6
    评论
  • 5
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值