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
- Caffe学习日记7
- [转载]caffe学习日记
- Caffe学习日记10
- Caffe学习日记1
- Caffe学习日记2
- Caffe学习日记3
- Caffe学习日记4
- Caffe学习日记5
- Caffe学习日记6
- Caffe学习日记8
- Caffe学习日记9
- Caffe学习日记-Extracting Features
- Caffe学习日记之安装 Ubuntu16.04 cpu only
- caffe学习日记--lesson5: VS下新建工程,探究Blob
- caffe学习日记--lesson6: 常用的caffemodel下载链接
- caffe学习日记--Lesson2:再看caffe的安装和使用、学习过程
- caffe学习日记--lesson3:win8系统,VS2013下的caffe工程编译探究
- caffe学习日记--lesson4:windows下caffe DEMO (mnist and cifar10)
- git相关
- IFrame 系列2 ---- contentWindow跟execCommand全面解析
- 《深入理解java虚拟机》学习笔记
- IFrame 系列3 ---- js选中文字API: setSelectionRange跟createTextRange
- IFrame 系列4 ---- document.selection 全方位兼容解析以及TextRange[createTextRange,createRange]对象的深入解析
- Caffe学习日记7
- Python入门笔记
- webpack
- 串的顺序存储结构与运算
- 两副图让你彻底明白同步IO和异步IO的区别
- eclipse上来就该配置
- node---path对象
- ES6/ES2015核心内容
- 漂亮的5个es6技巧演示