1

OCR出力を読み取り、ページ番号を見つけて、それを返すプログラムに取り組んでいます。関数がシーケンスを開始する数値を見つけるたびに、次のページで前のページよりも 1 大きい数値を探します。また、欠損値を推定するために空白を追加することもできます。

どの本でも、私の関数は 1 から 100 の潜在的な配列を識別します。それが識別するシーケンスの多くはジャンクです...まったく役に立ちません。ただし、他のものは通常、より包括的なシーケンスを形成するためにつなぎ合わせることができるメイン シーケンスのサブセットです。これは私の問題です。どうすればそれらをつなぎ合わせることができますか? 現在の私の出力は次のようになります。

 Index: 185 PNUM: 158   
 Index: 186 PNUM: 159   
 Index: 187 PNUM: 160   
 Index: 188 PNUM: 161   
 Index: 189 PNUM: 162   
 Index: -1 PNUM: blank   
 Index: -1 PNUM: blank   
 -------------------------------------------------
 Index: 163 PNUM: 134   
 Index: 164 PNUM: 135   
 Index: -1 PNUM: blank   
-------------------------------------------------
 Index: 191 PNUM: 166   
 Index: 192 PNUM: 167   
 Index: 193 PNUM: 168   
 Index: 194 PNUM: 169   

インデックスは、書籍の表紙からのページ数であり、伝統的に番号が付けられていないすべての著作権、献辞、目次のページが含まれます。PNUM は、alg が検出したページ番号です。ここでは、3 つの異なるシーケンスを見ることができます。その上部と下部は一緒にステッチする必要があります。お気づきのように、一番上のシーケンスのインデックスと pnum の間のオフセットは 27 ですが、一番下のシーケンスのオフセットは 25 です。オフセットの違いの最も一般的な理由は、ページが見つからないか、ページが2回スキャンイン。

Viterbi ベスト パス アルゴリズムを使用してこれらのシーケンスをつなぎ合わせるように提案されましたが、実際にはシーケンスをつなぎ合わせるだけで正確性を確認する必要がないため、それはやり過ぎのように思えます。これをどこに行けばいいのか本当にわかりません。助けていただければ幸いです。ありがとう!

4

1 に答える 1

0

ビタビ

はい、Viterbi は機能しますが、少しやり過ぎですが、後で OCR の問題、ページの欠落、重複などを補うために多くの柔軟性が得られます...

ウィキペディアの疑似コードを使用すると、問題は次のように再定式化できます。

//this is the actual hidden variable you're trying to guess
states = ('i', 'ii', 'iii', 'iv', ...., '1','2','3' ....)

//what OCR will give you, a 98% accurate view of state
//blank is for when there is no page number
//other is for an OCR result you didn't anticipate, such as 'f413dsaf'
possible_observations = (blank,other, 'i','ii','iii','iv',...,'1','2','3'...)

//the probability distribution of states for the first page
//must sum to 1.0
start_probability = {'i': 0.2, '1':0.5, all the rest: (1-0.7)/numOtherStates}

//the probability that the state '2' is found after '1'
//let's put a 0.05 percent chance of duplicate
//and put a very small probability of getting somewhere random
transition_probability = {
'i' : {'ii':0.8,'1':0.1,'i':0.05,allOthers: 0.05/numOtherStates},
'1' : {'2': 0.9, '1': 0.05, allOthers: 0.05/numOtherStates}
//etc
}

//that's the probability of what you OCR will see given the true state
//for the true page '1', there's 95% percent chance the OCR will see '1', 1% it will see    
//'i', 3% it will see a blank, and 0.01%/otherObservation that it will OCR something else
//you can use some string distance for that one (Levenshtein etc...)
emission_probability = {
'1' : {'1': 0.95, 'i': 0.01, blank: 0.03, otherObservations: (0.01)/numObservations},
'2' : {'2': 0.95, 'z': 0.01, blank: 0.03, otherObservations: (0.01)/numObservations},
}

observations = for i = 1 to maxINDEX {PNUM[INDEX]}

その他の可能性: レーベンシュタイン距離を使用

すべてのページ番号を再び配列 {PNUM[INDEX=0], PNUM[INDEX=1], ...} に順番に入れ、1, 2, 3, ... MAX(PNUM) と一致させます。距離を計算している間、レーベンシュタイン アルゴリズムは変更 (削除、挿入、ページ変更) を挿入します。これらの変更を表示するようにコーディングすると、適切なものも得られるはずです。

于 2014-08-26T03:07:11.747 に答える