IN HADOOP處理圖像使用的MapReduce HIPI:
HIPI是Hadoop的圖像處理接口。這提供了一套工具和Inputformat來處理使用Hadoops分發文件系統(HDFS)和Mapreduce的大量圖像。
STPES參與其中:
在HIPI整個過程可以在被分類至2份。
1)將所有圖像轉換爲大容量文件(HIPI Image Bundle)。
2)使用HIPI的圖像輸入格式處理創建的圖像批量文件。 剔除(卡勒類)是使用過濾掉具有低清晰度的圖像或缺陷
問題同HIPI:
爲了模擬我的散裝圖像處理的情況下,我使用的java程序來創建相同的圖像的多個拷貝在一個目錄中使用不同的名稱。然後通過使用HIPI的實用程序,我將所有圖像轉換爲大容量文件(在HIPI中稱爲HIP文件)。
要檢查所有圖像是否存在於批量文件中,我完成了相反的過程(將HIP文件轉換爲多個圖像)。還有另一個實用工具可以做同樣的事情。但我沒有收回所有圖像,並發現使用HIPI我丟失了一些圖像。
我無法使用HIPI繼續使用我的POC,並想到創建一個使用mapreduce處理批量圖像的新框架。
新的圖像處理框架:
爲了避免產卵多張地圖(每個文件中的每個)我們必須做的像HIPI做,那就是,所有的圖像轉換成一個單一的包文件。
該包文件作爲map-reduce的輸入。圖像輸入格式解析包文件並創建與每個圖像對應的緩衝圖像對象。
影像輸入格式重要的類:
圖像合成:
在到單個包文件結合多個圖像。
ImageInputFormat:
返回ImageRecordRreader和管理分裂
ImageRecordReader: 管理讀取每個分割。 將文件指針的初始搜索執行到每個分割的開始處。 nextKeyValue()方法從分割中讀取每個圖像並轉換爲BufferedImage。 BufferedImageWritable:
由於map reduce的鍵值類應該是可寫的可序列化類型,所以我們無法將BufferedImage直接保留爲map方法中的值。 這是一個只包含BufferedImage的包裝類。
BufferedImageWritable { BufferedImage img;
@Override
public void readFields(DataInput arg0) throws IOException {
}
@Override
public void write(DataOutput arg0) throws IOException {
}
@Override
public int compareTo(byte[] o) {
return 0;
}
}
未實現readFiled(),write()方法,因爲在我的情況的compareTo()方法,我不想存儲法師回HDFS。
如果您想要回寫HDFS中的任何圖像(在map或reduce中),您可能必須實現所有這些方法。在write()中,您可能需要編寫邏輯來存儲圖像,就像我們在創建批量文件時用於寫入圖像一樣。 readFiled()應該包含write()的相反邏輯。 compareTo()不需要實現,因爲我們從不將這個圖像保存爲map-reduce中的關鍵字(在map-reduce的排序過程中調用compareTo())。
由於您將圖像作爲BufferedImages(用於圖像處理的常見Java類)獲取圖像,因此很容易在其上執行大部分操作。但是在HIPI的情況下,圖像的值可以像Hipi的FloatImage類一樣在地圖的值中使用,並且您可能會感到操作難度高。
我已經成功地使用這個自定義輸入格式和OpenCV實現了facedetection程序。
,我用於開發相同的代碼將在GitHub
很快共享http://worldofbigdata-inaction.blogspot.in/2017/02/processing-images-in-hadoop-using.html
多一個選項是:3.對於每個對象創建sequencefile。 Sequensfile將爲每個對象圖像包含一個鍵值對。在這裏,我不知道如何告訴MapReduce只給一個映射器提供序列文件。 – sunillp 2012-01-12 09:31:08