Użyj wielowątkowości, ale pamiętaj, aby utworzyć jedną instancję na wątek dla TessBaseAPI. Nie udostępniaj ich między różnymi wątkami. Utwórz N wątków (N> = liczba rdzeni), a java zapewni przyspieszenie co najmniej liczby rdzeni.
To, co robię, to tworzenie wątków N, które tworzą obiekty TessBaseAPI w ich własnym kontekście (w metodzie run) i oczekiwanie na żądania OCR w pętli, aż do przerwania.
...
...
@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) {
}
}
}
}
...
...
Można zobaczyć, że obiekt tessBaseApi jest lokalny do sposobu wykonywania, dlatego absolutnie nie jest dzielona.
Czy mówisz o dokładności prędkości lub rozpoznawania? – rmtheis
Podejmuję temat prędkości, jest bardzo wolny. –
Hey @QuiLlHoN Czy znalazłeś jakieś rozwiązanie dla tak niskiej wydajności? Pojawia się ten sam problem:/ – Vucko