Initialize recipe recognition repository

This commit is contained in:
“Naeel”
2026-08-28 08:53:16 +03:00
commit 6a7872b345
4 changed files with 336 additions and 0 deletions
+204
View File
@@ -0,0 +1,204 @@
Пользователь:
/home/naeel/MED/recipe/PLAN/recipe1.png - пример рецепта
/home/naeel/MED/recipe/PLAN/gemini.md - то что жемини советует
надо - план создания приложения для андроида, которое
1. будет вычленять прямоукльник с датой рецепта и прямоугольник с названиями/дозировками лекарств и отправлять выделенное на сервер для дальнейшей обработки
2. после обработки сервер перешлёт обратно в приложение распознынне данные, которое приложение выведет на экран на место рукописного текста
пример - как гугл переводчик в режиме распознавания
ФИО ДР пациента не должны быть копированы, их прямоугольник не доолжен выделяться. или - выделяться но явно показываться что не используется, заблюрены или как то иначе
план - коротко, без воды, понятно, НИКАКОГО КОДА, кодить будут агенты, от тебя - архитектурные идеи, что гового из библиотек можно использовать, что - писать самим
задание понятно ?
Ассистент:
Задание понятно. Изучил рецепт и план Gemini. Готовлю архитектурный план.
Ассистент:
---
## План: Android-приложение распознавания рецепта
**Суть:** снимок бланка → выделение зон → OCR на сервере → наложение текста поверх рукописного (AR-режим). Зона ФИО/ДР — визуально заблюрена, на сервер не отправляется.
---
### Архитектура (4 слоя)
```
Camera → [Document Scanner] → aligned bitmap
↓
[Zone Detector] ←— ML Kit Text Recognition
↓
PATIENT | DATE | MEDICATIONS | OTHER
↓blur ↓ ↓
не отправляется POST /api/v1/recognize
↓
[Server OCR]
↓
JSON {date, medications[]}
↓
[AR Overlay Renderer]
```
---
### Клиент — Android / Kotlin / Compose
**Готовые библиотеки:**
- `ML Kit Document Scanner` — захват + перспективная коррекция бланка
- `ML Kit Text Recognition v2` — определение bounding boxes зон
- `Ktor Client` — HTTP + kotlinx.serialization
- `Jetpack Compose + Material 3` — UI
- `Coil Compose` — отображение bitmap
**Писать самим:**
- **Zone Classifier** — эвристика: y-позиция блока + ключевые слова ("Rp.", "Ф.И.О.", "Дата рождения")
- **Privacy Masking** — Compose Canvas: blur overlay на PATIENT-зоне
- **AR Overlay Renderer** — Compose Canvas с наложением текста поверх изображения
---
### Сервер — Python / FastAPI
**Готовые:**
- `FastAPI + pydantic` — API
- `Google Cloud Vision API` или `Azure Computer Vision` — OCR рукописи
- `Tesseract 5 + LSTM` — self-hosted альтернатива
**Писать самим:**
- Обёртка OCR API
- Парсер структуры лекарств
---
### Фазы
1. Capture + Alignment
2. Zone Detection + Privacy
3. Server OCR
4. AR Overlay
---
Пользователь:
надо учитывать что это - названия лекарств то есть ограниченный набор слов
Ассистент:
Важное замечание. Это даёт два преимущества:
1. На сервере — нормализация через справочник.
2. В промпте LLM — контекст ограниченного словаря.
3. В Zone Classifier — дополнительные сигналы вроде `Rp.`, `Tab.`, `мг`, `мл`.
Результат должен нормализоваться по справочнику лекарственных средств, например через `rapidfuzz` и локальную SQLite-копию ГРЛС. Низкая уверенность помечается как `uncertain: true` и показывается пользователю для проверки.
Пользователь:
- `gpt-oss-120b`
Ассистент:
`gpt-oss-120b` — модель на GitHub Models / Azure AI Foundry с OpenAI-совместимым API. В серверной части вместо отдельного OCR API и дополнительного парсера можно использовать один вызов Vision LLM, если конкретный endpoint принимает изображения.
Пользователь:
120 billions наврное это ознавает
Ассистент:
Да, скорее всего «120B» означает 120 миллиардов параметров. Уточните: это конкретная модель, которая уже у вас развёрнута, или планируете деплоить? И это Vision-модель, принимающая изображения?
Пользователь:
- `gpt-oss-120b`
Ассистент:
Хорошо. Вот финальный обновлённый план:
## План: Android-приложение распознавания рецепта
**Суть:** снимок бланка → выделение зон → Vision LLM на сервере → AR-наложение распознанного текста. Зона ФИО/ДР — заблюрена, на сервер не отправляется.
### Архитектура
```
Camera → [ML Kit Document Scanner] → aligned bitmap
↓
[ML Kit Text Recognition v2]
↓
[Zone Classifier]
/ | \\
PATIENT DATE MEDICATIONS
(blur, ↓ ↓
не шлём) POST /api/v1/recognize
↓
[FastAPI + gpt-oss-120b]
один Vision LLM запрос →
JSON {date, medications[]}
↓
[AR Overlay Renderer]
```
### Клиент — Android / Kotlin / Compose
**Готовые:**
- ML Kit Document Scanner
- ML Kit Text Recognition v2
- Ktor Client + kotlinx.serialization
- Jetpack Compose + Material 3 + Coil Compose
**Писать самим:**
- Zone Classifier для нескольких форм бланков
- Form Detector
- Privacy Masking
- AR Overlay Renderer
### Сервер — Python / FastAPI
**Готовые:**
- FastAPI + pydantic
- openai Python SDK для gpt-oss-120b
**Писать самим:**
- LLM-промпт с возвратом строго JSON
- Валидация ответа pydantic
- Retry при невалидном JSON
- Нормализация названий лекарств по справочнику ГРЛС
### Протокол
Request `POST /api/v1/recognize`:
```
zones: [
{ type: "DATE", image: "<base64 JPEG>" },
{ type: "MEDICATIONS", image: "<base64 JPEG>" }
]
```
Response:
```
{
date: "12.03.2025",
medications: [
{
name: "Амоксициллин",
raw: "Амоксицил",
uncertain: false,
dose: "500 мг",
instructions: "3 р/день"
}
]
}
```
### Фазы
1. Capture
2. Zone Detection + Privacy
3. Server LLM OCR
4. AR Overlay
### Ограниченный набор названий лекарств
Названия лекарств нужно проверять по справочнику, а не принимать ответ LLM без проверки. Рекомендуется хранить локальную SQLite-копию ГРЛС: МНН, торговые названия, формы выпуска и дозировки. Для сопоставления использовать `rapidfuzz`; при низком совпадении возвращать `uncertain: true`. Нельзя автоматически подменять сомнительное название без показа пользователю и возможности исправления.