以下链接是个人关于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"
这样我们就可以按照之前的博客开始训训练了。不过本人发现其并没有提高精度,至于为什么我也不太清楚,还在排查原因之中。