前言
之前有用OpenCv的SUFT特征提取和SVM、BOW做过按图像里的内容进行分类的相关项目,耗时长,准确率又不是很高,各种优化之后准确率也只有百分七十到八十,所以一直想用caffe试试。
一、系统环境
1.windows 7 64位
之前一直在linux下(Ubuntu 16.04 64位)使用过caffe,然后也有在win7 32位试过,能编译,但是在训练过程中出现各种小问题,所有就换64位系统,在训练没有遇到什么问题。
2.Anaconda3
安装Anaconda3尽量装3.4,这样就不用再把python的版本降到3.5。
3.caffe CPU
caffe我使用的是CPU版本。
二、数据收集与处理
1.收集数据
图像数据是从ZOL壁纸网站下载,里面有分类好的壁纸,可以整个系列下载。下载之后新建文件夹放同类型的图像,我收集了四个类型的然后手工分类放到相关的文件夹里,每个种类收集了差不多150张图像。
比如我这里把动漫人物放到这个文件夹下:
2.更改文件名
但下载下来的文件的文件名很混乱,所以要更改成与文件夹对应的文件名,方便之后训练使用,编写python脚本更改整个文件夹的文件名,每个类型的文件夹运行一次
rename.ipynb
import os
def rename():
path="E:/caffe/4/" #文件路径
ex = 4
filelist = os.listdir(path) #该文件夹下的所有文件
count = 0
for file in filelist: #遍历所有文件 包括文件夹
Olddir = os.path.join(path,file)#原来文件夹的路径
if os.path.isdir(Olddir):#如果是文件夹,则跳过
continue
filename = os.path.splitext(file)[0] #文件名
filetype = ".jpg"#os.path.splitext(file)[1] 文件扩展名
p = str(count).zfill(3)
Newdir = os.path.join(path,str(ex)+p+filetype) #新的文件路径
os.rename(Olddir,Newdir) #重命名
count += 1
rename()
得到统一递增的文件名,文件名前缀是当前的文件夹名,生成训练文件名列表是以文件名前缀打上标签。
3.统一图像大小
下载下来的图像文件大小有很多用类型的,编写python脚本把每个文件夹下的图像改成统一大小的像素的,该脚本把所有图像改成宽384和高256的图像。
resize.ipynb
from PIL import Image
import glob, os
w,h = 384,256 #更改成的分辨率
def timage():
for files in glob.glob('E:/caffe/5/*.jpg'): #原文件路径
filepath,filename = os.path.split(files)
filterame,exts = os.path.splitext(filename)
opfile = r'E:/caffe/data/5/' #保存的文件路径
if (os.path.isdir(opfile)==False):
os.mkdir(opfile)
im=Image.open(files)
im_ss=im.resize((int(w), int(h)))
try:
im_ss.save(opfile+filterame+'.jpg')
except:
print (filterame)
os.remove(opfile+filterame+'.jpg')
if __name__=='__main__':
timage()
4.可以从这里下载我分好类的正样本和测试样本,下载地址:https://download.youkuaiyun.com/download/matt45m/11044661
三、准备训练
1.创建数据文件夹
(1)在caffe-windows/data路径下创建一个自己存放数据的文件夹,这里起名为classify,在classify创建两个文件夹,分别为train和test,如下图:
(2)把要训练的图像文件放到train文件夹下,这里每个类别选了120张照片放进来,剩下的图像放到test文件夹里面,如下图:
(3)test文件夹里放着测试用的图像,如下图:
2.得到数据集文件名列表
(1)编写python代码,得到train与test文件夹下的文件列表并标记
getFileNameList.ipynb
import os
if __name__ == "