[Pytorch图像分类全流程实战] Task01:构建自己的图像分类数据集

这部分之前在可解释机器学习里面听过,但是当时在实战部分说实话就是跟着打了遍代码,对其过程了解的并不是那么清楚,希望本次能够有所收获。

运行的平台选择了Kaggle的GPU,白piao方法某站有 

数据质量决定算法质量

老师给的数据测试集81个文件夹,训练集也81个文件夹

也可以自己找

具体流程大致如下:

[Pytorch图像分类全流程实战] Task01:构建自己的图像分类数据集_第1张图片 

 D很重要

【A】安装配置环境

!pip install numpy pandas matplotlib requests tqdm opencv-python

【B1】图像采集(首选)

【B2】图像采集(备用)
【B3】制作图像分类数据集的注意事项

自己拿数据套进去其实也行,但最好别

删除无关图片——比如苹果里面包括水果和手机

类别均衡——不要把麻烦留给后面的算法

多样性、代表性、一致性——包含多种场景,防止过拟合


不同尺寸、比例的图像

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

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

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

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

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

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

【B4】删除多余文件

#导入工具包
import os
import cv2
from tqdm import tqdm

#准备样例数据集¶
# 下载测试数据集压缩包
!wget https://zihao-openmmlab.obs.cn-east-3.myhuaweicloud.com/20220716-mmclassification/dataset/dataset_delete_test.zip

# 解压
!unzip dataset_delete_test.zip >> /dev/null

#删除系统自动生成的多余文件
#建议在 Linux 系统中运行爬虫、划分训练集测试集代码

!find . -iname '__MACOSX'


!find . -iname '.DS_Store'

!find . -iname '.ipynb_checkpoints'

'.DS_Store' in os.listdir('dataset_delete_test/芒果')

#删除多余文件

!for i in `find . -iname '__MACOSX'`; do rm -rf $i;done

!for i in `find . -iname '.DS_Store'`; do rm -rf $i;done

!for i in `find . -iname '.ipynb_checkpoints'`; do rm -rf $i;done

#验证多余文件已删除
!find . -iname '__MACOSX'

!find . -iname '.DS_Store'

!find . -iname '.ipynb_checkpoints'

#删除gif格式的图像文件
dataset_path = 'dataset_delete_test'

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)

#删除非三通道的图像
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)

#再次删除多余的.ipynb_checkpoints目录
!find . -iname '.ipynb_checkpoints'

!for i in `find . -iname '.ipynb_checkpoints'`; do rm -rf $i;done

!find . -iname '.ipynb_checkpoints'


【C1】下载Demo数据集

用Linux基本不会生成多余文件,所以最好在云GPU上跑


【C2】统计图像尺寸、比例分布

【C3】拍摄地点地图可视化

【D】划分训练集测试集

##划分训练集和测试集
#导入工具包
import os
import shutil
import random
import pandas as pd

##获得所有类别名称
# 指定数据集路径
dataset_path = 'fruit81_full'

dataset_name = dataset_path.split('_')[0]
print('数据集', dataset_name)

classes = os.listdir(dataset_path)

len(classes)

##创建训练集文件夹和测试集文件夹
# 创建 train 文件夹
os.mkdir(os.path.join(dataset_path, 'train'))

# 创建 test 文件夹
os.mkdir(os.path.join(dataset_path, 'val'))

# 在 train 和 test 文件夹中创建各类别子文件夹
for fruit in classes:
    os.mkdir(os.path.join(dataset_path, 'train', fruit))
    os.mkdir(os.path.join(dataset_path, 'val', fruit))

##划分训练集、测试集,移动文件
test_frac = 0.2  # 测试集比例
random.seed(123) # 随机数种子,便于复现

df = pd.DataFrame()

print('{:^18} {:^18} {:^18}'.format('类别', '训练集数据个数', '测试集数据个数'))

for fruit in classes: # 遍历每个类别

    # 读取该类别的所有图像文件名
    old_dir = os.path.join(dataset_path, fruit)
    images_filename = os.listdir(old_dir)
    random.shuffle(images_filename) # 随机打乱

    # 划分训练集和测试集
    testset_numer = int(len(images_filename) * test_frac) # 测试集图像个数
    testset_images = images_filename[:testset_numer]      # 获取拟移动至 test 目录的测试集图像文件名
    trainset_images = images_filename[testset_numer:]     # 获取拟移动至 train 目录的训练集图像文件名

    # 移动图像至 test 目录
    for image in testset_images:
        old_img_path = os.path.join(dataset_path, fruit, image)         # 获取原始文件路径
        new_test_path = os.path.join(dataset_path, 'val', fruit, image) # 获取 test 目录的新文件路径
        shutil.move(old_img_path, new_test_path) # 移动文件

    # 移动图像至 train 目录
    for image in trainset_images:
        old_img_path = os.path.join(dataset_path, fruit, image)           # 获取原始文件路径
        new_train_path = os.path.join(dataset_path, 'train', fruit, image) # 获取 train 目录的新文件路径
        shutil.move(old_img_path, new_train_path) # 移动文件
    
    # 删除旧文件夹
    assert len(os.listdir(old_dir)) == 0 # 确保旧文件夹中的所有图像都被移动走
    shutil.rmtree(old_dir) # 删除文件夹
    
    # 工整地输出每一类别的数据个数
    print('{:^18} {:^18} {:^18}'.format(fruit, len(trainset_images), len(testset_images)))
    
    # 保存到表格中
    df = df.append({'class':fruit, 'trainset':len(trainset_images), 'testset':len(testset_images)}, ignore_index=True)

# 重命名数据集文件夹
shutil.move(dataset_path, dataset_name+'_split')

# 数据集各类别数量统计表格,导出为 csv 文件
df['total'] = df['trainset'] + df['testset']
df.to_csv('数据量统计.csv', index=False)

 举例:

[Pytorch图像分类全流程实战] Task01:构建自己的图像分类数据集_第2张图片

【E1】可视化文件夹中的图像
【E2】统计各类别图像数量
【F】训练图像分类识别模型的N种方法
其他的明天再说

你可能感兴趣的:(深度学习,人工智能,神经网络)