Какой самый быстрый способ прочитать изображения из URL? - PullRequest
1 голос
/ 24 апреля 2019

Я хочу создать генератор, который генерирует пакеты изображений из URL для обучения модели keras.У меня есть другой генератор, который передает мне URL-адреса изображений.

В настоящее время я загружаю образ на диск, а затем загружаю образ с диска.

def loadImage(URL):
    with urllib.request.urlopen(URL) as url:
        with open('temp.jpg', 'wb') as f:
            f.write(url.read())

    img_path = 'temp.jpg'
    img = image.load_img(img_path, target_size=(125, 125))
    os.remove(img_path)
    x = image.img_to_array(img)
    return x

def imageGenerator(batch_size):
    i = 0
    batch = []
    for URL in imageUrlGenerator():
        if i>batch_size:
            yield batch
            batch = []
            i=0
        batch.append(loadImage(URL))
        i+=1

Это работает, но мне интересно,не существует более быстрого способа загрузки изображений из Интернета без необходимости записи и чтения с / на диск.

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Если вы действительно используете keras и этот image.load_img является методом, который вы вызываете, он вызовет функцию , которая в конечном итоге должна быть PIL.Image.open.В документации для PIL.image.open первый аргумент fp может быть строковым именем файла (которое вы сейчас передаете) или потоковым объектом, который реализует read, seek и tell.Хотя объект, возвращаемый urllib.request.urlopen, предоставляет все три метода, он вообще не реализует seek, поэтому его нельзя использовать напрямую.Однако весь буфер может быть считан в объект BytesIO, который реализует seek, поэтому он должен использоваться.Если сложить это вместе, ваша функция loadImage может быть уменьшена до чего-то вроде следующего:

from io import BytesIO

def loadImage(URL):
    with urllib.request.urlopen(URL) as url:
        img = image.load_img(BytesIO(url.read()), target_size=(125, 125))

    return image.img_to_array(img)

Это сохраняет изображения, загруженные полностью в память.

0 голосов
/ 24 апреля 2019

2 Быстрые исправления:

  • Подумайте о перемещении линии os.remove(img_path).Я предполагаю, что это удаляет файл с вашего диска, но я думаю, что вы можете сохранить это для конца.Ваша модель просто нуждается во всей возможной информации.Получив информацию, вы можете либо асинхронно начать удаление файлов, либо просто подождать, пока модель не будет обучена и очищена.Делать это один за другим, как у вас, может замедлять вас.
  • Используйте быстрые запоминающие устройства и конфигурации, SSD, USB 3.x, USB C и т. Д.

Другие исправления:

  • Возможно лихранить вещи в кеше?
  • Не могли бы вы хранить вещи в массиве?Я так не думаю, но это возможно.
  • Вам нужно изображение целиком?Не могли бы вы снизить качество изображения?
  • Насколько вложено изображение?Синтаксический анализ изображения, вероятно, не является проблемой, но проверить его не помешает.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...