海量图像特征向量中的快速聚类预处理方法与流程

文档序号:14080503阅读:406来源:国知局
海量图像特征向量中的快速聚类预处理方法与流程

本发明涉及图像处理领域,尤其涉及一种海量图像特征向量中的快速聚类预处理方法。。



背景技术:

在图像智能分析领域,针对图像分析的先期步骤一般都包含图像的结构化处理,结构化处理过程对图像的像素点阵数据进行运算(如利用神经网络的模型)后,最终得到一个维度有限的高维向量来表达原始图像的特征,此向量一般也称为图像的特征向量,图像特征向量是输入数据的类型。

在图像智能分析中,有两个基本的问题,一是其解决图像“是什么”的分类问题(如人脸检测),二是解决图片个体在已知的某一类事物集合中“是谁(是哪个)”的识别问题(如人脸识别)。目前,深度神经网络是识别类图像智能分析领域的一个主流技术,而对此类功能神经网络的训练主流方法是监督学习的训练方法。监督学习的训练方法需要大量的标注数据用于训练的输入,特别针对某种类型图像“识别”问题而言,需要大量的已聚好类的某种事物图片和其特征的集合,这个集合其中的每一个类是此种事物中的某个个体在不同状态、条件、长时间跨度、角度下采集的图片及其特征。举人脸识别而言,所需要的训练数据是不同的人的图像集合,且这些集合中每一个人都是在不同的状态、光照、角度、表情、清晰度以及年龄等各条件情况下采集的图像。

在实际的场景中,人们很容易通过实地采集和网络爬取等技术方案迅速累积亿万级的海量图像数据;从这些海量的图像数据中,如何采用有效的方法得到可用于神经网络模型训练已聚类的图像集合,一般采用预处理+人工筛查的方式来得到已经Ground Truth的标注数据,因此如何使预处理步骤的结果尽可能准确、快速以及高效,则需要被仔细考虑。大部分的聚类方法都有如下待解决的问题:

n 聚类的类型个数不确定,聚类可能得到的类型理论上有无穷多种;

n 不同类型元素之间不互相重叠;

n 同时支持离线分析和实时分析;

n 人工分析预处理环节用,聚类结果容忍一定的错误;

n 针对海量数据进行预处理,处理速度需要足够快;

n 按条件聚类(如类型内元素个数的最大值和最小值,入选类别数总数上限);

n 高可用的容错和异常恢复机制。

现有的技术方案中,虽然有很多经典的聚类算法,但都没有直接有效地解决如上所述的问题场景的解决方案。

传统的K-Means聚类算法或K-Means的演进类算法如KNN算法,它首先要求是确定一个假设的类型个数K,而这正是场景中首先不符合的,另外K-Means算法也允许不同的类型之间可以相互重叠,这也不符合问题的所描述的场景,另外K-Means的类的算法在运行时也需要针对一些已知总数的数据集,这也不符合本场景中所提出到的实时分析需求,因为在实时输入的分析处理中,输入数据库的总数是不确定且是流式处理的。另外在实现方式上,K-Mean需要多轮处理,这对于海量数据处理来说将很难满足实时性的要求。

另外也有一些机构和团队研究了基于输入数据采样和高斯估计的频繁项特征值挖掘方法,支持离线分析和实时处理,但类似的方法均采用了输入采样虽然提高了处理速度,但损失了结果的准确性;其按时间周期进行处理的方法只能说是近实时而不是纯实时的处理;在离线处理模式下,因为不好定义输入周期而导致结果存在很大的不确定性,另外在上述场景中提到按条件聚类方面,在此类场景下也缺乏良好的支持。

另外也有一些直接的聚类方案,基于几何向量间的距离或其它相似度的衡量进行基于一一比较的聚类,但通常这些算法没有针对海量数据进行特别的设计,在处理方案的并行度、计算的复杂度、分类的准确性及运行的可靠性方面没有进行良好的设计,而导致方案在海量数据的环境下计算速度和准确率方面都表现不佳,不具备实用性。

综上所述,对于图像识别领域的标注数据的聚类预处理,有其特别的需求和场景特点,很难直接用现用的方案来解决。



技术实现要素:

为了解决现有技术中的问题,本发明提供了一种海量图像特征向量中的快速聚类预处理方法,解决现有技术中计算内存要求高和运算复杂的问题。

本发明是通过以下技术方案实现的:设计、制造了一种海量图像特征向量中的快速聚类预处理方法,包括如下步骤:(A)两级线程池处理;(B)两级Map的存储结构处理;所述两级线程池包括进行简单预聚类的初级预处理线程池和进行次级聚类合并的次级合并线程池;所述两级Map的存储结构中,将大的聚类结果Map划分成子Map,子Map的合并比较操作并行进行。

作为本发明的进一步改进:所述初级预处理线程池进行初级聚类任务切分调度,具体为:所述初级预处理线程池进行初级聚类任务切分调度,具体为:(A1)根据内存资源的消耗上限,设定初级预处理线程池队列的最大长度;(A2)检查队列中已有的任务块,如果队列未达到其在步骤(A1)中设定的最大长度,调度模块从特征值数据库中读取一个长度不大于最大长度的数据,并组装成一个任务请求放置到队列中;(A3)如查到队列长度达到最大值,则等待初级预处理线程池的线程从队列中取出任务请求,以便队列不再满为止;(A4)反复进行步骤(A2)和步骤(A3),直到数据都处理完毕为止。

作为本发明的进一步改进:所述步骤(A)中,初级预处理线程池按如下方式进行处理:从任务切分调度模块中获取任务块,如果没有获取成功,则等待,成功之后便进行后续步骤;初始化一个两级Map,第一级Map是第二级子Map的管理层,第二级子Map直接保存匹配结果的类,具体步骤:遍历任务块中指定的有限个元素,对于每一个元素,执行如下逻辑:每取到一个特征向量,跟当前所有子Map中的已聚类结果进行比较;将每个子Map匹配最佳的结果返回上一级进行处理,如果与某个子Map中的某个类达到最佳匹配,则将当前特征值增加到已存在的这个类中;如果与所有子Map中的类都不匹配,则新建一个类,并将当前特征值作为新建的这个类的第一个特征值,并将该类加入到空闲的子Map中进行管理,当指定的有限个元素都处理完毕后,向次级合并线程池发送合并请求。

作为本发明的进一步改进:所述步骤(B)中,两级Map存储结构中,按固定的切换粒度n将所有的聚类结果划分成m份,其中每一份都生成为一个子Map,以所有子Map为元素组合成一个大Map。

作为本发明的进一步改进:子Map的每一个元素为一个聚类过程形成的最终的结果类,每个类包含以下两个关键信息:所有聚类成这个类的原始特征值存储ID和这个类的代表特征值向量;当向当前类中新增加特征值向量时,如果是第一个特征值向量,则将此向量作为这个类的代表特征向量;如果新增加特征向量时,是第x个特征向量(x!=1),设原始的代表特征向量为y(org),则新的代表特征向量y(new) = ((n-1)x + y(org)) / n。

作为本发明的进一步改进:所述步骤(A)中,次级合并线程池按如下步骤进行处理:(A21)每一个合并线程都独立运行,每个线程不断的尝试获取合并请求,如果请求队列为空,则进行等待,如果不为空,则进行下一步处理;(A22)对于每一个合并请求,先并行且独立进行与每个子Map的比较操作;(A23)当一个合并请求的子Map都比较完成后,进行比较结果的合并,选取所有比较结果最大的匹配分值;(A24)如果这个最大的匹配值大于设定门限,则表明与现有的类匹配,进行现有类的更新操作,并将新的特征值ID附加到匹配的类中;当前元素处理完毕后跳转到步骤(A21),否则进行步骤(A25);(A25)新建类,首先检查是否达到最大的Map容量,如果没有达到,直接进行步骤(A27),否则进行步骤(A26);(A26)选择当前已存在的类中聚类结果集合特征值记录个数最少,且小于当前新加类的特征记录个数的类,将其删除以空出新的存储空间;(A27)新建立聚类结果元素,并将当前特征值ID集合及代表特征向量赋值给这个新的聚类结果。

作为本发明的进一步改进:还包括动态备份存储与恢复处理,其具体为:在聚类开始时,从数据库中读取初级任务切分的结果及状态,进行初级预聚类状态的恢复;从数据库中读取聚类合并的状态和数据,进行聚类合并状态的恢复;在聚类的处理过程中,每完成一次聚类预处理及每完成一次合并,向数据库中存入当前的中间结果信息。

本发明的有益效果是:将聚类运算过程通过两级调度设计,适合在多核服务器上进行运行;通过两级Map的存储结构,使聚类比较与聚类更新的之间的阻塞影响趋近为0;通过多级调度及对结果集的总量控制,并通过代表特征向量的机制,将内存的需求降低一个数量级;提升了在大规模长时间运算场景下方法的健壮性;同时,该方法的计算复杂度低、内存需求小且运算过程的可靠性高。

【附图说明】

图1为本发明中海量图像特征向量的快速聚类预处理结构的示意图;

图2为本发明中两级Map的存储结构示意图。

【具体实施方式】

下面结合附图说明及具体实施方式对本发明进一步说明。

一种海量图像特征向量中的快速聚类预处理方法,包括如下步骤:(A)两级线程池处理;(B)两级Map的存储结构处理;所述两级线程池包括进行简单预聚类的初级预处理线程池和进行次级聚类合并的次级合并线程池;所述两级Map的存储结构中,将大的聚类结果Map划分成子Map,子Map的合并比较操作并行进行。

所述初级预处理线程池进行初级聚类任务切分调度,具体为:所述初级预处理线程池进行初级聚类任务切分调度,具体为:(A1)根据内存资源的消耗上限,设定初级预处理线程池队列的最大长度;(A2)检查队列中已有的任务块,如果队列未达到其在步骤(A1)中设定的最大长度,调度模块从特征值数据库中读取一个长度不大于最大长度的数据,并组装成一个任务请求放置到队列中;(A3)如查到队列长度达到最大值,则等待初级预处理线程池的线程从队列中取出任务请求,以便队列不再满为止;(A4)反复进行步骤(A2)和步骤(A3),直到数据都处理完毕为止。

所述步骤(A)中,初级预处理线程池按如下方式进行处理:从任务切分调度模块中获取任务块,如果没有获取成功,则等待,成功之后便进行后续步骤;初始化一个两级Map,第一级Map是第二级子Map的管理层,第二级子Map直接保存匹配结果的类,具体步骤:遍历任务块中指定的有限个元素,对于每一个元素,执行如下逻辑:每取到一个特征向量,跟当前所有子Map中的已聚类结果进行比较;将每个子Map匹配最佳的结果返回上一级进行处理,如果与某个子Map中的某个类达到最佳匹配,则将当前特征值增加到已存在的这个类中;如果与所有子Map中的类都不匹配,则新建一个类,并将当前特征值作为新建的这个类的第一个特征值,并将该类加入到空闲的子Map中进行管理,当指定的有限个元素都处理完毕后,向次级合并线程池发送合并请求。

所述步骤(B)中,两级Map存储结构中,按固定的切换粒度n将所有的聚类结果划分成m份,其中每一份都生成为一个子Map,所有子Map组合成一个大Map。

子Map的每一个元素为一个聚类过程形成的最终的结果类,每个类包含以下两个关键信息:所有聚类成这个类的原始特征值存储ID和这个类的代表特征值向量;当向当前类中新增加特征值向量时,如果是第一个特征值向量,则将此向量作为这个类的代表特征向量;如果新增加特征向量时,是第x个特征向量(x!=1),设原始的代表特征向量为y(org),则新的代表特征向量y(new) = ((n-1)x + y(org)) / n。

所述步骤(A)中,次级合并线程池按如下步骤进行处理:(A21)每一个合并线程都独立运行,每个线程不断的尝试获取合并请求,如果请求队列为空,则进行等待,如果不为空,则进行下一步处理;(A22)对于每一个合并请求,先并行且独立进行与每个子Map的比较操作;(A23)当一个合并请求的子Map都比较完成后,进行比较结果的合并,选取所有比较结果最大的匹配分值;(A24)如果这个最大的匹配值大于设定门限,则表明与现有的类匹配,进行现有类的更新操作,并将新的特征值ID附加到匹配的类中;当前元素处理完毕后跳转到步骤(A21),否则进行步骤(A25);(A25)新建类,首先检查是否达到最大的Map容量,如果没有达到,直接进行步骤(A27),否则进行步骤(A26);(A26)选择当前已存在的类中聚类结果集合特征值记录个数最少,且小于当前新加类的特征记录个数的类,将其删除以空出新的存储空间;(A27)新建立聚类结果元素,并将当前特征值ID集合及代表特征向量赋值给这个新的聚类结果。

还包括动态备份存储与恢复处理,其具体为:在聚类开始时,从数据库中读取初级任务切分的结果及状态,进行初级预聚类状态的恢复;从数据库中读取聚类合并的状态和数据,进行聚类合并状态的恢复;在聚类的处理过程中,每完成一次聚类预处理及每完成一次合并,向数据库中存入当前的中间结果信息。

本发明的目标是实现快速且内存消耗可控的海量特征的向量的聚类的预处理,综合考虑所有有利条件(允许少量可接受的错误率)及限制条件 (高运算速度,低内存消耗,可高靠性,支持离线分析和实时分析),本发明专利提出了如下方法:

在总体上,本发明提供的方法的方案结构如图1所示,

本发明通过两级线程池,其中初级预处理线程池进行简单的预聚类,并交由次级的合并线程进行次级的聚类合并,通过这样的设计,最大程度的提高算法的并行性,消除直接聚类分析中聚类的比较过程与聚类的更新过程之间的同步需求带来的运算阻塞。

本发明的两级Map的存储结构,将大的聚类结果Map进行划分成子Map,子Map的合并比较操作并行进行,且当涉及到Map更新时,一个子Map的比较操作阻塞影响被限制在子Map内部,阻塞对并行运算影响降低了几个数量级,通过这样,最大程度的提高合并过程中的算法并行度。

两级线程池及两级聚类Map的设计,除了实现了极高的并行度之外,同时也极大的降低了聚类过程所需要的运算量。简单的直接聚类算法是一个N2,假设其中所有数据都不相同,那么两级合并完成后,算法总复杂度依然是N2,在本次设计中采用了新的代表特征向量y(new) = ((n-1)x + y(org)) / n 算法。原来比较n次的复杂度来确定一个类,现在只需要比较1次,子Map管理的类个数一定小于或等于源数据量,所以总的计算复杂度一定小于或等于N2

通过初级的预聚类的任务切分调度及聚类Map的数据结构的设计,将内存等资源的使用限制在可控制的范围。

通过多级的任务切分,将大规模的聚类运算划分为小规模的聚类运处的集合。

在一实施例中,本发明快速聚类算法中包含一个初级聚类任务切分调度模块,其核心的步骤如下:

1:根据内存资源的消耗上限,设定聚类线程池队列的最大长度。

2:检查队列中已有的任务块,如果队列未达到其在步骤1中设定的最大长度,调度模块从特征值数据库中读取长度为P(P不大于最大长度)的数据,并组装成一个任务请求放置到队列中。

3:如查到队列长度达到最大值,则等待聚类线程池的线程从队列中取出任务请求,以便队列不再满。

4:反复进行2和3两个步骤,直到数据都处理完毕为止。

本发明包含一个预聚类线程池,其核心的处理逻辑和步骤如下:

1:从任务切分调度模块中获取任务块,如果没有获取成功,则等待,成功之后便进行后续步骤。

2:初始化一个聚类结果Map,并遍历任务块中指定的有限个元素,对于每一个元素,执行如下逻辑:

1)每取到一个特征向量,跟当前所有子Map中的已聚类结果进行比较,比较将产生两个结果:与Map中的某个类匹配和不能够匹配Map中的任一已存在的类;

2)如果匹配,则将当前特征值增加到已存在的这个类中;

3)如果不匹配,则新建一个类,并将当前特征值作为这个类的第一个特征值;

4)反复进行2)和3)两个步骤,直到任务块中指定的有限个元素都处理完毕为止;

5)处理完后,向次级合并线程池发送合并请求。

本发明专利包含了一个两级聚类合并的Map缓冲区,其结构如图2所示:

两级Map存储结构中,设计了一个两级Map的存储结构,使聚类比较与聚类更新的之间的阻塞影响趋近为0:

1:按固定的切换粒度n将所有的聚类结果划分成m份,其中每一份都生成为一个子Map,以所有子Map为元素组合成一个大Map;

2: 子Map的每一个元素为一个聚类过程形成的最终的结果类,每个类的包含以下两个关键信息:

1)所有聚类成这个类的原始特征值存储ID(注意是id而不是特征值本身);

2)这个类的代表特征值向量。

3:第2个关键点中提到的代表特征值向量,按以下过程形成:

1) 当向当前类中新增加特征值向量时,如果是第一个特征值向量,则将此向量作为这个类的代表特征向量;

2)如果新增加特征向量时,是第x个特征向量(x!=1),设原始的代表特征向量为y(org),则新的代表特征向量y(new) = ((n-1)x + y(org)) / n。

在图2所示的两级Map数据结构上,合并线程池进行如下的逻辑处理过程:

1:每一个合并线程都独立运行,每个线程不断的尝试获取合并请求,如果请求队列为空,则进行等待,如果不为空,则进行下一步处理。

2:对于每一个合并请求,先并行且独立进行与每个子Map的比较操作。

3:当一个合并请求的子Map都比较完成后,进行比较结果的合并,选取所有比较结果最大的匹配值。

4:如果这个最大的匹配值大于设定门限,则表明与现有的类匹配,进行现有类的更新操作,进行代表特征值更新操作,并将新的特征值ID附加到匹配的类中,当前元素处理完毕后转到步骤1;否则进行步骤5。

5:表示需要新建类,首先检查是否达到最大的Map容量,如果没有达到,直接进行步骤7,否则进行步骤6。

6:选择当前已存在的类中,聚类的结果集合特征值记录个数最少且小于当前新加类的类。将其删除以空出新的存储空间。

7:新建立聚类结果元素,并将当前特征值ID集合及代表特征向量赋值给这个新的聚类结果。

8:回到步骤1。

9:按1-8的步骤反复处理,维持结果Map大小在设定的规模,直到所有合并请求处理完毕。

本发明专利包含的一个动态备份存储与恢复机制,其关键的步骤如下:

1:在聚类开始时,从数据库中读取初级任务切分的结果及状态,进行初级预聚类状态的恢复。

2:从数据库中读取聚类合并的状态和数据,进行聚类合并状态的恢复。

3:在聚类的处理过程中,每完成一次聚类预处理及每完成一次合并,向数据库中存入当前的中间结果信息。

将聚类运算过程通过两级调度设计,划分为预聚类与聚类合并两个步骤,并通过两级线程池设计,达到极高的计算并行度。

本发明从基本的直接聚类算法出发,结合分类的准确性的运行速度,内存消耗的,容错恢复等各方面因素的考虑,设计了一种同时适用于离线分析实时分析的、快速且内存需求低的海量特征向量的快速动态(动态指不需要已知类型数目)聚类预处理方法;通过多级调度及对结果集的总量控制,并通过代表特征向量的机制,将内存的需求降低一个数量级。

以上内容是结合具体的优选实施方式对本发明所作的进一步详细说明,不能认定本发明的具体实施只局限于这些说明。对于本发明所属技术领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干简单推演或替换,都应当视为属于本发明的保护范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1