一.数据的准备与预处理
数据的准备是非常重要的,我们现在准备做的是一个二分类任务,计划选取男女图片进行训练与测试。
train:随机选取300张男性图片,300张女性图片
val:随机选取80张男性图片,80张女性图片
test:随机选取100张男性图片,100张女性图片
ps:train集和val可以有交集,但是train集和test集不要有交集
我手里找到了一批512*768的图片,先使用matlab进行裁剪和缩放为128*128的图片,要尽量将图片中任务的体貌特征全部涵盖(肩膀以上),选取其中的正面照。
如下图所示
将图片处理好之后,还需要将其转化为LMDB格式
详细操作可参考该文档:https://blog.csdn.net/swiftfake/article/details/79799880
二.选取网络并修改内容
我们使用的是Alexnet,我们将该网络存放到/caffe/examples文件夹下
其中:
logs:为存放训练日志的文件夹
snapshot:为用于存放训练生成的caffemodel的文件夹
trainval.prototxt:alexnet网络的定义与数据的加载
solver.prototxt: 解决网络的参数
deploy.prototxt:alexnet网络的定义
如何将trainval.prototxt文件转化为deploy.prototxt文件,可参考该文档:
https://blog.csdn.net/swiftfake/article/details/80046480
接下来介绍需要我们修改的地方
trainval.prototxt:
首先我们要修改source路径和mean_file路径
然后将全连接层的num_output设置为2,保存即可
solver.prototxt:
修改snapshot_prefix和net路径,然后保存
deploy.prototxt:
全连接层的num_output设置为2,保存即可
三.训练模型
现在我们已经做好了所有的事前准备,开始训练模型
cd caffe
sudo GLOG_logtostderr=0 GLOG_log_dir=/home/hca/caffe/examples/Alexnet/logs ./build/tools/caffe train -solver /home/hca/caffe/examples/Alexnet/solver.prototxt
训练好的模型会存放到snapshot文件夹下
四.将mean.binaryproto文件转化为mean.npy文件
参考文档:https://blog.csdn.net/swiftfake/article/details/80624082
五.测试训练模型
训练结束以后,我们需要测试以下我们训练的模型是否正常
测试的方法有c++和python两种方式,不过说彻底点python也只是调用了c++的方法
上代码:
import sys
sys.path.append('./python')
sys.path.append('./python/caffe')
import caffe
import numpy as np
import cv2
import argparse
import matplotlib.pyplot as plt
color = {'female':'0', 'male':'1'}
root = '×××/caffe/'
caffe_model = root + '×××/×××.caffemodel'#存放caffemodel的路径
deploy = root + '×××/deploy.prototxt'#存放deploy文件的路径
mean_file='××××/mean.npy'#存放mean.npy文件的路径
def classifier(img, net):
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
transformer.set_transpose('data', (2,0,1))
transformer.set_mean('data', np.load(mean_file).mean(1).mean(1))
# transformer.set_raw_scale('data', 255)
# transformer.set_channel_swap('data', (2,1,0))
net.blobs['data'].data[...]= transformer.preprocess('data',img)
out = net.forward()
prob = out['prob']
print prob
return np.argmax(prob)
if __name__ == '__main__':
testList = open('×××/test.txt', 'r')#存放测试文件的路径
caffe.set_mode_gpu()
caffe.set_device(0)
net = caffe.Net(deploy, caffe_model, caffe.TEST)
count = 0
for line in testList:
imagePath = line.split()[0]
label = line.split()[1]
path = imagePath
img = cv2.imread(path)
plt.imshow(img)
plt.axis('on')
plt.show()
result = classifier(img, net)
print '-------------------------------'
plt.imshow(img)
plt.axis('off')
plt.show()
print result
print label
print '-------------------------------'
if result == int(label):
count = count+1
Precession = count*1.0/20 #20为测试图片的数量,可自行设置,也可以重新定义
print 'Precession is {}'.format(str(Precession))