今年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); 

该示例通过imageSetbagOfFeaturesindexImagesretrieveImages、四个函数就实现了基于BOW的图像检索。不过,代码虽少,但生成bag所用的特征是SURF,数量很大,图像集稍大时很容易耗尽内存。montage函数显示图像的效果较好,以前用plot函数显示多幅图像难免会有很多空白间距。