Python多进程批量处理图片

对于密集型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()
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个比较复杂的任务,需要涉及到PCB结构设计、文件读取、进程队列调度等多个方面。以下是一个大致的实现思路: 1. PCB结构设计 PCB(进程控制块)是用来描述进程信息的数据结构。在时间片轮转调度算法中,每个进程需要记录当前已经执行的时间片数、进程状态(就绪、运行、阻塞等)、进程优先级等信息。基于这些需求,我们可以设计一个PCB类,包含以下成员: - 进程ID - 进程状态 - 进程执行时间片数 - 进程优先级 - 进程功能序列(例如,一个进程可能包含多个指令,需要记录当前执行到哪个指令) 2. 文件读取和指令序列生成 我们可以将进程序列描述文件设计为一行一行的文本,每行表示一个进程,包含进程ID、进程功能序列等信息。例如: ``` 1,2,3,4,5 2,1,4,3,5 3,5,1,2,4 ``` 这个文件描述了三个进程,每个进程包含五个指令。我们可以编写一个文件读取函数,按行读取文件内容,并将读取到的每行文本按逗号分隔,生成对应的指令序列。例如,上述文件读取并解析后,得到的指令序列如下: ``` [ [1,2,3,4,5], [2,1,4,3,5], [3,5,1,2,4] ] ``` 3. 进程队列调度 在时间片轮转调度算法中,进程按照先来先服务的原则加入就绪队列,然后按照时间片轮转的方式进行调度,每个进程执行一个时间片后,重新加入就绪队列等待下一次调度。因此,我们需要设计一个就绪队列和一个正在运行的进程。 就绪队列可以使用一个列表(List)来实现,每次新加入一个进程时,将其加入列表尾部即可。正在运行的进程可以用一个PCB对象来表示,每次调度时,从就绪队列中取出队头进程,将其状态改为运行状态,并将其指令序列中的下一个指令执行一次。如果该进程执行完了全部指令,或者当前时间片用完了,就将其状态改为阻塞状态,并将其移出就绪队列。 每次调度时,都需要将正在运行的进程从队列头移动到队列尾,以实现时间片轮转的效果。同时,我们需要在每次调度结束后,输出当前的进程状态和就绪队列状态到日志文件中。 4. 可视化应用程序 为了方便用户使用,我们可以设计一个Windows可视化应用程序,包含以下功能: - 文件读取:用户可以通过界面选择进程序列描述文件,并读取其中的内容。 - 调度模拟:用户可以手动点击“开始”按钮,开始模拟时间片轮转调度算法的执行过程。 - 日志输出:程序可以将调度过程输出到日志文件中,并在界面上显示出来,以便用户查看。 以上是一个大致的实现思路,具体的实现细节还需要根据具体情况进行调整和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值