LIRE教程之源码分析 |LIRE Tutorial of Analysis of the Source Code

最近在做地理图像识别和检索的研究,发现了一个很好用的框架LIRE,遂研究了一通。网上的教程不算很多,而且LIRE更新比较快,一些方法已经更新或废弃,故想写几篇文章重新总结一下框架内的多种方法,方便他人使用。

LIRE(Lucene Image Retrieval)是一个开源的轻量级图像识别Java框架,提供了多种简单易用的图片检索方法。事实上,LIRE是基于Lucene这个全文检索引擎修改的,也沿用了该检索引擎的思路。

LIRE相关资料:

官网首页:http://www.lire-project.net/

下载地址:http://www.itec.uni-klu.ac.at/~mlux/lire-release/

Github:https://github.com/dermotte/LIRE

官方文档:https://github.com/dermotte/LIRE/blob/master/src/main/docs/developer-docs/docs/index.md

官方教程:http://www.semanticmetadata.net/wiki/

在进入正文之前,再推荐一下DaveBobo的博客,作者已经总结了不少方法,可以参考:https://blog.csdn.net/davebobo/article/category/6466512

在下载LIRE之后,同时也要确保Lucene相关的jar包没有缺失。


接下来进入正题。本文的内容是结合官方给出的Sample Application,完成图片的提取特征、索引生成、图片检索。下载地址:[LIRE Sample Application]

笔者使用的是Intellij Idea。首先导入工程。从左边的文件夹中,可以发现LIRE的class都在net.semanticmetadata.lire这个文件夹中,而官方给出的案例则在net.semanticmetada.sampleapplication中。

图片特征提取和索引生成

打开案例中的Index.java文件(Github),点击右上角的三角,修改Idea的配置文件,输入图片文件夹的路径。



运行,等待程序结束后发现右边文件夹多出了一个index文件。

事实上,这个程序是最基本的索引文件。其步骤是:

(1) 读取输入文件夹下所有的照片文件。

(2) 设置提取图片要素的方法和descriptors。

(3) 对图片进行特征提取并写入索引。

其中,重点在于图片特征的提取方法。根据源码,可以发现首先建立了一个GlobalFeatureBuilder。这相当于图片提取的容器,再设置了图片提取要素的方法,在这段源码中包括CEDD,FCTH,AutoColorCorrelogram这三种方法。事实上,除了这些方法之外,还可以参考lib/net.semanticmetadata.lire/imageanalysis/features/global这个文件夹下的其他类,这个文件夹下包括了LIRE中包含的全局要素提取方法。

GlobalDocumentBuilder globalDocumentBuilder = new GlobalDocumentBuilder(false, false);
globalDocumentBuilder.addExtractor(CEDD.class);
globalDocumentBuilder.addExtractor(FCTH.class);
globalDocumentBuilder.addExtractor(AutoColorCorrelogram.class);

接下来,只要使用GlobalDocumentBuilder.createDocument()方法就可以完成图片的特征提取。提取之后还需要建立索引,从而方便之后的图片检索。LIRE是建立在Lucene的基础上的,通过Lucene可以非常快速建立文档及其索引。新建一个IndexWriter,并将图片的特征写入其中。具体代码是下面这一段:

BufferedImage img = ImageIO.read(new FileInputStream(imageFilePath));
Document document = globalDocumentBuilder.createDocument(img, imageFilePath);
iw.addDocument(document);

即从本地上读取图片,再进行图片的特征提取,最后生成索引文件。

图片检索

在完成图片的特征提取之后,下一步是进行图片的检索,即给定一张图片,找出与这张图片最相似的图片。

打开案例中的Searcher.java文件(Github)。修改Idea配置文件,传入给定图片的路径。

运行之后可以发现输出了一串从小到大的分数及其具体的图片路径。分数越小说明该图片与给定图片越相似。如果分数为0说明两者一样。

这个程序是最基本的检索文件。其步骤是:

(1) 读取给定的图片。

(2) 读取之前生成的图片索引,寻找与给定图片最相似的图片。

(3) 输出相似度分数及具体的图片。

根据源码,可以发现使用了IndexReader读取了索引文件,之前是使用IndexWriter将这些索引文件写入了硬盘。

IndexReader ir = DirectoryReader.open(FSDirectory.open(Paths.get("index")));

接下来使用了ImageSearcher.search()方法寻找最相似的图片。其方法是使用CEDD方法对给定的图片进行特征提取,之后在索引中进行搜索。在这段代码中,返回与给定图片最相似的30张图片。ImageSearchHits即为最相似的图片,可以从中获取相似度分数和图片路径等。

ImageSearcher searcher = new GenericFastImageSearcher(30, CEDD.class);
ImageSearchHits hits = searcher.search(img, ir);

以上构成了一个完整的图片特征提取-生成索引-图片检索步骤,使用这两份代码已经满足基础的使用了。

LIRE教程之源码分析 | LIRE Tutorial of Analysis of the Source Code的更多相关文章

  1. 自定义View系列教程04--Draw源码分析及其实践

    深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...

  2. 模块化系列教程 | 深入源码分析阿里JarsLink1.0模块化框架

    1. 概述 1.1 模块动态加载卸载主流程 2. 模块动态加载 2.1 模块加载源码分析 2.1.1 AbstractModuleRefreshScheduler 2.1.2 ModuleLoader ...

  3. 著名的安装制作软件InnoSetup的源码及示例源码-The installation of a well-known software s source code and sample InnoSetup source

    @echo off rem Inno Setup rem Copyright (C) 1997-2007 Jordan Russell rem Portions by Martijn Laan rem ...

  4. 自定义View系列教程03--onLayout源码详尽分析

    深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...

  5. 自定义View系列教程02--onMeasure源码详尽分析

    深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...

  6. 小D课堂 - 新版本微服务springcloud+Docker教程_4-03 高级篇幅之Ribbon负载均衡源码分析实战

    笔记 3.高级篇幅之Ribbon负载均衡源码分析实战     简介: 讲解ribbon服务间调用负载均衡源码分析         1.完善下单接口         2.分析@LoadBalanced ...

  7. 同网页的WebRTC实现与源码分析

    基本按照Real time communication with WebRTC搭建(下面简称该网站为官方tutorial) 本文重视WebRTC的基于同页面通信的代码实现,主要讲述顺序是WebRTC的 ...

  8. jQuery源码分析系列

    声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://git ...

  9. Struts2 源码分析——前言

    笔者简言 笔者在博园里面注册是在二年前.可是那个时候我不知道要写些什么,也怕写出来被别人骂误人子弟.而现在却动笔了是因为前一段时间内我去参加一些大公司的面试,让笔者内心深处留下很多问号.最近三年来我一 ...

随机推荐

  1. 30G 的redis 如何优化

    突然发现我们的redis 已经用了30G了,好吧这是个很尴尬的数字因为我们的缓存机器的内存目前是32G的,内存已经告竭.幸好上上周公司采购了90G的机器,现在已经零时迁移到其中的一台机器上了.(跑题下 ...

  2. CentOS 7 Update GCC G++

    curl https://ftp.gnu.org/gnu/gcc/gcc-5.4.0/gcc-5.4.0.tar.bz2 -O echo "extracting files..." ...

  3. JS 获取鼠标坐标

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. java代码求输入数的平均值~~~~

    总结:1.谢谢程老师,一个很好的老师,人很普通,但是浑浊的世界里,那一份真实感动到底~~~~很感谢他 2.这里注意两个方面,也是我最大的弱点:循环和数组的length属性.前者运用不灵活,后者自己总是 ...

  5. 1130 Infix Expression

    题意:给出一个语法树(二叉树),输出相应的中缀表达式. 思路:很显然,通过中序遍历来做.通过观察,发现除了根结点之外的所有非叶结点的两侧都要输出括号,故在中序遍历时判断一下即可. 代码: #inclu ...

  6. json数据url传递到php后台

    1.js进行encodeURI jsonData = encodeURI(jsonData); 2.php进行urldecode $urldecodeJson = urldecode($json); ...

  7. Java面试(三)

    1  java中Exception 和 Error 区别 都是Throwable的子类.RuntimeException继承自Exception. Error和RuntimeException及其子类 ...

  8. web开发 那些年基于Redis的Provider库

    因为session基于本地cache,以前我们自己写分布式缓存,或者数据库存储,或者cookie加密存储,来保存用户状态信息,但较少的直接通过创建一个继承 SessionStateStoreProvi ...

  9. 解决:An internal error occurred during: "Launching New_configuration". Path for project must have only one segment.

    问题: 点击运行时eclipse报错如下: An internal error occurred during: "Launching New_configuration". Pa ...

  10. 0004-程序流程2之ui-router大意

    按照传统的操作方式,一般是点击某个按钮或者某个菜单项,我们将页面通过指定URL的方式跳转, 在HTML中,使用的是传统的a标签的href属性作跳转,在使用ui-router的情况下,我们对一个按钮 添 ...