我想制作一个生成器,该生成器从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加载图像而不必在磁盘中读写数据。
答案 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
行。我认为这是从驱动器中删除文件,但是我认为您可以将其保存下来。您的模型只需要所有可能的信息。获得信息后,您可以异步开始删除文件,也可以等待模型训练和清理。像现在一样一步一步地做,可能会减慢您的速度。 其他修复程序:
答案 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)