最近在作地理圖像識別和檢索的研究,發現了一個很好用的框架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包沒有缺失。java
接下來進入正題。本文的內容是結合官方給出的Sample Application,完成圖片的提取特徵、索引生成、圖片檢索。下載地址:[LIRE Sample Application]
筆者使用的是Intellij Idea。首先導入工程。從左邊的文件夾中,能夠發現LIRE的class都在net.semanticmetadata.lire這個文件夾中,而官方給出的案例則在net.semanticmetada.sampleapplication中。
github
打開案例中的Index.java文件(Github),點擊右上角的三角,修改Idea的配置文件,輸入圖片文件夾的路徑。
運行,等待程序結束後發現右邊文件夾多出了一個index文件。app
事實上,這個程序是最基本的索引文件。其步驟是:框架
(1) 讀取輸入文件夾下全部的照片文件。源碼分析
(2) 設置提取圖片要素的方法和descriptors。ui
(3) 對圖片進行特徵提取並寫入索引。.net
其中,重點在於圖片特徵的提取方法。根據源碼,能夠發現首先創建了一個GlobalFeatureBuilder。這至關於圖片提取的容器,再設置了圖片提取要素的方法,在這段源碼中包括CEDD,FCTH,AutoColorCorrelogram這三種方法。事實上,除了這些方法以外,還能夠參考lib/net.semanticmetadata.lire/imageanalysis/features/global這個文件夾下的其餘類,這個文件夾下包括了LIRE中包含的全局要素提取方法。code
GlobalDocumentBuilder globalDocumentBuilder = new GlobalDocumentBuilder(false, false); globalDocumentBuilder.addExtractor(CEDD.class); globalDocumentBuilder.addExtractor(FCTH.class); globalDocumentBuilder.addExtractor(AutoColorCorrelogram.class);
接下來,只要使用GlobalDocumentBuilder.createDocument()方法就能夠完成圖片的特徵提取。提取以後還須要創建索引,從而方便以後的圖片檢索。LIRE是創建在Lucene的基礎上的,經過Lucene能夠很是快速創建文檔及其索引。新建一個IndexWriter,並將圖片的特徵寫入其中。具體代碼是下面這一段:blog
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);
以上構成了一個完整的圖片特徵提取-生成索引-圖片檢索步驟,使用這兩份代碼已經知足基礎的使用了。