表征学习代码实现
其最经典的网络是IDENet,度量学习:triple loss,ReID的半壁江山。
分类问题,分类行人的ID。
- 分类损失也叫ID损失,只有ID损失的网络称为ID Embeding网络(IDE网络)。
- 训练集中行人的ID数为网络的类别数。
- 特征层后接一个分类FC,经过Softmax激活函数计算交叉熵损失。
- 测试阶段使用倒数第二层的特征向量进行检索,分类FC层丢失。
数据集准备
Market1501
- "bounding_box_test"有19732张图片。
- "bounding_box_train"有12936张图片。
- “query”.There are 750 identities. 3368张图片。
- “gt_query”
- “gt_bbox”
测试时将"query"当"probe",“bounding_box_test"当"gallery”
- “0001” 是person ID,每个人都有一个不同的person ID。“0000”, "000-1"是干扰项。
- "c1"是第一个相机的ID,在这个数据集中一共有6个相机。测试时同一个相机的图片需要做互斥处理。
- “s1” is the sequence 1 of camera 1. 根据时间先后对序列排序,序列信息主要用在序列ReID或者tracking上,单帧ReID用不上。
- "001051"是序列里的第1051帧,用不上。
- “00” means that this bounding box is the first one among the several.
代码实现
主要代码:
- data_manager.py:自动处理数据集,返回数据集的一些常用属性。
- data_loader.py:吐数据的dataloader。
- transform.py:数据预处理代码,可以自定义数据增广等。
- model.py:提取特征的模型(ResNet50)。
- train.py:主文件,包含训练、测试等代码。
- utils.py:一些可能会用到的功能代码。
data_manager.py
#文件路径,标注信息(ID, CAMID),图片数量
先定义文件路径, def __init__ (self, root='data', **kwargs):
路径不存在时报错处理,def _check_before_run(self):
然后,取图片的重要信息#文件路径,标注信息(ID, CAMID),图片数量
def _process_dir(self, relabel=False):
img_paths = glob.glob(osp.join(dir_path,'*.jpg'))
embed() #把所有.jpg结尾的文件以绝对路径的形式列出来
pattern = re.compile(r'([-\d]+)_c(\d)')
pid_container = set() #set是去重的,list不是
for img_path in img_paths:
pid, _ = map(int, pattern.search(img_path).group())
if pid == -1: continue
pid_container.add(pid)
pid2label = {pid:label for label, pid in enumerate(pid_container)}
embed() #映射关系