描画されたシンボルと期待されるシンボルの違いなどを評価するアルゴリズムがいくつかあると思います。どんな助けでも大歓迎です:))
3 に答える
簡単なニューラル ネットワークを実装して、手書きの数字を認識することができます。実装する最も単純なタイプは、バックプロパゲーションによってトレーニングされたフィードフォワード ネットワークです (確率的またはバッチ モードでトレーニングできます)。ニューラル ネットワークの学習を高速化するために、バックプロパゲーション アルゴリズムにいくつかの改善を加えることができます (モメンタム、Silva および Almeida のアルゴリズム、シミュレートされたアニーリング)。
実際のシンボルと予想されるイメージの違いを見る限り、使用されているアルゴリズムの 1 つにk最近傍アルゴリズムがあります。これは、文字認識にk -nearest -neighbor アルゴリズムを使用する方法を説明する論文です(編集: 以前に間違ったリンクがありました。私が提供したリンクでは、論文の代金を支払う必要があります。無料版を探しています。紙の)。
ニューラル ネットワークを使用して文字を認識する場合、必要な手順は次のようになります。
- 適切なトレーニング アルゴリズムを使用してニューラル ネットワークを設計します。ネットワークをトレーニングしながら、最も単純な (確率的逆伝播) から始めて、必要に応じてアルゴリズムを改善することをお勧めします。
- トレーニング データの適切なサンプルを取得します。手書きの数字を認識するニューラル ネットワークには、MNIST データベースを使用しました。
- トレーニング データをニューラル ネットワークの入力ベクトルに変換します。MNIST データの場合、画像を 2 値化する必要があります。128 のしきい値を使用しました。大津の方法から始めましたが、それでは望みどおりの結果が得られませんでした。
- ネットワークを作成します。MNIST からの画像は 28x28 の配列で提供されるため、784 個のコンポーネントと 1 つのバイアス (つまり 785 個の入力) を持つ入力ベクトルがニューラル ネットワークに存在します。ここで概説したガイドラインに従ってノード数を設定した 1 つの非表示レイヤーを使用しました (バイアスと共に)。出力ベクトルには 10 個のコンポーネントがあります (各桁に 1 つ)。
- ネットワークにトレーニング データをランダムに提示し (ランダムに並べられた数字、各数字のランダムな入力画像を使用)、目的のエラー レベルに達するまでトレーニングします。
- ニューラル ネットワークに対してテスト データ (MNIST データも付属) を実行して、数字が正しく認識されることを確認します。
ここで、手書きの数字を認識しようとする例(恥知らずなプラグ) を確認できます。MNIST のデータを使用してネットワークをトレーニングしました。
このルートに進むことにした場合は、ニューラル ネットワークの概念を理解するために時間を費やすことを期待してください。概念を実際に理解するまでに、コードを読み書きするのに少なくとも 3 ~ 4 日かかりました。良いリソースはheatonresearch.comです。ニューラル ネットワークを実装して、AND、OR、および XOR ブール演算をシミュレートすることから始めることをお勧めします (しきい値活性化関数を使用)。これにより、基本的な概念が理解できるはずです。実際にネットワークをトレーニングすることになると、XOR ブール演算子を認識するニューラル ネットワークのトレーニングを試みることができます。学習アルゴリズムの紹介を開始するのに適した場所です。
ニューラル ネットワークの構築に関しては、Encogなどの既存のフレームワークを使用できますが、自分でネットワークを構築する方がはるかに満足のいくものであることがわかりました (その方法でより多くを学ぶことができると思います)。いくつかのソースを見たい場合は、単純なニューラル ネットワークの構築とトレーニングに役立つ Java の基本クラスがいくつかあるgithub (恥知らずなプラグ) にあるプロジェクトをチェックアウトできます。
幸運を!
編集
数字や文字の認識にk -nearest-neighborsを使用しているソースをいくつか見つけました。
- デジタル カーブレット変換を使用したバングラ基本文字認識(元の画像のカーブレット係数とその形態学的に変更されたバージョンを使用して、個別の k–最近傍分類器をトレーニングします。これらの分類器の出力値は、単純な多数決方式を使用して融合され、最終決定で。)
- Nearest Neighbors と類似検索のホームページ
- 大規模データベースでの近似最近傍検索を使用した高速で正確な手書き文字認識
- 最近傍検索と分類
ニューラル ネットワークに関するリソースについては、次のリンクが役立つことがわかりました。
- CS-449: ニューラル ネットワーク
- 人工ニューラル ネットワーク: ニューラル ネットワークのチュートリアル
- ニューラル ネットワークの概要
- Java によるニューラル ネットワーク
- バックプロパゲーション ニューラル ネットワークの概要
- 運動量と学習率の適応(このページでは、学習を高速化できる標準的なバックプロパゲーション アルゴリズムのいくつかの機能強化について説明します)
Detexifyをチェックしましたか。私はそれがあなたが望むことをほとんどやってくれると思い ますhttp://detexify.kirelabs.org/classify.html
これはオープンソースなので、どのように実装されているかを見ることができます。ここからコードを取得できます(間違って思い出せない場合は、Haskellにあります) https://github.com/kirel/detexify-hs-backend
特にあなたが探しているものはSim.hsにあるべきです
お役に立てば幸いです
補遺
実際にチェックアウトする前に機械学習アルゴリズムを実装していない場合: www.ml-class.org
これは、スタンフォード機械学習センターのディレクターである Andrew Ng が教える無料のクラスです。このコースは、幅広い機械学習アルゴリズムの実装に特化した、完全にオンラインで行われるコースです。アルゴリズムの理論的な複雑さにはあまり触れませんが、アルゴリズムの選択、実装、使用方法、およびアルゴリズムのパフォーマンスを診断する方法について説明します。- アルゴリズムの実装が自動的にチェックされるという点でユニークです! 即座にフィードバックが得られるので、機械学習を始めるのに最適です。
このクラスには、手書きの数字を認識する演習が少なくとも 2 つ含まれています。(プログラミング演習 3: 多項式分類を使用、プログラミング演習 4: フィードフォワード ニューラル ネットワークを使用)
クラスは少し前に開始されましたが、まだサインアップできるはずです。そうでない場合は、来年初めに新しい実行を開始する必要があります。実装を確認できるようにしたい場合は、「アドバンス トラック」にサインアップする必要があります。
手書き認識を実装する 1 つの方法
この質問に対する答えは、リソースの制約の種類 (組み込みプラットフォーム) や、正しくラベル付けされたシンボルの優れたライブラリがあるかどうかなど、さまざまな要因によって異なります。代表する。
まともなサイズのライブラリがある場合は、迅速で汚れた標準的な機械学習アルゴリズムを実装するのがおそらく最善の方法です。多項分類器、ニューラル ネットワーク、またはサポート ベクター マシンを使用できます。
libSVMなど、コードの機械学習部分を処理する優れたライブラリがあるため、サポート ベクター マシンを実装するのが最も速いと思います。機械学習アルゴリズムの使用に慣れている場合は、30 分もかからずに実装できます。
おそらく実装したい基本的な手順は次のとおりです。
シンボルが「どのように見えるか」を学ぶ
- ライブラリ内の画像をバイナリ化します。
- イメージをベクトル / 1 次元配列に展開します。
- ライブラリ内の画像の「ベクトル表現」とそのラベルを libSVM に渡して、ピクセル カバレッジがライブラリ内の画像の表現されたシンボルにどのように関連するかを学習させます。
- このアルゴリズムは、学習された認識アルゴリズムを説明する一連のモデル パラメーターを返します。
認識したい文字ごとに 1 ~ 4 を繰り返して、適切なモデル パラメータのセットを取得する必要があります。
注: ステップ 1 ~ 4 は、ライブラリに対して 1 回だけ実行する必要があります (ただし、認識したいシンボルごとに 1 回)。開発者のマシンでこれを行うことができ、出荷/配布するコードにパラメーターのみを含めることができます。
シンボルを認識したい場合:
モデル パラメータの各セットは、文字が 1 つの特定の文字を表しているかどうかをテストするアルゴリズムを記述します。現在のシンボルを使用してすべてのモデルをテストし、テストしているシンボルに最適なモデルを選択することで、文字を「認識」します。
このテストは、テスト対象のモデルの適合度を返す SVM ライブラリに、展開された形式でテストするモデル パラメーターとシンボルを再度渡すことによって行われます。