逐层可视化图像特征
来源:互联网 发布:centos 禅道安装 编辑:程序博客网 时间:2024/06/05 00:36
本文参考 薛启元学习笔记五和caffe官网中的内容进行实践
(1-4)是之前博客 特征提取部分的内容,详细内容请参考之前的博文
1.选择数据执行
2.定义特征提取网络结构
3.提取特征
4.成功 会在_temp目录下生成一个特征文件(lmdb格式)
5.提取的特征为lmdb格式,转换成mat格式
6.UFLDL里的display_network函数进行可视化
之前博文已经详细说明了步骤1-4,本文只针对5.6部分进行说明
5.提取的特征为lmdb格式,转换成mat格式
5-1 在caffe-master/src目录下新建一个以个人名字命名的文件夹
sudo mkdir filenamesudo chmod go+w filename #添加可写权限
5-2 在filename下新建两个脚本 feat_helper_pb2.py lmdb2mat.py 作用是将lmdb转换成mat格式
这里可能会出现比较多的问题,需要提前配置python环境,这是一个比较痛苦的过程,每个人情况不同,出现问题就google找答案,如果出现lmdb的安装问题利用如下方法进行解决
pip install lmdbfeat_helper_pb2.py
# Generated by the protocol buffer compiler. DO NOT EDIT!from google.protobuf import descriptorfrom google.protobuf import messagefrom google.protobuf import reflectionfrom google.protobuf import descriptor_pb2# @@protoc_insertion_point(imports)DESCRIPTOR = descriptor.FileDescriptor( name='datum.proto', package='feat_extract', serialized_pb='\n\x0b\x64\x61tum.proto\x12\x0c\x66\x65\x61t_extract\"i\n\x05\x44\x61tum\x12\x10\n\x08\x63hannels\x18\x01 \x01(\x05\x12\x0e\n\x06height\x18\x02 \x01(\x05\x12\r\n\x05width\x18\x03 \x01(\x05\x12\x0c\n\x04\x64\x61ta\x18\x04 \x01(\x0c\x12\r\n\x05label\x18\x05 \x01(\x05\x12\x12\n\nfloat_data\x18\x06 \x03(\x02')_DATUM = descriptor.Descriptor( name='Datum', full_name='feat_extract.Datum', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ descriptor.FieldDescriptor( name='channels', full_name='feat_extract.Datum.channels', index=0, number=1, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='height', full_name='feat_extract.Datum.height', index=1, number=2, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='width', full_name='feat_extract.Datum.width', index=2, number=3, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='data', full_name='feat_extract.Datum.data', index=3, number=4, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='label', full_name='feat_extract.Datum.label', index=4, number=5, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='float_data', full_name='feat_extract.Datum.float_data', index=5, number=6, type=2, cpp_type=6, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), ], extensions=[ ], nested_types=[], enum_types=[ ], options=None, is_extendable=False, extension_ranges=[], serialized_start=29, serialized_end=134,)DESCRIPTOR.message_types_by_name['Datum'] = _DATUMclass Datum(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _DATUM # @@protoc_insertion_point(class_scope:feat_extract.Datum)# @@protoc_insertion_point(module_scope)
lmdb2mat.py
import lmdbimport feat_helper_pb2import numpy as npimport scipy.io as sioimport timedef main(argv): lmdb_name = sys.argv[1] print "%s" % sys.argv[1] batch_num = int(sys.argv[2]); batch_size = int(sys.argv[3]); window_num = batch_num*batch_size; start = time.time() if 'db' not in locals().keys(): db = lmdb.open(lmdb_name) txn= db.begin() cursor = txn.cursor() cursor.iternext() datum = feat_helper_pb2.Datum() keys = [] values = [] for key, value in enumerate( cursor.iternext_nodup()): keys.append(key) values.append(cursor.value()) ft = np.zeros((window_num, int(sys.argv[4]))) for im_idx in range(window_num): datum.ParseFromString(values[im_idx]) ft[im_idx, :] = datum.float_data print 'time 1: %f' %(time.time() - start) sio.savemat(sys.argv[5], {'feats':ft}) print 'time 2: %f' %(time.time() - start) print 'done!'if __name__ == '__main__': import sys main(sys.argv)
5-3 创建脚本文件extract_feature.sh, 并执行,将在examples/_temp文件夹下得到lmdb文件和.mat文件
extrace_feature.sh
<span style="color:#333333;">#!/usr/bin/env sh# args for EXTRACT_FEATURETOOL=/home/ypp/caffe-master/build/toolsMODEL=/home/ypp/caffe-master/examples/imagenet/caffe_reference_imagenet_model #下载得到的caffe modelPROTOTXT=/home/ypp/caffe-master//examples/_temp/imagenet_val.prototxt # 网络定义LAYER=fc7 # 提取层的名字,如提取fc7等LEVELDB=/home/ypp/caffe-master//examples/_temp/features # 保存的leveldb路径BATCHSIZE=10# args for LEVELDB to MATDIM=4096 # 需要手工计算feature长度(</span><span style="color:#cc0000;">需要更改的,不然会报错;也可以报错是多少维再回来进行修改</span><span style="color:#333333;">)OUT=/home/ypp/caffe-master//examples/_temp/features.mat #.mat文件保存路径BATCHNUM=1 # 有多少个batch, 本例只有两张图, 所以只有一个batch$TOOL/extract_features.bin $MODEL $PROTOTXT $LAYER $LEVELDB $BATCHSIZEpython /home/ypp/caffe-master/src/ypp/lmdb2mat.py $LEVELDB $BATCHNUM $BATCHSIZE $DIM $OUT</span>
5-4结果图
6.UFLDL里的display_network函数进行可视化
6-1 在src/filename文件下新建 display_netkwork.m函数
display_network.m
function [h, array] = display_network(A, opt_normalize, opt_graycolor, cols, opt_colmajor)% This function visualizes filters in matrix A. Each column of A is a% filter. We will reshape each column into a square image and visualizes% on each cell of the visualization panel. % All other parameters are optional, usually you do not need to worry% about it.% opt_normalize: whether we need to normalize the filter so that all of% them can have similar contrast. Default value is true.% opt_graycolor: whether we use gray as the heat map. Default is true.% cols: how many columns are there in the display. Default value is the% squareroot of the number of columns in A.% opt_colmajor: you can switch convention to row major for A. In that% case, each row of A is a filter. Default value is false.warning off allif ~exist('opt_normalize', 'var') || isempty(opt_normalize) opt_normalize= true;endif ~exist('opt_graycolor', 'var') || isempty(opt_graycolor) opt_graycolor= true;endif ~exist('opt_colmajor', 'var') || isempty(opt_colmajor) opt_colmajor = false;end% rescaleA = A - mean(A(:));if opt_graycolor, colormap(gray); end% compute rows, cols[L M]=size(A);sz=sqrt(L);buf=1;if ~exist('cols', 'var') if floor(sqrt(M))^2 ~= M n=ceil(sqrt(M)); while mod(M, n)~=0 && n<1.2*sqrt(M), n=n+1; end m=ceil(M/n); else n=sqrt(M); m=n; endelse n = cols; m = ceil(M/n);endarray=-ones(buf+m*(sz+buf),buf+n*(sz+buf));if ~opt_graycolor array = 0.1.* array;endif ~opt_colmajor k=1; for i=1:m for j=1:n if k>M, continue; end clim=max(abs(A(:,k))); if opt_normalize array(buf+(i-1)*(sz+buf)+(1:sz),buf+(j-1)*(sz+buf)+(1:sz))=reshape(A(:,k),sz,sz)'/clim; else array(buf+(i-1)*(sz+buf)+(1:sz),buf+(j-1)*(sz+buf)+(1:sz))=reshape(A(:,k),sz,sz)'/max(abs(A(:))); end k=k+1; end endelse k=1; for j=1:n for i=1:m if k>M, continue; end clim=max(abs(A(:,k))); if opt_normalize array(buf+(i-1)*(sz+buf)+(1:sz),buf+(j-1)*(sz+buf)+(1:sz))=reshape(A(:,k),sz,sz)'/clim; else array(buf+(i-1)*(sz+buf)+(1:sz),buf+(j-1)*(sz+buf)+(1:sz))=reshape(A(:,k),sz,sz)'; end k=k+1; end endendif opt_graycolor h=imagesc(array,'EraseMode','none',[-1 1]);else h=imagesc(array,'EraseMode','none',[-1 1]);endaxis image offdrawnow;warning on all
6.2 在/examples/_temp中将display_network拷贝到_temp文件下
6.3打开matlab,设置matlab路径为_temp路径,输入如下命令
nsample = 2;% num_output = 96; % conv1% num_output = 256; % conv5num_output = 4096; % fc7load features.matwidth = size(feats, 2);nmap = width / num_output;for i = 1 : nsample feat = feats(i, :); feat = reshape(feat, [nmap num_output]); figure('name', sprintf('image #%d', i)); display_network(feat);end
6.4结果图
下图是对 conv1的特征图像进行可视化的结果:将提特征的命令改成conv1,将extract_feature中的参数改成290400,最后matlab实现可视化时把输出数量改成96
0 0
- 逐层可视化图像特征
- Caffe_Windows学习笔记(四)逐层可视化图像特征
- caffe python接口:可视化每层图像特征
- 学习笔记:深度学习网络特征逐层可视化
- 使用python可视化特征层参数和特征图
- Caffe提取任意层特征并进行可视化
- Caffe提取任意层特征并进行可视化
- caffe学习笔记(5):层的特征可视化
- Caffe提取任意层特征并进行可视化
- Caffe学习笔记4图像特征进行可视化
- caffe实现逐层可视化
- Caffe学习系列(17):模型各层特征和过滤器可视化
- Caffe学习系列(17):模型各层特征和过滤器可视化
- caffe cnn提取各层特征并可视化结果(Python接口)
- 图像特征
- 图像特征
- 图像特征
- 图像特征
- 修改默认主菜单排列 默认亮度 默认壁纸
- ava.lang.UnsatisfiedLinkError: Couldn't load XXXfrom loader dalvik.system.PathClassLoader[DexPathLis
- Java的继承(继承、多态、动态绑定、静态绑定、泛型数组、对象包装器的自动装箱与自动拆箱)
- vs2010英文版打包中文框架出错的解决办法
- 初识变量”的物质
- 逐层可视化图像特征
- in 里的小表做驱动表
- 深入理解Linux网络技术内幕-设备注册和初始化(三)
- javascript/JS常用正则表达式
- Android studio 2.0 Preview4 最新版
- Android 使用回调.activity调用fragment中的数据
- _T("")
- OC面试题集
- 手记NO2