Lyti4 commited on
Commit
babb4f3
·
verified ·
1 Parent(s): 0f1c5d2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +56 -49
app.py CHANGED
@@ -79,12 +79,7 @@ class FreeAIOrchestrator:
79
  print("🔄 Инициализация кастомного токенайзера для Surya Table...")
80
 
81
  # Используем пайплайн с указанием нашего токенайзера
82
- self.surya_table_model = pipeline(
83
- "image-to-text",
84
- model="vikp/surya_table",
85
- tokenizer=Byt5LangTokenizer.from_pretrained("t5-base", legacy=False)
86
- )
87
-
88
  print("✅ Surya Table модель загружена успешно")
89
  self.surya_table_available = True
90
  except Exception as e:
@@ -255,62 +250,25 @@ class FreeAIOrchestrator:
255
  pil_image = Image.open(io.BytesIO(image))
256
 
257
  # Распознаем таблицу через Surya Table
258
- try:
259
- # Пробуем с нашим кастомным токенайзером
260
- table_result = self.surya_table_model(pil_image)
261
- except Exception as tokenizer_error:
262
- print(f"⚠️ Ошибка с кастомным токенайзером: {tokenizer_error}")
263
- # Если не сработало, используем альтернативный метод
264
- try:
265
- print("🔄 Используем альтернативный метод для Surya Table...")
266
- # Используем автоматически выбранный tokenizer
267
- from transformers import pipeline
268
- surya_fallback = pipeline(
269
- "image-to-text",
270
- model="vikp/surya_table",
271
- tokenizer=None # Позволяем pipeline самому выбрать tokenizer
272
- )
273
- table_result = surya_fallback(pil_image)
274
- except Exception as fallback_error:
275
- print(f"⚠️ Ошибка с fallback методом: {fallback_error}")
276
- # Если и это не сработало, используем еще более простой метод
277
- try:
278
- # Альтернативный подход без использования pipeline
279
- print("🔄 Используем прямой подход для Surya Table...")
280
- from transformers import AutoModelForVision2Seq, AutoImageProcessor
281
-
282
- processor = AutoImageProcessor.from_pretrained("vikp/surya_table")
283
- model = AutoModelForVision2Seq.from_pretrained("vikp/surya_table")
284
-
285
- inputs = processor(images=pil_image, return_tensors="pt")
286
- outputs = model.generate(**inputs, max_length=1024)
287
-
288
- table_text = processor.batch_decode(outputs, skip_special_tokens=True)[0]
289
- table_result = [{"generated_text": table_text}]
290
- except Exception as direct_error:
291
- print(f"⚠️ Все методы распознавания Surya Table не удались: {direct_error}")
292
- raise direct_error
293
 
294
  # Преобразуем результат в структурированный формат
295
  try:
296
  # Результат может быть в разных форматах
297
  if isinstance(table_result, list) and len(table_result) > 0:
298
- if isinstance(table_result[0], dict) and 'generated_text' in table_result[0]:
299
- table_text = table_result[0]['generated_text']
300
  else:
301
- table_text = str(table_result)
302
  else:
303
- table_text = str(table_result)
304
-
305
- # Парсим структуру таблицы из текста
306
- table_data = self._parse_table_text(table_text)
307
 
308
  return {
309
  "success": True,
310
  "type": "table",
311
  "model": "surya_table",
312
  "rows": table_data,
313
- "raw_text": table_text,
314
  "confidence": 0.95
315
  }
316
  except Exception as parse_error:
@@ -347,6 +305,55 @@ class FreeAIOrchestrator:
347
  print(f"❌ Ошибка распознавания таблицы: {e}")
348
  return []
349
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
350
  def _parse_table_text(self, table_text):
351
  """Парсинг текста таблицы в структурированные данные"""
352
  rows = []
 
79
  print("🔄 Инициализация кастомного токенайзера для Surya Table...")
80
 
81
  # Используем пайплайн с указанием нашего токенайзера
82
+ self.surya_table_model = TableRecPredictor()
 
 
 
 
 
83
  print("✅ Surya Table модель загружена успешно")
84
  self.surya_table_available = True
85
  except Exception as e:
 
250
  pil_image = Image.open(io.BytesIO(image))
251
 
252
  # Распознаем таблицу через Surya Table
253
+ table_result = self.surya_table_model([pil_image])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
254
 
255
  # Преобразуем результат в структурированный формат
256
  try:
257
  # Результат может быть в разных форматах
258
  if isinstance(table_result, list) and len(table_result) > 0:
259
+ if isinstance(table_result[0], dict) and 'cells' in table_result[0]:
260
+ table_data = self._parse_surya_table(table_result[0])
261
  else:
262
+ table_data = []
263
  else:
264
+ table_data = []
 
 
 
265
 
266
  return {
267
  "success": True,
268
  "type": "table",
269
  "model": "surya_table",
270
  "rows": table_data,
271
+ "raw_text": "",
272
  "confidence": 0.95
273
  }
274
  except Exception as parse_error:
 
305
  print(f"❌ Ошибка распознавания таблицы: {e}")
306
  return []
307
 
308
+ def _parse_surya_table(self, surya_result):
309
+ """Парсинг результата Surya в структурированные данные"""
310
+ rows = []
311
+ headers = {}
312
+
313
+ # First pass: get headers
314
+ for cell in surya_result.get('cells', []):
315
+ if cell.get('is_header'):
316
+ headers[cell.get('col_id')] = cell.get('text', '').lower()
317
+
318
+ # Second pass: get rows
319
+ row_dict = {}
320
+ for cell in surya_result.get('cells', []):
321
+ row_id = cell.get('row_id')
322
+ if row_id not in row_dict:
323
+ row_dict[row_id] = {}
324
+
325
+ col_id = cell.get('col_id')
326
+ header = headers.get(col_id, str(col_id))
327
+
328
+ value = cell.get('text', '')
329
+ # Преобразуем заголовки к стандартным полям
330
+ if 'товар' in header or 'название' in header or 'наимен' in header:
331
+ row_dict[row_id]['name'] = value
332
+ elif 'кол' in header or 'шт' in header:
333
+ try:
334
+ # Извлекаем числовое значение
335
+ quantity = re.search(r'(\d+(?:\.\d+)?)', value)
336
+ if quantity:
337
+ row_dict[row_id]['quantity'] = float(quantity.group(1))
338
+ else:
339
+ row_dict[row_id]['quantity'] = value
340
+ except:
341
+ row_dict[row_id]['quantity'] = value
342
+ elif 'арт' in header:
343
+ row_dict[row_id]['article'] = value
344
+ elif 'цен' in header:
345
+ # Извлекаем числовое значение цены
346
+ price = re.search(r'(\d+(?:\.\d+)?)', value)
347
+ if price:
348
+ row_dict[row_id]['price'] = float(price.group(1))
349
+ else:
350
+ row_dict[row_id]['price'] = value
351
+ else:
352
+ # Для прочих колонок используем оригинальное название
353
+ row_dict[row_id][header] = value
354
+
355
+ return list(row_dict.values())
356
+
357
  def _parse_table_text(self, table_text):
358
  """Парсинг текста таблицы в структурированные данные"""
359
  rows = []