对于密集型CPU/IO操作,合理使用多线程/进程可以大大加快速度,在机器学习中经常需要对我们自己的图像数据集做一些预处理,因此使用多进程是一个不错的方式,下面的例子展示了使用Python自带的多进程模块multiprocessing
例子。
'''
使用多进程批量处理图片
'''
from multiprocessing.dummy import Pool
from PIL import Image
from skimage.transform import rescale, resize
from skimage import io, util
import numpy as np
import os
from PIL import Image
global count
count=1
dir = r"G:\machinelearning\GAN\high_res_1447\train\images"
save_dir=r"G:\machinelearning\GAN\low_res_1447_x8_noisy\train\images"
def get_image_paths(folder=dir):
'''
返回图片路径列表
dir: 存放图片的文件夹路径
'''
return (os.path.join(folder, f)
for f in os.listdir(folder)
if 'jpeg' or 'png' in f)
def resize_image(filename):
'''
(1)读取图片
(2)设定新的存储路径
(3)图片是否添加噪声
(4)resize图片
(5)保存图片,skimage.io.imsave()
'''
global count
full_file_name = os.path.join(dir,filename)
# 保存的新路径
new_full_file_name = os.path.join(save_dir,filename.split('\\')[-1])
# print("文件全路径:",full_file_name)
image = np.array(Image.open((filename))) # 打开图片,转换为ndarray
# 添加高斯噪声,方差0.002
image = util.random_noise(image, mode='gaussian',var=0.002)
image_resized = resize(image, (int(image.shape[0] / 8), int(image.shape[1] / 8)),
anti_aliasing=True)
io.imsave(new_full_file_name,image_resized)
print('存储resize之后的图像,第 {} 张,存储成功!'.format(count))
count = count+1
if __name__ == '__main__':
images = get_image_paths() # 已经有缺省参数
pool = Pool(24)
pool.map(resize_image, images) # 注意map用法,是multiprocessing.dummy.Pool的方法
pool.close()
pool.join()