构建自己的图像分类数据集

前言

本文是学习同济子豪兄两天搞定毕设系列而撰写的学习文档,其中只摘录了一些自己之前不太懂的地方,完整版本请看参考链接。

文章目录

  • 前言
    • 图像采集
    • 注意事项
    • 删除多余文件
    • 下载Demo数据集
    • 统计图像尺寸、比例分布
    • 划分训练集和测试集
    • 可视化文件夹中的图像
  • 参考

图像采集

网络爬取图像制作为数据集

注意事项

  • 删除无关图片

  • 类别均衡

  • 多样性、代表性、一致性
    数据集应尽可能包括目标物体的各类场景,训练出的图像分类模型才能在各类测试场景中具备好的泛化性能,防止过拟合。

    • 不同尺寸、比例的图像

    • 不同拍摄环境(光照、设备、拍摄角度、遮挡、远近、大小)

    • 不同形态(完整西瓜、切瓣西瓜、切块西瓜)

    • 不同部位(全瓜、瓜皮、瓜瓤、瓜子)

    • 不同时期(瓜秧、小瓜、大瓜)

    • 不同背景(人物、菜地、抠图)

    • 不同图像域(照片、漫画、剪贴画、油画)

如果训练集的图像分布与测试集(或真实测试场景)的图像分布不一致,会出现OOD(Out-Of-Distribution)问题。比如在训练时出现的都是一粒一粒的葡萄,而在现实世界中出现一串一串的葡萄,机器就会识别失败。

删除多余文件

如:“_MACOSX” “.DS_Store"文件是在macos系统上解压文件时会生成,以及”.ipynb_checkpoints"文件是在使用jupyternotebook时会产生,均属于多余文件,使用Linux命令find . -iname '__MACOSX'可以找到该文件夹,或者使用'.DS_Store'in os.listdir('dataset_delete_test/芒果')
用linux命令for i in find . -iname '__MACOSX'; do rm -rf $i;done可以删除文件,再用find .-iname 命令进行验证,此外还有gif文件和非三通道文件需要删除

for fruit in tqdm(os.listdir(dataset_path)):
    for file in os.listdir(os.path.join(dataset_path, fruit)):
        file_path = os.path.join(dataset_path, fruit, file)
        img = cv2.imread(file_path)
        if img is None:
            print(file_path, '读取错误,删除')
            os.remove(file_path)
import numpy as np
from PIL import Image
for fruit in tqdm(os.listdir(dataset_path)):
    for file in os.listdir(os.path.join(dataset_path, fruit)):
        file_path = os.path.join(dataset_path, fruit, file)
        img = np.array(Image.open(file_path))
        try:
            channel = img.shape[2]
            if channel != 3:
                print(file_path, '非三通道,删除')
                os.remove(file_path)
        except:
            print(file_path, '非三通道,删除')
            os.remove(file_path)

因为运行了notebook,需要再次删除.ipynb_checkpoints文件:for i in find . -iname '.ipynb_checkpoints'; do rm -rf $i;done

下载Demo数据集

删除文件和文件夹指令rm -rf

统计图像尺寸、比例分布

利用数据分析常见pandas操作进行统计,此处,图片尺寸利用img = cv2.imread(file)将图片读入,然后img.size[0]代表图片高度,img.size[1]代表图像宽度。
在保存最后统计结果图像时,用此格式图片清晰度比较高:plt.savefig('图像尺寸分布.pdf', dpi=120, bbox_inches='tight')

划分训练集和测试集

 shutil.move(old_img_path, new_test_path) #移动文件

 # 删除旧文件夹
 assert len(os.listdir(old_dir)) == 0 # 确保旧文件夹中的所有图像都被移动走
 shutil.rmtree(old_dir) # 删除文件夹
 
 # 重命名数据集文件夹
 shutil.move(dataset_path, dataset_name+'_split')

查看文件目录结构
sudo snap install tree,tree dataset_folder -L 2

可视化文件夹中的图像

import matplotlib.image as mpimg
from mpl_toolkits.axes_grid1 import ImageGrid
images = []
for each_img in os.listdir(folder_path)[:N]:
    img_path = os.path.join(folder_path, each_img)
    img_bgr = cv2.imread(img_path)
    img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
    images.append(img_rgb)
    fig = plt.figure(figsize=(10, 10))

grid = ImageGrid(fig, 111,  # 类似绘制子图 subplot(111)
                 nrows_ncols=(n, n),  # 创建 n 行 m 列的 axes 网格
                 axes_pad=0.02,  # 网格间距
                 share_all=True
                 )

# 遍历每张图像
for ax, im in zip(grid, images):
    ax.imshow(im)
    ax.axis('off')

plt.tight_layout()
plt.show()

构建自己的图像分类数据集_第1张图片

参考

[1] 同济子豪兄 https://space.bilibili.com/1900783
[2] 同济子豪兄代码

你可能感兴趣的:(分类,python,计算机视觉)