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)}"