另一个caffe实例整个流程

四个类别:第0类 train:10000张 test:1685张   第1类:train:10000张  test:1250张  第2类:train:10000张 test:3553张 第3类:train:10000张 test:3639张

合计:train:40000张   test:10127张   图片要相同尺寸

一、生成label.txt

#include<iostream>
#include<string>
int main()
{
	FILE *fid1;
	fid1 = fopen("train_labels10.9.txt", "w");
	int label0 = 0, label1 = 1,label2=2,label3=3;
	char name[15], label[2], black[] = "\r\n";
	memset(name, 0, sizeof(name));
	for (int i = 0; i < 40000; ++i)
	{

		itoa(i, name, 10);
		strcat(name, ".jpg ");
		if (i<10000)
			itoa(label0, label, 10);
		else if (i>=10000 & i<20000)
			itoa(label1, label, 10);
		else if (i >= 20000 & i<30000)
			itoa(label2, label, 10);
		else
			itoa(label3, label, 10);
		
		strcat(name, label);
		printf("%s", name);
		fwrite(name, sizeof(name), 1, fid1);
		fwrite(black, strlen(black), 1, fid1);
		memset(name, 0, sizeof(name));
		memset(label, 0, sizeof(label));
	}
	
	fclose(fid1);
	return 0;
}
test文件夹也一样生成标签的txt


二、转化为lmdb

E:\pyCaffe_GPU\Build\x64\Release\convert_imageset.exe  E:\pyCaffe_GPU\Build\x64\Release\liuguanglei10_8train\ E:\pyCaffe_GPU\Build\x64\Release\liuguanglei10_8train\train_labels10.9.txt  E:\pyCaffe_GPU\examples\imagenet\train_lmdb_zao --shuffle -backend=lmdb  
pause




三、计算train和test的mean.binaryproto

E:\pyCaffe_GPU\Build\x64\Release\compute_image_mean.exe  E:\pyCaffe_GPU\examples\imagenet\train_lmdb_zao E:\pyCaffe_GPU\examples\imagenet\mean_zao_train.binaryproto 
pause 
(本来运行它时报错因为我图片尺寸有的大有的小  所以在第一步之前就要缩放到相同尺寸 不然这步会报错 所以我只能把图片缩放到相同尺寸后 再把上几步重走一遍 才正确)

四、写两个prototxt属性文件

name: "CaffeNet"
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    mirror: true
    crop_size: 190
    mean_file: "E:/pyCaffe_GPU/examples/imagenet/mean_zao_train.binaryproto"
  }
  data_param {
    source: "E:/pyCaffe_GPU/examples/imagenet/train_lmdb_zao/"
    batch_size: 100
    backend: LMDB
  }
}
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {
    mirror: false
    crop_size: 190
    mean_file: "E:/pyCaffe_GPU/examples/imagenet/mean_zao_test.binaryproto"
  }
  data_param {
    source: "E:/pyCaffe_GPU/examples/imagenet/test_lmdb_zao/"
    batch_size: 20
    backend: LMDB
  }
}
layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  convolution_param {
    num_output: 13
    kernel_size: 5
    stride: 5
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}
layer {
  name: "relu1"
  type: "ReLU"
  bottom: "conv1"
  top: "conv1"
}
layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_size: 5
    stride: 3
  }
}
layer {
  name: "norm1"
  type: "LRN"
  bottom: "pool1"
  top: "norm1"
  lrn_param {
    local_size: 5
    alpha: 0.0001
    beta: 0.75
  }
}
layer {
  name: "conv2"
  type: "Convolution"
  bottom: "norm1"
  top: "conv2"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  convolution_param {
    num_output: 26
    kernel_size: 3
	stride: 1
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 1
    }
  }
}
layer {
  name: "relu2"
  type: "ReLU"
  bottom: "conv2"
  top: "conv2"
}
layer {
  name: "pool2"
  type: "Pooling"
  bottom: "conv2"
  top: "pool2"
  pooling_param {
    pool: MAX
    kernel_size: 3
    stride: 1
  }
}
layer {
  name: "norm2"
  type: "LRN"
  bottom: "pool2"
  top: "norm2"
  lrn_param {
    local_size: 5
    alpha: 0.0001
    beta: 0.75
  }
}
layer {
  name: "fc3"
  type: "InnerProduct"
  bottom: "pool2"
  top: "fc3"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  inner_product_param {
    num_output: 1050
    weight_filler {
      type: "gaussian"
      std: 0.005
    }
    bias_filler {
      type: "constant"
      value: 1
    }
  }
}
layer {
  name: "relu3"
  type: "ReLU"
  bottom: "fc3"
  top: "fc3"
}
layer {
  name: "drop3"
  type: "Dropout"
  bottom: "fc3"
  top: "fc3"
  dropout_param {
    dropout_ratio: 0.5
  }
}
layer {
  name: "fc4"
  type: "InnerProduct"
  bottom: "fc3"
  top: "fc4"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  inner_product_param {
    num_output: 4
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}
layer {
  name: "accuracy"
  type: "Accuracy"
  bottom: "fc4"
  bottom: "label"
  top: "accuracy"
  include {
    phase: TRAIN
  }
}
layer {
  name: "accuracy"
  type: "Accuracy"
  bottom: "fc4"
  bottom: "label"
  top: "accuracy"
  include {
    phase: TEST
  }
}
layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "fc4"
  bottom: "label"
  top: "loss"
}


net: "E:/pyCaffe_GPU/examples/imagenet/zaotraintest.prototxt"
test_iter: 550
test_interval: 100

base_lr: 0.0001
momentum: 0.9
weight_decay: 0.0005


lr_policy: "step"
gamma: 0.1
stepsize:1000
power: 0.75

display: 10

max_iter: 20000

snapshot: 2000
snapshot_prefix: "E:/pyCaffe_GPU/examples/imagenet/zao"

solver_mode: GPU
五、写train.bat训练

E:\pyCaffe_GPU\Build\x64\Release\caffe.exe train --solver=E:\pyCaffe_GPU\examples\imagenet\zaosolver.prototxt >zao_log.txt 2>&1


六、画accuracy及loss曲线图

大概稳定在88%的样子。

训练出了caffemodel!

七、预测验证集类别
我有验证集4127张。

1,写自己的deploy文件

name: "CaffeNet"
layer {
  name: "data"
  type: "Input"
  top: "data"
  input_param { shape: { dim: 10 dim: 3 dim: 190 dim: 190 } }
}
layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  convolution_param {
    num_output: 13
    kernel_size: 5
    stride: 5
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}
layer {
  name: "relu1"
  type: "ReLU"
  bottom: "conv1"
  top: "conv1"
}
layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_size: 5
    stride: 3
  }
}
layer {
  name: "norm1"
  type: "LRN"
  bottom: "pool1"
  top: "norm1"
  lrn_param {
    local_size: 5
    alpha: 0.0001
    beta: 0.75
  }
}
layer {
  name: "conv2"
  type: "Convolution"
  bottom: "norm1"
  top: "conv2"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  convolution_param {
    num_output: 26
    kernel_size: 3
	stride: 1
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 1
    }
  }
}
layer {
  name: "relu2"
  type: "ReLU"
  bottom: "conv2"
  top: "conv2"
}
layer {
  name: "pool2"
  type: "Pooling"
  bottom: "conv2"
  top: "pool2"
  pooling_param {
    pool: MAX
    kernel_size: 3
    stride: 1
  }
}
layer {
  name: "norm2"
  type: "LRN"
  bottom: "pool2"
  top: "norm2"
  lrn_param {
    local_size: 5
    alpha: 0.0001
    beta: 0.75
  }
}
layer {
  name: "fc3"
  type: "InnerProduct"
  bottom: "pool2"
  top: "fc3"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  inner_product_param {
    num_output: 1050
    weight_filler {
      type: "gaussian"
      std: 0.005
    }
    bias_filler {
      type: "constant"
      value: 1
    }
  }
}
layer {
  name: "relu3"
  type: "ReLU"
  bottom: "fc3"
  top: "fc3"
}
layer {
  name: "drop3"
  type: "Dropout"
  bottom: "fc3"
  top: "fc3"
  dropout_param {
    dropout_ratio: 0.5
  }
}
layer {
  name: "fc4"
  type: "InnerProduct"
  bottom: "fc3"
  top: "fc4"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  inner_product_param {
    num_output: 4
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}
layer {
  name: "prob"
  type: "Softmax"
  bottom: "fc4"
  top: "prob"
}

2、预测类别的脚本py

#http://www.111cn.net/phper/python/47504.htm
import time
start=time.clock()
import os
from myclassify1img import classify1img
import caffe
caffe.set_mode_gpu()
caffe.set_device(0)

dir_path='E:/pyCaffe_GPU/examples/imagenet/zao_val/'   

imglist=[]
for path,d,filelist in os.walk(dir_path):
    filelist.sort(key= lambda x:int(x[:-4]))
    for filename in filelist: 
        mypath =dir_path + filename
        imglist.append(mypath)
print imglist

net_file='E:\pyCaffe_GPU\examples\imagenet\mydeploy_zao.prototxt'
caffe_model='E:\pyCaffe_GPU\examples\imagenet\zao_iter_20000.caffemodel'   
mean_file='E:\pyCaffe_GPU\examples\imagenet\mean_zao_train.binaryproto'
class_result='E:\pyCaffe_GPU\examples\imagenet\zao_class_result.txt'

net = caffe.Net(net_file,caffe_model,caffe.TEST)
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))
mean_blob = caffe.proto.caffe_pb2.BlobProto()
mean_blob.ParseFromString(open(mean_file, 'rb').read())
mean_npy = caffe.io.blobproto_to_array(mean_blob)
b2=mean_npy[0,:,:,:]
transformer.set_mean('data',b2.mean(1).mean(1))  
transformer.set_raw_scale('data', 255)
transformer.set_channel_swap('data', (2,1,0)) # if using RGB instead if BGR
#img=caffe.io.load_image('E:/Keras_Code/examples/imagenet/forclassify/test13.bmp')
imagenet_labels_filename = 'E:\pyCaffe_GPU\examples\imagenet\zao_label.txt' 

allclass=[]
for file in imglist:
	img=file    
	myclass=classify1img(imagenet_labels_filename,net,transformer,img)  
	allclass.append(myclass)

f=open(class_result,'w')
for ind in range(len(filelist)):
    f.write(filelist[ind]+' '+allclass[ind]+'\n')
f.close()

finish=time.clock()
print "read: %f s"%(finish - start)


结果:


搞定!

3、计算准确率:

#include <iostream>
#include <fstream>
using namespace std;

#define NUM 4126

int i, Datalen = -1;
double Data[NUM];

int main(void)
{
	int pre_class, cor1 = 0, cor2 = 0, cor3 = 0, cor4 = 0,all3=0,all0=0,all1=0,all2=0,correct=0;
	ifstream fin("zao_class_result.txt");
	if (!fin)
	{
		cerr << "Can not open txt file." << endl;
		getchar();
		return 1;
	};
	while (!fin.eof())
	{
		Datalen++;
		fin >> Data[Datalen];
	};
	fin.close();
	
	for (i = 0; i <= NUM; i++)
	{
		pre_class = Data[i];
		//cout << pre_class << " ";
		if (i < 685)
		{
			++all0;
			if (pre_class == 0)
			    ++cor1;
		}
		else if (i >= 685 & i < 935)
		{
			++all1;
			if (pre_class == 1)
				++cor2;
		}	
		else if (i >= 935 & i < 2488)
		{
			++all2;
			if (pre_class == 2)
				++cor3;
		}	
		else
		{
			++all3;
			if (pre_class == 3)
				++cor4;
		}
	}
	//cout << endl << endl;
	cout << cor1 << " " << cor2 << " " << cor3 << " " << cor4 << endl;
	cout << all0 << " " << all1 << " " << all2 << " " << all3 << endl;
	correct = cor1 + cor2 + cor3 + cor4;
	//cout << "correct number:" << correct << endl;
	double ac = correct / double(NUM+1);
	cout << "correct number:" << ac << endl;
	return 0;
}
一共4127张   准确率77%


八、提取特征

#extract many images in one folder
import time
start=time.clock()
import os
import numpy as np
import matplotlib.pyplot as plt
import caffe
from useless_test import vis_square
from PIL import Image
import scipy.io as sio 
caffe.set_mode_gpu()
caffe.set_device(0)

deployPrototxt ='E:\pyCaffe_GPU\examples\imagenet\mydeploy_zao.prototxt'  #
modelFile ='E:\pyCaffe_GPU\examples\imagenet\zao_iter_20000.caffemodel'   #
mean_file='E:\pyCaffe_GPU\examples\imagenet\mean_zao_train.binaryproto'  #
net = caffe.Net(deployPrototxt, modelFile,caffe.TEST)

#for layer_name, blob in net.blobs.iteritems():  
#    print layer_name + '\t' + str(blob.data.shape)

transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})  
transformer.set_transpose('data', (2,0,1))    
mean_blob = caffe.proto.caffe_pb2.BlobProto()
mean_blob.ParseFromString(open(mean_file, 'rb').read())
mean_npy = caffe.io.blobproto_to_array(mean_blob)
b2=mean_npy[0,:,:,:]
transformer.set_mean('data',b2.mean(1).mean(1))  
transformer.set_raw_scale('data', 255)   
transformer.set_channel_swap('data', (2,1,0))  
net.blobs['data'].reshape(1,3,190,190)   #

dir_path='E:/pyCaffe_GPU/examples/imagenet/zao_val'  #
filelists=os.listdir(dir_path)
#print filelists

#dim=4096  changed by you
features = np.empty((len(filelists),1050),dtype="float32")   #

for ind,everyimg in enumerate(filelists):
    theimg='E:/pyCaffe_GPU/examples/imagenet/zao_val/'+everyimg
    net.blobs['data'].data[...] = transformer.preprocess('data',caffe.io.load_image(theimg))
    net.forward()
    feat_fc= net.blobs['fc3'].data[0]
    feat_fc.shape=(1050,1)  #
    row_feat_fc=np.transpose(feat_fc)
    features[ind,:]=row_feat_fc

#np.savetxt("E:/Keras_Code/examples/imagenet/savefeatures.txt",row_feat_fc)
sio.savemat("E:/pyCaffe_GPU/examples/imagenet/zao_imgsfeatures.mat", {'feature':features})  #
finish=time.clock()
print "read: %f s"%(finish - start)


OK啦!

/

最讨厌星期一!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!不想上班!!!!!要是有坐在家里收钱的工作就好了!!!!!!!!

评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

元气少女缘结神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值