萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> 編程語言綜合 >> 利用Python實現簡單的相似圖片搜索的教程

利用Python實現簡單的相似圖片搜索的教程

   利用Python實現簡單的相似圖片搜索的教程

        這篇文章主要介紹了利用Python實現簡單的相似圖片搜索的教程,文中的示例主要在一個圖片指紋數據庫中實現,需要的朋友可以參考下

2015423113218600.jpg (690×197)
大概五年前吧,我那時還在為一家約會網站做開發工作。他們是早期創業公司,但他們也開始擁有了一些穩定用戶量。不像其他約會網站,這家公司向來以潔身自好為主要市場形象。它不是一個供你鬼混的網站——是讓你能找到忠實伴侶的地方。

  由於投入了數以百萬計的風險資本(在US大蕭條之前),他們關於真愛並找尋靈魂伴侶的在線廣告勢如破竹。Forbes(福布斯,美國著名財經雜志)采訪了他們。全國性電視節目也對他們進行了專訪。早期的成功促成了事業起步時讓人垂涎的指數級增長現象——他們的用戶數量以每月加倍的速度增長。對他們而言,一切都似乎順風順水。

  但他們有一個嚴重的問題——色情問題。

  該約會網站的用戶中會有一些人上傳色情圖片,然後設置為其個人頭像。這種行為破壞了很多其他用戶的體驗——導致很多用戶取消了會員。

  可能對於現在的一些約會網站隨處可見幾張色情圖片也許並不能稱之為是問題。或者可以說是習以為常甚至有些期待,只是一個被接受然後被無視的在線約會的副產品。

  然而,這樣的行為既不應該被接受也應該被忽視。

  別忘了,這次創業可是將自己定位在優秀的約會天堂,免於用戶受到困擾其他約會網站的污穢和垃圾的煩擾。簡而言之,他們擁有很實在的以風險資本作為背後支撐的名聲,而這也正是他們需要保持的風格。

  該約會網站為了能迅速阻止色情圖片的爆發可以說是不顧一切了。他們雇傭了圖片論壇版主團隊,真是不做其他事只是每天盯著監管頁面8個小時以上,然後移除任何被上傳到社交網絡的色情圖片。

  毫不誇張的說,他們投入了數萬美元(更不用說數不清的人工小時)來解決這個問題,然而也僅僅只是緩解,控制情況不變嚴重而不是在源頭上阻止。

  色情圖片的爆發在2009年的七月達到了臨界水平。8個月來第一次用戶量沒能翻倍(甚至已經開始減少了)。更糟糕的是,投資者聲稱若該公司不能解決這個問題將會撤資。事實上,污穢的潮汐早已開始沖擊這座象牙塔了,將它推翻流入大海也不過是時間問題。

  正在這個約會網站巨頭快要撐不住時,我提出了一個更魯棒的長期解決方案:如果我們使用圖片指紋來與色情圖片的爆發斗爭呢?

  你看,每張圖片都有一個指紋。正如人的指紋可以識別人,圖片的指紋能識別圖片。

  這促使了一個三階段算法的實現:

  1. 為不雅圖片建立指紋,然後將圖片指紋存儲在一個數據庫中。

  2. 當一個用戶上傳一份新的頭像時,我們會將它與數據庫中的圖片指紋對比。如果上傳圖片的指紋與數據庫任意一個不雅圖片指紋相符,我們就阻止用戶將該圖片設置為個人頭像。

  3. 當圖片監管人標記新的色情圖片時,這些圖片也被賦予指紋並存入我們的數據庫,建立一個能用於阻止非法上傳且不斷進化的數據庫。

  我們的方法,盡管不十分完美,但是也卓有成效。慢慢地,色情圖片爆發的情況有所減慢。它永遠不會消失——但這個算法讓我們成功將非法上傳的數量減少了80%以上。

  這也挽回了投資者的心。他們繼續為我們提供資金支持——直到蕭條到來,我們都失業了。

  回顧過去時,我不禁笑了。我的工作並沒持續太久。這個公司也沒有堅持太久。甚至還有幾個投資者卷鋪蓋走人了。

  但有一樣確實存活了下來。提取圖片指紋的算法。幾年之後,我把這個算法的基本內容分享出來,期望你們可以將它應用到你們自己的項目中。

  但最大的問題是,我們怎麼才能建立圖片指紋呢?

  繼續讀下去一探究竟吧。

  即將要做的事情

  我們打算用圖片指紋進行相似圖片的檢測。這種技術通常被稱為“感知圖像hash”或是簡單的“圖片hash”。

  什麼是圖片指紋/圖片哈希

  圖片hash是檢測一張圖片的內容然後根據檢測的內容為圖片建立一個唯一值的過程。

  比如,看看本文最上面的那張圖片。給定一張圖片作為輸入,應用一個hash函數,然後基於圖片的視覺計算出一個圖片hash。相似的圖片也應當有相似的hash值。圖片hash算法的應用使得相似圖片的檢測變得相當簡單了。

  特別地,我們將會使用“差別Hash”或簡單的DHash算法計算圖片指紋。簡單來說,DHash算法著眼於兩個相鄰像素之間的差值。然後,基於這樣的差值,就建立起一個hash值了。

  為什麼不使用md5,sha-1等算法?

  不幸的是,我們不能在實現中使用加密hash算法。由於加密hash算法的本質使然,輸入文件中非常微小的差別也能造成差異極大的hash值。而在圖片指紋的案例中,我們實際上希望相似的輸入可以有相似的hash輸出值。

  圖片指紋可以用在哪裡?

  正如我上面舉的例子,你可以使用圖片指紋來維護一個保存不雅圖片的數據庫——當用戶嘗試上傳類似圖片時可以發出警告。

  你可以建立一個圖片的逆向搜索引擎,比如TinEye,它可以記錄圖片以及它們出現的相關網頁。

  你還可以使用圖片指紋幫助管理你個人的照片收集。假設你有一個硬盤,上面有你照片庫的一些局部備份,但需要一個方法刪除局部備份,一張圖片僅保留一份唯一的備份——圖片指紋可以幫你做到。

  簡單來說,你幾乎可以將圖片指紋/哈希用於任何需要你檢測圖片的相似副本的場景中。

  需要的庫有哪些?

  為了建立圖片指紋方案,我們打算使用三個主要的Python包:

  PIL/Pillow用於讀取和載入圖片

  ImageHash,包括DHash的實現

  以及NumPy/SciPy,ImageHash的依賴包

  你可以使用下列命令一鍵安裝所需要的必備庫:

  ?

1 $ pip install pillow imagehash

  第一步:為一個圖片集建立指紋

  第一步就是為我們的圖片集建立指紋。

  也許你會問,但我們不會,我們不會使用那些我為那家約會網站工作時的色情圖片。相反,我創建了一個可供使用的人工數據集。

  對計算機視覺的研究人員而言,數據集CALTECH-101 是一個傳奇般的存在。它包含來自101個不同分類中的至少7500張圖片,內容分別有人物,摩托車和飛機。

  從這7500多張圖片中,我隨機的挑選了17張。

  然後,從這17張隨機挑選的圖片中,以幾個百分點的比例隨機放大/縮小並創建N張新圖片。這裡我們的目標是找到這些近似副本的圖片——有點大海撈針的感覺。

  你也想創建一個類似的數據集用於工作嗎?那就下載CALTECH-101 數據集,抽取大概17張圖片即可,然後運行repo下的腳本文件gather.py。

  回歸正題,這些圖片除了寬度和高度,其他各方面都是一樣的。而且因為他們沒有相同的形狀,我們不能依賴簡單的md5校驗和。最重要的是,有相似內容的圖片可能有完全不相同的md5哈希。然而,采取圖片哈希,相似內容的圖片也有相似的哈希指紋。

  所以趕緊開始寫代碼為數據集建立指紋吧。創建一個新文件,命名為index.py,然後開始工作:

  ?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # import the necessary packages from PIL import Image import imagehash import argparse import shelve import glob   # construct the argument parse and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-d", "--dataset", required = True, help = "path to input dataset of images") ap.add_argument("-s", "--shelve", required = True, help = "output shelve database") args = vars(ap.parse_args())   # open the shelve database db = shelve.open(args["shelve"], writeback = True)

  要做的第一件事就是引入我們需要的包。我們將使用PIL或Pillow中的Image類載入硬盤上的圖片。這個imagehash庫可以被用於構建哈希算法。

  Argparse庫用於解析命令行參數,shelve庫用作一個存儲在硬盤上的簡單鍵值對數據庫(Python字典)。glob庫能很容易的獲取圖片路徑。

  然後傳遞命令行參數。第一個,—dataset是輸入圖片庫的路徑。第二個,—shelve是shelve數據庫的輸出路徑。

  下一步,打開shelve

copyright © 萬盛學電腦網 all rights reserved