tddf commited on
Commit
4b7419e
·
verified ·
1 Parent(s): 7741560

Update Main.py

Browse files
Files changed (1) hide show
  1. Main.py +17 -24
Main.py CHANGED
@@ -5,7 +5,7 @@ import torch
5
  from transformers import LightOnOcrForConditionalGeneration, LightOnOcrProcessor
6
  from PIL import Image
7
 
8
- # Ускоряем скачивание модели на Hugging Face Spaces
9
  os.environ["HF_HUB_ENABLE_HF_TRANSFER"] = "1"
10
 
11
  # ==================== Настройки страницы ====================
@@ -35,18 +35,11 @@ st.markdown("""
35
  border: 1px solid #e5e7eb;
36
  margin-top: 20px;
37
  }
38
- .stButton > button {
39
- background: linear-gradient(90deg, #3b82f6, #1e40af);
40
- color: white;
41
- border-radius: 12px;
42
- padding: 12px 32px;
43
- font-weight: 600;
44
- }
45
  </style>
46
  """, unsafe_allow_html=True)
47
 
48
  # ==================== Загрузка модели ====================
49
- @st.cache_resource(show_spinner="⏳ Загрузка модели LightOnOCR-1B-1025...\nЭто может занять 2–6 минут при первом запуске на CPU")
50
  def load_model():
51
  model_name = "lightonai/LightOnOCR-1B-1025"
52
 
@@ -61,7 +54,7 @@ def load_model():
61
 
62
  processor = LightOnOcrProcessor.from_pretrained(model_name)
63
 
64
- # Добавляем pad_token, если его нет (важно для генерации)
65
  if processor.tokenizer.pad_token is None:
66
  processor.tokenizer.pad_token = processor.tokenizer.eos_token
67
 
@@ -83,15 +76,15 @@ def load_image():
83
  st.markdown('<div class="header-emoji">📄✨</div>', unsafe_allow_html=True)
84
  st.title("LightOnOCR")
85
  st.markdown("**Мгновенное распознавание текста с изображений**")
86
- st.caption("Модель: lightonai/LightOnOCR-1B-1025 • Хорошо работает с английским и документами")
87
 
88
- # Загружаем модель
89
  processor, model, device, dtype = load_model()
90
 
91
- # Информация в боковой панели
92
  with st.sidebar:
93
- st.success(f"✅ Модель успешно загружена на **{device.upper()}**")
94
- st.info("LightOnOCR-1B-1025 — современная модель для OCR. Лучше всего работает с английским текстом, документами, чеками и таблицами.")
95
 
96
  # Загрузка изображения
97
  img = load_image()
@@ -103,7 +96,7 @@ if st.button("🔍 Распознать текст", use_container_width=True, t
103
  else:
104
  with st.spinner("Распознавание текста... (может занять 5–20 секунд на CPU)"):
105
 
106
- # Правильный формат промпта для LightOnOCR
107
  conversation = [
108
  {
109
  "role": "user",
@@ -121,16 +114,18 @@ if st.button("🔍 Распознать текст", use_container_width=True, t
121
  tokenize=True,
122
  return_dict=True,
123
  return_tensors="pt",
124
- images=img # Передаём PIL изображение
125
  )
126
 
127
- # Переносим tensors на правильное устройство
128
- inputs = {
 
 
129
  k: (v.to(device=device, dtype=dtype) if v.is_floating_point() else v.to(device))
130
  for k, v in inputs.items()
131
  }
132
 
133
- # Генерация текста
134
  output_ids = model.generate(
135
  **inputs,
136
  max_new_tokens=2048,
@@ -145,21 +140,19 @@ if st.button("🔍 Распознать текст", use_container_width=True, t
145
  prompt_length = inputs["input_ids"].shape[1]
146
  generated_ids = output_ids[0, prompt_length:]
147
 
148
- # Декодируем
149
  generated_text = processor.decode(
150
  generated_ids,
151
  skip_special_tokens=True,
152
  clean_up_tokenization_spaces=True
153
  ).strip()
154
 
155
- # Вывод результата
156
  st.success("✅ Распознавание завершено!")
157
  st.markdown('<div class="result-box">', unsafe_allow_html=True)
158
  st.subheader("📝 Распознанный текст")
159
  st.code(generated_text, language=None)
160
  st.markdown('</div>', unsafe_allow_html=True)
161
 
162
- # Кнопка скачивания
163
  st.download_button(
164
  label="💾 Скачать текст как .txt",
165
  data=generated_text,
@@ -167,6 +160,6 @@ if st.button("🔍 Распознать текст", use_container_width=True, t
167
  mime="text/plain"
168
  )
169
 
170
- # Нижняя подпись
171
  st.markdown("---")
172
  st.caption("Сделано на базе [lightonai/LightOnOCR-1B-1025](https://huggingface.co/lightonai/LightOnOCR-1B-1025)")
 
5
  from transformers import LightOnOcrForConditionalGeneration, LightOnOcrProcessor
6
  from PIL import Image
7
 
8
+ # Ускоряем скачивание модели
9
  os.environ["HF_HUB_ENABLE_HF_TRANSFER"] = "1"
10
 
11
  # ==================== Настройки страницы ====================
 
35
  border: 1px solid #e5e7eb;
36
  margin-top: 20px;
37
  }
 
 
 
 
 
 
 
38
  </style>
39
  """, unsafe_allow_html=True)
40
 
41
  # ==================== Загрузка модели ====================
42
+ @st.cache_resource(show_spinner="⏳ Загрузка модели LightOnOCR-1B-1025...\nЭто может занять 2–6 минут при первом запуске...")
43
  def load_model():
44
  model_name = "lightonai/LightOnOCR-1B-1025"
45
 
 
54
 
55
  processor = LightOnOcrProcessor.from_pretrained(model_name)
56
 
57
+ # Исправляем pad_token
58
  if processor.tokenizer.pad_token is None:
59
  processor.tokenizer.pad_token = processor.tokenizer.eos_token
60
 
 
76
  st.markdown('<div class="header-emoji">📄✨</div>', unsafe_allow_html=True)
77
  st.title("LightOnOCR")
78
  st.markdown("**Мгновенное распознавание текста с изображений**")
79
+ st.caption("Модель: lightonai/LightOnOCR-1B-1025")
80
 
81
+ # Загрузка модели
82
  processor, model, device, dtype = load_model()
83
 
84
+ # Сайдбар
85
  with st.sidebar:
86
+ st.success(f"✅ Модель загружена на **{device.upper()}**")
87
+ st.info("Лучше всего работает с английским текстом, документами и таблицами.")
88
 
89
  # Загрузка изображения
90
  img = load_image()
 
96
  else:
97
  with st.spinner("Распознавание текста... (может занять 5–20 секунд на CPU)"):
98
 
99
+ # Правильный промпт
100
  conversation = [
101
  {
102
  "role": "user",
 
114
  tokenize=True,
115
  return_dict=True,
116
  return_tensors="pt",
117
+ images=img
118
  )
119
 
120
+ # Перенос на устройство
121
+
122
+
123
+ inputs = {
124
  k: (v.to(device=device, dtype=dtype) if v.is_floating_point() else v.to(device))
125
  for k, v in inputs.items()
126
  }
127
 
128
+ # Генерация
129
  output_ids = model.generate(
130
  **inputs,
131
  max_new_tokens=2048,
 
140
  prompt_length = inputs["input_ids"].shape[1]
141
  generated_ids = output_ids[0, prompt_length:]
142
 
 
143
  generated_text = processor.decode(
144
  generated_ids,
145
  skip_special_tokens=True,
146
  clean_up_tokenization_spaces=True
147
  ).strip()
148
 
149
+ # Результат
150
  st.success("✅ Распознавание завершено!")
151
  st.markdown('<div class="result-box">', unsafe_allow_html=True)
152
  st.subheader("📝 Распознанный текст")
153
  st.code(generated_text, language=None)
154
  st.markdown('</div>', unsafe_allow_html=True)
155
 
 
156
  st.download_button(
157
  label="💾 Скачать текст как .txt",
158
  data=generated_text,
 
160
  mime="text/plain"
161
  )
162
 
163
+ # Подвал
164
  st.markdown("---")
165
  st.caption("Сделано на базе [lightonai/LightOnOCR-1B-1025](https://huggingface.co/lightonai/LightOnOCR-1B-1025)")