Hướng dẫn EasyOCR: Trích xuất và tóm tắt văn bản với EasyOCR và GPT-3!
Ngày 15/02/2023 - 07:02Bắt đầu
Cài đặt thư viện cần thiết
Chúng tôi sẽ bắt đầu bằng cách tải xuống các thư viện cần thiết:
pip install easyocr openai matplotlib python-dotenv
Viết mã
Đối với hướng dẫn này, tôi sẽ sử dụng VSC, nhưng bạn có thể sử dụng bất kỳ môi trường nào bạn muốn, kể cả sổ ghi chép hoặc Google Colab.
Lưu ý : Tôi sẽ sử dụng một tệp duy nhất cho hướng dẫn này, nhưng vui lòng chia mã thành các mô-đun.
Import
import os
import cv2
import openai
import easyocr
import matplotlib.pyplot as plt
from torch.cuda import is_available
from dotenv import load_dotenv
Trích xuất văn bản từ hình ảnh
Đối với tác vụ này, chúng tôi sẽ sử dụng EasyOCR . Chúng tôi sẽ tạo một lớp có thể trích xuất văn bản cho chúng tôi!
class Reader: def __init__(self, is_cuda=False): self.reader = easyocr.Reader(['en'], gpu=is_cuda, model_storage_directory=os.path.join('models'), download_enabled=True) def __call__(self, img): return self.extract_text(img) def extract_text(self, img, show_text=False, show_confidence=False): result = self.reader.readtext(img) extracted_text = [] for text in filter(lambda x: x[-1] > .45, result): box, acc_text, confidence = text # box[0] and box[2] - upper left and lower right corners of the box img = cv2.rectangle(img, [int(i) for i in box[0]], [int(i) for i in box[2]], (0, 255, 0), 2) # each coordinate is a list has to be int if show_text and show_confidence: img_text = f'{acc_text} - ({"{:.3f}".format(confidence)}%)' elif show_text: img_text = acc_text elif show_confidence: img_text = f'CONF: ({"{:.3f}".format(confidence)}%)' if show_text or show_confidence: img = cv2.putText( img, img_text, (int(box[0][0]), int(box[0][1] - 3)), cv2.FONT_HERSHEY_SIMPLEX, fontScale=.5, color=(168, 90, 50), thickness=2 ) extracted_text.append(acc_text) return extracted_text, img
Trong __init__
phương pháp chúng tôi xác định Trình đọc tiếng Anh, nó sẽ sử dụng GPU nếu có sẵn và nó sẽ tải các mô hình xuống ./models
thư mục nếu chúng chưa được tải xuống.
__call__
phương thức cho phép chúng ta gọi trực tiếp extract_text
phương thức chỉ sử dụng thể hiện của lớp như một hàm, ví dụ:
reader = Reader()
result = reader(img) # executes `extract_text` method and returns result
Phương pháp cuối cùng là extract_text
phương pháp. Nó lấy một hình ảnh làm đối số và trả về một danh sách văn bản được trích xuất và hình ảnh có các hộp giới hạn. Nó lọc ra các văn bản với độ tin cậy dưới 45%. Phương thức trả về tuple: danh sách các văn bản và hình ảnh được trích xuất với các hộp giới hạn, nếu chúng ta muốn nó cũng có thể hiển thị văn bản và độ tin cậy cho từng hộp giới hạn.
Bây giờ chúng ta có thể thử sử dụng lớp này để trích xuất văn bản từ một hình ảnh. Để làm cho cuộc sống dễ dàng hơn, tôi sẽ tạo chức năng tải hình ảnh:
def read_img(img_path): img = cv2.imread(img_path) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) return img
Tôi sẽ sử dụng hình ảnh từ hướng dẫn trước của Adrian :
if __name__ == '__main__': reader = Reader(is_cuda=is_available()) img = read_img('./example_post.png') text, extracted_image = reader(img) text = ' '.join(text) print('Extracted_text') print(text) plt.imshow(extracted_image) plt.show()
Kết quả:
Chúng tôi đã làm một công việc thực sự tốt! Nhưng nó vẫn chưa kết thúc. Bây giờ chúng ta chuyển sang phần tóm tắt văn bản bằng GPT-3 .
Trong trường hợp này, chúng tôi cũng tạo một lớp sẽ xử lý các yêu cầu của chúng tôi đối với GPT.
Đầu tiên, tôi sẽ tạo .env
tệp và tôi sẽ đặt khóa API OpenAI của mình ở đây.
OPENAI_API_KEY=
Bây giờ tôi sẽ định nghĩa lớp cho GPT-3.
class GPT_3: def __init__(self, api_key): openai.api_key = api_key self.completion = openai.Completion self.options = { 'engine': 'text-davinci-002', 'temperature': 0.25, 'top_p': 1, 'frequency_penalty': 0, 'presence_penalty': 0, 'max_tokens': 512 } def __call__(self, prompt, options=None): return self.prediction(prompt, options) def prediction(self, prompt, options=None): if not options: options = self.options return self.completion.create(prompt=prompt, **options)['choices'][0]['text'] def summarize(self, text): prompt = f'Try to summarize the following text as best you can!\n\n{text}' return self.prediction(prompt=prompt)
Trong __init__
phương pháp, chúng tôi xác định mô hình GPT-3, các tùy chọn cho nó và chúng tôi đặt khóa API. Bạn có thể đọc về các tùy chọn GPT-3 này tại đây .
__call__
- phương pháp này có cùng mục đích với lớp trước.
Phương pháp thứ ba - prediction
cho phép chúng tôi đưa ra dự đoán cho một dấu nhắc nhất định.
Và cuối cùng: summarize
phương thức sẽ tóm tắt văn bản đã cho.
Kiểm tra nó!
Sau khi hoàn thành công việc, mã của chúng tôi trông như thế này:
import os
import cv2
import openai
import easyocr
import matplotlib.pyplot as plt
from torch.cuda import is_available
from dotenv import load_dotenv
class Reader: def __init__(self, is_cuda=False): self.reader = easyocr.Reader(['en'], gpu=is_cuda, model_storage_directory=os.path.join('models'), download_enabled=True) def __call__(self, img): return self.extract_text(img) def extract_text(self, img, show_text=False, show_confidence=False): result = self.reader.readtext(img) extracted_text = [] for text in filter(lambda x: x[-1] > .45, result): box, acc_text, confidence = text # box[0] and box[2] - upper left and lower right corners of the box img = cv2.rectangle(img, [int(i) for i in box[0]], [int(i) for i in box[2]], (0, 255, 0), 2) # each coordinate is a list has to be int if show_text and show_confidence: img_text = f'{acc_text} - ({"{:.3f}".format(confidence)}%)' elif show_text: img_text = acc_text elif show_confidence: img_text = f'CONF: ({"{:.3f}".format(confidence)}%)' if show_text or show_confidence: img = cv2.putText( img, img_text, (int(box[0][0]), int(box[0][1] - 3)), cv2.FONT_HERSHEY_SIMPLEX, fontScale=.5, color=(168, 90, 50), thickness=2 ) extracted_text.append(acc_text) return extracted_text, img
class GPT_3: def __init__(self, api_key): openai.api_key = api_key self.completion = openai.Completion self.options = { 'engine': 'text-davinci-002', 'temperature': 0.25, 'top_p': 1, 'frequency_penalty': 0, 'presence_penalty': 0, 'max_tokens': 512 } def __call__(self, prompt, options=None): return self.prediction(prompt, options) def prediction(self, prompt, options=None): if not options: options = self.options return self.completion.create(prompt=prompt, **options)['choices'][0]['text'] def summarize(self, text): prompt = f'Try to summarize the following text as best you can!\n\n{text}' return self.prediction(prompt=prompt)
def read_img(img_path): img = cv2.imread(img_path) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) return img
if __name__ == '__main__': load_dotenv() # Load secrets reader = Reader(is_cuda=is_available()) gpt_3 = GPT_3(os.getenv('OPENAI_API_KEY')) img = read_img('./example_post.png') text, extracted_image = reader(img) text = ' '.join(text) print('Extracted_text') print(text) summarization_result = gpt_3.summarize(text) print('Summarized text:') print(summarization_result) plt.imshow(extracted_image) plt.show()
Và hãy chạy nó
Bài viết liên quan
23/01/2024
29/01/2024
02/03/2024
24/01/2024
28/01/2024
26/01/2024