Fast-ReID系列文章目录
前言
本人做行人重识别工程的数据准备过程。借鉴人脸的数据聚类清洗方法实现半自动行人重识别数据标注。
一、行人截取
使用行人跟踪算法,讲视频中行人截取出来: 使用yolov5 + deepsort 实现行人跟踪参考此方法Yolov5_DeepSort GitHub,并稍作修改以过滤掉不完整和太小的行人
1. 限制检测到行人的长宽比例和大小
w = x2 - x1
h = y2 - y1
person_rate = h / w
if person_rate > 2.1 and w > 96 and h > 128:
# print(person_rate)
if frame_rate % 5 != 0:
continue
cv2.imwrite(os.path.join(save_path, '{}{}{}{}{}{}'.format(str(id).zfill(4), '_c2-', video_name, '_', str(person_num), '.jpg')), img[y1:y2, x1:x2])
2. 跳帧截取
if frame_rate % 25 != 0:
continue
3. 调整行人置信度过滤
parser.add_argument('--conf-thres', type=float, default=0.65, help='object confidence threshold')
parser.add_argument('--iou-thres', type=float, default=0.85, help='IOU threshold for NMS')
4. 通过以上方法再加上人工过滤,就能获得做了部分标注的行人重识别数据集了:
0002:行人ID, c1-1:摄像头号,98:该id下行人图片序号
但是我们知道跟踪算法很容易出现id切换,就会出现一个视频同一行人有多个ID。那么这时如果人工做去重的话就效率很低,可以借鉴人脸聚类的方法实现行人聚类。
二、行人聚类
人脸聚类方法文章
GitHub
对于给定的大量待聚类行人图片,找一个用开源数据训练的reid模型,本人使用得是用fastreid训练的模型,利用reid特征抽取组件(reid_feature_extract)进行行人特征抽取,并对用抽取的行人特征进行人脸聚类并进行图片归档。
main.py代码如下(示例):
extract_features = torch.nn.functional.normalize(query_feats, dim=1, p=2).data.cpu().numpy() #替换成行人特征提取
print('features:', extract_features.shape) # (N, 2048) N:图片数量
with Timer('All Steps'):
global args
args = parser.parse_args()
label_path = None
pred_label_path = None
# with Timer('Extract Feature'): 注释掉人脸特征提取
# extract_features = extract_fature(args)
if eval(args.is_evaluate):
args.label_path = 'data/tmp/test.meta'
if not eval(args.is_cuda):
args.knn_method = 'faiss-cpu'
with Timer('Face Cluster'):
cluster_main(args, extract_features)
face_cluster_by_infomap.py代码如下(示例):
def get_dist_nbr(features, args):
# features = np.fromfile(feature_path, dtype=np.float32)
# features = features.reshape(-1, 256)
features = features.reshape(-1, 2048) #修改 行人输出2048维特征
features = l2norm(features)
index = knn_faiss(feats=features, k=args.k, knn_method=args.knn_method)
knns = index.get_knns()
dists, nbrs = knns2ordered_nbrs(knns)
return dists, nbrs
最后生成如图所示,每个文件夹下保存不同时段不同角度的行人图片,一个文件夹对应一个ID,最后在进行人工筛选。
聚类优化
reid模型和聚类算法并不能做到完全准确,需要不断的优化reid模型对我们视频场景的泛化能力和调整聚类算法的参数,经过几次迭代后提升聚类准确度。
parser.add_argument('--k', default=80, type=int)
parser.add_argument('--min_sim', default=0.5, type=float)