14

我正在尋找一種對主要由文本組成的掃描頁面進行分類的方法。python中的圖像分類

這裏是我的問題的細節。我有大量的掃描文檔,需要檢測這些文檔中是否存在特定類型的頁面。我打算將文檔「爆裂」到他們的組件頁面中(每個頁面都是一個單獨的圖像),並將這些圖像分類爲「A」或「B」。但我無法弄清楚這樣做的最佳方法。

更多細節:

  • 我有 「A」 和 「B」 的圖像(頁)的例子不勝枚舉,所以我可以做監督學習。
  • 目前還不清楚如何從這些圖像中爲訓練提供最好的特徵。例如。這些功能是什麼?
  • 頁面偶爾略微旋轉,所以如果分類對旋轉和(較小程度上)縮放比較不敏感,那將會很好。
  • 我想要一個跨平臺的解決方案,理想情況下使用純Python或使用通用庫。
  • 我想過使用OpenCV,但這看起來像一個「重量級」解決方案。

編輯:

  • 的「A」和「B」的網頁的區別在於「B」的頁面具有相同的一般結構上他們的形式,包括條形碼的存在。 「A」頁面是自由文本。
+0

它們有什麼不同?字體?尺寸?你可以只是OCR的一部分(標題或作者在頭?) – 2010-10-11 13:42:09

+0

尼克,我添加了一個編輯澄清。其實,我的目標是在B頁之後扔掉所有東西,因爲我不必OCR它們。所以,我真的需要在做任何OCR之前檢測它們。 – Kyle 2010-10-11 13:51:30

+3

這是一個相當困難的問題 - 除非你的集合確實是巨大的,豈不是更容易只是人工分類的網頁爲'A'或'B'?您可以編寫一個小GUI應用程序來輪流顯示它們,這樣您就可以每頁按一個鍵。 – katrielalex 2010-10-11 13:53:45

回答

4

首先,我想說的是,在我看來,OpenCV是用於這些操作的非常好的工具。而且,它有一個很好描述的Python界面here

OpenCV經過高度優化,您的問題不是一件容易的事情。

[GLOBAL編輯:我的想法重組]

下面是可以使用的功能的幾個想法:

  • 爲了檢測條形碼,你也許應該嘗試做一個距離變換(DistTransform在OpenCV中)如果條形碼是孤立的。也許你可以通過match或matchShapes找到興趣點。我認爲這是可行的,因爲條形碼shoudl具有相同的形狀(大小等)。興趣點的分數可以用作特徵。

  • 由於您擁有不同種類的全局結構,圖像的時刻在這裏可能很有用。這將是用於製造&頁數b之間的區別(見there爲OpenCV的功能)(你會得到的方式不變描述:))

  • 你也許應該嘗試計算vertical gradienthorizontal gradient也許足夠了。條形碼是vertical gradient == 0和horizontal gradient!= 0的特定位置。這一主要優勢是這些操作的成本較低,因爲您的目標只是檢查頁面上是否存在這樣的區域。你可以找到目標區域,並使用其得分爲特徵

一旦你有你的特點,你可以嘗試做supervised learning和試驗推廣。你的問題需要很少false negative(因爲你要扔掉一些頁面),所以你應該用ROC曲線評估你的表現,仔細看看敏感度(應該很高)。 對於分類,您可以使用套索懲罰的迴歸來找到最佳特徵。 Whatnick的帖子也給出了商品的想法和其他描述符(可能更一般)。

2

所以你希望能夠區分使用特定元素的兩種頁面 - 基本上是條形碼的存在。有兩個步驟:

  1. 特徵提取(計算機視覺):找到興趣點或線,將條形碼的特定功能,而不是文字。

  2. 二元分類(統計學習):根據提取的特徵確定是否存在條形碼。


與第一步打交道,你一定要看看在Hough transform。識別圖像中的線條非常理想,並且可能對條形碼檢測有用。例如,閱讀這些two pages。這裏有examples與OpenCV。


關於第二個步驟中,最有用的分類將基於:

  • k個最近鄰
  • 迴歸
  • 隨機森林(真的很好R中實現,但我做的不知道Python)
+0

橙色學習套件具有我用之前,我發現在河的一個 – whatnick 2010-10-13 07:46:33

9

我會回答3部分,因爲你的問題顯然是一個大的問題,我會強烈建議手動方法與廉價的勞動力,如果頁面集合不超過1000

第1部分: 特徵提取 - 你有一個非常大的特色從物體檢測場進行選擇。由於您的要求之一是旋轉不變性,因此我會推薦SIFT/SURF類功能。你也可以找到哈里斯的角落等。決定使用哪些功能可能需要專業知識,如果您具有計算能力,我會建議創建一大堆功能並通過基於分類器訓練的重要性評估程序。

第2部分: 分類選擇 - 我是Random Forest分類的忠實球迷。這個概念非常簡單易懂,非常靈活且非參數化。調諧只需要很少的參數,您也可以在監督培訓期間以參數選擇模式運行。

第3部分: 實現 - Python本質上是一種膠水語言。用於圖像處理的純Python實現永遠不會很快。我建議將OpenCV用於特徵檢測,將R用於統計工作和分類器。

的解決方案似乎是過度設計,但機器學習從來就不是一個簡單的任務,即使頁面之間的區別很簡單,他們是一本書的左側和右側頁面。

+0

SIFT肯定是一個好主意,但在這種情況下,我們也許可以定義,因爲我們事先知道(存在更直接定製功能一個很好的隨機森林的實現條形碼或明文等)...(參見我的文章)。使用分類器培訓來發現如何結合我們的功能來給出答案是一個不錯的選擇。 (一般爲+1後) – ThR37 2010-10-11 15:00:33

+0

@wok:我認爲whatnick想提出這個問題的更一般的(乾淨)的方式,而不是在「我應該使用什麼功能?」的問題直接去更深。我們必須記住,條形碼不是解決這個問題的唯一方法,而是嘗試將不同的方式結合起來。在所有情況下,您的鏈接都非常有趣。 – ThR37 2010-10-11 15:44:36

+0

優秀的答案。我看到SIFT&SURF,但是,唉,我的應用程序是商業應用程序,SIFT已獲得專利。 – Kyle 2010-10-11 17:56:42

0

您可以嘗試由A和B的的訓練數據上傳到demo.nanonets.ai建立模型(免費使用)

1)在這裏上傳你的訓練數據:

demo.nanonets.ai

2)然後

import requests 
import json 
import urllib 
model_name = "Enter-Your-Model-Name-Here" 
url = "https://cdn.pixabay.com/photo/2012/04/24/12/13/letter-39694_960_720.png" 
files = {'uploadfile': urllib.urlopen(url).read()} 
url = "http://demo.nanonets.ai/classify/?appId="+model_name 
r = requests.post(url, files=files) 
print json.loads(r.content) 

3)的響應看起來像:

使用以下(Python代碼)查詢API
{ 
    "message": "Model trained", 
    "result": [ 
    { 
     "label": "A", 
     "probability": 0.97 
    }, 
    { 
     "label": "B", 
     "probability": 0.03 
    } 
    ] 
}