今年11月下旬,京东金融发布了大数据比赛。长期搞图像的我忍不住想参加一下,看看都有什么样的人参加比赛,自己能取得什么样的成绩。现在比赛已经结束了,机器之心有一篇文章简单介绍了猪脸识别商业组第一名的情况。看到他们参赛阵容这么豪华,我也就自我安慰了一下,虽然自己离前二十还有一段距离,不过我是单枪匹马啊,一个人一台机器,还经常内存不足。这也提醒我,该买机器了,进入深度学习时代,光拼代码不够了,还要拼机器。同时,我也感叹了一下现在的Matlab真是强大,回想自己在学校时候用VC98+libsvm跑的在trecvid2005上的词典生成程序,一个人几个星期能搞出来就不错了。而现在,几行代码就够了。还不用配置VS的环境、不用编译OPENCV源码,真是太容易了。前两年,深度学习火起来后,有人说本科生都能把CNN跑起来,达到教授们的水平。现在,有了Matlab,中学生都能把CNN跑起来了。难怪国家开始提倡小学生开始编程了。这样的话,到2035年成为人工智能强国的就很容易了。
下面进入正题,接触Matlab已经18年了,本科时候学数学用,读硕时候用simullink搭卫星编码的仿真系统,觉得Matlab确实好用,简单,上手快,帮助文档很全面,示例很多,代码拷过来就能跑。读博期间没有再用,那段时间Matlab在图像处理和计算机视觉上功能比较少,主要用OpenCV了。这两年,Matlab发力了,不但补上了图像检索、BOW,还实现了深度学习的不少功能。研究算法的小伙伴们可以看看。记得在读博期间,写过不少图像检索的程序,都是在OpenCV和MFC基础上写的,耗时比较长,在代码实现上还是花了不少时间的。现在,在Matlab2016或Matlab2017下,一个检索程序只需要几行代码就够了。而且,计算指标、画曲线都不用自己写代码了,真是方便。
%exam1.m
setDir = fullfile(toolboxdir('vision'),'visiondata','imageSets','cups');
%读取指定目录下图像,并生成imageSet类
imgSets = imageSet(setDir, 'recursive');
thumbnailGallery = [];
%图像缩放和设置缩略图
for i = 1:imgSets.Count
I = read(imgSets, i);
thumbnail = imresize(I, [300 300]);
thumbnailGallery = cat(4, thumbnailGallery, thumbnail);
end
figure;
%将一组图像显示为缩略图,图像之间无空白
montage(thumbnailGallery);
%设置生成词袋用的图像特征提取方式
extractor = @exampleBagOfFeaturesExtractor;
%为图像集生成词袋
bag = bagOfFeatures(imgSets,'CustomExtractor',extractor);
%为图像集建立图像索引
imageIndex = indexImages(imgSets,bag,'Verbose',false);
%读取图象集第四幅图像
queryImage = read(imgSets,4);
figure;
imshow(queryImag)
%对查询图像进行检索,生成的结果按相似度排序
indices = retrieveImages(queryImage,imageIndex);
%在图像索引中取出第一幅即最相似的图像
bestMatch = imageIndex.ImageLocation{indices(1)};
figure;
imshow(bestMatch);
该示例通过imageSet、bagOfFeatures、indexImages、retrieveImages、四个函数就实现了基于BOW的图像检索。不过,代码虽少,但生成bag所用的特征是SURF,数量很大,图像集稍大时很容易耗尽内存。montage函数显示图像的效果较好,以前用plot函数显示多幅图像难免会有很多空白间距。
转载于:https://blog.51cto.com/8764888/2053832