代码:CNN-for-Image-Retrieval。

2015/12/31更新:添加对MatConvNet最新版version 1.0-beta17的支持,预训练的模型请到Matconvnet官网下载最新的模型。

2015/10/20更新:Web演示部分代码公开CNN-Web-Demo-for-Image-Retrieval。

2015/09/24更新:添加对MatConvNet最新版version 1.0-beta14的支持。

2015/06/29更新:添加对MatConvNet最新版version 1.0-beta12的支持。

注意:其中文件夹matconvnet-1.0-beta17是已经编译好了的,鉴于MatConvNet只能在Matlab 2014及其以上以及系统必须是64位,所以在使用此工具箱之前得满足这两个条件。如果是Pythoner,推荐使用flask-keras-cnn-image-retrieval,纯Python,非常易于写成在线图像搜索应用。

MatConvNet is a MATLAB toolbox implementing Convolutional Neural Networks (CNNs) for computer vision applications. It is simple, efficient, and can run and learn state-of-the-art CNNs. Several example CNNs are included to classify and encode images.

MatConvNet是Andrea Vedaldi用Matlab开发的一个卷积网络工具包,相比于Caffe,这个工具包配置比较简单,而且最近这两年,vgg小组在深度学习领域也是成绩斐然。关于MatConvNet的文档,可以查看MatConvNet Convolutional Neural Networks for MATLAB以及在线文档。这里我们主要讲讲怎么配置MatConvNet以及怎样利用在imageNet上已经训练好的模型抽取特征并进行图像检索。

MatConvnet配置

首先,下载MatConvNet,怎么下载这个自己看着办,如果你有github的账号,推荐你star一下它,既然都用它了,不给个star好意思么(哈哈~)。下载完后,解压,移到某处,本小子自己将它放在D:\matlabTools\目录下,打开matlab,进入到D:\matlabTools\matconvnet-1.0-beta10目录下,然后在matlab命令窗下输入以下命令进行mex编译:

addpath matlab
vl_compilenn

如果没出什么问题的话,会在你的matconvnet-1.0-beta10\matlab文件夹下多出几个文件夹,其中最重要的是mex,mex文件夹里有编译完成的mex文件vl_imreadjpeg.mexw64,vl_nnconv.mexw64,vl_nnnormalize.mexw64,vl_nnpool.mexw64说明编译成功。

注意:如果编译失败,可能的原因是你的matlab版本有点低(我在matlab2012b上没有编译成功),这个我查看了一下github上得issures,发觉也有人碰到这样的问题。另外根据Andrea Vedaldi在error in compiling CPU version with windows 7 + matlab 2014a说的:

Hi, we never tested a 32-bit build. Is there a particular reason why you are not running MATLAB 64 bit? Note that MATLAB 32 bit will be phased out by Mathwork in one of the upcoming releases. There does not seem much incentive in creating a 32 bit version of the code, although I am sure it could be done with relatively little effort. Also, in most applications of deep learning 4GB of addressable memory seem a little too little.

所以建议使用64位的matlab,此外在编译的时候,确认mex是否在matlab命令窗里可用,不行的话就setup吧,我用的是vs2010的编译器。

上面这一步完成了,基本就配置完了,下面就测试一下MatConvNet吧。测试的脚本见http://www.vlfeat.org/matconvnet/pretrained/给出的脚本例子,即:

% install and compile MatConvNet (needed once)
untar('http://www.vlfeat.org/matconvnet/download/matconvnet-1.0-beta17.tar.gz') ;
cd matconvnet-1.0-beta17
run matlab/vl_compilenn% download a pre-trained CNN from the web (needed once)
urlwrite(...'http://www.vlfeat.org/matconvnet/models/imagenet-vgg-f.mat', ...'imagenet-vgg-f.mat') ;% setup MatConvNet
run  matlab/vl_setupnn% load the pre-trained CNN
net = load('imagenet-vgg-f.mat') ;% 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_ = im_ - net.meta.normalization.averageImage ;% run the CNN
res = vl_simplenn(net, im_) ;% show the classification result
scores = squeeze(gather(res(end).x)) ;
[bestScore, best] = max(scores) ;
figure(1) ; clf ; imagesc(im) ;
title(sprintf('%s (%d), score %.3f',...
net.meta.classes.description{best}, best, bestScore)) ;

上面用的是urlwrite来下载imagenet-vgg-f.mat的,这里强烈推荐你单独下载,然后把urlwrite下载的那一行去掉,load时指向你放置的imagenet-vgg-f.mat具体位置即可。测试如果顺利的话,就可以进入下一节我们真正关心的图像减速话题了。

用已训练模型抽取特征

在抽取特征之前,有必要稍微先来了解一下imagenet-vgg-f这个模型。这里稍微啰嗦一下上面的那个测试脚本,im_ = imresize(im_, net.normalization.imageSize(1:2))将图像缩放到统一尺寸,即224*224的大小,这点你可以看看net中normalization.imageSize,而且还必须为彩色图像。res有22个struct,从第17到20的struct分别是4096位,最后第21到22个struct是1000维的,是4096维经过softmax后的结果,这里我们要用的是第20个struct的数据(自己测过第19个struct,检索效果比采用第20个struct的特征差)。这个网络有8层构成,从第6层到第8层都是全连接层。关于这个网络的结构,暂时到这里。

大致了解了这个网络结构后,我们便可以使用该网络抽取图像的特征了,抽取特征的代码(完整的图像检索代码见文末最后给出的链接)如下:

% Author: Yong Yuan
% Homepage: yongyuan.nameclear all;close all;clc;% version: matconvnet-1.0-beta17
%run ./matconvnet-1.0-beta17/matlab/vl_compilenn
run ./matconvnet-1.0-beta17/matlab/vl_setupnn%% Step 1 lOADING PATHS
path_imgDB = './database/';
addpath(path_imgDB);
addpath tools;% viesion: matconvnet-1.0-beta17
net = load('imagenet-vgg-f.mat') ;%% Step 2 LOADING IMAGE AND EXTRACTING FEATURE
imgFiles = dir(path_imgDB);
imgNamList = {imgFiles(~[imgFiles.isdir]).name};
clear imgFiles;
imgNamList = imgNamList';numImg = length(imgNamList);
feat = [];
rgbImgList = {};%parpool;%parfor i = 1:numImg
for i = 1:numImgoriImg = imread(imgNamList{i, 1});if size(oriImg, 3) == 3im_ = single(oriImg) ; % note: 255 rangeim_ = imresize(im_, net.meta.normalization.imageSize(1:2)) ;im_ = im_ - net.meta.normalization.averageImage ;res = vl_simplenn(net, im_) ;% viesion: matconvnet-1.0-beta17featVec = res(20).x;featVec = featVec(:);feat = [feat; featVec'];fprintf('extract %d image\n\n', i);elseim_ = single(repmat(oriImg,[1 1 3])) ; % note: 255 rangeim_ = imresize(im_, net.meta.normalization.imageSize(1:2)) ;im_ = im_ - net.meta.normalization.averageImage ;res = vl_simplenn(net, im_) ;% viesion: matconvnet-1.0-beta17featVec = res(20).x;featVec = featVec(:);feat = [feat; featVec'];fprintf('extract %d image\n\n', i);end
endfeat_norm = normalize1(feat);
save('feat4096Norml.mat','feat_norm', 'imgNamList', '-v7.3');

在倒数第二行,对特征进行了L2归一化,方便后面用余弦距离度量,L2归一化方法如下:

function [X] = normalize1(X)
% X:n*dfor i=1:size(X,1)if(norm(X(i,:))==0)elseX(i,:) = X(i,:)./norm(X(i,:));end
end

上面便是特征抽取的代码,特征抽取完后,我们便可以采用进行检索了。匹配时采用的是余弦距离度量方式,至于后面的检索部分的代码,相比于前面特征抽取的过程,更显灵活,怎么处理可以随自己的喜欢了,所以这里就不再对代码进行列举了。下面是我在corel1k外加上Caltech256抽取几类构成1333张图像库做的一个飞机检索结果,时间所限,就不测大的图像库了。

示例:Caltech-256图像数据库

Caltech-256图像数据库上搜索结果

最后,整个图像检索的代码已放在github上了,感兴趣的同学可以去CNN-for-Image-Retrieval,有github的同学不要吝啬你的star哦,这个代码我会随时完善更新,比如添加计算mAP的代码。

from: http://yongyuan.name/blog/image-retrieval-using-MatconvNet-and-pre-trained-imageNet.html

使用matlab版卷及神经网络 MatconvNe和预训练的imageNet进行图像检Image retrieval using MatconvNet and pre-trained imageNet相关推荐

  1. Make GNN Great Again:图神经网络上的预训练和自监督学习

    来源:RUC AI Box本文约6500字,建议阅读13分钟本文梳理近年来 GNN预训练和自监督学习/对比学习的相关工作. 1 引言 近些年来,对图神经网络(GNN)的研究如火如荼.通过设计基于 GN ...

  2. KDD 2020 开源论文 | GPT-GNN:图神经网络的生成式预训练

    论文标题:GPT-GNN: Generative Pre-Training of Graph Neural Networks 论文链接:https://arxiv.org/abs/2006.15437 ...

  3. GPT-GNN:图神经网络的生成式预训练 KDD 2020

    论文链接:https://arxiv.org/pdf/2006.15437.pdf 代码链接:https://github.com/acbull/GPT-GNN 论文来源:KDD 2020 参考文档: ...

  4. 基于深度神经网络的图像分类与训练系统(MATLAB GUI版,代码+图文详解)

    摘要:本博客详细介绍了基于深度神经网络的图像分类与训练系统的MATLAB实现代码,包括GUI界面和数据集,可选择模型进行图片分类,支持一键训练神经网络.首先介绍了基于GoogleNet.ResNet进 ...

  5. 二阶偏微分方程组 龙格库塔法_数值方法(MATLAB版)(原书第3版)[Numerical Methods Using MATLAB,Third Edition]pdf...

    摘要 本书特点 强大的图形表达 宽泛的计算方法 重点科学领域的重要算法 大量可运行的实例 数值方法(MATLAB版)(原书第3版)[Numerical Methods Using MATLAB,Thi ...

  6. Matlab粒子群算法神经网络泰坦尼克号

    Matlab粒子群算法神经网络泰坦尼克号 介绍 实验步骤 初始化参数 初始化种群 计算适应度函数 速度.位置更新 极值更新 实验结果 总代码 介绍 这里用粒子群算法优化神经网络的参数,使其得到更好的训 ...

  7. 【ELM分类】基于matlab遗传算法优化ELM神经网络数据分类【含Matlab源码 2138期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[ELM分类]基于matlab遗传算法优化ELM神经网络数据分类[含Matlab源码 2138期] 点击上面蓝色字体,直接付费下载,即可. ...

  8. matlab流量预测模型,基于MATLAB工具箱的BP神经网络年径流量预测模型研究——以塔城地区乌拉斯台河为例...

    水 文 JOURNAL OF CHINA HYDROLOGY 第28卷第1期 2008年2月 Vol.28 No.1 Feb., 2008 塔城地区位于新疆维吾尔自治区西北边陲, 地处中纬, 虽属内陆 ...

  9. 156 13.67用matlab答案,数学实验(MATLAB版韩明版)5.1,5.3,5.5,5.6部分答案

    <数学实验(MATLAB版韩明版)5.1,5.3,5.5,5.6部分答案>由会员分享,可在线阅读,更多相关<数学实验(MATLAB版韩明版)5.1,5.3,5.5,5.6部分答案(1 ...

最新文章

  1. python导入数据画多列直方图_在python datafram中使用两列(值、计数)绘制直方图...
  2. Dijkstra模板
  3. ffmpeg封装h264裸流为mp4文件,视频播放速度特别慢-解决
  4. python课程是学什么的-Python课程包括哪些内容?
  5. 提高电子商务转化率的关键因素
  6. 1364: 开灯与关灯(深入思考问题更妙哦~~)
  7. html表ge模板_精选甘特图模板,丰富又好用
  8. 我们如何在Python中创建多行注释?
  9. C++安全方向(三)3.4 使用哈希列表验证文件的完整性
  10. idea快捷键汇总mac_IntelliJ IDEA for MAC 快捷键设置汇总
  11. Java面向对象练习题之计算圆的面积和周长
  12. 电脑服务器显示过期,win10系统提示你的设备存在过期风险怎么办_网站服务器运行维护,win10...
  13. 利用Python处理辅助明细账并计算账龄
  14. 关于大数据的视频资料
  15. linux18安装anyconnect4.9遇到I/O问题
  16. 如何使用Win10自带的截图工具截屏
  17. GDevelop教程大全之 构建您的 2D游戏世界
  18. 解决汉荣达HRD-700背光灯和数字灯干涉的问题~
  19. Echarts 折线图 渐变色 不堆叠
  20. ruby + nokogiri实现将天涯易读全帖转换成txt文件的功能

热门文章

  1. blockchain 区块链200行代码:在JavaScript实现的一个简单的例子
  2. 2018香港纷智金融科技峰会 金色财经现场图文直播报道
  3. 转载:谢谢原作者:块设备驱动实战基础篇三 (BIO请求回调机制)
  4. Spring - @CompentScan全解
  5. Java-CentoOS 7安装JDK8 (rpm格式 和 tar.gz格式) 多JDK设置默认的Java 版本
  6. Java线程池的拒绝策略
  7. Redis之压缩链表ziplist
  8. @Autowired和@Resouce的区别
  9. 基础理论:啥是分布函数CDF、啥叫联合分布?
  10. 双代号网络图节点编号原则_一表多图(表格/横道图/网络图)让计划编制效率提高10倍...