sterepando commited on
Commit
701ee56
·
verified ·
1 Parent(s): 6e100aa

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +78 -0
app.py ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import io
2
+ import uvicorn
3
+ from PIL import Image
4
+ from fastapi import FastAPI, UploadFile, File, Response
5
+ from transformers import pipeline
6
+
7
+ # --- 1. Глобальная загрузка модели (СВЕРХБЫСТРЫЙ СТАРТ) ---
8
+ # Модель загружается только один раз при запуске сервера.
9
+ # Используем пайплайн для простоты и эффективности.
10
+ try:
11
+ print(">>> Загрузка модели LightOnOCR-1B-1025... Это может занять несколько минут при первом запуске.")
12
+ # Используем torch.bfloat16 для ускорения и уменьшения потребления памяти, если доступно
13
+ ocr_pipeline = pipeline(
14
+ "image-to-text",
15
+ model="lightonai/LightOnOCR-1B-1025",
16
+ device="cuda" if torch.cuda.is_available() else "cpu", # Используем GPU, если он доступен
17
+ torch_dtype=torch.bfloat16 if torch.cuda.is_available() else None,
18
+ )
19
+ print(">>> Модель успешно загружена!")
20
+ except Exception as e:
21
+ print(f"Ошибка при загрузке модели: {e}")
22
+ ocr_pipeline = None
23
+
24
+ # Инициализация FastAPI
25
+ app = FastAPI(
26
+ title="LightOnOCR Super-Fast API",
27
+ description="Публичный API для высокоскоростного распознавания текста.",
28
+ version="1.0.0",
29
+ )
30
+
31
+ # --- 2. Эндпоинт API ---
32
+
33
+ @app.post(
34
+ "/api/ocr",
35
+ summary="Запустить OCR по изображению",
36
+ response_description="Расшифрованный текст",
37
+ )
38
+ async def run_ocr(file: UploadFile = File(..., description="Изображение для расшифровки")):
39
+ """
40
+ Принимает изображение (JPG, PNG и т.д.) и возвращает распознанный текст.
41
+ """
42
+ if ocr_pipeline is None:
43
+ return Response(content="Сервер не готов. Модель не загружена.", status_code=503)
44
+
45
+ try:
46
+ # 1. Чтение файла в память
47
+ contents = await file.read()
48
+
49
+ # 2. Конвертация байтов в объект PIL Image
50
+ image = Image.open(io.BytesIO(contents)).convert("RGB")
51
+
52
+ # 3. Запуск пайплайна (САМЫЙ БЫСТРЫЙ ЭТАП)
53
+ results = ocr_pipeline(image, generate_kwargs={"max_new_tokens": 1024})
54
+
55
+ # 4. Извлечение текста
56
+ if results and isinstance(results, list) and 'generated_text' in results[0]:
57
+ decoded_text = results[0]['generated_text']
58
+ return {"text": decoded_text}
59
+ else:
60
+ return {"text": "Ошибка: Не удалось распознать текст или результат пуст."}
61
+
62
+ except Exception as e:
63
+ # Логирование ошибок для отладки
64
+ print(f"Ошибка обработки запроса: {e}")
65
+ return Response(content=f"Внутренняя ошибка сервера: {str(e)}", status_code=500)
66
+
67
+ # --- 3. Главная страница (для совместимости с HF Space) ---
68
+
69
+ @app.get("/", include_in_schema=False)
70
+ async def home():
71
+ """Перенаправление на документацию API."""
72
+ return {"message": "API запущен. Используйте эндпоинт /api/ocr (POST) или посмотрите документацию по /docs"}
73
+
74
+ # --- 4. Запуск сервера (для локального тестирования) ---
75
+ if __name__ == "__main__":
76
+ # На Hugging Face Space этот блок не запускается,
77
+ # сервер запускается через команду uvicorn (см. ниже)
78
+ uvicorn.run(app, host="0.0.0.0", port=7860)