使用caffeNet分类:
主文件夹:/home/echo/caffe-master/examples/visionClass
网址:blog.csdn.net/liumaolincycle/article/details/48475479
参考:《Caffe的Mnist分类简单流程.docx》
训练模型
examples/visionClass/train_caffenet.sh
copy caffeNet的deploy.prototxt,并且改一下:num_output: 5
运行bp2npy.py文件,将C++可识别的mean.binaryproto的均值文件变成python可识别的.npy文件,代码:
#coding:utf-8
import caffe
import numpy as np
MEAN_PROTO_PATH = 'examples/cifar10/mean.binaryproto' # 待转换的 pb格式图像均值文件路径
MEAN_NPY_PATH = 'examples/cifar10/mean.npy' # 转换后的 numpy格式图像均值文件路径
blob = caffe.proto.caffe_pb2.BlobProto()# 创建protobuf blob
data = open(MEAN_PROTO_PATH, 'rb' ).read()# 读入mean.binaryproto文件 内容
blob.ParseFromString(data)# 解析文件内容到blob
array = np.array(caffe.io.blobproto_to_array(blob))# 将blob中的均值转换成numpy 格式,array的shape (mean_number,channel, hight, width)
mean_npy = array[0] # 一个array中可以有多组均值存 在,故需要通过下标选择其中一组均值
np.save(MEAN_NPY_PATH ,mean_npy)
补充:
关于训练时候图像增强的几点:
mirror: true
crop_size: 227
对图像进行增强用的,应该是网络有固定的输入大小就是227,这样可以将图像增强很多倍
关于classify.py有几点疑问:
(1)均值文件:之前训练的时候的均值文件是训练样本的均值,测试的时候需要的均值文件就是原来训练集的均值文件;
(2)下面应该是输入图像进网络之前会下采样至256*256,甚至执行create_imagenet.sh制作lmdb图片格式的时候就应经是讲图片设置为256*256了。
"--images_dim",default='256,256',help="Canonical 'height,width' dimensions of input images."
(3)下面就是说有两种方式,一种是直接去只从中间crop一下,根据真个判定类别,另一种是四个角落,以及中间五个地方同时判定,取平均
"--center_only",action='store_true',help="Switch for prediction from center crop alone instead of " +"averaging predictions across crops (default)."
单张测试:
echo@echo-PC:~/caffe-master$ python python/classify.py --model_def examples/visionClass/deploy.prototxt --pretrained_model examples/visionClass/caffenet_train/iter_50000.caffemodel --mean_file examples/visionClass/mean.npy --center_only --gpu examples/visionClass/visibData/4/YzPic20160407095646.bmp classOut
出错:ValueError: Mean shape incompatible with input shape.估计还是得把图片变成一定大小的
blog.csdn.net/fangjin_kl/article/details/50936925:
if ms != self.inputs[in_][1:]:
print(self.inputs[in_])
in_shape = self.inputs[in_][1:]
m_min, m_max = mean.min(), mean.max()
normal_mean = (mean - m_min) / (m_max - m_min)
mean = resize_image(normal_mean.transpose((1,2,0)),
in_shape[1:]).transpose((2,0,1)) * \
(m_max - m_min) + m_min
(10,3,227,227)应该是print(self.inputs[in_]) 这句话输出的,我估计10指的是四边以及中间,然后再镜像
echo@echo-PC:~/caffe-master$ python python/classify.py --model_def examples/visionClass/deploy.prototxt --pretrained_model examples/visionClass/caffenet_train/iter_50000.caffemodel --mean_file examples/visionClass/mean.npy --center_only --gpu examples/visionClass/visibData/4/YzPic20160407095646.bmp classOut
之后结果生成:classOut.npy的文件,保存各类的置信度,可以这样去查看内容
>>> import numpy as np
>>> np.load("classOut.npy")
array([[ 6.56269421e-08, 3.51868638e-11, 1.38281503e-05,
3.01185180e-03, 9.96974230e-01]], dtype=float32)
>>>
但是最好通过以下方式去直观看到, 用我改进版的classify Visionclass.py
echo@echo-PC:~/caffe-master$ python python/classifyVisionclass.py --print_results --model_def examples/visionClass/deploy.prototxt --pretrained_model examples/visionClass/caffenet_train/iter_50000.caffemodel --mean_file examples/visionClass/mean.npy --labels_file examples/visionClass/synset_words.txt --center_only --gpu examples/visionClass/visibData/4/YzPic20160407095646.bmp classOut
批量测试准确率:
./build/tools/caffe test --model examples/visionClass/train_val.prototxt --weights examples/visionClass/caffenet_train/iter_50000.caffemodel --gpu 0
结果:
I0609 14:53:45.144374 4707 caffe.cpp:313] Loss: 0.494232
I0609 14:53:45.144385 4707 caffe.cpp:325] accuracy = 0.8104
I0609 14:53:45.144395 4707 caffe.cpp:325] loss = 0.494232 (* 1 = 0.494232 loss)
echo@echo-PC:~/caffe-master$
训练过程画出loss曲线,类似如下,最后对log文件进行解析就好,暂时不做,请参考《Python 训练caffe之loss曲线绘制》
/home/echo/caffe-master/build/tools/caffe train --solver=/home/echo/caffe-master/examples/mnist/lenet_solver.prototxt --gpu all 2>&1 |tee out.log
网友评论