手書き数字を認識する


22

あなたの仕事は、手書きの数字を含む画像を読み取り、数字を認識して印刷することです。

入力: 28 * 28のグレースケールイメージ。スペースで区切られた0から255までの784のプレーンテキスト番号のシーケンスとして指定されます。0は白を意味し、255は黒を意味します。

出力:認識された数字。

スコアリング:MNISTデータベーストレーニングセット(ASCII形式に変換)からの1000枚の画像でプログラムをテストします。既に画像を(ランダムに)選択していますが、リストは公開しません。テストは1時間以内に終了する必要がありn、正しい答えの数を決定します。
nプログラムが対象となるには、少なくとも200である必要があります。ソースコードのサイズがの場合、sスコアはとして計算されs * (1200 - n) / 1000ます。最低スコアが勝ちます。

ルール:

  • プログラムは標準入力から画像を読み取り、標準出力に数字を書き込む必要があります
  • 組み込みOCR機能なし
  • サードパーティライブラリなし
  • 外部リソース(ファイル、プログラム、Webサイト)はありません
  • プログラムは、自由に利用可能なソフトウェアを使用してLinuxで実行可能である必要があります(必要に応じて、ワインを使用できます)
  • ソースコードはASCII文字のみを使用する必要があります
  • 回答を修正するたびに、推定スコアと一意のバージョン番号を投稿してください

入力例:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 18 18 18 126 136 175 26 166 255 247 127 0 0 0 0 0 0 0 0 0 0 0 0 30 36 94 154 170 253 253 253 253 253 225 172 253 242 195 64 0 0 0 0 0 0 0 0 0 0 0 49 238 253 253 253 253 253 253 253 253 251 93 82 82 56 39 0 0 0 0 0 0 0 0 0 0 0 0 18 219 253 253 253 253 253 198 182 247 241 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 80 156 107 253 253 205 11 0 43 154 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 1 154 253 90 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 139 253 190 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 190 253 70 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35 241 225 160 108 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 81 240 253 253 119 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 45 186 253 253 150 27 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 93 252 253 187 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 249 253 249 64 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 130 183 253 253 207 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39 148 229 253 253 253 250 182 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 24 114 221 253 253 253 253 201 78 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 66 213 253 253 253 253 198 81 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 171 219 253 253 253 253 195 80 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 55 172 226 253 253 253 253 244 133 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 136 253 253 253 212 135 132 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

ところで、この行を入力に追加する場合:

P2 28 28 255

反転/ネガ色のpgm形式の有効な画像ファイルを取得します。

これは正しい色では次のようになります。 桁

出力例:

5

順位:

No.| Name         | Language   | Alg | Ver | n   | s   |  Score
----------------------------------------------------------------
 1 | Peter Taylor | GolfScript | 6D  | v2  | 567 | 101 |  63.933
 2 | Peter Taylor | GolfScript | 3x3 | v1  | 414 | 207 | 162.702

関連はなく、全く同じ(ではない挑戦が、ラテックスコードを見つけるために非常に有用):detexify.kirelabs.org/classify.html。また、数字も認識します。
ジャスティン

1
黒ピクセルのみを考慮する必要があると安全に仮定できますか?127ピクセル以上ですか?何を想定できますか?
ジャスティン

2
特に、これがコードゴルフの質問である場合は、白黒の入力に制限してください。人々は、コード内の文字を数えることなく、この問題を解決することでキャリア全体を作り上げています。あなたが選んだキャラクターを公開しないことは、不正行為を止める方法であり、一種のギャンブルになります...そして人々がここでAIを書くのは不合理なので、面白いのは奇妙なヒューリスティックをして、どれだけうまくいくかを見ることですトーナメント対競技で行われます。
レブム博士14年

3
@aditsuはい、だれでもうまくできません。しかし、あなたはそれがうまくいかないことを求めているのではなく、キャラクターカウントが測定される競争で誰かが「勝つ」ことを望んでいます。趣味のパズルソルバーにとっては、問題を少し減らすことがより現実的だと思います。入力を制約することは、それを合理的にするための良い出発点のようです。入力を事前にパスして、それが白黒であることを示すことをお勧めします。
レブム博士14年

2
@ Dr.Rebmuおよび白黒入力を希望する人:128などのしきい値を使用して入力を自由に変換してください。チェックしましたが、数字はまだ認識できます(私の脳では)。他のしきい値も試すことができますが、より良い結果が得られる場合があります。
aditsu

回答:


6

GolfScript 6D(v2:推定スコア101 * 0.63〜= 64)

これは、以前のGolfScriptの回答とは非常に異なるアプローチであるため、他の回答を編集してこのv2を作成するよりも、v1に別の回答として投稿する方が理にかなっています。

~]:B;569'!EM,R.==|%NL2+^=1'{{32-}%95{base}:^~\^}:&~2/{~B=<}%2^10'#]8Y,;KiZfnnRsDzPsvQ!%4C&..z,g,$m'&=

非ゴルフ

~]:B;
[30 183 21 378 31 381 7 461 113 543 15 568]
2/{~B=<}%2base
7060456576664262556515119565486100005262700292623582181233639882 10base
=

説明

生の問題は、784次元空間内のポイントの分類です。標準的なアプローチの1つは次元の削減です。分類を行うのに十分な識別力を提供する次元の小さなサブセットを識別します。各ディメンションと各可能なしきい値を評価して、有望に見える18組(ディメンション、しきい値の範囲)を特定しました。次に、しきい値の各範囲の中心を選択し、18ペアの6要素サブセットを評価しました。最後に、最適な6次元投影の各次元のしきい値を最適化し、その精度を56.3%から56.6%に改善しました。

投影は6次元になり、各次元に単純なしきい値を適用するため、最終的なルックアップテーブルに必要な要素は64だけです。特に圧縮可能ではないようですので、主なゴルフは、両方のルックアップテーブル(次元としきい値のリスト、および半空間ベクトルから数字へのマップ)をベース変換し、ベース変換コードを共有することです。


7
あなたは「784次元空間」で私を失った;-)
デジタルトラウマ

どこかに間違いがあるのではないかと思っています。正しい答えは37個しかありません。また、物事を少し曖昧にしているので、(1)と(2)(私がしたように)または見出しに似たものを追加してください。
aditsu

@aditsu、単純な論理エラー。修正されました。
ピーターテイラー

したがって、基本的には、それぞれが異なるしきい値を持つ6つの「関連する」ピクセルをサンプリングして、6ビットを取得していますか?
aditsu

@aditsu、正確に。
ピーターテイラー

5

GolfScript 3x3(v1:推定スコア207 * 0.8〜= 166)

~]28/10:?/{zip?/{[]*0-!!}/}%2{base}:^~'"yN(YZ5B 7k{&w,M`f>wMb>}F2A#.{E6T9kNP_s 3Q?V`;Z\'C-z*kA5M@?l=^3ASH/@*@HeI@A<^)YN_bDI^hgD>jI"OUWiGct%7/U($*;h*<"r@xdTz6x~,/M:gT|\\:#cII8[lBr<%0r&y4'{32-}%95^?^2/{))*~}%=

または概要では、

~]28/10:?/{zip?/{[]*0-!!}/}%2{base}:^~'MAGIC STRING'{32-}%95^?^2/{))*~}%=

説明

高レベルでの私のアプローチは次のとおりです。

  1. ピクセルのしきい値:ピクセルが上にある場合はt1、に設定し1ます。それ以外の場合0
  2. ピクセルをグループ化します。最初に、28x28グリッドを4x4グリッドに分割しました(各サブグリッドは7x7ピクセルです)。しかし、3x3グリッド(サブグリッドが10x10、10x8、または8x8ピクセル)に分割すると、ルックアップテーブルのサイズが大幅に削減され、精度が約56%から約40%に低下します。
  3. 各グループのピクセルを合計し、再度しきい値を設定t21ます。設定されたピクセルの数が上記の場合、グループのスコアを;とします。それ以外の場合0
  4. グループスコアのベクトルによるテーブル検索を行います。(テーブルは、ランレングスエンコーディングと標準のベース変換トリックを使用して圧縮されます。テーブルの50%〜63%のほとんどの選択肢はt1t2「気にしない」値として残します。ランレングス; v1テーブルの平均ランレングスは3.6です)。

設定はt1=t2=0、最適ではありませんが、精度の点から、t1およびt2精度の点でそれほど離れていないことがわかります。テーブルの圧縮率の点ではかなり優れています。2つのしきい値処理を組み合わせて[]*0-!!(2D配列を1Dに平坦化、0sを削除、空かどうかを確認)することができます。

ルックアップテーブルは、グループスコアの特定のベクトルの最も可能性の高い候補を提供します。テーブルの圧縮率の改善が精度の低下を上回るように変更できるテーブルエントリを識別することにより、スコアを改善することが可能です。


素晴らしい、私は同様のアイデアを持っていたが、それがそれほどうまく圧縮できるとは思わなかった。今、私は精度をもっと重視する必要があると考えています:pが、それを変更する予定はありません。
aditsu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.