行人重识别是给定一张query,从若干张剪裁好的行人中识别出query。
行人搜索是给一张query和多张包含很多人的大图作为gallery,从大图中检测并识别出query。
行人搜索分为端到端(end to end person search)方法和两步法(two step person search)方法。
端到端方法的代码现在已经公开了很多,但是两步法没有公开代码,如果自己想做实验实践一番,该怎么做呢?以下是我总结出来的步骤:
两阶段流程
1.训练,在行人搜索数据集上训练检测器,比如faster
项目可以是PSTR-main(数据集类 配置文件都方便改)
得到epoch_xx.pth
训练命令示例
cd /home/Projects/PSTR-main; nohup python tools/train.py --config configs/pstr/prw_faster_rcnn_r50_fpn_2x_coco.py \
--work-dir /home/Newdisk/exprlogs/twosteppsnsch/PRW_first --gpu-ids 1 \
> /home/Newdisk/exprlogs/twosteppsnsch/exproutput/PRW_first.txt 2>&1 &
这一步训练时,建议使用mmdet,里面有多种检测器可以选择。训练时需要CoCo版本的数据集标注,这个在AlignPS中已经提供好了,可以直接用。上面的PSTR也可以换成AlignPS。
2.测试,对测试集的gallery经过检测,得到每张图上的行人坐标及其得分。
得到faster.pkl文件。
测试命令示例
bash /home/Projects/twostage_mmdetection-2.25.2/tools/dist_test.sh /home/Projects/PSTR-main/configs/pstr/prw_faster_rcnn_r50_fpn_2x_coco.py \
65511 /home/Newdisk/exprlogs/twosteppsnsch/PRW_first/epoch_24.pth 2 \
--work-dir /home/Newdisk/exprlogs/twosteppsnsch/PRW_first/test_0d5_scores --eval bbox \
--out /home/Newdisk/exprlogs/twosteppsnsch/PRW_first/test_0d5_scores/PRW_first_score_0d5.pkl --score-thresh 0.5
行人搜索中召回率也很重要,因为最终的AP=初始AP*召回率。调整召回率就对应上面score-thresh参数(前景得分阈值)。如果前景得分阈值设置低了,那么会保留更多的proposal,召回率更高。也就是说有ID的行人被检测器保留下来的更多,副作用就是也会带来更多的无ID的行人图像,测试时干扰图像就更多。自己权衡一下收益选择合适的值。
3.剪裁,根据检测框把gallery中行人剪裁出来,命名为imgname_index.jpg,imgname是图像原始名称,index为当前行人是该场景图第几个行人。
Crop_and_Label_Imgs_PRW.crop_testimgs(crop_img_save_dir, fg_score_thresh, pklpath, model=None)
得到剪裁的图像集合
比如 /home/Newdisk/exprlogs/twosteppsnsch/PRW_first/test_0d5_scores/Faster_imgs_PRW_fgscore_0d5/faster
4.标注,把剪裁的图像根据它和GT的IOU是否大于0.5,决定要不要对其赋予真值ID。
Crop_and_Label_Imgs_PRW.assign_id_all_IoU_gt_thresh(crop_img_save_dir, fg_score_thresh, iou_thresh, record_dir,pklpath=None, mdl=None)
得到分配ID后的剪裁图像集合
比如 /home/Newdisk/exprlogs/twosteppsnsch/PRW_first/test_0d5_scores/Faster_imgs_PRW_fgscore_0d5/faster
5.归类,CUHK系列的数据集测试时非全集测试,而是TestG100,因此需要把每个gallery上检测的几个人都归在一类。PRW不需要,本身就是全集测试
6.ReID测试,先构造检测器版的ReID数据集,其中训练集和query用GT剪裁的训练集,测试集的gallery用上面第四步或第五步的结果。每张图都要用Market的形式命名,最终组织成Market1501的格式在ReID模型上测试。三个数据集的测试流程在evaluate_in_CUHK_SYSU_settings,evaluate_in_drsu_settings,eval_in_PRW_settings里面放着。
注意点:
各个数据集的训练集需要ID重映射为0开始的连续ID,便于训练时分类头的学习和定义。
ReID测试时难免出现ReID版数据集上训练好的模型分类器ID数和检测器生成的ReID数据集上ID数不一致的问题,可能是数据集划分时考虑不严谨。
问题不大,把根据GT剪裁的ReID版数据集的训练集直接搬运到检测器版ReID训练集上就行,因为我测试时不需要训练集,也不需要训练集上学习的分类头,只借你的主干网络用用。
另外,不同于ReID排除-1的样本,CUHK数据集和PRW都得留着ID=-1的样本。