1. Продукты
  2.   Aspose.OMR
  3.   Aspose.OMR FOSS for Python

Aspose.OMR FOSS для Python

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

Open-Source Python библиотека для оптического распознавания отметок

Aspose.OMR FOSS for Python — это бесплатная, открытая библиотека для разработки OMR (optical mark recognition) форм — листов ответов с множественным выбором, форм с флажками и опросов — и распознавания отметок, которые респондент ставит на отсканированном или сфотографированном изображении. Она предназначена для разработчиков, автоматизирующих оценку экзаменов, подсчет результатов опросов или сбор данных из форм в чистом Python, построенной исключительно на numpy, opencv-python и Pillow. Один OmrEngine охватывает весь процесс — Generate() преобразует шаблон, созданный кодом из дерева TemplateConfig элементов, таких как ChoiceBoxConfig, CheckBoxConfig, GridConfig и AnswerSheetConfig, или написанный в компактном DSL разметки текста, в изображение страницы и дескриптор .omr; GetTemplateProcessor() загружает этот дескриптор для распознавания новых сканов с помощью Recognize() или RecognizeFolder(), возвращая результаты, экспортируемые в CSV, JSON или XML. Библиотека лицензирована по MIT и устанавливается одной командой pip (см. ниже); это ранний релиз (v0.1.0, Development Status: Alpha), охватывающий фундамент, генерацию и слои распознавания полной поверхности Aspose.OMR — рендеринг в этом выпуске поддерживает только LTR/Western, а поддержка RTL-писем и полноценной обработки переполнения находится в дорожной карте, но ещё не реализована. Для семейства корпоративных продуктов смотрите Aspose.OMR — Enterprise Product Family.

Разработка и создание OMR-форм

  • Code-first templates: TemplateConfig, PageConfig и конфигурации элементов (ChoiceBoxConfig, CheckBoxConfig, GridConfig, CompositeGridConfig, AnswerSheetConfig) описывают каждое поле на странице.
  • Markup DSL: компактный текстовый формат (?choicebox=... / &choicebox) создает те же структуры без ручного создания объектов.
  • Writing-system enums: Arabic, Hebrew, Persian, Urdu, Bengali и Western присутствуют для API точности с Aspose.OMR поверхностью; рендерер этой версии поддерживает только LTR/Western — RTL-рендеринг пока не реализован.
  • Overflow enums: LongWordHandling и подклассы OverflowAction (Clip, NoClip, Wrap) правильно разбираются и проверяются, но рендерер этой версии пока их не учитывает — реальное поведение при переполнении пока не настраивается.
  • Checkbox and choice groups: CheckBoxConfig и ChoiceBoxConfig поддерживают множественный выбор; FormValidationLogic, задаваемый один раз для TemplateProcessor, может вызвать ошибку, если вопрос с отключённым Multiselect получает более одной отметки.

Где Aspose.OMR FOSS может быть использовано

  • Экзамены и викторины: генерировать листы ответов с множественным выбором и распознавать заполненные пузырьки для автоматической оценки.
  • Опросы и формы: создавать пронумерованные матрицы листов ответов с AnswerSheetConfig для массового сбора ответов.
  • Сетки ввода данных: GridConfig и CompositeGridConfig фиксируют числовые или пользовательские символы как одно объединённое значение.
  • Печатаемый вывод: Save() записывает готовую к печати страницу PNG рядом с дескриптором .omr, используемым для последующего распознавания.
  • Пакетные конвейеры: RecognizeFolder() обрабатывает всю папку сканов за один вызов.

Распознать метки и экспортировать результаты

  • Движок без состояния: OmrEngine.Generate() создает GenerationResult (изображение страницы + шаблон .omr JSON); GetTemplateProcessor() загружает этот шаблон для распознавания новых сканов.
  • Несколько форматов экспорта: RecognitionResult экспортирует в CSV, JSON или XML, каждый с соответствующим вариантом потока.
  • Результаты также в памяти: MemoryGenerationResult предоставляет сгенерированные изображения как потоки в памяти через GetImages()/GetOmr() — дисковый ввод/вывод не требуется.
  • Коррекция наклона и перекалибровка: распознавание исправляет наклон скана по угловым опорным меткам, а Recalculate() повторно применяет другой порог без повторного сканирования.
  • Встроенные изображения: ImageCollection позволяет разметке ссылаться на байты изображения в памяти по имени, избегая обращений к файловой системе.

Опыт разработчика

Aspose.OMR FOSS for Python устанавливается одной командой pip (см. пример Quick Start ниже). API сосредоточен на трёх объектах — OmrEngine, дереве TemplateConfig (или DSL разметки) и TemplateProcessor — которые охватывают весь процесс генерации → сканирования → распознавания → экспорта.

Библиотека зависит только от numpy, opencv-python и Pillow — никаких нативных бинарных файлов OMR для компиляции. Она лицензирована по MIT, размещена на GitHub и в настоящее время находится в раннем релизе v0.1.0, покрывающем базовый, генерационный и распознающий уровни полной поверхности Aspose.OMR.

Создать форму и распознать отсканированные ответы

Создайте (или загрузите) шаблон, сохраните сгенерированное изображение страницы и дескриптор .omr, затем распознайте отсканированную копию и экспортируйте результаты в CSV.

git clone https://github.com/aspose-omr-foss/Aspose.OMR-FOSS-for-Python.git
cd Aspose.OMR-FOSS-for-Python
pip install -e .
from omr.api import OmrEngine, FormValidationLogic
engine = OmrEngine()
gen = engine.Generate("final-exam.txt")          # or a code-first TemplateConfig
gen.Save("out", "final-exam")                    # -> out/final-exam.png + out/final-exam.omr
processor = engine.GetTemplateProcessor("out/final-exam.omr", FormValidationLogic.Ignore)
result = processor.Recognize("scan.png")         # -100 = auto-calibrated threshold
print(result.GetCsv())                           # also GetJson() / GetXml()

Создать вопрос с несколькими вариантами ответа из разметки

DSL разметки текста создает то же дерево элементов, что и код-ориентированный API. Здесь ?choicebox=... открывает вопрос с выбором, следующая строка перечисляет его варианты, а &choicebox закрывает его — Generate() возвращает дескриптор .Template JSON, который можно изучить напрямую.

import json
from omr.api import OmrEngine
markup = [
    "?choicebox=Rate it",
    "(1) Poor (2) Fair (3) Good",
    "&choicebox",
]
engine = OmrEngine()
result = engine.Generate(markup)
desc = json.loads(result.Template)
cb = desc["Pages"][0]["Elements"][0]
print([b["Value"] for b in cb["Fields"][0]["Bubbles"]])  # ['Poor', 'Fair', 'Good']

Часто задаваемые вопросы

Какая модель лицензирования для Aspose.OMR FOSS for Python?

Он распространяется под лицензией MIT — свободно использовать, модифицировать и распространять, включая коммерческие продукты, при условии включения оригинального уведомления об авторском праве.

Какие версии Python и зависимости требуются?

Python 3.10 или новее, с тремя зависимостями, устанавливаемыми автоматически через pip — numpy, opencv-python и Pillow. Никакое собственное оборудование OMR или внешние сервисы не требуются.

Могу ли я экспортировать сгенерированный шаблон в PDF?

В этом выпуске нет. GenerationResult.SaveAsPdf() и MemoryGenerationResult.GetPDF() оба вызывают NotImplementedError. Используйте PNG-вывод из Save() или GetImages() вместо этого.

В какие форматы я могу экспортировать результаты распознавания?

RecognitionResult экспортирует в CSV, JSON или XML с помощью GetCsv(), GetJson() и GetXml(), каждый с соответствующим вариантом потока в памяти.

Поддерживает ли он языки, отличные от английского?

Еще не готово к рендерингу. Слой шаблона определяет арабскую, ивритскую, персидскую, урду и бенгальскую системы письма для соответствия поверхности Aspose.OMR, но в этом выпуске движок рендеринга поддерживает только LTR/Western — рендеринг RTL и набор нативных цифр находятся в дорожной карте upstream, но пока не реализованы.

Поддерживается ли проверка ответов с несколькими вариантами выбора?

Да, для вопросов, у которых отключён Multiselect. Передайте FormValidationLogic.Exception в GetTemplateProcessor(), чтобы вызвать исключение, когда такой вопрос получает более одной отметки; значение по умолчанию, Ignore, принимает её без предупреждения. GlobalPageSettings.Multiselect по умолчанию включён.

  

Ресурсы поддержки и обучения

 Русский