2025, Oct 31 21:17

Как запустить labelme в Windows: обход ошибок onnxruntime и NumPy

Разбираем, почему labelme падает в Windows из‑за onnxruntime и несовместимости NumPy (ImportError, DLL load failed), и показываем рабочий способ запуска GUI.

После установки labelme и попытки запустить его в Windows приложение может вылетать ещё до появления интерфейса. Часто это выражается в ImportError из onnxruntime или сообщении об ABI-несовместимости NumPy. Ниже — воспроизводимый сценарий ошибки и способ, который позволяет открыть графический интерфейс.

Воспроизведение проблемы

После установки стандартного набора пакетов в среде Windows запуск labelme из терминала завершается сбоем.

pip install labelme opencv-python tensorflow matplotlib albumentations
labelme

Выполнение прекращается с трассировкой, указывающей на onnxruntime.

Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "C:\Users\Otaku\AppData\Local\Programs\Python\Python312\Scripts\labelme.exe\__main__.py", line 4, in <module>
  File "C:\Users\Otaku\AppData\Local\Programs\Python\Python312\Lib\site-packages\labelme\__main__.py", line 17, in <module>
    from labelme.app import MainWindow
  File "C:\Users\Otaku\AppData\Local\Programs\Python\Python312\Lib\site-packages\labelme\app.py", line 21, in <module>
    from labelme._automation import bbox_from_text
  File "C:\Users\Otaku\AppData\Local\Programs\Python\Python312\Lib\site-packages\labelme\_automation\bbox_from_text.py", line 6, in <module>
    import osam
  File "C:\Users\Otaku\AppData\Local\Programs\Python\Python312\Lib\site-packages\osam\__init__.py", line 5, in <module>
    from . import apis  # noqa: F401
  File "C:\Users\Otaku\AppData\Local\Programs\Python\Python312\Lib\site-packages\osam\apis.py", line 5, in <module>
    import onnxruntime
  File "C:\Users\Otaku\AppData\Local\Programs\Python\Python312\Lib\site-packages\onnxruntime\__init__.py", line 61, in <module>
    raise import_capi_exception
  File "C:\Users\Otaku\AppData\Local\Programs\Python\Python312\Lib\site-packages\onnxruntime\__init__.py", line 24, in <module>
    from onnxruntime.capi._pybind_state import (
  File "C:\Users\Otaku\AppData\Local\Programs\Python\Python312\Lib\site-packages\onnxruntime\capi\_pybind_state.py", line 32, in <module>
    from .onnxruntime_pybind11_state import *  # noqa
ImportError: DLL load failed while importing onnxruntime_pybind11_state: A dynamic link library (DLL) initialization routine failed.

Попытка проверить onnx из консоли тоже может завершиться неудачей:

onnx --help
onnx : The term 'onnx' is not recognized as the name of a cmdlet, function, script file, or operable program.

Установка onnxruntime-directml и повторный запуск могут привести к другой форме сбоя: сначала ошибка NumPy/ABI, затем ещё один импортный сбой.

A module that was compiled using NumPy 1.x cannot be run in
NumPy 2.1.3 as it may crash. To support both 1.x and 2.x
versions of NumPy, modules must be compiled with NumPy 2.0.
Some module may need to rebuild instead e.g. with 'pybind11>=2.12'.

If you are a user of the module, the easiest solution will be to
downgrade to 'numpy<2' or try to upgrade the affected module.
We expect that some modules will need time to support NumPy 2.

Traceback (most recent call last):  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "C:\Users\Otaku\AppData\Local\Programs\Python\Python312\Scripts\labelme.exe\__main__.py", line 4, in <module>
    from labelme.__main__ import main
  File "C:\Users\Otaku\AppData\Local\Programs\Python\Python312\Lib\site-packages\labelme\__main__.py", line 17, in <module>
    from labelme.app import MainWindow
  File "C:\Users\Otaku\AppData\Local\Programs\Python\Python312\Lib\site-packages\labelme\app.py", line 21, in <module>
    from labelme._automation import bbox_from_text
  File "C:\Users\Otaku\AppData\Local\Programs\Python\Python312\Lib\site-packages\labelme\_automation\bbox_from_text.py", line 6, in <module>
    import osam
  File "C:\Users\Otaku\AppData\Local\Programs\Python\Python312\Lib\site-packages\osam\__init__.py", line 5, in <module>
    from . import apis  # noqa: F401
  File "C:\Users\Otaku\AppData\Local\Programs\Python\Python312\Lib\site-packages\osam\apis.py", line 5, in <module>
    import onnxruntime
  File "C:\Users\Otaku\AppData\Local\Programs\Python\Python312\Lib\site-packages\onnxruntime\__init__.py", line 23, in <module>
    from onnxruntime.capi._pybind_state import ExecutionMode  # noqa: F401
  File "C:\Users\Otaku\AppData\Local\Programs\Python\Python312\Lib\site-packages\onnxruntime\capi\_pybind_state.py", line 32, in <module>
    from .onnxruntime_pybind11_state import *  # noqa
AttributeError: _ARRAY_API not found

... later ...

ImportError

Что происходит

Трассировка показывает, что labelme подключает путь автоматизации, который импортирует onnxruntime через osam. Сбой возникает при загрузке скомпилированного расширения onnxruntime: в одном случае сообщается об ошибке инициализации DLL. В другом случае вывод явно указывает, что модуль, собранный под NumPy 1.x, не может выполняться на NumPy 2.1.3, после чего выбрасывается AttributeError — это снова намекает на проблемы при импорте внутри скомпилированных биндингов onnxruntime.

Попытки переустановить пакеты, перезагрузиться, сменить версию Python или создать новое venv из встроенного терминала VS Code часто не дают результата.

Рабочее решение

Создайте чистое окружение через обычный Windows PowerShell и заставьте onnxruntime импортироваться до инициализации GUI в labelme — это решает проблему запуска.

mkdir tmp; cd tmp; python -m venv venv; . venv/Scripts/Activate.ps1; pip install labelme; labelme --help

Затем в той же сессии PowerShell откройте входной файл пакета labelme в редакторе.

code venv/Lib/site-packages/labelme/__init__.py

Добавьте одну строку импорта в самом начале.

import onnxruntime

Сохраните файл, вернитесь в то же окно PowerShell и запустите labelme. Интерфейс должен открыться.

Почему это важно

Инструменты разметки часто представляют собой тонкую оболочку над смесью чистого Python, скомпилированных расширений и опциональных ML-рантаймов. Когда цепочка импортов доходит до компонентов вроде onnxruntime, окружение должно быть достаточно согласованным, чтобы загрузить эти нативные части. Текст ошибки здесь прямо упоминает несовместимость между NumPy 1.x и 2.x для некоторых собранных модулей и сбой инициализации DLL для биндинга onnxruntime — это объясняет, почему приложение падало ещё до появления окна.

Выводы

Если labelme не запускается в Windows с ошибками, связанными с onnxruntime, начните с чистого виртуального окружения, созданного через обычный Windows PowerShell, и устанавливайте только необходимое. Один раз запустите labelme, чтобы проверить входную точку, а затем вставьте import onnxruntime в начало файла __init__.py пакета labelme — это может заставить GUI загрузиться. Если вы видите сообщение NumPy о том, что модули 1.x не работают на NumPy 2, сам этот вывод описывает возможные варианты, но в данном случае связка PowerShell плюс явный импорт оказалась достаточной, чтобы labelme заработал.

Статья основана на вопросе на StackOverflow от Otakuwu и ответе Otakuwu.