File size: 4,018 Bytes
3886a19 c30f358 5c8c150 3886a19 4d7290f 3886a19 c30f358 3886a19 5c8c150 b052766 5c8c150 b052766 5c8c150 3886a19 5c8c150 3886a19 c30f358 3886a19 c30f358 5c8c150 3886a19 5c8c150 3886a19 5c8c150 3886a19 5c8c150 3886a19 5c8c150 3886a19 c30f358 3886a19 c30f358 |
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# utils.py
import os
from transformers import AutoModel, AutoTokenizer
from PIL import Image, ImageEnhance, ImageFilter
import torch
import logging
logger = logging.getLogger(__name__)
class OCRModel:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super(OCRModel, cls).__new__(cls)
cls._instance.initialize()
return cls._instance
def initialize(self):
try:
logger.info("Initializing OCR model...")
# تهيئة النموذج والتوكينايزر
self.tokenizer = AutoTokenizer.from_pretrained('RufusRubin777/GOT-OCR2_0_CPU', trust_remote_code=True)
self.model = AutoModel.from_pretrained(
'RufusRubin777/GOT-OCR2_0_CPU',
trust_remote_code=True,
low_cpu_mem_usage=True,
device_map='cpu',
use_safetensors=True,
pad_token_id=self.tokenizer.eos_token_id
)
# تحديد الجهاز وتهيئة النموذج للتقييم
self.device = "cpu" # هذا النموذج مصمم للـ CPU
self.model = self.model.eval().cpu()
logger.info("Model initialization completed successfully")
except Exception as e:
logger.error(f"Error initializing model: {str(e)}", exc_info=True)
raise
def preprocess_image(self, image):
"""معالجة مسبقة للصورة لتحسين جودة التعرف على النص"""
try:
# تحويل الصورة إلى RGB إذا لم تكن كذلك
if image.mode != 'RGB':
image = image.convert('RGB')
# تحسين التباين
enhancer = ImageEnhance.Contrast(image)
image = enhancer.enhance(1.5)
# تحسين الحدة
enhancer = ImageEnhance.Sharpness(image)
image = enhancer.enhance(1.5)
# تحسين السطوع
enhancer = ImageEnhance.Brightness(image)
image = enhancer.enhance(1.2)
# تطبيق فلتر لتنعيم الصورة قليلاً
image = image.filter(ImageFilter.SMOOTH)
return image
except Exception as e:
logger.error(f"Error in image preprocessing: {str(e)}", exc_info=True)
raise
def process_image(self, image_stream):
try:
logger.info("Starting image processing")
# حفظ الصورة مؤقتاً لأن النموذج يتطلب مسار ملف
temp_image_path = "temp_image.jpg"
# إعادة تعيين مؤشر البداية للـ BytesIO
image_stream.seek(0)
# فتح وحفظ الصورة مؤقتاً
image = Image.open(image_stream).convert('RGB')
processed_image = self.preprocess_image(image)
processed_image.save(temp_image_path)
# استخدام النموذج للتعرف على النص
try:
result = self.model.chat(self.tokenizer, temp_image_path, ocr_type='format')
logger.info(f"Successfully extracted text: {result[:100]}...")
# حذف الملف المؤقت
if os.path.exists(temp_image_path):
os.remove(temp_image_path)
return result.strip()
except Exception as e:
logger.error(f"Error in OCR processing: {str(e)}", exc_info=True)
if os.path.exists(temp_image_path):
os.remove(temp_image_path)
raise
except Exception as e:
logger.error(f"Error in image processing: {str(e)}", exc_info=True)
return f"Error processing image: {str(e)}" |