本篇内容:
1. 尝试DAG模块运行更复杂的图片识别算法。
2. 使用DAG模块,识别任意图片。
一、使用DAG模块
上一篇的例子是使用SimpleNN的典范。更复杂的模型则是使用DagNN。例如,要运行GoogLeNet使用:
首先试运行一下是否可以识别示例,将下面的代码复制后全部粘贴到MATLAB命令行中运行即可。(注意:运行目录应为MATCONVNET文件夹下)
% setup MatConvNet
run matlab/vl_setupnn
% download a pre-trained CNN from the web (只需要第一次运行即可)
urlwrite(
... 'http://www.vlfeat.org/matconvnet/models/imagenet-googlenet-dag.mat', ...
'imagenet-googlenet-dag.mat') ;
% load the pre-trained CNN
net = dagnn.DagNN.loadobj(load('imagenet-googlenet-dag.mat')) ;
net.mode = 'test' ;
% load and preprocess an image
im = imread('peppers.png') ;
im_ = single(im) ;
% note: 0-255 range
im_ = imresize(im_, net.meta.normalization.imageSize(1:2)) ;
im_ = bsxfun(@minus, im_, net.meta.normalization.averageImage) ;
% run the CNN
net.eval({'data', im_}) ;
% obtain the CNN otuput
scores = net.vars(net.getVarIndex('prob')).value ;
scores = squeeze(gather(scores)) ;
% show the classification results
[bestScore, best] = max(scores) ;figure(1) ; clf ; imagesc(im) ;
title(sprintf('%s (%d), score %.3f',
...net.meta.classes.description{best}, best, bestScore)) ;
二、使用已经训练好的神经网络测试自己的图片
上面的例子运行无误后,就可以尝试来测试自己的图片了。
事实上,只需要将PNG格式的图片保存到运行目录下,然后将代码中的图片名改为要测试的名字即可。
我写了一个简单的脚本,可以参考一下:
%ex.m
run matlab/vl_setupnn
net = dagnn.DagNN.loadobj(load('imagenet-googlenet-dag.mat')) ;
net.mode = 'test' ;
a = zeros(1,1);
while(1)
a = input('Please input the pngs name.\n','s');
a = ['photos/',a];
im = imread(a);
im_ = single(im) ; % note: 0-255 range
im_ = imresize(im_, net.meta.normalization.imageSize(1:2)) ;
im_ = bsxfun(@minus, im_, net.meta.normalization.averageImage) ;
net.eval({'data', im_}) ;
scores = net.vars(net.getVarIndex('prob')).value ;
scores = squeeze(gather(scores)) ;
[bestScore, best] = max(scores) ;
figure(1) ; clf ; imagesc(im) ;
title(sprintf('%s (%d), score %.3f',...
net.meta.classes.description{best}, best, bestScore)) ;
end