পাইথনে বাংলা OCR – ইমেজ টু টেক্সট

ইমেজ থেকে টেক্সট বের করার জন্য অনেক টুল রয়েছে। বেশির ভাগই ইংরেজিতে। বাংলা টেক্সট এক্সট্রাক্ট করার অপশন থাকে না। আপনি চাইলে ছোট্ট একটা পাইথন প্রোগ্রাম লিখে নিতে পারেন। যার মাধ্যমে যে কোন PDF/ইমেজ থেকে বাংলা টেক্সট গুলো এক্সট্রাক্ট করতে পারবেন। আর তার জন্য আমরা ব্যবহার করব pytesseract

আমরা pip ব্যবহার করে pytesseract ইন্সটল করব। পিপ সম্পর্কে বিস্তারিতঃ পাইথন প্যাকেজ ম্যানেজার PIP। ইন্সটল শেষে কমান্ডলাইন বা টার্মিনালে গিয়ে লিখবঃ

pip install pytesseract

ঠিক মত ইন্সটল হয়েছে কিনা তা ভেরিফাই করতে পারি এই কোড টার্মিনালে রান করেঃ

python -c "import pytesseract; print('pytesseract installed successfully!')"

বাংলা ভাষা ডিফল্ট ভাবে ইন্সটল থাকার কথা। কি কি ল্যাঙ্গুয়েজ প্যাক রয়েছে, তা দেখা যাবে নিচের কমান্ড রান করেঃ

tesseract --list-langs

বাংলার কোড হচ্ছে ben। যদি না থাকে, এখান থেকে ডাউনলোড করে নেওয়া যাবে। ডাউনলোড শেষে tessdata ফোল্ডারে কপি করতে হবে। সাধারণত লিনাক্স বা ম্যাকে এই লোকেশনে। /usr/share/tesseract-ocr/5/tessdata/ এবং উইন্ডোজে C:\Program Files\Tesseract-OCR\tessdata এই লোকেশনে কপি করতে হবে।

এরপর নিচের মত করে ছোট্ট একটা স্ক্রিপ্ট লিখলে নির্দিষ্ট ইমেজ থেকে থেকে টেক্সট বের করে দিবে।

import pytesseract
from PIL import Image

# Load the image
image_path = "bangla.png"  # Path to your image file
image = Image.open(image_path)

# Perform OCR on the image
text = pytesseract.image_to_string(image, lang="ben")  # 'ben' is the code for Bangla

# Print the extracted text
print("Extracted Text:")
print(text)

একটা ফাইলে টেক্সট গুলো আউটপুট হিসেবে লিখতে পারিঃ

# Save the extracted text to a file
with open("extracted_bangla_text.txt", "w", encoding="utf-8") as file:
    file.write(text)

একের অধিক ইমেজ ফাইল যদি এক সাথে রিড করতে চাই, তাহলে এভাবে লিখতে পারি কোডঃ

import os
import pytesseract
from PIL import Image

# Directory containing the images
image_dir = "path_to_your_directory"  # Replace with the path to your image directory

# Output text file to save OCR results
output_txt_file = "ocr_results.txt"

# Language for OCR (Bangla in this case)
ocr_language = "ben"  # Change to your desired language

# Open the output file in write mode
with open(output_txt_file, "w", encoding="utf-8") as output_file:
    # Iterate through all files in the directory
    for filename in os.listdir(image_dir):
        if filename.lower().endswith((".png", ".jpg", ".jpeg", ".tiff", ".bmp")):  # Supported image formats
            # Full path to the image
            image_path = os.path.join(image_dir, filename)

            # Load the image
            image = Image.open(image_path)

            # Perform OCR on the image
            extracted_text = pytesseract.image_to_string(image, lang=ocr_language)

            # Write the filename and extracted text to the output file
            output_file.write(f"File: {filename}\n")
            output_file.write(extracted_text)
            output_file.write("\n" + "=" * 50 + "\n")  # Separator for readability

            print(f"Processed: {filename}")  # Optional: Print progress

print(f"All OCR results saved to {output_txt_file}")

একের অধিক ল্যাঙ্গুয়েজও আমরা এক্সট্রাক্ট করতে পারব। যেমন বেশির ভাগ লেখায় ইংরেজি শব্দ ও থাকে। তখন ben+eng এভাবে দুইটা ল্যাঙ্গুয়েজ যোগ করতে দিতে পারব।

ocr_languages = "ben+eng"

PDF থেকে বাংলা টেক্সট

PDF থেকে যদি টেক্সট এক্সট্রাক্ট করতে চাই, তাহলে pdf2image ইন্সটল করে নিব।

pip install pdf2image

এরপর পর নিচের মত করে কোড লিখবঃ

import pytesseract
from pdf2image import convert_from_path

# Convert PDF to images
images = convert_from_path("bangla.pdf")

# OCR with Bangla language
for i, image in enumerate(images):
    text = pytesseract.image_to_string(image, lang="ben")
    print(f"Page {i + 1}:\n{text}\n")

উপরের স্ক্রিপ্ট টার্মিনালে আউটপুট দেখাবে। আমরা চাইলে একটা ফাইলে টেক্সট গুলো আউটপুট দিতে পারিঃ

import pytesseract
from pdf2image import convert_from_path

# Path to your PDF file
pdf_path = "bangla.pdf"

# Output text file path
output_txt_path = "output.txt"

# Convert the PDF to images
images = convert_from_path(pdf_path)

# Open a text file for writing in Unicode format
with open(output_txt_path, "w", encoding="utf-8") as file:
    for i, image in enumerate(images):
        # Perform OCR on each page
        text = pytesseract.image_to_string(image, lang="ben")  # 'ben' for Bangla language
        # Write the page number and extracted text to the file
        file.write(f"Page {i + 1}:\n")
        file.write(text)
        file.write("\n" + "="*50 + "\n")  # Separator between pages

print(f"Bangla text extracted and saved to {output_txt_path}")

সহজ না?

অপশনালঃ আমি সাধারণত Miniconda ব্যবহার করে পাইথন একেক কাজে একেক এনভারনমেন্ট তৈরি করে এরপর পাইথন স্ক্রিপ্ট রান করি। যেমন উপরের কাজ গুলো করার জন্য প্রথমে ocr এনভারনমেন্ট তৈরি করে নিব। এনভারনমেন্ট নিয়ে বিস্তারিত পাওয়া যাবে পাইথনের একের অধিক ভার্সন ম্যানেজমেন্ট এবং ভার্চুয়াল এনভারনমেন্ট লেখাতে।

মেশিন লার্নিং রিলেটেড কাজ করার কারণে pyenv থেকে আমর conda এনভারনমেন্ট বেশি ব্যবহৃত হয়। এখানে conda দিয়ে কিভাবে pytesseract ইন্সটল করবেন, তা দেখাচ্ছি।

কম্পিউটারে মিনিকন্ডা ইন্সটল না থাকলে প্রথমে ইন্সটল করে নিব। উইন্ডোজ, ম্যাক, লিনাক্স সব অপারেটিং সিস্টেমের জন্যই পাওয়া যায়। মিনিকন্ডা হচ্ছে এনাকন্ডার মিনি ভার্সন। এনাকন্ডাতে অনেক বেশি প্যাকেজ থাকে। যেগুলোর বেশির ভাগই অদরকারি, তাই মিনি ভার্সন আমি প্রেফার করি। এরপর conda ব্যবহার করে দরকারি প্যাকেজ গুলো ইন্সটল করে নিতে পারব। তার পর নিচের মত করে একটা এনভারনমেন্ট তৈরি করে নিবঃ

conda create -n orc python=3.12

এরপর সদ্য তৈরি করা এনভারনমেন্ট একটিভ করে নিব।

conda activate ocr

তারপর এই এনভারনমেন্টে pytesseract ইন্সটল করবঃ

conda install -c conda-forge pytesseract

এরপর চাইলে নিচের স্ক্রিপ্ট রান করতে পারবঃ

import pytesseract
from PIL import Image

# Load the image
image_path = "bangla.png"  # Path to your image file
image = Image.open(image_path)

# Perform OCR on the image
text = pytesseract.image_to_string(image, lang="ben")  # 'ben' is the code for Bangla

# Print the extracted text
print("Extracted Text:")
print(text)

বাংলা প্যাক ইন্সটল না থাকলে ইন্সটল করতেঃ

conda install -c conda-forge tesseract-data-ben

পাইথন প্রোগ্রামিং নিয়ে এই ব্লগে প্রচুর লেখা রয়েছেঃ বাংলায় পাইথন প্রোগ্রামিং ল্যাঙ্গুয়েজ। এই ব্লগের কোন লেখা পড়ে অসুবিধায় পড়লে jakir.me discussions গ্রুপে আলোচনা করতে পারেন।

Leave a Reply