/ Модель

Характеристики

Контекст
655 380 токенов
Лицензия
MIT
Архитектура
glm_ocr · dense
Базовая модель
GLM-OCR
Опубликована
1 окт 2026

glm-ocr-field-bbox-lora

Изображение и текст → текст

Дообученная на базе GLM-OCR модель извлекает поля рецептов и координаты их расположения из изображений в формате JSON.

132скачиваний за 30 дней0лайковвеса обновлены2 окт 2026

Бенчмарки

Как модель справилась с задачами пользователей ailist и что о ней публикуют открытые лидерборды

Тесты пользователейпока нет

Никто ещё не опубликовал тест этой модели. Соберите бенчмарк из своих задач — результат появится здесь.

  1. Добавьте модель в бенчмарк

    Вместе с другими моделями категории «Изображение → текст» — сравнение идёт внутри одной категории.

  2. Опишите свои задачи

    Напишите запросы, при необходимости приложите файлы и эталонные ответы.

  3. Запустите и опубликуйте

    Модели ответят на каждую задачу, судья оценит ответы. Опубликованный результат появится на этой странице.

Публичные оценки

Из открытых лидербордов. Сравнивайте результаты одного теста при одинаковых условиях — отсутствие оценки не значит, что модель хуже.

В подключённых источниках результатов для этой модели пока нет.

Что умеет модель

Описание составлено по карточке модели и метаданным Hugging Face

KeraCare/glm-ocr-field-bbox-lora — дообученная на задаче извлечения данных из рецептов модель на базе GLM-OCR от zai-org. По изображению рецепта она возвращает один JSON-объект со структурированными полями: сведения о клинике, враче и пациенте, дату и перечень лекарств. Для найденных значений модель указывает ограничивающие рамки на изображении в координатах от 0 до 1000; для печатей и подписей указывает область без распознавания текста.

Модель создана с помощью LoRA и объединена с базовыми весами. Адаптер обучен на 17 192 изображениях рецептов в течение трёх эпох; часть автоматически созданных аннотаций проверена вручную. В оценке на 476 отложенных изображениях точность определения, является ли документ рецептом, составила 99,8%, точное совпадение числа лекарств — 94,3%, а микро F1 для текста — 79,2%. Эти результаты относятся к описанной выборке и не гарантируют такое же качество на других типах документов или изображений. Лицензия — MIT.

Сценарии применения

  • Извлечение данных о пациенте из фото рецепта
  • Распознавание названий, дозировок и количества лекарств
  • Определение, является ли изображение рецептом
  • Поиск координат текста и областей на рецепте
  • Преобразование рецепта в структурированный JSON

Ограничения

Оценка проведена на 476 отложенных изображениях рецептов, и её результаты могут не переноситься на другие типы документов или условия съёмки. Текст печатей и подписей модель не распознаёт, а возвращает только их области.

Карточка модели

README от автора на Hugging Face, как он его опубликовал

Открыть на Hugging Face

GLM-OCR Field + BBox Extraction (LoRA, full-scale)

Fine-tuned from zai-org/GLM-OCR to jointly extract structured fields and their bounding boxes from prescription document images. Given a prescription photo, the model returns a single JSON object with every field below, each with its on-page location.

This is a LoRA adapter merged into the base weights (rank 64, alpha 128, dropout 0.05, targeting the vision encoder attention, vision-language merger, and LM attention/MLP layers). A sibling full fine-tune of the same task is at KeraCare/glm-ocr-field-bbox-full-ft — in our evaluation this LoRA checkpoint outperformed it on every metric, at both pilot and full scale.

Training data

17,192 prescription images, Kimi-model-generated field+bbox annotations (partially manually verified), 3 epochs. Trained on an NVIDIA GB10 (DGX Spark).

Output format

A single JSON object:

  • is_prescription (bool), declared_med_count (int)
  • structure_name, structure_phone, structure_address, structure_email: clinic/pharmacy header fields
  • prescriber_name, prescriber_specialty
  • patient_name, patient_age_dob, date
  • stamp, signature: region only, text is always null
  • header_logo, other
  • medications: list of {name, dosage, frequency, quantity, duration, drug_type}

Every field except is_prescription/declared_med_count is a list of {"text": <string or null>, "bbox": [x1, y1, x2, y2]} (empty list if the field doesn't appear on the document). bbox is normalized to image width/height and scaled to the 0-1000 integer range (not 0-1 floats, not pixels) — x_pixel = x_bbox * image_width / 1000.

Evaluation (n=476, held-out, zero overlap with training data)

MetricThis model (LoRA)Full-FT sibling
is_prescription accuracy99.8%99.4%
declared_med_count exact match94.3%90.5%
Micro text-F1 @ fuzzy≥0.779.2%75.2%
Micro geometry-F1 @ IoU≥0.565.6%57.8%
Macro mean IoU0.5970.536

Inference

import json
from PIL import Image
import torch
from transformers import AutoProcessor, AutoModelForImageTextToText

MODEL_PATH = "KeraCare/glm-ocr-field-bbox-lora"
IMAGE_PATH = "prescription.jpg"

processor = AutoProcessor.from_pretrained(MODEL_PATH, use_fast=False)
model = AutoModelForImageTextToText.from_pretrained(
    MODEL_PATH, torch_dtype=torch.bfloat16, device_map="cuda",
)

# Match the resolution used during training.
processor.image_processor.size = {"longest_edge": 1_048_576, "shortest_edge": 1024}

PROMPT = """Extract every field below from this prescription image, including the on-page location
(bounding box) of each piece of text you find.

Return a single JSON object with these top-level keys:
- is_prescription: boolean, whether the image is a prescription.
- declared_med_count: integer, the number of medications listed on the prescription.
- structure_name, structure_phone, structure_address, structure_email: lists of
  {"text": <string>, "bbox": [x1, y1, x2, y2]} for the clinic/pharmacy header.
- prescriber_name, prescriber_specialty: lists of {"text": <string>, "bbox": [...]}.
- patient_name, patient_age_dob, date: lists of {"text": <string>, "bbox": [...]}.
- stamp, signature: lists of {"text": null, "bbox": [...]} marking the region only (text is always null).
- header_logo, other: lists of {"text": <string or null>, "bbox": [...]} for any logo or unclassified element.
- medications: a list of objects, each with keys name, dosage, frequency, quantity, duration
  (each {"text": <string or null>, "bbox": [x1, y1, x2, y2] or null}) and drug_type (string or null).

bbox is [x1, y1, x2, y2]: the top-left and bottom-right corners, normalized to the image width/height
and scaled to the 0-1000 integer range. If a field does not appear on the prescription, return an
empty list for it. Output ONLY the JSON object, no other text.
"""

image = Image.open(IMAGE_PATH).convert("RGB")
messages = [
    {
        "role": "user",
        "content": [
            {"type": "image", "url": IMAGE_PATH},
            {"type": "text", "text": PROMPT},
        ],
    }
]

text = processor.apply_chat_template(
    messages, tokenize=False, add_generation_prompt=True, enable_thinking=False,
)
inputs = processor(text=text, images=[[image]], return_tensors="pt").to(model.device)

generated_ids = model.generate(**inputs, max_new_tokens=2048)
output_text = processor.decode(
    generated_ids[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True
)
result = json.loads(output_text)
print(json.dumps(result, indent=2, ensure_ascii=False))

No system prompt is used — only the single user turn (image + the instruction above) and the model's JSON completion, matching the exact format used during training.

Как запустить

На своей GPU в ailist. Цена — по текущим предложениям провайдеров

GPU в ailist

Универсальный рантайм

Можно запустить

Подбираем GPU…

Класс архитектуры
GlmOcrForConditionalGeneration
Ревизия весов
adb2a4a

0 моделей