一、背景
最近我需要自己训练VGG模型,当然自己也采集了一部分数据。在VGG模型中,输入数据是224*224尺寸的,因此需要对数据进行批量resize处理,这是背景。
二、出现问题的原因
首先给出我批量resize图片的简单代码:
import os
from PIL import Image
# 将所有图像resize成224*224,并保存在目录'result/'下
def resize_image(image_name):
# 获取输入文件夹中的所有文件
files = os.listdir('./data/' + image_name)
output_dir = './result/' + image_name
# 判断输出文件夹是否存在,不存在则创建
if not os.path.exists(output_dir):
os.makedirs(output_dir)
for file in files:
img = Image.open('./data/' + image_name + file)
img = img.resize((224, 224), Image.ANTIALIAS)
img.save(os.path.join(output_dir, file))
if __name__ == '__main__':
resize_image('chengqiang/')
直接运行上述代码,然后就报错了:
对于这个问题的原因,查了一下,因为我使用的是PIL模块,对于PIL模块来说,其模式包括以下几种:
# 参考链接:https://www.jianshu.com/p/e8d058767dfa
模式
1 1位像素,黑和白,存成8位的像素
L 8位像素,黑白
P 8位像素,使用调色板映射到任何其他模式
RGB 3×8位像素,真彩
RGBA 4×8位像素,真彩+透明通道
CMYK 4×8位像素,颜色隔离
YCbCr 3×8位像素,彩色视频格式
I 32位整型像素
F 32位浮点型像素
报错原因也很明显,因为有图片的模式是“P”,不是"RGB",所以无法直接写入保存,找到这张图片,发现和普通的彩色图片并没有什么区别:
具体查看图片模式的方法为:
img = Image.open('./data/chengqiang/117.jpg')
print(img.mode)
三、问题解决方法
对于这个问题,需要做的也很简单,无非就是将模式“P”转化为“RGB”模式,再保存为“jpg”就可以了,所以只用增加两行代码:
if img.mode == "P":
img = img.convert('RGB')
可以看到添加后程序就能够顺利运行:
最后附上完整代码:
import os
from PIL import Image
# 将所有图像resize成224*224,并保存在目录'result/'下
def resize_image(image_name):
# 获取输入文件夹中的所有文件
files = os.listdir('./data/' + image_name)
output_dir = './result/' + image_name
# 判断输出文件夹是否存在,不存在则创建
if not os.path.exists(output_dir):
os.makedirs(output_dir)
for file in files:
img = Image.open('./data/' + image_name + file)
if img.mode == "P":
img = img.convert('RGB')
img = img.resize((224, 224), Image.ANTIALIAS)
img.save(os.path.join(output_dir, file))
if __name__ == '__main__':
resize_image('chengqiang/')