这部分之前在可解释机器学习里面听过,但是当时在实战部分说实话就是跟着打了遍代码,对其过程了解的并不是那么清楚,希望本次能够有所收获。
运行的平台选择了Kaggle的GPU,白piao方法某站有
数据质量决定算法质量
老师给的数据测试集81个文件夹,训练集也81个文件夹
也可以自己找
具体流程大致如下:
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)
举例:
【E1】可视化文件夹中的图像
【E2】统计各类别图像数量
【F】训练图像分类识别模型的N种方法
其他的明天再说