APP下载

一种基于内容的海量图像检索框架的设计与实现

2016-05-18林文煜戴青云曹江中何小明

电脑知识与技术 2016年9期

林文煜++戴青云++曹江中++何小明++李能

摘 要:针对传统基于内容的图像检索系统在存储、处理、检索海量图像等方面的不足,借助Hadoop分布式技术和HBase面向列的数据库对海量数据出色的读写性能,提出了一种适用于海量图像数据存储与处理的检索框架。该框架提供处理图像数据的可序列化数据类型,并通过通用的输入模块实现海量图像的输入和数据类型转换,为现有的图像处理、特征提取等算法的并行处理提供可行的方案。

关键词: 海量图像; 检索框架; 并行处理

中图分类号:TP391 文献标识码:A 文章编号:1009-3044(2016)09-0212-04

Designed and Implementation of An Content-based Image Retrieval Framework for Magnanimity Image

LIN Wen-yu,DAI Qing-yun,CAO Jiang-zhong, HE Xiao-ming,LI Neng

(Guangdong University of Technology, Guangzhou 510006, China)

Abstract:With the advantage of the I/O performance of mass data of Hadoop distributed technology and HBase column oriented database, a new retrieval framework is put forword for overcoming the shortage of data storage, processing, real-time retrieval with a very large image database. The retrieval framework is applied to storing and processing the huge amounts of image data. It provides a serializable data type for image data processing, and inputs large image and converts data types by a general input module. Thus the framework can provide a feasible scheme for parallel processing of image processing and feature extraction algorithms.

Key words:magnanimity image; retrieval framework; parallel processing

伴随着计算机与移动电子设备的快速发展与广泛应用,各领域各行业的图像数据也日益增多。如何从海量的数字图像中快速有效地检索出有价值有意义的信息,成为了人们面临的一大难题,也促使了大量学者投身于图像检索技术的研究中。单从图像检索技术的发展而言,从基于文本标注的图像检索到现今各种基于图像内容的检索方法使得对图像特征的处理、特征提取、相似度比对等方面现已出现许多较为成熟的算法[1]。但对于海量图像的检索而言,除了对现有的图像的处理、表达与度量等方面的要求外,还增加了对海量图像数据存储的需求,以及对整个海量图像数据集的处理效率的要求。

传统的基于内容的图像检索,通过在单个计算机上以单线程对图像进行处理、特征提取,再将提取出的图像特征数据存入关系型数据库。在检索请求发起时,通过遍历关系数据库将查询图像的特征与全库特征进行比对并对比对结果进行排序,从而获得检索的结果。依赖单计算机的处理能力对现今图像数据增长的急速形势而言,传统的图像处理技术显然是杯水车薪。即使通过多线程技术来处理海量图像也不能完全解决对海量图像存储与处理效率的问题。随着大数据概念的兴起及其存储与处理技术的成熟,采用Hadoop技术与HBase技术的基于内容的海量图像框架,不仅可以解决海量图像的存储与数据传输的问题,还能将原本设计的图像检索算法直接移植到分布式环境中并行处理,依靠MapReduce集群的并行计算能力,实现对海量图像的检索。

海量图像中,超过八成的图像是容量在数MB以内的小文件,不适合使用HDFS等流式访问的大文件分布式存储技术。而基于HBase的海量图片存储技术方案,实现系统层的小文件合并、全局名字空间、并具有良好的通用性[2]。

1技术背景

1.1 基于内容的图像检索技术

针对图像本身的数据内容的操作与处理是基于内容的图像检索的重要特点。具体处理流程如图1所示。

对于图像特征的提取而言,虽然在实现的算法上各有不同,但处理对象都是图像数据,而算法提取的结果往往是能以文本表示的矩阵或数字。现有计算机的图像处理接口使得对数字图像数据的存储与读取简化为字节流的获取与输出,而基于内容的图像检索技术的研发人员专注于图像处理算法的研究,而不必在存储与读取图像方面耗费过多的精力与资源,这也是现今基于内容的图像检索技术快速发展的重要原因之一。

1.2 基于Hadoop的分布式技术

Hadoop的核心是HDFS分布式文件系统和MapReduce分布式计算框架,它提供了一系列分布式文件系统和通用的I/O的组件和接口,更提供了分布式数据处理的模式和执行环境。

MapReduce是一种用于数据处理的简单编程模型,支持包括Java、C++和Python等多种编程语言。在本质上,MapReduce的程序是并行化的,这意味着对大规模的数据分析能够在足够多的廉价机器上高效的并行执行。并行化处理大型数据集的能力正是MapReduce框架的最大优势。

1.3 HBase数据库

HBase是一个分布式的、持久的、强一致性的数据存储系统,性能优异的读写性能。它是列存储数据库,底层通过HDFS做数据存储,更支持MapReduce的批量式计算和随机查询。

HBase是用Java编写的,提供了原生的操作API,同时也支持用其他编程语音访问HBase。HBase的数据和坐标都是以字节数组的形式存储,这在间接上支持存储任意的数据类型。HBase只存放有内容的表格单元,数据文件的稀疏性非常适合存储文件数据[3]。

1.3常见的分布式图像检索框架

现在常见的分布式图像检索方法是部分分布式实现。部分分布式实现是指,通过借用传统的图像特征提取算法,将图像特征提取后存入关系数据库,再通过MapReduce处理文本化后的图像特征文件[4]。

面对海量的图像数据,没有把对图像的处理过程通过并行化技术来实现这将极大的影响整体的检索效率。不仅如此,面对图像来源的多变与不确定性是很难保证对图像数据的传输与存储,更无法对其进行并行处理与检索。

2框架设计与实现

2.1框架整体架构

Hadoop集群具有硬件成本低廉、集群规模灵活等优势,而其承载的MapReduce应用具有高效的并行计算能力。在框架的设计中也需要借助MapReduce框架的来开发对海量图像、图像特征数据的并行化处理程序,实现对海量图像数据的高效处理,既能以图像的可序列化数据类型将图像在分布式环境中存储、传输和操作,又能移植现有的成熟的图像特征提取等算法。为了对图像数据进行快速的查询与压缩式存储,存储图像的环境需要使用HBase面向列扩展的分布式数据库,图像以字节数组的形式存于其中,以较为出色的读写性能支撑分布式图像检索的运行。因此选择以HBase为数据存储库,以MapReduce程序实现并行处理模块,建立海量分布式图像检索框架。

检索框架主要分为图像输入模块、分布式集群模块和检索结果显示模块。图像输入模块以获取网络图像为基础,承载着采集图像文件并转换为设计的可序列化图像数据类型,随后转为字节数组存入HBase的图像表中等数据输入工作。分布式集群模块以可序列化的图像数据类型为接口,通过移植现有图像预处理、特征提取和相似度比对等算法实现并行化的图像检索。检索结果显示模块主要实现将相似度较高的一系列图像还原为图像文件,并显示或保存到指定计算机硬盘中。

框架整体架构如图2。

2.2可序列化的图像数据类型

2.2.1可序列化图像数据类型的用途和现状

序列化是指将结构化对象转为字节流以便于通过网络进行传输或写入持久存储的过程。可序列化的数据格式是指实现由Hadoop设计的紧凑、快速的接口Writable的类。Writable接口主要定义了一个二进制输入流方法和一个二进制输出流方法,MapReduce程序就是通过它来序列化键值对的值。针对Hadoop的Java基本封装类来说,大多是针对文本和数字数据的,而API中针对二进制数据的封装类BytesWritable由于底层是由int字段实现最长仅能容纳4字节的数据。因此要在Mapreduce程序中处理图像需要自定义序列化数据格式。

针对Hadoop的分布式图像处理,国内研究者大多是通过继承Hadoop的Java API提供的文件输入Fi1eInPutFormat类和文件输出格式FileOutputFormat类,将一个图像作为一个输入分片和输出分片,实现将图像文件转换为自定义的可序列化图像类型[5] -[7]。这样的实现一方面对输入路径和输入的图像文件数量存在限制,另一方面对自定义图像类型的设计不便于对图像进行处理。

2.2.2图像数据类型ImageWritable

对于可序列化的数据类型,除了要能适用分布式环境的传输和存储外,也要便于对数据的处理。因此系统设计的Hadoop API中基本的可序列化类型都有其对应的Java API基本数据类型,如Text类与String类对应。因此实现图像的数据类型若与图像处理常涉及的类相对应就能够便于并行式对图像的处理。在Java API 中BufferedImage类是处理图像最常用的类,而且它能将对象本身转换为字节数组,而字节数组又可以转化为Hadoop API的Text类型。Text类型是通过可变长的int型在字符串编码中存储字节数,最大值为2GB,这足够保存绝大多少的图片数据。此外,BufferedImage类带有图像常用的数据信息。

ImageWritable类的具体实现,如图3。其中ImageWritable的构造方法需由BufferedImage对象作参数;私有函数parseBytes实现将BufferedImage转换为字节数组,再通过字符数组可以转换为Text类型;用第二个Text类型保存图像文件的后缀名;用第三个Text类型保存获取图像的网址。

2.3 HBase的数据库设计

本框架针对的是海量图像的检索,除了要存储海量的图像内容的数据外,针对图像预处理后的图像数据,图像特征等相关数据,采用面向列扩展的HBase数据库进行存储。由于行键除了要求唯一性外还要求定长,因此建议将图像获取的路径或网址通过MD5摘要处理后的定长字段作为行键,而将获取图片的路径或网址作为一个列值存入。

HBase中单元格的默认块大小是64KB,但这是对于HBase的系统文件而言的。HBase对于列值是没有长度限定的。为了索引的性能,HBase仅会对行键的长度做检查,默认应该小于65536。由此可知,对于海量的小图像文件的数据而言,没有必要对图像的字节数组进行分段,这样将影响图片的存储和读取的效率。

对于图像检索的应用而言,HBase除了保存图像数据外,还可以保存预处理后的图像数据、提取后的图像特征等数据。对HBase的数据表设计见表1。

2.4图像输入模块

对于ImageWritable类来说只是MapReduce程序中一种键/值对中的值的数据类型,要将图像文件输入分布式文件系统或HBase数据库中,常规的做法是继承Hadoop API的文件输入格式类(FileInputFormat)。文件输入格式类以一个计算机本地图像文件为一个文件分片,再转换为自定义的可序列化类。

本框架的图像输入模块主要一个Web服务器和一个MapReduce程序。Web服务器具有文件上传和浏览等功能。MapReduce程序是实现图像数据获取和格式转换的工具。本地图像通过Web服务器就能转换为网络图像。再把一个记录网络图片地址的文本文件作为输入,在Map过程中通过获取文件流,生成BufferedImage对象,再将其转换为ImageWritable对象,最后可以通过SequenceFile文件保存到HDFS中。另外,也可以通过ImageWritable类获得对应的字节数组存入HBase的数据库表格中。针对图片输入模块将图像数据存入HDFS的MapReduce数据流如图4。

2.5分布式集群模块

框架中的分布式集群模块主要包括图片的预处理、图像特征提取以及特征相似度计算等MapReduce程序。由于有ImageWritable数据类型的支持,可以从HDFS或HBase中获取需要的图像数据,通过将现有选用的图像预处理的算法在Map过程中实现,将处理后的图像生成的BufferedImage对象构建出新的ImageWritable对象并通过Reduce过程写入HDFS的SequenceFile中或存入HBase数据库中。对于图像特征提取的MapReduce过程,与预处理不同的是MapReduce输出的是文本或数字类型的数据。相似度计算和排序的MapReduce程序的输入输出都是文本或数字的数据类型。分布式集群模块一种的实现见表2。

2.6检索结果的显示模块

检索结果显示模块主要是以某个输入图片为待检图片时,通过图像相似度计算和排序后,将相似度高的图像集合通过MapReduce程序从HBase数据库的表中读取对应的图像数据,并将其转换为BufferedImage对象,通过UI界面显示出来,还可将这些检索结果保存到计算机本地的硬盘上。

3 ImageWritable类的封装与实现

ImageWritable类是实现分布式图像检索框架的核心类。

首先要实现BufferedImage对象和byte[]对象的转换,这需用到图像文件的后缀名,一般可以从图像的网址中截取。代码如下:

private byte[] getBytes(BufferedImage image, String format) {

ByteArrayOutputStream baos

= new ByteArrayOutputStream();

try{

ImageIO.write(image, format, baos);

} catch (Exception e) {

e.printStackTrace();}

return baos.toByteArray();}

其中ImageIO类是Java API中常用的图像工具类,常用于读取或生成图像。

由于通过上面实现的getBytes方法可将BufferedImage对象转换为byte[]对象,而通过byte []对象可以建立Text对象。Text类是HadoopAPI的基础类,对数据的传输和存储由原生的接口保证正确性与可靠性。对于ImageWritable类实现的Writable接口的二进制读写流方法,示意代码如下:

public void readFields(DataInput arg0) throws IOException {

imagedata.readFields(arg0);

imageFormat.readFields(arg0);

imagePath.readFields(arg0);}

public void write(DataOutput arg0) throws IOException {

imagedata.write (arg0);

imageFormat.write (arg0);

imagePath.write (arg0);}

以上对ImageWritable类的封装与实现都是使用Java来编程实现的。

4结束语

本文提出了一种能够存储、处理和检索海量图像数据的图像检索框架。该框架以HBase为数据存储工具,并通过MapReduce程序并行化实现图像检索,解决了趋于成熟的多种图像检索方法无法存储、处理和检索海量图像的问题,具有数据输入灵活、处理数据量大,算法并行化的移植灵活等特点,适合应用于对现有的图像检索系统进行并行处理的重构。

参考文献:

[1] 李向阳, 庄越挺, 潘云鹤. 基于内容的图像检索技术与系统[J]. 计算机研究与发展,2001,38((3): 344-354.

[2] 朱晓丽, 赵志刚. 一种基于HBase的海量图片存储技术[J]. 信息系统工程,2013(8):22-24.

[3] 朱敏, 程佳, 柏文阳. 一种基于HBase的RDF数据存储模型[J]. 计算机研究与发展,2013,50((z1): 23-31.

[4] 王贤伟, 戴青云, 姜文超, 曹江中. 基于MapReduce的外观设计专利图像检索方法[J].小型微型计算机系统,2012,33((3): 626-632.

[5] 郑欣杰, 朱程荣, 熊齐邦. 基于MapReduce 的分布式光线跟踪的设计与实现[J].计算机工程,2007,33((22):83-85.

[6] 李倩, 施霞萍. 基于Hadoop MapReduce图像处理的数据类型设计[J]. 软件导刊,2012,11((4):182-183.

[7] 张良将, 宦飞, 王杨德. Hadoop云平台下的并行化图像处理实现[J]. 信息安全与通信保密,2012(10):59-62.