首页> 中国专利> 基于行人重识别的跨镜头的行人检索方法

基于行人重识别的跨镜头的行人检索方法

摘要

本方法涉及行人检索方法,尤其是基于行人重识别的跨镜头的行人检索方法;它包括,采用resnet‑50作为基础网络构建网络结构;训练;对各监控设备采集的监控视频中的行人进行检测、跟踪,分割出行人图片并进行存储;根据分割的行人图片计算行人特征;根据各个行人的行人特征之间的相似度对行人进行分类,并将各行人的行人特征以及行人信息记录在对应的分类下,构成行人特征数据库;计算待检索行人的行人特征,将待检索行人的行人特征与行人特征数据库中的参照特征进行对比得出待检索行人所属类别;实现了通过现有的resnet‑50神经网络快速检索行人,通过eigenlayer减少欧式距离进行相似性度量的误差。

著录项

  • 公开/公告号CN112686088A

    专利类型发明专利

  • 公开/公告日2021-04-20

    原文格式PDF

  • 申请/专利权人 广东毓秀科技有限公司;

    申请/专利号CN201910997126.3

  • 发明设计人 余捷全;常伟;

    申请日2019-10-20

  • 分类号G06K9/00(20060101);G06K9/34(20060101);G06K9/62(20060101);

  • 代理机构

  • 代理人

  • 地址 510000 广东省广州市天河区金穗路3号1701房

  • 入库时间 2023-06-19 10:41:48

说明书

技术领域

本方法涉及行人检索方法,尤其是基于行人重识别的跨镜头的行人检索方法。

背景技术

目前,摄像机已经得到广泛的应用,带来了视频信息的爆炸式增长,无论是政府管理部门、还是公共场所,都依托于视频监测系统对辖区进行管理。但是,视频采集的数据为非结构化信息,在视频信息检索与应用上,技术手段仍然低下、原始,难以满足应用的需求。例如,在商场或火车站旁寻找一个走失的孩子,只能通过人工的方式去查看辖区内的所有摄像机采集的录像,其非常耗时耗力。在视频侦查应用上,一个案件涉及的视频可能有几百T大小,通过人工方式看可能要一两个月;通过视频摘要工具进行分析,再人工观看,假设浓缩比为20:1,其工作量仍不可小觑;而人脸识别技术虽然准确率高,但是对视频场景、人脸大小要求严格,对于大部分普通视频难以满足人脸识别的要求,其应用效果以及效率都不甚理想。

发明内容

针对现有技术的不足,本方法提供一种高效的行人检索方法。

本方法的技术方案为:

基于行人重识别的跨镜头的行人检索方法,其特征在于:它包括以下步骤:

步骤一,采用resnet-50作为基础网络构建网络结构;

步骤二,训练;

步骤三,获取各个监控设备采集的监控视频;

步骤四,对各监控设备采集的监控视频中的行人进行检测、跟踪,分割出行人图片并进行存储;

步骤五,根据分割的行人图片计算行人特征;

步骤六,根据各个行人的行人特征之间的相似度对行人进行分类,并将各行人的行人特征以及行人信息记录在对应的分类下,构成行人特征数据库;

步骤七,计算待检索行人的行人特征,将待检索行人的行人特征与行人特征数据库中的参照特征进行对比得出待检索行人所属类别,该类别下的行人信息作为跨镜头行人检索的结果。

具体的,所述步骤一中构建网络结构的方法:将resnet-50作为基础网络,在最后一个全连接层的前面加入一个Eigenlayer,全连接层是以向量内积形式进行特征的相似性度量或者说分类,全连接层的权重之间存在相关性的,学出来的特征也是有相关性的,而在Person Re-ID的普遍测试中是以欧式距离进行相似性度量的,因此存在一定的误差。

具体的,所述步骤二中训练方法为:

首先,用加了全连接层的resnet-50在之前训好的resnet-50上进行fine-tune直至收敛;然后进行约束和松弛迭代和重复约束和松弛迭代。经过去相关和约束处理后,权重向量是正交的,但是这时候不一定收敛的很好,因此需要松弛步骤,然后不断重复次过程。

具体的,约束和松弛迭代的方法包括:去相关:将新加的全连接层的权重进行SVD分解,W=USVTW=USVT,用US代替W,然后用WWTWWT的特征向量代替权重;约束:固定本层参数继续fine-tune直至收敛;松弛:不固定本层参数继续fine-tune直至收敛。SVD分解的奇异特征向量的符号是不确定的,因此特征投影到权重上后的方向是不确定的,因此用WWTWWT特征向量来代替权重。

具体的,欧式距离的计算:

由于V为酉矩阵,因此USUS来替换W之后的相似性度量是不变的,即

在一个较优实施例中,采用TensorFlow调用预训练模型来精调神经网络resnet-50。

本方法的有益效果为:通过图像输入、主干模型分层、特征层输入特征、eigenlayer、特征层输出特征和数据输出,实现了通过现有的resnet-50神经网络快速检索行人,通过eigenlayer减少欧式距离进行相似性度量的误差。

附图说明

图1为本方法的流程示意图。

具体实施方式

下面结合附图对本方法的具体实施方式作进一步说明:

实施例1

如图1所示,将resnet-50作为基础网络,在最后一个全连接层的前面加入一个Eigenlayer,全连接层是以向量内积形式进行特征的相似性度量或者说分类,全连接层的权重之间存在相关性的,学出来的特征也是有相关性的,而在Person Re-ID的普遍测试中是以欧式距离进行相似性度量的,因此存在一定的误差。

用加了全连接层的resnet-50在之前训好的resnet-50上进行fine-tune直至收敛;然后进行约束和松弛迭代和重复约束和松弛迭代。经过去相关和约束处理后,权重向量是正交的,但是这时候不一定收敛的很好,因此需要松弛步骤,然后不断重复次过程。

约束和松弛迭代的方法包括:去相关:将新加的全连接层的权重进行SVD分解,W=USVTW=USVT,用US代替W,然后用WWTWWT的特征向量代替权重;约束:固定本层参数继续fine-tune直至收敛;松弛:不固定本层参数继续fine-tune直至收敛。SVD分解的奇异特征向量的符号是不确定的,因此特征投影到权重上后的方向是不确定的,因此用WWTWWT特征向量来代替权重。

欧式距离的计算:

由于V为酉矩阵,因此USUS来替换W之后的相似性度量是不变的,即

获取某一区域内各个监控设备采集的监控视频,所述区域可以为小区、商场等固定区域,监控视频可以采用实时获取的方式,获取之后可以对监控视频进行实时地分析。

对各个监控设备采集的监控视频独立地进行分析,对每个监控设备采集的监控视频中的行人进行检测、跟踪,分割出行人图片并进行存储的方法具体包括:

对监控设备采集的监控视频的每个视频帧进行分析,如果帧数高,可以采用间隔取帧的方式,对视频帧通过目标检测方法检测出行人的位置信息,具体可采用目标检测模型yolo v3模型进行检测,检测的位置信息包括行人在视频帧中的坐标以及行人的边界框,再利用近邻匹配算法对行人进行跟踪,得出行人进入和离开该监控设备监控范围内的时间,然后按照检测出的行人边界框位置将行人图片从视频帧中分割出来,保存分割后的行人图片。对于在同一监控设备采集的监控视频中出现的每个行人,在该行人刚出现的若干帧内随机的保存多张该行人的图片,同时保存该行人出现的位置和时间信息。

该步骤主要是对单个监控设备拍摄的监控视频进行本地的行人追踪,可以得出行人出现和离开的时间,以及采集行人的不同姿态的图片。

所述根据分割的行人图片计算行人特征具体包括:

对行人图片通过深度学习模型抽取出行人的特征向量,可以采用ResNet50作为基础网络,并根据训练样本修改最后的输出层的大小,对该模型进行训练,再利用训练好的ResNet50模型进行行人特征向量的抽取,在推断过程中将average pool层的输出2048维的特征向量正则化后作为图片的特征,即每张图片可以获得2048维的特征。

实施例2

采用TensorFlow调用预训练模型来精调神经网络resnet-50。

使用TensorFlow调用预训练模型来精调神经网络。为了简单起见,以调用预训练的ResNet-50用于图像分类为例,使用的模块是tf.contrib.slim。

TensorFlow的所有用于图像分类的预训练模型的下载地址为models/research/slim,包含常用的VGG,Inception,ResNet,MobileNet以及最新的NasNet模型等。要使用这些预训练模型的关键是将这些预训练的参数正确的导入到定义好的神经网络,这可以通过函数slim.assign_from_checkpoint_fn来方便的实现。

一、Fine tuning模型定义

前已提及,TensorFlow所有预训练模型均在GitHub项目models/research/slim,而其对应的神经网络实现则在其子文件夹nets。我们以调用ResNet-50为例(其它模型类似),首先来定义网络结构:

我们假设要分类的图像有self.num_classes个类,随机选择一个批量的图像,对这些图像进行预处理后,把它们作为参数传入predict函数,此时直接调用TensorFlow-slim封装好的nets.resnet_v1.resnet_v1_50神经网络得到图像特征,因为ResNet-50是用于1000个类的分类的,所以需要设置参数num_classes=None禁用它的最后一个输出层。我们假设输入的图像批量形状为[None,224,224,3],则resnet_v1_50函数返回的形状为[None,1,1,2048],为了输入到全连接层,需要用函数tf.squeeze去掉形状为1的第1,2个索引维度。最后,连接再一个全连接层得到self.num_classes个类的预测输出。

可以看到,使用tf.contrib.slim模块,调用ResNet-50等神经网络变得异常简单。而接下来的关键问题是怎么导入预训练的参数,进而使用我们自己的数据来对预训练模型进行精调。在阐述怎么解决这个问题之前,先将整个模型定义的文件model.py列出以方便阅读:

要将预训练模型ResNet-50的参数导入到前面定义好的模型,需要继续借助tf.contrib.slim模块,而且方法很简单,只需要在训练函数slim.learning.train中指定初始化参数来源函数init_fn即可,而这可以通过函数

slim.assign_from_checkpoint_fn(model_path,var_list,

ignore_missing_vars=False,

reshape_variables=False)

很方便的实现。其中,第一个参数model_path指定预训练模型xxx.ckpt文件的路径,第二个参数var_list指定需要导入对应预训练参数的所有变量,通过函数

slim.get_variables_to_restore(include=None,

exclude=None)

可以快速指定,如果需要排除一些变量,也就是如果想让某些变量随机初始化而不是直接使用预训练模型来初始化,则直接在参数exclude中指定即可。第三个参数ignore_missing_vars非常重要,一定要将其设置为True,也就是说,一定要忽略那些在定义的模型结构中可能存在的而在预训练模型中没有的变量,因为如果自己定义的模型结构中存在一个参数,而这些参数在预训练模型文件xxx.ckpt中没有,那么如果不忽略的话,就会导入失败(这样的变量很多,比如卷积层的偏置项bias,一般预训练模型中没有,所以需要忽略,即使用默认的零初始化)。最后一个参数reshape_variabels指定对某些变量进行变形,这个一般用不到,使用默认的False即可。

有了以上的基础,而且你还阅读过上一篇文章TensorFlow-slim训练CNN分类模型(续)的话,那么整个使用预训练模型的训练文件train.py就很容易写出了,如下(重点在函数get_init_fn):

函数get_init_fn从指定路径下读取预训练模型。如果没有指定预训练模型路径(FLAGS.checkpoint_path),则返回None(表示随机初始化参数)。如果在训练路径下(FLAGS.logdir)已经保存过训练后的模型,也返回None(即忽略预训练模型参数,而使用最后训练保存下来的模型初始化参数)。如果你只想导入部分层的预训练参数,而忽略其它层的预训练参数,则可以设置checkpoint_exclude_scopes这个参数,用来指定你要排除掉(即不需要导入预训练参数)的那些层的名字,比如你要禁用第一卷积层,以及第一个block1,只需要指定:

checkpoint_exclude_scopes='resnet_v1_50/conv1,resnet_v1_50/block1'

init_fn=get_init_fn(checkpoint_exclude_scopes)

函数get_trainable_variables的作用是获取需要训练的变量,它默认返回所有可训练的变量。当你需要冻结一些层,让这些层的参数不更新时,通过参数checkpoint_exclude_scopes指定,比如我想让ResNet-50的block1和block2/unit_1冻结时,通过:

scopes_to_freeze='resnet_v1_50/block1,resnet_v1_50/block2/unit_1'

vars_to_train=get_trainable_variables(scopes_to_freeze)

调用即可。

选择数据集,下载好数据集之后,执行如下指令:

将训练集图像写入到train.record文件中。之后,执行:

$python3train.py\

--record_path Path/to/train.record\

--checkpoint_path Path/to/pretrained_ResNet-50_model/resnet_v1_50.ckpt

开始训练。训练开始之后,会在当前train.py路径下生成一个文件夹training用来保存训练模型。需要额外说明的是,训练过程不会在终端输出准确率、损失等数据,需要在终端执行:

$tensorboard--logdir Path/to/training

之后,打开返回的http链接在浏览器查看准确率、损失等训练曲线(训练过程中,训练结束后都可查看)。训练正常启动后,每10分钟会保存一次模型到training文件夹(诸如model.ckpt-xxx之类的文件),你可以选择使用其中的model.ckpt-xxx模型来直接进行预测,也可以选择将model.ckpt-xxx转化为.pb文件之后再进行预测,如果选择转化,执行:

$python3export_inference_graph.py\

--trained_checkpoint_prefix Path/to/model.ckpt-xxx\

--output_directory Path/to/exported_pb_file_directory

之后,在指定的输出路径下(Path/to/exported_pb_file_directory)会生成一个文件夹,该文件内的frozen_inference_graph.pb即是转化成的固化模型文件(固化指的是所有参数都转化成了常数)。之后就可以使用evaluate.py或者predict.py进行验证或预测了。

上述实施例和说明书中描述的只是说明本方法的原理和最佳实施例,在不脱离本方法精神和范围的前提下,本方法还会有各种变化和改进,这些变化和改进都落入要求保护的本方法范围内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号