Caffe学习日记7

来源:互联网 发布:27岁未婚单身女 知乎 编辑:程序博客网 时间:2024/05/20 07:53

1. 制作训练集和测试集LMDB数据库

解析:首先对分类图像进行标注,如下所示:

import os    def IsSubString(SubStrList, Str):      flag = True      for substr in SubStrList:          if not(substr in Str):              flag = False      return flag    def GetFileList(FindPath, FlagStr=[]):      FileList=[]      FileNames=os.listdir(FindPath)      if len(FileNames) > 0:          for fn in FileNames:              if len(FlagStr) > 0:                  if IsSubString(FlagStr, fn):                      fullfilename = os.path.join(FindPath, fn)                      FileList.append(fullfilename)              else:                  fullfilename = os.path.join(FindPath,fn)                  FileList.append(fullfilename)      if len(FileList) > 0:          FileList.sort()      return FileList      train_txt = open('train.txt', 'w')  imgfile = GetFileList('I:\\data\\train\\0')  for img in imgfile:      img = img.split('\\')[3] + '\\' + img.split('\\')[4]    str0 = img + ' ' + '0' + '\n'            train_txt.writelines(str0)  imgfile = GetFileList('I:\\data\\train\\1')  for img in imgfile:      img = img.split('\\')[3] + '\\' + img.split('\\')[4]    str1 = img + ' ' + '1' + '\n'      train_txt.writelines(str1)  train_txt.close()  val_txt = open('val.txt','w')  imgfile = GetFileList('I:\\data\\val\\0')  for img in imgfile:      img = img.split('\\')[3] + '\\' + img.split('\\')[4]    str4 = img + ' ' + '0' + '\n'            val_txt.writelines(str4)  imgfile = GetFileList('I:\\data\\val\\1')  for img in imgfile:      img = img.split('\\')[3] + '\\' + img.split('\\')[4]    str5 = img + ' ' + '1' + '\n'      val_txt.writelines(str5)  val_txt.close()  

然后转换为LMDB数据库,如下所示:[1]

D:\caffe-master\Build\x64\Release\convert_imageset --resize_height=100 --resize_width=100 --shuffle=true G:\data\train\ G:\train.txt G:\trainlmdb D:\caffe-master\Build\x64\Release\convert_imageset --resize_height=100 --resize_width=100 --shuffle=true G:\data\val\ G:\val.txt G:\vallmdb 

(1)gray:bool类型,默认为false,如果设置true,则代表将图像当做灰度图像来处理,否则当做彩色图像来处理。

(2)shuffle:bool类型,默认为false,如果设置true,则代表将图像集中图像的顺序随机打乱。

(3)backend:string类型,可取值集合{"lmdb", "leveldb"},默认为"lmdb",代表采用何种形式存储转换后的数据。

(4)resize_width:int32类型,默认值为0,如果为非0值,则代表图像的宽度将被resize成resize_width。

(5)resize_height:int32类型,默认值为0,如果为非0值,则代表图像的高度将被resize成resize_height。

6)check_size:bool类型,默认值为false,如果该值true,则在处理数据时检查每一条数据的尺寸大小是否相同。

7)encoded:bool类型,默认值为false,如果为true,则代表将存储编码后的图像。

8)encode_type:string类型,默认值"",用于指定用何种编码方式存储编码后的图像,取值为编码方式的后缀。

说明:如果check_size=true,那么当图像大小不一致时报错。但是,可以通过resize_width和resize_height统一设置

图像大小。如果check_size=false,那么当训练网络需要图像大小一致时,可以通过crop_size进行设置。对于训练过

程,裁剪方式是随机的;对于测试过程,处理方式是只裁剪图像的中间区域[2]。以上两种方式都是数据预处理过程。


2. 制作训练集和测试集均值文件 

解析:图像减去均值后,再进行训练和测试,会提高速度和精度。那么是计算一个图像所有像素的平均值?还是所有

图像相同位置像素的平均值?是后者,即每个通道每个像素位置上的平均值[4]。如下所示:

D:\caffe-master\Build\x64\Release\compute_image_mean.exe G:\trainlmdb G:\train_mean.binaryproto D:\caffe-master\Build\x64\Release\compute_image_mean.exe G:\vallmdb G:\val_mean.binaryproto 


3. 修改train_val,solver和deploy配置文件

解析:

(1)train_val.prototxt

主要修改crop_size,mean_file,source,num_output。如果微调AlexNet,那么还需要修改全连接层(fc6,fc7和

fc8)的名字。

(2)solver.prototxt

主要修改net,根据需要修改其它参数。

(3)deploy.prototxt

主要修改input_param,num_output。


4. 训练CNN、微调CNN和测试CNN

解析:

(1)训练CNN

D:\caffe-master\Build\x64\Release\caffe.exe train --solver G:\bvlc_alexnet\solver.prototxt
(2)微调CNN
D:\caffe-master\Build\x64\Release\caffe.exe train --solver G:\bvlc_alexnet\solver.prototxt --weights G:\bvlc_alexnet.caffemodel
(3)测试CNN
D:\caffe-master\Build\x64\Release\caffe.exe test --model G:\bvlc_alexnet\train_val.prototxt --weights G:\bvlc_alexnet.caffemodel --iterations 100


5. 网络结构、权值、特征图和学习曲线(Train Loss,Test Loss)可视化

(1)网络结构可视化

python draw_net.py ./bvlc_alexnet/train_val.prototxt bvlc_alexnet.png

(2)网络权值可视化 [5] 

权值指的就是卷积核,以AlexNet为例,alexnet_weights_vis.m如下所示:

clear;clc;close all;caffe.set_mode_cpu();model_dir = 'D:\caffe-master\models\bvlc_alexnet\';net_model = [model_dir 'deploy.prototxt'];net_weights = [model_dir 'bvlc_alexnet.caffemodel'];phase = 'test';net = caffe.Net(net_model, net_weights, phase);param_names = {'conv1', 'conv2', 'conv3', 'conv4', 'conv5'};for i = 1:length(param_names)    visualize_weights(net, param_names{i}, 1);end

visualize_weights.m函数,如下所示:

function visualize_weights(net, param_name, space)w = net.params(param_name, 1).get_data();size(w)nums = size(w,4);channels = size(w,3);width = size(w,2);count = nums * channels;n = ceil(sqrt(count));weight_map = zeros(n * (width + space), n * (width + space), 'uint8');w = w - min(w(:));w = w / max(w(:)) * 255;w = uint8(w);for i = 0: count-1    c = mod(i, n);    r = floor(i/n);    j = mod(i, channels) + 1;    k = floor(i / channels) + 1;    weight_map(r * (width + space) + (1 : width), c * (width + space) + (1 : width)) = w(:, :, j, k);endfigure;imshow(weight_map);title(param_name);

(3)特征图可视化 [6]

每个小方块显示对应特定卷积核的响应图。低层响应特征图关注图像中不同细节(背景或主体的纹理或轮廓),高

维响应特征图变得局部且稀疏,用于剔除不相关内容并提取目标重要特征。featuremap_visualize.m,如下所示:

clear;clc;close all;caffe.set_mode_cpu();model_dir = 'D:\caffe-master\models\bvlc_reference_caffenet\';net_model = [model_dir 'deploy.prototxt'];net_weights = [model_dir 'bvlc_reference_caffenet.caffemodel'];phase = 'test';% initialize a networknet = caffe.Net(net_model, net_weights, phase);im = imread('D:\caffe-master\examples\images\cat.jpg');figure();imshow(im);title('Original Image');input_data = {prepare_image(im)};scores = net.forward(input_data);blob_names = {'data', 'conv1', 'conv2', 'conv3', 'conv4', 'conv5'};for i = 1:length(blob_names)    visualize_feature_maps(net, blob_names{i}, 1);end

prepare_image.m函数,如下所示:

function crops_data = prepare_image(im)d = load('D:\caffe-master\matlab\+caffe\imagenet\ilsvrc_2012_mean.mat');mean_data = d.mean_data;IMAGE_DIM = 256;CROPPED_DIM = 227;% convert an image returned by Matlab's imread to im_data in caffe's dataim_data = im(:, :, [3, 2, 1]);  im_data = permute(im_data, [2, 1, 3]); im_data = single(im_data);  im_data = imresize(im_data, [IMAGE_DIM IMAGE_DIM], 'bilinear'); im_data = im_data - mean_data;  % oversample (4 corners, center, and their x-axis flips)crops_data = zeros(CROPPED_DIM, CROPPED_DIM, 3, 10, 'single');indices = [0 IMAGE_DIM-CROPPED_DIM] + 1;n = 1;for i = indices  for j = indices    crops_data(:, :, :, n) = im_data(i:i+CROPPED_DIM-1, j:j+CROPPED_DIM-1, :);    crops_data(:, :, :, n+5) = crops_data(end:-1:1, :, :, n);    n = n + 1;  endendcenter = floor(indices(2) / 2) + 1;crops_data(:,:,:,5) = im_data(center:center+CROPPED_DIM-1, center:center+CROPPED_DIM-1, :);crops_data(:,:,:,10) = crops_data(end:-1:1, :, :, 5);

visualize_feature_maps.m函数,如下所示:

function [] = visualize_feature_maps(net, blob_name, space)blob = net.blobs(blob_name).get_data();blob_width = max(size(blob,1), size(blob,2));ceil_width = blob_width + space;channels = size(blob, 3);ceil_num = ceil(sqrt(channels));Map = zeros(ceil_width * ceil_num, ceil_width * ceil_num);for u = 1:ceil_num    for v = 1:ceil_num        w = zeros(blob_width,blob_width);        if(((u-1) * ceil_num + v) <= channels)            w = blob(:, :, (u-1) * ceil_num + v, 1)';            w = w - min(min(w));            w = w / max(max(w)) * 255;        end        Map(ceil_width * (u - 1) + (1:blob_width), ceil_width * (v-1) + (1:blob_width)) = w;    endendMap = uint8(Map);figure();imshow(Map);colormap(jet);caxis([0 255]);colorbar;title(blob_name);

(4)学习曲线可视化

show_loss_curve.m函数,如下所示:

clear;clc;close all;train_log_file = 'alexnet_temp.log';train_interval = 40;test_interval = 500;[~, string_output] = dos(['cat ', train_log_file, '| grep ''Train net output #0'' | awk ''{print $11}''']);train_loss = str2num(string_output);n = 1:length(train_loss);idx_train = (n - 1) * train_interval;[~, string_output] = dos(['cat ', train_log_file, '| grep ''Test net output #1'' | awk ''{print $11}''']);test_loss = str2num(string_output);m = 1:length(test_loss);idx_test = (m - 1) * test_interval;figure;plot(idx_train, train_loss, 'r');hold on;plot(idx_test, test_loss, 'y');grid onlegend('Train Loss', 'Test Loss');xlabel('iterations');ylabel('loss');title('Train & Test Loss Curve');


参考文献:

[1] Caffe中的图像转换工具convert_imageset:http://blog.csdn.net/dsif1995/article/details/51793986

[2] Caffe中使用crop_size剪裁训练图片:http://blog.csdn.net/u010417185/article/details/52651761

[3] 用Caffe跑自己的jpg数据:http://www.w2bc.com/article/143751

[4] compute_image_mean:http://blog.csdn.net/chenriwei2/article/details/46362851

[5] Caffe网络权值可视化:http://blog.csdn.net/u012938704/article/details/52787960

[6] Caffe特征图可视化:http://blog.csdn.net/u012938704/article/details/52767695

1 0
原创粉丝点击