マルチスレッドを使用しますが、TessBaseAPIのスレッドごとに1つのインスタンスを作成することに注意してください。異なるスレッド間でそれらを共有しないでください。 N個のスレッド(N> =コアの数)を作成すると、javaは少なくともコア数をスピードアップすることを確認します。
TessBaseAPIオブジェクトを独自のコンテキスト(runメソッド内)で作成し、中断されるまでループ内でOCR要求を待機するN個のスレッドを作成しています。
...
...
@Override
public void run() {
TessBaseAPI tessBaseApi = new TessBaseAPI();
tessBaseApi.init(Ocrrrer.DATA_PATH, "eng");
setTessVariable(tessBaseApi, "load_system_dawg", "0");
setTessVariable(tessBaseApi, "load_freq_dawg", "0");
setTessVariable(tessBaseApi, "load_unambig_dawg", "0");
setTessVariable(tessBaseApi, "load_punc_dawg", "0");
setTessVariable(tessBaseApi, "load_number_dawg", "0");
setTessVariable(tessBaseApi, "load_fixed_length_dawgs", "0");
setTessVariable(tessBaseApi, "load_bigram_dawg", "0");
setTessVariable(tessBaseApi, "wordrec_enable_assoc", "0");
setTessVariable(tessBaseApi, "tessedit_enable_bigram_correction", "0");
setTessVariable(tessBaseApi, "assume_fixed_pitch_char_segment", "1");
setTessVariable(tessBaseApi, TessBaseAPI.VAR_CHAR_WHITELIST, "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ<");
Log.d(TAG, "Training file loaded");
while (!interrupted()) {
reentrantLock.lock();
try {
Log.d(TAG, this.getName() + " wait for OCR");
jobToDo.await();
Log.d(TAG, this.getName() + " input arrived. Do OCR");
this.ocrResult = doOcr(tessBaseApi);
ocrDone.signalAll();
} catch (InterruptedException e) {
return;
} finally {
try {
reentrantLock.unlock();
} catch (Exception ex) {
}
}
}
}
...
...
tessBaseApiオブジェクトはrunメソッドにとってローカルなので、絶対に共有されていないことがわかります。
スピードや認識精度についてお話ししていますか? – rmtheis
私はスピードを取っています、それは非常に遅いです。 –
こんにちは@QuiLlHoNこのような低速性能の解決策はありましたか?私は同じ問題に遭遇しています:/ – Vucko