Chào các bạn, tiếp tục chủ đề Tự học và phát triển ứng dụng thực tế AI, ML, DL, DS mình xin giới thiệu bài viết Tự xây dựng OCR server đơn giản bằng Python sử dụng Tesseract và Flask.
OCR là gì?
OCR là thuật ngữ được viết tắt bởi cụm từ Optical Character Recognition (nhận dạng ký tự quang học). Đây là ứng dụng công nghệ chuyên dùng để đọc văn bản từ file ảnh. Được sử dụng để nhận dạng các ký tự, chữ viết tay, hay chữ đánh máy, công nghệ này cũng được dùng để truyền tải, nhập liệu dữ liệu.
Một số ứng dụng của OCR:
– Ứng dụng bóc tách thông tin văn bản
– Ứng dụng bóc tách thông tin tờ trình, hợp đồng
– Ứng dụng vào bóc tách biểu mẫu ngân hàng, bảo hiểm, viễn thông, nghiên cứu thị trường
– Ứng dụng bóc tách chứng minh thư
– Ứng dụng bóc tách thông tin sổ đỏ
– Ứng dụng bóc tách thông tin giản đồ
– Ứng dụng phân tích và tìm kiếm theo ảnh
Bắt đầu xây dựng OCR server đơn giản
Chúng ta sẽ bắt đầu bằng cách phát triển back-end của Flask để phục vụ các kết quả của công cụ OCR. Từ đây, chúng ta chỉ cần đưa ra end-point và cung cấp kết quả cho người dùng cuối.
Dependencies
Chúng ta cần tải về Tesseract và tất cả các dependencies của nó, bao gồm Leptonica, cũng như một số gói khác.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ sudo apt-get update $ sudo apt-get install autoconf automake libtool $ sudo apt-get install libpng12-dev $ sudo apt-get install libjpeg62-dev $ sudo apt-get install g++ $ sudo apt-get install libtiff4-dev $ sudo apt-get install libopencv-dev libtesseract-dev $ sudo apt-get install git $ sudo apt-get install cmake $ sudo apt-get install build-essential $ sudo apt-get install libleptonica-dev $ sudo apt-get install liblog4cplus-dev $ sudo apt-get install libcurl3-dev $ sudo apt-get install python2.7-dev $ sudo apt-get install tk8.5 tcl8.5 tk8.5-dev tcl8.5-dev $ sudo apt-get build-dep python-imaging --fix-missing |
Chúng ta cũng cần ImageMagick nếu chúng ta muốn chỉnh sửa các hình ảnh trước khi đưa chúng vào chương trình.
1 |
$ sudo apt-get install imagemagick |
Xây dựng Leptonica và Tesseract
1 2 3 4 5 6 7 8 |
$ wget http://www.leptonica.org/source/leptonica-1.70.tar.gz $ tar -zxvf leptonica-1.70.tar.gz $ cd leptonica-1.70/ $ ./autobuild $ ./configure $ make $ sudo make install $ sudo ldconfig |
1 2 3 4 5 6 7 8 9 |
$ cd .. $ wget https://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.02.tar.gz $ tar -zxvf tesseract-ocr-3.02.02.tar.gz $ cd tesseract-ocr/ $ ./autogen.sh $ ./configure $ make $ sudo make install $ sudo ldconfig |
Biến môi trường
Chúng ta cần thiết lập một biến môi trường để tạo nguồn dữ liệu Tesseract:
1 |
$ export TESSDATA_PREFIX=/usr/local/share/ |
Tesseract Packages
Cuối cùng, hãy lấy các gói ngôn ngữ tiếng Anh Tesseract có liên quan:
1 2 3 4 |
$ cd .. $ wget https://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.eng.tar.gz $ tar -xf tesseract-ocr-3.02.eng.tar.gz $ sudo cp -r tesseract-ocr/tessdata $TESSDATA_PREFIX |
Cài đặt Web server
Các bạn có thể tải về từ nguồn này đã có phần cài đặt server Flask
1 2 3 4 5 6 7 8 |
$ wget https://github.com/rhgraysonii/ocr_tutorial/archive/v0.tar.gz $ tar -xf v0.tar.gz $ mv ocr_tutorial-0/* ../home/ $ cd ../home $ sudo apt-get install python-virtualenv $ virtualenv env $ source env/bin/activate $ pip install -r requirements.txt |
Bây giờ đến phần OCR
Chúng ta cần tạo một lớp bằng cách sử dụng pytesseract để lấy và đọc hình ảnh. Tạo một file mới có tên ocr.py trong thư mục “flask_server” và thêm mã sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import pytesseract import requests from PIL import Image from PIL import ImageFilter from StringIO import StringIO def process_image(url): image = _get_image(url) image.filter(ImageFilter.SHARPEN) return pytesseract.image_to_string(image) def _get_image(url): return Image.open(StringIO(requests.get(url).content)) |
Phương thức process_image(), chúng ta dùng để làm sắc nét hình ảnh để làm rõ nét văn bản.
Mở rộng, Tạo CLI sau khi thực hiện quá nhiều cấu hình. Vì vậy, chúng ta hãy bắt tay vào làm một cái. Tạo một file mới trong “flask_server” được gọi là cli.py và sau đó thêm mã sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import sys import requests import pytesseract from PIL import Image from StringIO import StringIO def get_image(url): return Image.open(StringIO(requests.get(url).content)) if __name__ == '__main__': """Tool to test the raw output of pytesseract with a given input URL""" sys.stdout.write(""" ===OOOO=====CCCCC===RRRRRR=====\n ==OO==OO===CC=======RR===RR====\n ==OO==OO===CC=======RR===RR====\n ==OO==OO===CC=======RRRRRR=====\n ==OO==OO===CC=======RR==RR=====\n ==OO==OO===CC=======RR== RR====\n ===OOOO=====CCCCC===RR====RR===\n\n """) sys.stdout.write("A simple OCR utility\n") url = raw_input("What is the url of the image you would like to analyze?\n") image = get_image(url) sys.stdout.write("The raw output from tesseract with no processing is:\n\n") sys.stdout.write("-----------------BEGIN-----------------\n") sys.stdout.write(pytesseract.image_to_string(image) + "\n") sys.stdout.write("------------------END------------------\n") |
Bây giờ chúng ta đã có một OCR engine, chúng ta cần phải có một số output! Thêm hàm xử lý và route handler sau vào app.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import os import logging from logging import Formatter, FileHandler from flask import Flask, request, jsonify from ocr import process_image @app.route('/v{}/ocr'.format(_VERSION), methods=["POST"]) def ocr(): try: url = request.json['image_url'] if 'jpg' in url: output = process_image(url) return jsonify({"output": output}) else: return jsonify({"error": "only .jpg files, please"}) except: return jsonify( {"error": "Did you mean to send: {'image_url': 'some_jpeg_url'}"} ) |
Như bạn có thể thấy, chúng ta chỉ thêm response là JSON của phương thức process_image() của Engine, pass nó vào 1 image object bằng Image from PIL . Hiện tại tính năng này chỉ hoạt động với hình ảnh .jpg.
Đừng quên thêm version của api
1 |
_VERSION = 1 # API version |
Vậy là xong, chúng ta kiểm tra xem code có hoạt động không nào!
1 2 |
$ cd ../home/flask_server/ $ python app.py |
1 |
$ curl -X POST http://localhost:5000/v1/ocr -d '{"image_url": "some_url"}' -H "Content-Type: application/json" |
Chúc các bạn thành công!
Leave a Reply