16

主にテキストで構成されるスキャンされたページを分類する方法を探しています。

これが私の問題の詳細です。スキャンされたドキュメントの膨大なコレクションがあり、これらのドキュメント内の特定の種類のページの存在を検出する必要があります。ドキュメントを構成ページ (それぞれが個別の画像) に「バースト」し、これらの各画像を「A」または「B」に分類する予定です。しかし、これを行う最善の方法がわかりません。

詳細:

  • 「A」と「B」の画像(ページ)の例がたくさんあるので、教師あり学習を行うことができます。
  • トレーニングのためにこれらの画像から特徴を最適に抽出する方法は私にはわかりません。たとえば、それらの機能は何ですか?
  • ページはときどきわずかに回転するため、分類が回転や (程度は低いが) スケーリングの影響を受けないようにするとよいでしょう。
  • 理想的には、純粋な python または共通ライブラリを使用したクロスプラットフォーム ソリューションが必要です。
  • 私は OpenCV の使用を考えましたが、これは「重い」ソリューションのようです。

編集:

  • 「A」ページと「B」ページの違いは、「B」ページには、バーコードの存在を含め、同じ一般的な構造を持つフォームがあることです。「A」ページはフリーテキストです。
4

4 に答える 4

9

あなたの問題は明らかに大きなものなので、3 つの部分に分けてお答えします。ページのコレクションが 1000 を超えない場合は、人件費の安い手動の方法を強くお勧めします。

パート 1: 特徴抽出 - オブジェクト検出フィールドから選択できる非常に多数の特徴があります。要件の 1 つは回転の不変性であるため、SIFT /SURF クラスの機能をお勧めします。ハリスコーナーなどが適している場合もあります。どの機能を使用するかを決定するには、専門知識が必要な場合があります。コンピューティング能力がある場合は、優れた機能のるつぼを作成し、それを分類子トレーニング ベースの重要度推定器に渡すことをお勧めします。

パート 2: 分類子の選択 - 私はランダム フォレスト分類子の大ファンです。この概念は非常に理解しやすく、柔軟性が高く、パラメトリックではありません。チューニングに必要なパラメーターは非常に少なく、教師ありトレーニング中にパラメーター選択モードで実行することもできます。

パート 3: 実装 - Python は本質的にグルー言語です。画像処理のための純粋な python 実装は、非常に高速になることは決してありません。特徴検出には OpenCV を、統計作業と分類子には R を組み合わせて使用​​することをお勧めします。

ソリューションは過剰に設計されているように見えるかもしれませんが、ページの違いが単に本の左側と右側のページであるというだけの場合でも、機械学習は決して簡単な作業ではありません。

于 2010-10-11T14:49:18.477 に答える
4

まず、私の考えでは、OpenCVはこの種の操作に非常に優れたツールであると言いたいと思います。さらに、ここで詳しく説明されているPythonインターフェイスがあります。

OpenCVは高度に最適化されており、問題は簡単ではありません。

[グローバル編集:私のアイデアの再編成]

使用できる機能のいくつかのアイデアは次のとおりです。

  • バーコードを検出するために、バーコードが分離されている場合は、距離変換(OpenCVではDistTransform)を実行してみてください。たぶん、matchまたはmatchShapesを使用して興味のあるポイントを簡単に見つけることができるでしょう。バーコードは同じ形(サイズなど)なので実現可能だと思います。関心ポイントのスコアを特徴として使用できます。

  • さまざまな種類のグローバル構造があるため、画像の瞬間がここで役立つ場合があります。これは、AページとBページを区別するのにおそらく十分です(openCV関数についてはそこを参照してください)(ちなみに、不変の記述子を取得します:))

  • vertical gradientあなたは多分計算してみるべきhorizontal gradientです。vertical gradientバーコードは、 == 0およびhorizontal gradient!=0の特定の場所です。この主な利点は、ページにそのようなゾーンがあるかどうかを確認することだけが目的であるため、これらの操作のコストが低いことです。インタレストゾーンを見つけて、そのスコアを機能として使用できます

機能を取得したらsupervised learning、一般化を実行してテストすることができます。問題に必要なものはごくわずかfalse negativeであるため(一部のページを破棄するため)、ROC曲線を使用してパフォーマンスを評価し、感度(高いはずです)を注意深く確認する必要があります。分類には、投げ縄ペナルティを伴う回帰を使用して、最適な機能を見つけることができます。whatnickの投稿は、商品のアイデアやその他の記述子(おそらくより一般的なもの)も提供します。

于 2010-10-11T14:18:53.180 に答える
3

したがって、特定の要素 (基本的にはバーコードの存在) を使用して 2 種類のページを区別できるようにする必要があります。次の 2 つの手順があります。

  1. 特徴抽出(コンピューター ビジョン): テキストではなく、バーコードの特定の特徴である関心点または線を見つけます。

  2. 二値分類(統計学習):抽出した特徴からバーコードの有無を判定します。


最初のステップを扱うには、間違いなくハフ変換を確認する必要があります。画像内の線を識別するのに理想的で、バーコードの検出に役立ちます。たとえば、この2 ページを読んでください。OpenCVを使用したを次に示します。


2 番目のステップについて、最も有用な分類は以下に基づいています。

  • k 最近傍
  • ロジスティック回帰
  • ランダム フォレスト (R ではうまく実装されていますが、Python については知りません)
于 2010-10-11T14:33:54.830 に答える
1

A と B のトレーニング データをdemo.nanonets.ai (無料) にアップロードして、モデルの構築を試すことができます。

1) ここにトレーニング データをアップロードします。

demo.nanonets.ai

2) 次に、次の (Python コード) を使用して API をクエリします。

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) 応答は次のようになります。

{
  "message": "Model trained",
  "result": [
    {
      "label": "A",
      "probability": 0.97
    },
    {
      "label": "B",
      "probability": 0.03
    }
  ]
}
于 2016-12-13T11:20:23.663 に答える