YoloV5 + deepsort + Fast-ReID 完整行人重识别系统(三)

Fast-Reid系列文章目录


前言

上一篇fast-reid训练使用Fast-Reid框架训练了自己应用场景下的模型,训练策越为融合了大量开源reid数据集在加上自己的数据一起训练总共30W+的数据。
代码已开源:
Yolov5-Deepsort-Fastreid
yolov5-deepsort-pedestrian-counting

一、yolov5 + deepsort

使用yolov5实现行人检测,deepsort进行跟踪,在遮挡的情况下能较好的防止reid模型误识别。
本人将yolov5、deepsort分别封装成了类,很容易嵌入到自己的项目中,方便替换检测或跟踪算法。
本人将deepsor的表征提取模型替换成了fastreid训练的reid模型。能够提升跟踪性能。
详细请看person_search_reid.py代码如下(示例):

class yolo_reid():
    def __init__(self, cfg, args, path):
        self.args = args
        self.video_path = path
        use_cuda = args.use_cuda and torch.cuda.is_available()
        if not use_cuda:
            warnings.warn("Running in cpu mode which maybe very slow!", UserWarning)
		# Person_detect行人检测类
        self.person_detect = Person_detect(self.args, self.video_path)
        # deepsort 类
        self.deepsort = build_tracker(cfg, args.sort, use_cuda=use_cuda)
        imgsz = check_img_size(args.img_size, s=32)  # self.model.stride.max())  # check img_size
        self.dataset = LoadImages(self.video_path, img_size=imgsz)
        self.query_feat = np.load(args.query)
        self.names = np.load(args.names)

    def deep_sort(self):
        idx_frame = 0
        results = []
        for video_path, img, ori_img, vid_cap in self.dataset:
            idx_frame += 1
            t1 = time_synchronized()

			# yolo detection
            bbox_xywh, cls_conf, cls_ids, xy = self.person_detect.detect(video_path, img, ori_img, vid_cap)
            
            # do tracking  # features:reid模型输出512dim特征
            outputs, features = self.deepsort.update(bbox_xywh, cls_conf, ori_img)
            print(len(outputs), len(bbox_xywh), features.shape)

2.行人计数

本人吧yolov5 + deepsort顺带实现了行人计数功能, 统计摄像头内出现过的总人数,以及对穿越自定义黄线行人计数效果如下:
在这里插入图片描述
详细请看person_count.py代码

二、Reid提取特征

行人重识别和人脸识别是类似的,刚开始接触的可以认为就是人脸换成行人的识别。

1、截取需要识别的行人底库
在这里插入图片描述
2、运行person_bank.py保存行人特征和names,方便进行特征比对,识别出对应的names。
在这里插入图片描述

# features:reid模型输出512dim特征
person_cossim = cosine_similarity(features, self.query_feat)
max_idx = np.argmax(person_cossim, axis=1)
maximum = np.max(person_cossim, axis=1)
max_idx[maximum < 0.6] = -1
score = maximum
reid_results = max_idx
draw_person(ori_img, xy, reid_results, self.names)  # draw_person name

如下图识别出了底库中的行人a1111和b22222。未识别的为None
在这里插入图片描述

总结

在场景不复杂,未出现遮挡时,识别精度还是可以的。使用显卡运行也能够达到实时。下一步打算在业务逻辑上优化跟踪和重实别结合,减少计算量,提升识别性能。如有感兴趣的同学有好方法欢迎与我交流,谢谢!

猜你喜欢

转载自blog.csdn.net/zengwubbb/article/details/113422048