将高分辨率图像分割成大小均匀的图像用于训练,可以提高训练效率,提高模型性能,并提供更大的灵活性。
目录
- 一、大小均匀图像用于训练优势
- 二、代码
- 2.1 代码参数修改
- 2.2 代码
- 2.3 输出
- 2.4 分割结果
- 三、总结
一、大小均匀图像用于训练优势
内存管理:高分辨率图像通常占用大量内存。通过将它们分割成较小的图像,可以更有效地利用内存,使训练过程更加高效。
并行化:小图像可以在多个处理器或GPU上并行处理,这可以大大提高训练速度。
避免过拟合:通过从大图像中提取出许多小图像,可以增加训练样本的数量,这有助于提高模型的泛化能力,避免过拟合。
学习局部特征:在许多情况下,图像的局部特征(如纹理、形状等)对于任务来说可能是非常重要的。使用小图像可以使模型更专注于这些局部特征。
灵活性:分割后的小图像可以适应各种网络结构,特别是那些设计用于处理固定大小输入的网络。
二、代码
2.1 代码参数修改
下面是使用代码,根据自己情况修改参数,其中output_dir是裁剪后小图像的保存路径,此路径在代码中设置就行,不用在本地文件夹中提前创建好。
2.2 代码
import multiprocessing
import os
import sysimport cv2
import numpy as np
from tqdm import tqdmdef main():args = {"inputs_dir": "F:\Code\Python\SRGAN\SRGAN-PyTorch\data\SRGAN_ImageNet", # Path to input image directory."output_dir": "data/SRGAN_ImageNet_train_GT_sub2", # Path to generator image directory."crop_size": 128, # Crop image size from raw image."step": 64, # Step size of sliding window."thresh_size": 0, # Threshold size. If the remaining image is less than the threshold, it will not be cropped."num_workers": 10 # How many threads to open at the same time.}split_images(args)def split_images(args: dict):"""Split the image into multiple small images.Args:args (dict): Custom parameter dictionary."""inputs_dir = args["inputs_dir"]output_dir = args["output_dir"]num_workers = args["num_workers"]if not os.path.exists(output_dir):os.makedirs(output_dir)print(f"Create {output_dir} successful.")else:print(f"{output_dir} already exists.")sys.exit(1)# Get all image pathsimage_file_paths = os.listdir(inputs_dir)# Splitting images with multiple threadsprogress_bar = tqdm(total=len(image_file_paths), unit="image", desc="Split image")workers_pool = multiprocessing.Pool(num_workers)for image_file_path in image_file_paths:workers_pool.apply_async(worker, args=(image_file_path, args), callback=lambda arg: progress_bar.update(1))workers_pool.close()workers_pool.join()progress_bar.close()print("Split image successful.")def worker(image_file_path: str, args: dict):"""Split the image into multiple small images.Args:image_file_path (str): Image file path.args (dict): Custom parameter dictionary."""inputs_dir = args["inputs_dir"]output_dir = args["output_dir"]crop_size = args["crop_size"]step = args["step"]thresh_size = args["thresh_size"]image_name, extension = os.path.splitext(os.path.basename(image_file_path))image = cv2.imread(os.path.join(inputs_dir, image_file_path), cv2.IMREAD_UNCHANGED)image_height, image_width = image.shape[0:2]image_height_space = np.arange(0, image_height - crop_size + 1, step)if image_height - (image_height_space[-1] + crop_size) > thresh_size:image_height_space = np.append(image_height_space, image_height - crop_size)image_width_space = np.arange(0, image_width - crop_size + 1, step)if image_width - (image_width_space[-1] + crop_size) > thresh_size:image_width_space = np.append(image_width_space, image_width - crop_size)index = 0for h in image_height_space:for w in image_width_space:index += 1# Cropcrop_image = image[h: h + crop_size, w:w + crop_size, ...]crop_image = np.ascontiguousarray(crop_image)# Save imagecv2.imwrite(os.path.join(output_dir, f"{image_name}_{index:04d}{extension}"), crop_image)if __name__ == "__main__":main()
2.3 输出
分割过程如下,高分辨率图像较多时,会等待很久…
2.4 分割结果
三、总结
以上就是数据集制作,将高分辨率图像分割成大小均匀图像的详细方法,后续还可以再均匀大小图像基础上进一步做数据增强,数据增强方法参考博文:数据增强
感谢您阅读到最后!关注公众号「视觉研坊」,获取干货教程、实战案例、技术解答、行业资讯!