半自动的行人重识别数据标注算法Tracking + infomap

2023-11-07 19:40

本文主要是介绍半自动的行人重识别数据标注算法Tracking + infomap,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Fast-ReID系列文章目录

文章目录

  • 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:continuecv2.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 argsargs = parser.parse_args()label_path = Nonepred_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)

这篇关于半自动的行人重识别数据标注算法Tracking + infomap的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/365863

相关文章

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

Python给Excel写入数据的四种方法小结

《Python给Excel写入数据的四种方法小结》本文主要介绍了Python给Excel写入数据的四种方法小结,包含openpyxl库、xlsxwriter库、pandas库和win32com库,具有... 目录1. 使用 openpyxl 库2. 使用 xlsxwriter 库3. 使用 pandas 库

SpringBoot定制JSON响应数据的实现

《SpringBoot定制JSON响应数据的实现》本文主要介绍了SpringBoot定制JSON响应数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录前言一、如何使用@jsonView这个注解?二、应用场景三、实战案例注解方式编程方式总结 前言

使用Python在Excel中创建和取消数据分组

《使用Python在Excel中创建和取消数据分组》Excel中的分组是一种通过添加层级结构将相邻行或列组织在一起的功能,当分组完成后,用户可以通过折叠或展开数据组来简化数据视图,这篇博客将介绍如何使... 目录引言使用工具python在Excel中创建行和列分组Python在Excel中创建嵌套分组Pyt

在Rust中要用Struct和Enum组织数据的原因解析

《在Rust中要用Struct和Enum组织数据的原因解析》在Rust中,Struct和Enum是组织数据的核心工具,Struct用于将相关字段封装为单一实体,便于管理和扩展,Enum用于明确定义所有... 目录为什么在Rust中要用Struct和Enum组织数据?一、使用struct组织数据:将相关字段绑

在Mysql环境下对数据进行增删改查的操作方法

《在Mysql环境下对数据进行增删改查的操作方法》本文介绍了在MySQL环境下对数据进行增删改查的基本操作,包括插入数据、修改数据、删除数据、数据查询(基本查询、连接查询、聚合函数查询、子查询)等,并... 目录一、插入数据:二、修改数据:三、删除数据:1、delete from 表名;2、truncate

Java实现Elasticsearch查询当前索引全部数据的完整代码

《Java实现Elasticsearch查询当前索引全部数据的完整代码》:本文主要介绍如何在Java中实现查询Elasticsearch索引中指定条件下的全部数据,通过设置滚动查询参数(scrol... 目录需求背景通常情况Java 实现查询 Elasticsearch 全部数据写在最后需求背景通常情况下

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时