完整案例:caffe框架用Alexnet做二分类的全部流程

一.数据的准备与预处理
数据的准备是非常重要的,我们现在准备做的是一个二分类任务,计划选取男女图片进行训练与测试。
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))
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值