从网址读取图像的最快方法是什么?

时间:2019-04-24 02:38:28

标签: python image url keras

我想制作一个生成器,该生成器从url生成成批图像以训练keras模型。我还有另一个生成器,可以为我提供图片网址。

我目前要做的是将映像下载到磁盘,然后从磁盘加载映像。

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

这行得通,但我想知道是否没有一种更快的方法可以从Web加载图像而不必在磁盘中读写数据。

4 个答案:

答案 0 :(得分:1)

假设您实际上正在使用keras,并且此image.load_img是您要调用的方法,那么它将call a function最终应为PIL.Image.open。在PIL.image.open的文档中,第一个参数fp可以是字符串文件名(这是您当前正在传递的文件名),也可以是实现read,{{1 }}和seek。尽管tell返回的对象确实提供了所有三种方法,但它根本不实现urllib.request.urlopen,因此不能直接使用。但是,可以将整个缓冲区读入确实实现seek的{​​{1}}对象中,因此它应该是可用的。综合起来,您的BytesIO函数可能简化为以下形式:

seek

这会将下载的图像完全保留在内存中。

答案 1 :(得分:1)

Github 个问题中得到这个

from io import BytesIO
from PIL import Image
import requests

def loadImage(url):
    response = requests.get(url)
    img_bytes = BytesIO(response.content)
    img = Image.open(img_bytes)
    img = img.convert('RGB')
    img = img.resize((250,250), Image.NEAREST)
    img = img_to_array(img)
    return img

答案 2 :(得分:0)

2个快速修复:

  • 考虑移动loadImage行。我认为这是从驱动器中删除文件,但是我认为您可以将其保存下来。您的模型只需要所有可能的信息。获得信息后,您可以异步开始删除文件,也可以等待模型训练和清理。像现在一样一步一步地做,可能会减慢您的速度。
  • 使用快速存储设备和配置,SSD,USB 3.x,USB C等。

其他修复程序:

  • 是否可以将内容保存在缓存中?
  • 您可以将事物保存在数组中吗?我不这么认为,但是有可能。
  • 您需要整个图像吗?您能降低图像质量吗?
  • 图像如何嵌套?解析图像可能不是问题,但检查无害。

答案 3 :(得分:0)

这是我见过的最简单的解决方案。

from PIL import Image
from urllib import request
from io import BytesIO

url = "https://github.com/ironmanciti/MachineLearningBasic/blob/master/datasets/TransferLearningData/watch.jpg?raw=true"
res = request.urlopen(url).read()
Sample_Image = Image.open(BytesIO(res)).resize((150,150))

plt.imshow(Sample_Image)