Гайд · TNWS AI
Почему Gradio Image передаёт массив, а vision-модель ожидает путь к файлу
Выбираем type=numpy, pil или filepath и проверяем размер и формат входа до запуска vision-инференса.
Задача и применимость
Русскоязычный вопрос: «почему gradio image передает numpy вместо filepath в модель». Для gr.Image как входного компонента перед любой vision-моделью. По официальной справке, проверенной 20 сентября 2026 года, type по умолчанию — numpy; установите filepath либо pil только тогда, когда этого требует ваша модельная функция. Скрипт является диагностическим тестом представления данных, а не классификатором фотографии.
Что подтверждено производителем
gr.Image(type="numpy") преобразует вход в массив пикселей, type="pil" — в объект PIL, type="filepath" — во временный путь. Для grayscale image_mode="L" форма массива меняется на (height,width). Анимированный GIF требует filepath или pil; поэтому тип надо выбирать не по названию файла, а по контракту кода модели.
Порядок действий
- Прочитайте сигнатуру inference-функции своей модели: массив, PIL или путь.
- Явно укажите type у gr.Image, а не полагайтесь на значение по умолчанию.
- Выведите диагностическую форму или тип без сохранения личной фотографии.
- Проверьте цветовой режим и ориентацию на тестовой картинке.
- После успешного контракта подключите модель и проверьте эталонные изображения.
Готовый шаблон
Сохраните пример в отдельном файле Python. В коде нет реального секрета или скрытого вызова модели: если подключён внешний API, его адрес и параметры указаны явно. Установите gradio в отдельном окружении; дополнительные пакеты требуются только там, где они импортированы в примере.
import gradio as gr
def inspect(pixels):
if pixels is None:
return "Изображение не загружено"
if len(pixels.shape) != 3:
return f"Форма {pixels.shape}: не RGB-массив H×W×3"
h, w, channels = pixels.shape
return f"Размер: {w}×{h}, каналов: {channels}"
gr.Interface(inspect, inputs=gr.Image(type="numpy", image_mode="RGB"),
outputs=gr.Textbox(), title="Проверка пикселей") .launch(server_name="127.0.0.1")
Вход и ожидаемый результат
Загрузите тестовый PNG 640×480 пикселей; ожидается текст «Размер: 640×480, каналов: 3» при обычном RGB-входе. Если модель ждёт путь для собственного загрузчика, переключите type="filepath" и измените функцию: теперь вход уже строка пути, а вызов pixels.shape приведёт к ошибке. Именно такую несовместимость и диагностирует статья.
Проверка контракта
Преобразование изображения может изменить вид входа модели: RGBA может быть сведён к RGB, а серый — развёрнут до трёх каналов. Для задач OCR это влияет на мелкие символы и контраст, для сегментации — на совпадение маски с координатами. Зафиксируйте исходное разрешение, применённый цветовой режим и ресайз до inference. Нельзя сравнивать две модели по фото, если первой вы отправили оригинал, а второй уменьшенный массив.
Работа с данными пользователя
filepath удобен для пайплайна, который сам читает изображение, но путь временный и существует на серверной стороне приложения. Не передавайте этот путь в prompt как видимый пользователю артефакт и не открывайте произвольные пути, присланные в текстовом поле. Размер файла, число пикселей и реальный тип содержимого проверяйте отдельно от gr.Image: даже валидная картинка может быть слишком большой для GPU.
Что проверить перед развёртыванием
Число каналов в диагностическом тексте проверяет контракт, а не качество распознавания. Для настоящего vision-приложения создайте таблицу минимум из пары изображений с известными эталонами и одного отрицательного случая: плохая резкость или отсутствие объекта. Если модель отвечает уверенно на неразборчивый кадр, не считайте интерфейс успешным; добавьте явный отказ либо ручную проверку. Отмечайте версию preprocessing вместе с checkpoint.
Готовый запрос для будущего OCR-этапа: «С изображения выпиши только отчётливо видимый артикул. Если текст нечитаем, ответь НЕВИДНО. Не достраивай недостающие символы». Для тестового изображения с AB-17 ожидаем AB-17, но только после реального inference; показанная функция ограничивается размерами. В сравнении numpy удобен для модели, принимающей пиксели, а filepath — для загрузчика, который открывает файл самостоятельно.
Контрольная фотография должна быть легально доступна для теста и не содержать лиц или приватных данных. При сравнении с PIL проверьте не только тип объекта, но и значения одного известного пикселя, если цвет критичен. Если ваш OCR ожидает цвет BGR, а Gradio отдаёт RGB, придётся явно конвертировать каналы; иначе качество падает без очевидной ошибки Python. Фиксируйте этот шаг рядом с версией preprocessing.
Критерии приёмки
- При RGB-входе проверена форма H×W×3.
- Выбранный type совпадает с параметром модельной функции.
- Распознавание проверено отдельно от диагностики формы.
Типичные ошибки и чего не делать
- Не вызывать .shape у строкового filepath.
- Не публиковать временный путь как ссылку пользователя.
- Не путать успешную загрузку и точность vision-модели.
FAQ
Какой type по умолчанию?
numpy.
Когда нужен filepath?
Когда ваша inference-функция принимает путь.
Где выбирается grayscale?
Через image_mode="L".
Официальные источники
Частые вопросы
Какой type по умолчанию?
numpy.
Когда нужен filepath?
Когда ваша inference-функция принимает путь.
Где выбирается grayscale?
Через image_mode="L".
Читайте также
Как добавить ползунок temperature к AI-чату через additional_inputs в Gradio
Связываем Slider и функцию чат-бота без ошибки порядка аргументов; проверяем значение до вызова нейросети.
Как добавить примеры вопросов в Gradio, не вызывая нейросеть по клику
Настраиваем examples и run_examples_on_click=False, чтобы пользователь отредактировал вопрос перед дорогим вызовом модели.
Как группировать запросы к ML-модели через batch=True в Gradio Interface
Сверяем сигнатуру пакетной функции, tuple of lists и max_batch_size на детерминированном тесте.
Комментарии
Пока тихо. Скажите первое слово