Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
import easyocr
from time import time
import os
print(time())
reader=easyocr.Reader(['en'])
print(time())
path='D:/Bilder/debugoutput/testauswahl4/'
start=time()
for bild in os.listdir(path):
result=reader.readtext(path+bild)
print(time())
end=time()
print(end-start)
Wenn ich das ausführe, liegen zwischen den ersten ausgegebenen Zeiten 4 Sekunden. Danach rattert das Programm dann recht schnell durch den Rest durch. Woran liegt das genau?
Und kann man das irgendwie beschleunigen?
import easyocr
from pathlib import Path
reader = easyocr.Reader(['en'])
path = Path('D:/Bilder/debugoutput/testauswahl4/')
for bild in path.iterdir():
result = reader.readtext(str(bild))
easyocr lädt weitere Bibliotheken nach. Das braucht halt Zeit. Die 58s bis Dein PC hochgefahren ist, stören Dich ja auch nicht.
Du wirst das nicht beschleunigen können. Was du erreichen kannst ist, diese Kosten nicht andauernd zu bezahlen. Indem dein Programm dauerhaft läuft, und Arbeitsaufträge per Schnittstelle entgegennimmt.
#!/usr/bin/env python3
import easyocr
from time import monotonic
from pathlib import Path
TESTSELECTION = Path('D:/Bilder/debugoutput/testauswahl4/')
def read_text(reader):
start_time = monotonic()
for bild in TESTSELECTION.iterdir():
result = reader.readtext(bild)
end_time = monotonic()
print(start_time - end_time)
def main():
reader = easyocr.Reader(['en'])
read_text(reader)
if __name__ == '__main__':
main()
Jetzt ändert sich zwar erst mal nicht viel, doch der Aufbau ist jetzt etwas geschickter. 'easyocr' wird nur einmal geladen. Dann kannst du 'read_text' so oft du willst aufrufen, und es wird ohne die Ladezeit von 'easycor' ausgeführt. Natürlich musst du da noch eine Schleife und Bedingungen einbauen, die deinen Anforderungen entsprechen, so dass du letztendlich dein Programm nur einmal starten musst.
Wobei ein bereits geladenes Modul bei einem weiteren Import innerhalb der gleichen Python-Session wiederverwendet wird. Da ist es also egal, wo man den Import platziert. Dass die Imports ganz am Anfang erfolgen sollten, dient vor allem Lesbarkeit, weniger der Performance. Begründete Ausnahmefälle wie "Lazy Loading" mal ausgenommen.
Hier sollte wirklich der Fokus auf der Schnittstelle liegen. Denkbar neben vielen anderen Möglichkeiten wäre z.B. ein Microservice, der dauerhaft läuft und Befehle via JSON annimmt. Das ist quasi ein eigener (Software-)Server, der auch auf dem gleichen Rechner sein kann. Falls das nicht sofort einleuchtend ist, einfach mal mit der eigentlichen Bedeutung eines Servers beschäftigen. Ein gängiges Framework dafür ist übrigens Flask. Wenn du die JSON-Schnittstelle fertig hast, dann ist der Einbau der Flask-Schicht relativ trivial.
EDIT: JSON ist natürlich zum Anstoßen des Readers gemeint. Die Textausgabe würde ich als Datei ausliefern.