Гайд · TNWS AI

Почему Gradio Image передаёт массив, а vision-модель ожидает путь к файлу

4 мин—

Выбираем 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; поэтому тип надо выбирать не по названию файла, а по контракту кода модели.

Порядок действий

  1. Прочитайте сигнатуру inference-функции своей модели: массив, PIL или путь.
  2. Явно укажите type у gr.Image, а не полагайтесь на значение по умолчанию.
  3. Выведите диагностическую форму или тип без сохранения личной фотографии.
  4. Проверьте цветовой режим и ориентацию на тестовой картинке.
  5. После успешного контракта подключите модель и проверьте эталонные изображения.

Готовый шаблон

Сохраните пример в отдельном файле 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.

Критерии приёмки

  1. При RGB-входе проверена форма H×W×3.
  2. Выбранный type совпадает с параметром модельной функции.
  3. Распознавание проверено отдельно от диагностики формы.

Типичные ошибки и чего не делать

  • Не вызывать .shape у строкового filepath.
  • Не публиковать временный путь как ссылку пользователя.
  • Не путать успешную загрузку и точность vision-модели.

FAQ

Какой type по умолчанию?

numpy.

Когда нужен filepath?

Когда ваша inference-функция принимает путь.

Где выбирается grayscale?

Через image_mode="L".

Официальные источники

Частые вопросы

Какой type по умолчанию?

numpy.

Когда нужен filepath?

Когда ваша inference-функция принимает путь.

Где выбирается grayscale?

Через image_mode="L".

Читайте также

Комментарии

Пока тихо. Скажите первое слово