图像检索:图像拷贝检索PHash改进方案
感知哈希是用來做圖像拷貝檢索(Copy Detection)最容易操作的一種方法,實際上除了感知哈希、均值哈希,還有很多的從圖像本身出發(fā)計算出來的圖像哈希值,在OpenCV 3.3及其以后的版本中,包含了很多圖像哈希的計算方法,具體的可以參考The module brings implementations of different image hashing algorithms,其中各種圖像哈希方法對8種不同變化的抗干擾程度,文檔中做了一個很好的總結(jié):
從圖中可以看到,Phash具備較好的對不同變化的抗干擾性,因為在一般要求不高的圖像拷貝檢索場景中,應用得較多。下面小白菜就PHash的原理(計算步驟)、在使用中存在的問題以及改進方案做一個記錄與總結(jié)。
PHash原理
感知哈希(Perceptual Hash, PHash)比均值哈希要穩(wěn)健,PHash使用DCT將圖像由空域轉(zhuǎn)為頻域,并對頻域的低頻成分進行散列化。PHash算法可分為以下幾個步驟:
注意:在保留左上角的8*8矩陣的時候,不一定非得是最左上角,可以往右下移一個或幾個像素。下面是采用PHash做拷貝檢索結(jié)果:
可以看到,對于上面查詢,PHash能夠獲得很好的拷貝檢索準確率,但是PHash除了上面圖表所示的對椒鹽噪聲、旋轉(zhuǎn)幾乎不具有抗干擾特性外,還有其他的方面的一些局限。
PHash的局限:PHash為了容忍圖像的一些形變而只取了圖像的低頻部分,從而造成了特征捕獲不到圖像的細節(jié)部分,使得對于純色或者近似純色圖像在做查重的時候并不是很理想。具體地說,由于PHash取的是dct的左上角部分,屬于低頻成分,也就是關(guān)注的是圖像的大致外形,沒有關(guān)注細節(jié),所以對于純色圖片或者近似純色圖片,就沒法捕獲到它的輪廓細節(jié),導致對純色圖像或者近似純色圖片的查重準確率不高。一種改進的方式是:把這個取的部分往右下移,這樣就可以獲得圖像的輪廓細節(jié),純色圖像或者近似純色圖片查重準確率就會提升,壞處就是輪廓細節(jié)取多了,容忍細節(jié)變化就小了,導致圖像容忍的形變變小,但是這種思路是值得借鑒的。
PHash特性
PHash對噪聲、模糊、jpeg壓縮等具備較好的不變性,此外,在實際應用中還有另一類變換也是值得非常關(guān)注的,即對圖像做水平鏡像操作。PHash對鏡像不具備不變性,可以通過一個簡單的實驗予以驗證。
實驗過程:測試了兩對圖片,每一對圖片包含圖片自身,已經(jīng)其對應的鏡像圖片(圖片對的大小是一樣的,說明為jpeg壓縮影響),分別計算圖片對之間的距離,一對算出來的距離是35,一對算出來的是33。說明PHash對鏡像無召回能力。
既然談到了圖像的鏡像變換,我們不妨對PHash、基于SIFT特征的Fisher Vector以及DL相似特征對鏡像變換是否有不變形做一個整理:
| PHash特征 | 鏡像 | 否 | 見上面說的驗證過程 |
| FV特征 | 鏡像 | 很弱 | SIFT對鏡像不具備不變性,故FV對鏡像召回能力很弱,具體參考論文Flip-Invariant SIFT for Copy and Object Detection |
| DL相似特征 | 鏡像 | 是 | 由于DL相似特征在訓練的時候,數(shù)據(jù)增強里面包含鏡像,DL相似特征對鏡像具備旋轉(zhuǎn)特性,檢索顯示的top@K里面,可以找回鏡像的視頻,見結(jié)果鏡像檢索結(jié)果 |
PHash改進方案
在前面已經(jīng)提到了PHash對于純色或近似純色圖像做拷貝檢索存在的缺陷,當DCT進行散列化時如果選取的DCT的頻率過低,則對純色或近似純色圖像的拷貝檢索存在badcase,如下圖所示:
從上圖可以看到,由于查詢圖像是接近純色的圖片,導致取得DCT的低頻只能捕獲到圖像的大致外觀,因而很多接近純色的圖片到排在了前面。對這類case的改進優(yōu)化,我們知道無論是取低頻還是高頻部分做散列化都不合適,如果只取高頻,則會影響正常圖片的召回。因此,比較容易想到的一種改進方式是:對于正常的圖片,只需采用低頻DCT哈希值做排序;對于純色或近似純色圖像,先用低頻DCT哈希值檢索排序,然后再用高頻DCT哈希值檢索再做重排。這種改進方式的好處是顯而易見的,對于每一張圖片,只需要額外增加64個比特位的存儲空間,并且不用對整個拷貝檢索的架構(gòu)做很大的調(diào)整,我們所要做的就是再計算一下高頻DCT的哈希值,并且增加一個對純色或接近純色的檢索服務,就能使PHash在圖像拷貝檢索上獲得較大的精度提升,同時又不至于較大的減少召回。
對于圖像純色或接近純色的檢索,小白菜以為應該做得輕巧簡潔,因為本身PHash做拷貝檢索就是一個很輕量的服務,如果圖像純色或接近純色的檢索做的過重,比如用DL對圖像純色與非純色進行分類,就失去了用PHash做拷貝檢索的意義,另外采用還需消耗大量的GPU,因而圖像純色或接近純色的服務越輕巧越好。下面小白菜提供的一個極輕量的圖像純色或接近純色的檢索方法:
cv::Mat imGray = cv::imread("123.jpg", CV_LOAD_IMAGE_GRAYSCALE);int histSize = 256; float range[] = {0, 255} ; const float* histRange = {range}; cv::Mat hist; cv::calcHist(&imGray, 1, 0, cv::Mat(), hist, 1, &histSize, &histRange);cv::Mat idx; cv::sortIdx(hist, idx, CV_SORT_EVERY_COLUMN + CV_SORT_DESCENDING); cv::sort(hist, hist, CV_SORT_EVERY_COLUMN + CV_SORT_DESCENDING);float maxFre = hist.at<float>(0,0); float secFre = hist.at<float>(0,1); float allFre = cv::sum(hist)[0];float ratio1 = (maxFre + secFre)/allFre; if(ratio1 >= 0.51){cout << "pure image" << endl; }根據(jù)灰度測試的結(jié)果,在閾值為0.51時,粗略評估對于純色或接近純色圖像的召回率至少在85%以上,準確率在90%以上,檢測速度在10ms左右。這里,對于召回率和準確率的要求是,召回越高越好,對準確率的要求可以相對低一點,因為我們的目的是要改善純色或接近純色圖像的拷貝檢索的準確率,可以小幅犧牲點非純色圖像拷貝檢索的召回。
改善性能驗證
按上述所提的改進方案重排后,即:
- 對于一個查詢,先使用低頻分量DCT哈希值進行排序;
- 對查詢圖像進行純色或者近似純色圖像檢測,如果不是純色或者近似純色圖像,當前排序結(jié)果為最終拷貝檢索排序結(jié)果;
- 如果是純色或者近似純色圖像,使用高頻DCT哈希值對初排結(jié)果進行重新排序,對重排序結(jié)果只保留漢明距離只小于等于某一閾值的那些結(jié)果,將其作為最終排序結(jié)果;
下面是上面查詢圖像采用該改進方案重排后的一個結(jié)果,如下圖所示:
從上面可以看到,經(jīng)過重排后,對于純色或者接近純色圖像的拷貝檢索,結(jié)果有了很大的提升,實際中測試了很多的case,發(fā)現(xiàn)都能夠獲得很好的改善。
總結(jié)
在本篇文章中,小白菜就PHash的原理、存在的缺陷以及改進的方案做了詳細的總結(jié),這個問題的存在以及想到的解決方法并不是憑空產(chǎn)生和獲得的,而是實際應用中確確實實會存在這樣或那樣的問題,需要不斷從原理上推敲,然后反復進行實驗。當然對PHash的改進應該有非常多,這種改進方案不一定是最好的,但是可以值得借鑒,希望對有需要的同學有所幫助或者啟發(fā)。
from:?http://yongyuan.name/blog/improve-phash-for-copy-detection.html?
總結(jié)
以上是生活随笔為你收集整理的图像检索:图像拷贝检索PHash改进方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 视觉检索:视频多帧排序
- 下一篇: 深度学习:Neural Network