这个博客是 Building powerful image classification models using very little data 的前期准备,用于把图片数据按照教程指示放到规定的文件夹中。
python 文件处理主要用到 os 模块和 shutil 模块,'sh' 大概是 bash 的意思
os.chdir('path') 改变当前路径到 path
os.listdir('path') 输出 path 路径下所有的文件名
os.makedirs('path/dirname') 在 path 路径下创建 dirname 文件夹
shutil.copy2('path/filename', 'newpath') 将 path 路径下的 filename 文件拷贝到 newpath 路径下
场景:按照上面的教程,我们需要先下载 kaggle 猫狗识别大赛的源文件,分为 train 和 test1,解压后放到 cat_dog 文件夹,然后,我们将构建符合教程要求的文件目录,其结构如下图所示(注意文件名的变化):
data/ train/ dogs/ dog001.jpg dog002.jpg ... cats/ cat001.jpg cat002.jpg ... validation/ dogs/ dog001.jpg dog002.jpg ... cats/ cat001.jpg cat002.jpg ...
依据教程要求,需要从 train 文件夹中将 cat.000.jpg 到 cat.999.jpg 拷贝到 data/cats/cat000.jpg 到 data/cats/cat999.jpg,将 cat.1000.jpg 到 cat.1399.jpg 拷贝到 validation/cats/cat000.jpg 到 validation/cats/cat399.jpg。同样的结构用于狗数据集的构建。
代码:
import shutil import os os.chdir('cat_dog') os.makedirs('train') os.makedirs('train/dogs') os.makedirs('train/cats') os.makedirs('validation') os.makedirs('validation/dogs') os.makedirs('validation/cats') def getFileName(num, category): return category+'.'+str(num)+'.jpg' def setFileName(num, category): num = str(num) num = (3-len(num))*'0'+num return category+num+'.jpg' for num in range(1000): cat = getFileName(num, 'cat') dog = getFileName(num, 'dog') new_cat = setFileName(num, 'cat') new_dog = setFileName(num, 'dog') shutil.copy2('train1/'+cat, 'train/cats/'+new_cat) shutil.copy2('train1/'+dog, 'train/dogs/'+new_dog) for num in range(400): cat = getFileName(1000+num, 'cat') dog = getFileName(1000+num, 'dog') new_cat = setFileName(num, 'cat') new_dog = setFileName(num, 'dog') shutil.copy2('train1/'+cat, 'validation/cats/'+new_cat) shutil.copy2('train1/'+dog, 'validation/dogs/'+new_dog)
ps:为了使得构建的 train 与之前下载的 train 文件夹不重名,将之前的 train 文件夹改为 train1.
pps: 没注意看原教程要求,这里构建的 train 文件夹和 validation 文件夹应该放到 data 目录下,直接手动操作就好了。