wprowadzenie
ludzie mogą zrozumieć zawartość obrazu po prostu patrząc. Postrzegamy tekst na obrazie jako tekst i potrafimy go odczytać.
Komputery nie działają tak samo. Potrzebują czegoś bardziej konkretnego, zorganizowanego w sposób, który mogą zrozumieć.
w tym miejscu rozpoczyna się optyczne rozpoznawanie znaków (OCR). Niezależnie od tego, czy jest to rozpoznawanie tablic samochodowych z kamery, czy ręcznie pisane dokumenty, które należy przekształcić w cyfrową kopię, ta technika jest bardzo przydatna. Chociaż nie zawsze jest idealny, jest bardzo wygodny i sprawia, że niektórzy ludzie o wiele łatwiej i szybciej wykonują swoją pracę.
w tym artykule zagłębimy się w głębię optycznego rozpoznawania znaków i jej obszarów zastosowań. Zbudujemy również prosty skrypt w Pythonie, który pomoże nam wykryć znaki z obrazów i wyeksponować to poprzez aplikację Flask dla wygodniejszego medium interakcji.
co to jest optyczne rozpoznawanie znaków?
optyczne rozpoznawanie znaków polega na wykrywaniu treści tekstowych na obrazach i tłumaczeniu obrazów na zakodowany tekst, który komputer może łatwo zrozumieć. Obraz zawierający tekst jest skanowany i analizowany w celu identyfikacji znaków w nim. Po identyfikacji znak jest konwertowany na tekst zakodowany maszynowo.
Jak to się naprawdę osiąga? Dla nas tekst na obrazie jest łatwo dostrzegalny i jesteśmy w stanie wykryć znaki i odczytać tekst, ale dla komputera jest to cała seria kropek.
obraz jest najpierw skanowany, a tekst i elementy graficzne są konwertowane na bitmapę, która jest zasadniczo matrycą czarnych i białych kropek. Obraz jest następnie wstępnie przetwarzany, gdzie jasność i kontrast są dostosowywane w celu zwiększenia dokładności procesu.
obraz jest teraz podzielony na strefy identyfikujące obszary zainteresowania, takie jak miejsca, w których znajdują się obrazy lub tekst, co ułatwia rozpoczęcie procesu ekstrakcji. Obszary zawierające tekst można teraz podzielić dalej na linie i słowa i znaki, a teraz oprogramowanie jest w stanie dopasować znaki poprzez porównanie i różne algorytmy wykrywania. Efektem końcowym jest tekst na obrazku, który otrzymujemy.
proces może nie być w 100% dokładny i może wymagać interwencji człowieka, aby poprawić niektóre elementy, które nie zostały prawidłowo zeskanowane. Korekcję błędów można również osiągnąć za pomocą słownika lub nawet przetwarzania języka naturalnego (NLP).
wyjście może być teraz konwertowane na inne nośniki, takie jak dokumenty word, pliki PDF, a nawet zawartość audio za pomocą technologii zamiany tekstu na mowę.
zastosowanie OCR
wcześniej digitalizację dokumentów uzyskiwano poprzez ręczne wpisywanie tekstu na komputerze. Dzięki OCR proces ten jest łatwiejszy, ponieważ dokument może być skanowany, przetwarzany, a tekst wyodrębniany i przechowywany w edytowalnej formie, takiej jak dokument word.
Jeśli masz w telefonie skaner dokumentów, taki jak Adobe Scan, prawdopodobnie spotkałeś się z używaną technologią OCR.
lotniska mogą również używać OCR do automatyzacji procesu rozpoznawania paszportów i wydobywania z nich informacji.
Inne zastosowania OCR obejmują automatyzację procesów wprowadzania danych,wykrywanie i rozpoznawanie tablic rejestracyjnych samochodów.
co będziemy używać
dla tego projektu OCR, użyjemy Python-Tesseract, lub po prostu PyTesseract, biblioteka, która jest opakowaniem dla silnika Google Tesseract-OCR.
wybrałem to, ponieważ jest całkowicie open-source i jest rozwijany i utrzymywany przez giganta, jakim jest Google. Postępuj zgodnie z tymi instrukcjami, aby zainstalować Tesseract na swoim komputerze, ponieważ PyTesseract zależy od niego.
wykorzystamy również Framework Flask web do stworzenia naszego prostego serwera OCR, na którym możemy robić zdjęcia za pomocą kamery internetowej lub przesyłać zdjęcia w celu rozpoznawania postaci.
będziemy również używać Pipenv, ponieważ obsługuje również konfigurację środowiska wirtualnego i zarządzanie wymaganiami.
oprócz tych, użyjemy również biblioteki Pillow, która jest forkiem Python Imaging Library (Pil) do obsługi otwierania i manipulacji obrazami w wielu formatach w Pythonie.
w tym poście skupimy się na PyTesseract, chociaż istnieją inne biblioteki Pythona, które mogą pomóc Ci wyodrębnić tekst z obrazów, takie jak:
- Textract:, który może wyodrębnić dane z plików PDF, ale jest ciężkim pakietem.
- Pyocr: oferuje więcej opcji wykrywania, takich jak zdania, cyfry lub słowa.
Konfiguracja
Rozpocznij od instalacji Pipenv za pomocą następującego polecenia za pośrednictwem Pip(w przypadku potrzeby skonfigurowania, zapoznaj się z tym).
$ pip install pipenv
Utwórz katalog projektu i rozpocznij projekt, uruchamiając następujące polecenie:
$ mkdir ocr_server && cd ocr_server && pipenv install --three
możemy teraz aktywować nasze środowisko wirtualne i zacząć instalować nasze zależności:
$ pipenv shell$ pipenv install pytesseract Pillow
w przypadku, gdy nie będziesz używać Pipenv, zawsze możesz użyć podejścia Pip i środowiska wirtualnego. Postępuj zgodnie z oficjalną dokumentacją, aby pomóc ci rozpocząć pracę z Pip i środowiskiem wirtualnym:
Uwaga: w takim przypadku zamiastpipenv install Pillow
, polecenie będziepip install Pillow
.
realizacja
zamierzamy zrealizować ten projekt w 2 fazach. W pierwszym stworzymy skrypt, a w następnym zbudujemy aplikację Flask, która będzie działać jako interfejs.
skrypt OCR
Po zakończeniu konfiguracji możemy teraz utworzyć prostą funkcję, która pobiera obraz i zwraca wykryty w nim tekst – będzie to rdzeń naszego projektu:
try: from PIL import Imageexcept ImportError: import Imageimport pytesseractdef ocr_core(filename): """ This function will handle the core OCR processing of images. """ text = pytesseract.image_to_string(Image.open(filename)) # We'll use Pillow's Image class to open the image and pytesseract to detect the string in the image return textprint(ocr_core('images/ocr_example_1.png'))
funkcja jest dość prosta, w pierwszych 5 linijkach importujemy Image
z Image
Pillow
biblioteka i naszaPyTesseract
biblioteka.
następnie tworzymy iocr_core
funkcję, która przyjmuje nazwę pliku i zwraca tekst zawarty w obrazku.
zobaczmy, jak radzi sobie skrypt z prostym obrazkiem zawierającym tekst:
i po uruchomieniu fragmentu kodu zostaliśmy powitani tym:
nasz prosty skrypt OCR działa! Oczywiście było to dość łatwe, ponieważ jest to tekst cyfrowy, doskonały i precyzyjny, w przeciwieństwie do pisma ręcznego. Jest o wiele więcej, co możemy zrobić z biblioteką PyTesseract, ale więcej na ten temat w późniejszym poście.
najpierw zintegrujmy ten skrypt z aplikacją Flask, aby ułatwić przesyłanie obrazów i wykonywanie operacji rozpoznawania znaków.
interfejs sieciowy Flask
nasz skrypt może być używany za pomocą wiersza poleceń, ale aplikacja Flask uczyniłaby go bardziej przyjaznym i wszechstronnym. Na przykład możemy przesyłać zdjęcia za pośrednictwem strony internetowej i uzyskać wyodrębniony tekst wyświetlany na stronie internetowej lub możemy przechwytywać zdjęcia za pomocą kamery internetowej i wykonywać na nich rozpoznawanie znaków.
Jeśli nie jesteś zaznajomiony z frameworkiem Flask, jest to dobry samouczek, aby przyspieszyć i zacząć.
zacznijmy od zainstalowania pakietu Flask:
$ pipenv install Flask
teraz zdefiniujmy podstawową trasę:
from flask import Flaskapp = Flask(__name__)@app.route('/')def home_page(): return "Hello World!"if __name__ == '__main__': app.run()
Zapisz plik i uruchom:
$ python3 app.py
Jeśli otworzysz plik przeglądarka i przejdź do 127.0.0.1:5000
lub localhost:5000
powinieneś zobaczyć „Hello World!”na stronie. Oznacza to, że nasza aplikacja Flask jest gotowa na kolejne kroki.
utworzymy teraztemplates
folder do hostowania naszych plików HTML. Stwórzmy prosty index.html
:
<!DOCTYPE html><html> <head> <title>Index</title> </head> <body> Hello World. </body></html>
dostosujmy również nasz app.py
, aby renderować nasz nowy szablon:
from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')def home_page(): return render_template('index.html')if __name__ == '__main__': app.run()
Uwaga: zaimportowali teraz render_template
I użyli go do renderowania pliku HTML. Jeśli ponownie uruchomisz aplikację Flask, nadal powinieneś zobaczyć ” Hello World!”na stronie głównej.
to wystarczy na crash course Flask, zintegrujmy teraz nasz skrypt OCR z aplikacją webową.
najpierw dodamy funkcjonalność, aby przesłać obrazy do naszej aplikacji Flask i przekazać je do funkcjiocr_core
, którą napisaliśmy powyżej. Następnie wyrenderujemy obraz obok wyodrębnionego tekstu w naszej aplikacji internetowej w wyniku:
import osfrom flask import Flask, render_template, request# import our OCR functionfrom ocr_core import ocr_core# define a folder to store and later serve the imagesUPLOAD_FOLDER = '/static/uploads/'# allow files of a specific typeALLOWED_EXTENSIONS = set()app = Flask(__name__)# function to check the file extensiondef allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1).lower() in ALLOWED_EXTENSIONS# route and function to handle the home [email protected]('/')def home_page(): return render_template('index.html')# route and function to handle the upload [email protected]('/upload', methods=)def upload_page(): if request.method == 'POST': # check if there is a file in the request if 'file' not in request.files: return render_template('upload.html', msg='No file selected') file = request.files # if no file is selected if file.filename == '': return render_template('upload.html', msg='No file selected') if file and allowed_file(file.filename): # call the OCR function on it extracted_text = ocr_core(file) # extract the text and display it return render_template('upload.html', msg='Successfully processed', extracted_text=extracted_text, img_src=UPLOAD_FOLDER + file.filename) elif request.method == 'GET': return render_template('upload.html')if __name__ == '__main__': app.run()
jak widać w naszej funkcjiupload_page()
, otrzymamy obraz za pośrednictwem POST i wyrenderujemy upload HTML, jeśli żądanie jest GET.
sprawdzamy, czy użytkownik rzeczywiście załadował plik i używamy funkcji allowed_file()
, aby sprawdzić, czy plik jest akceptowalnego typu.
po sprawdzeniu, czy obraz jest wymaganego typu, przekazujemy go do skryptu rozpoznawania znaków, który stworzyliśmy wcześniej.
funkcja wykrywa tekst na obrazku i zwraca go. Wreszcie, w odpowiedzi na przesyłanie obrazu, renderujemy wykryty tekst obok obrazu, aby użytkownik mógł zobaczyć wyniki.
plikupload.html
zajmie się umieszczaniem obrazu i renderowaniem wyniku za pomocą silnika szablonów Jinja, który domyślnie jest dostarczany z kolbą:
<!DOCTYPE html><html> <head> <title>Upload Image</title> </head> <body> {% if msg %} <h1>{{ msg }}</h1> {% endif %} <h1>Upload new File</h1> <form method=post enctype=multipart/form-data> <p><input type=file name=file> <input type=submit value=Upload> </form> <h1>Result:</h1> {% if img_src %} <img src="{{ img_src }}"> {% endif %} {% if extracted_text %} <p> The extracted text from the image above is: <b> {{ extracted_text }} </b></p> {% else %} The extracted text will be displayed here {% endif %} </body></html>
szablon Jinja pozwala nam wyświetlać tekst w określonych scenariuszach za pomocą znaczników{% if %} {% endif %}
. Możemy również przekazywać wiadomości z naszej aplikacji Flask do wyświetlenia na stronie internetowej w tagach{{ }}
. Używamy formularza, aby przesłać obraz do naszej aplikacji Flask.
wynik to:
teraz, jeśli prześlemy nasz obrazek z wcześniej:
tak! Nasza aplikacja Flask umożliwia integrację funkcji OCR i wyświetlanie tekstu w przeglądarce. Ułatwia to przetwarzanie obrazów zamiast uruchamiania poleceń w CLI za każdym razem, gdy mamy nowy obraz do przetworzenia.
załącz więcej obrazów, aby dalej zbadać granice naszego prostego skryptu OCR, ponieważ nie będzie działać we wszystkich sytuacjach.
na przykład spróbujmy wyodrębnić tekst z poniższego obrazu, a wynik zostanie podświetlony na obrazie:
jest to dowód na to, że OCR nie zawsze jest w 100% dokładny i może wymagać interwencji człowieka od czasu do czasu.
przetestowałem również skrypt OCR pod kątem mojego pisma ręcznego, aby zobaczyć, jak będzie działał, i oto wynik:
Jak widać, nie może całkowicie wyodrębnić tekstu z mojego pisma ręcznego, jak to miało miejsce w przypadku innych obrazów, które widzieliśmy wcześniej. Postanowiłem spróbować jeszcze raz, tym razem z obrazem z tego źródła i takie były wyniki:
rozpoznawanie znaków na tym zdjęciu jest znacznie lepsze niż to, w którym użyłem własnego pisma. Jak widać linie w pobranym obrazie są grubsze i jest lepszy kontrast między tekstem a tłem i to może być przyczyną słabego wykrywania na moim piśmie ręcznym.
jest to obszar do dalszej eksploracji, możesz uzyskać odręczne notatki od przyjaciół lub współpracowników i zobaczyć, jak dobrze skrypt będzie w stanie wykryć znaki. Możesz nawet dostać plakaty na wydarzenia i spróbować skanować je w poszukiwaniu tekstu, możliwości jest wiele.
inne opcje PyTesseract
Python-Tesseract ma więcej opcji, które możesz zbadać. Na przykład, można określić język za pomocą lang
flaga:
pytesseract.image_to_string(Image.open(filename), lang='fra')
jest to wynik skanowania obrazu bez lang
flaga:
i teraz z flagą lang
:
framework jest również zoptymalizowany do wykrywania języków lepiej, jak widać na zrzutach ekranu. (Źródło obrazu).
bez flagi lang
skrypt ominął kilka francuskich słów, ale po wprowadzeniu flagi był w stanie wykryć całą francuską zawartość. Tłumaczenie nie jest możliwe, ale i tak robi wrażenie. Oficjalna dokumentacja Tesseract zawiera obsługiwane języki w tej sekcji.
Orientacja i wykrywanie skryptów jest również jedną z możliwości PyTesseract, co pomaga w wykrywaniu używanych czcionek i orientacji tekstu na danym obrazku. Jeśli możemy odnieść się do odręcznego obrazu, który pobraliśmy wcześniej:
print(pytesseract.image_to_osd(Image.open('downloaded_handwritten.png')))
nie było informacji o numerze strony na obrazie, więc nie zostało to wykryte. Silnik Tesseract jest w stanie wyodrębnić informacje o orientacji tekstu na obrazie i jego rotacji. Pewność orientacji jest figurą pewności silnika o wykrytej orientacji, aby działać jako przewodnik, a także pokazać, że nie zawsze jest w 100% dokładna. Sekcja skrypt oznacza system pisania używany w tekście, a po nim następuje znacznik zaufania.
gdybyśmy szukali rozpoznanych znaków i ich granic, PyTesseract osiąga to poprzezpytesseract.image_to_boxes(Image.open('downloaded_handwritten.png'))
.
to niektóre z możliwości PyTesseract, takie jak konwersja wyodrębnionego tekstu do przeszukiwalnego pliku PDF lub wyjścia HOCR.
czego jeszcze nie zrobiliśmy
wiele osiągnęliśmy w tym poście, ale jest jeszcze więcej do zrobienia, aby udoskonalić nasz projekt i przygotować go do realnego świata. Po pierwsze, możemy dodać styl do naszej strony i uczynić ją bardziej atrakcyjną dla użytkownika końcowego za pomocą CSS. Możemy również dodać opcję przesyłania i skanowania wielu obrazów jednocześnie i wyświetlania wszystkich ich wyników jednocześnie. Czy nie ułatwiłoby to skanowania wielu dokumentów?
przeglądarka pozwala nam podłączyć się do kamery Maszyny i przechwytywać obrazy, oczywiście za zgodą użytkownika. Może to być bardzo pomocne, zwłaszcza na urządzeniach mobilnych. Zamiast przechwytywania i zapisywania obrazu, a następnie przesyłania go na stronę internetową, jeśli dodamy funkcjonalność kamery, możemy zezwolić użytkownikowi na wykonywanie operacji bezpośrednio z aplikacji internetowej Flask. Przyspieszy to proces skanowania.
Załóżmy, że aplikacja Flask nie jest tym, co zamierzałeś odsłonić skaner OCR, możesz również utworzyć narzędzie CLI. Narzędzie pozwoli Ci uruchomić polecenie zawierające lokalizację obrazu, a następnie wydrukować dane wyjściowe skanera na terminalu lub wysłać je do bazy danych lub interfejsu API. Jeśli wybrałeś tę ścieżkę, Docopt jest fantastycznym narzędziem do budowania narzędzi wiersza poleceń przy użyciu Pythona.
podsumowanie
dzięki Tesseract i Bibliotece Python-Tesseract udało nam się skanować obrazy i wyodrębniać z nich tekst. Jest to optyczne rozpoznawanie znaków i może być bardzo przydatne w wielu sytuacjach.
zbudowaliśmy skaner, który pobiera obraz i zwraca tekst zawarty w obrazie i integruje go w aplikacji Flask jako interfejs. Pozwala nam to na wyeksponowanie funkcjonalności w bardziej znanym medium i w sposób, który może obsługiwać wiele osób jednocześnie.