大家好,今天来跟大家分享一下最近做的一个目标识别的小程序。采用的方法是DenseSift+BOW词袋模型+SVM支持向量机。

1. 问题描述

目标识别,即给定一张图片,能够识别并标出图中的物体,是数字图像处理中一个经典内容。

目前的目标识别大部分利用的是有监督的训练方法。这里采用的训练集为PASCAL

VOC2007数据集,下载地址为:http://pascallin.ecs.soton.ac.uk/challenges/VOC/该数据集分为训练集、测试集两部分。其中训练集5011张图片,测试集4952张图片。已经为每张训练集与测试集图片提供了20类物体标注及位置,这20类物体分别为:"aeroplane","bicycle","bird","boat","bottle","bus","car","cat","chair","cow","diningtable","dog","horse","motorbike","person","pottedplant","sheep","sofa","train","tvmonitor"。我们本学期数字图像处理的大作业即用该数据集训练一个可以从图片上识别这20类物体并标注其位置的一个分类程序。

2. 特征选择

要做目标识别,首先应当从图片上选取合适的描述特征。我们采用的是DenseSift。DenseSift是Sift的一种变种,其每个描述子也是一个128维的向量,表征的是关键点2邻域内16个像素点沿八个方向的梯度变化,因此维度为16*8=128。它与Sift最大的不同在于关键点的选取是稠密且同规格的,如下图所示。

我们的程序首先将训练集中每个图片上标注的物体按照类别切出来,再在切出的图片上提取其DenseSift。例如在这5011张图片中,238张图片中含有306架飞机,那么我们就有306个关于飞机的DenseSift矩阵,每个矩阵的列数为128,行数与对应的飞机图片大小有关。由于训练集的飞机有不同的尺度,因此每个矩阵的行数是不同的。

3.

词袋模型的建立

为了建立词袋模型,我们需要将提取出来的DenseSift特征进行离散化,即建立字典,找1000个标准词汇(注意每个标准词汇都是一个128维的向量),将所有DenseSift矩阵中的特征点都用欧氏距离最近的标准词汇上,进而对离散化后的DenseSift统计直方图,这样就能将每一张目标物体的图片用一个有1000个柱的直方图,即一个1000维度的一维向量表示。

这里1000个标准词汇理论上应当用所有DenseSift矩阵中的所有特征点做一个k-mean聚类,聚成1000类。由于总的特征点数据过多,都用来聚类的话会卡爆我的内存。因此实际操作上,我用前987张训练集图片上标注的目标物体的DenseSift特征点进行聚类,用的是OpenCV中的BOWKMeansTrainer进行3次迭代最终找出了1000个类的中心点作为1000个标准词汇。

然后,我们将上一步中得到的DenseSift矩阵的每一行都找到一个与其最接近的标准词汇替代,然后对每一个DenseSift对每一个标准词汇出现的频率进行直方图统计。之所以统计频率而不统计频数,是因为在我们的训练集中切出来的每个目标物体图片的大小是不一样的,因此最终得到的关键点数目也是不一致的。因此统计频率实质上是进行了一部归一化,使得我们每张图片统计结束后得到的都是一个1000维的单位向量。

4.

训练SVM支持向量机

进过上一步之后,306个飞机对象的图片都可以用一个1000维空间中的点来表示,我们可以将飞机对象的图片作为正样本,其他类别图片得到的点做负样本,这样就能为飞机训练一个SVM分类器。然而这一步要注意的是,由于负样本是其他19类样本的和,因此负样本的数量远远大于正样本的数量。会导致我们训练的SVM过拟合,即不管输入什么都输出-1.我们的解决方法是用全部的飞机对象,其他的样本数量只取正样本数量的十分之一,即30张图片进行训练。这样我们的正样本有306个,负样本有570个,比较均衡。用同样的方式可以为另外的19类物体分别训练出一个SVM。

5. 识别目标

有了每类物体的分类器后,任给一张图片,我们就能①对其提取DenseSift,②将其提取到的所有特征点离散化为1000个标准词汇并统计每个标准词汇出现频率的直方图,③将统计后得到的1000维向量做输入分别用20个SVM分类器预测其是否属于自己的类。以下是对整张图片进行识别后得到的结果。

通过比较可以发现,尽管dogy和中华田园犬中都识别出了dog,但同时混入了其他的动物例如cat与sheep。同样地,飞机虽然也被识别了出来,但同时还误识出了car。

而且在实验中还发现,只要是立方体、带有窗户的物体,都会识别成bus或train等缺陷。

6.基于滑动窗口的目标识别

最后要做的就是利用滑动窗口技术在一张图片上遍历识别其中的物体了。由于我们每个滑动窗口都要提取DenseSift、离散化、用SVM分类20次,加上滑动窗口后会更加费时。因此假定要识别一张宽为W高为H的图片,我们用W*H的窗口,W/2*H的窗口,W*H/2的窗口以及W/2*H/2的窗口进行扫描,每个窗口的步长为窗口宽与高的1/2。而且我们规定如果再大尺度的窗口下扫描出了任何物体,就不需在小尺度下进行扫描。好在大部分的图片在较大尺度下就能识别到物体。以下是一些结果:

7. 存在的不足

现在的问题是,动物类分类并不好,识别猫时会连带识别出鸟,识别狗时会连带识别出猫,识别人时会连带识别出马,识别火车时会连带识别出大巴车,识别鸟会识别出飞机;会把挂在墙上的画识别成显示器等。增大训练样本,会导致内存爆掉。如果建立更多SVM分类器的话,又会导致识别一张图片的速度下降。

在较大的滑动窗口中就能识别出位于屏幕中央非常小的物体,导致目标切割不准。

dense sift matlab,DenseSift+BOW词袋模型+SVM支持向量机相关推荐

  1. BoW词袋模型原理学习及Python实现

    文章目录 BoW词袋模型原理 为什么要用BoW模型描述图像 构建BoW码本步骤 编码 测试 BoW词袋模型原理 BoW(Bag of Words)词袋模型最初被用在文本分类中,将文档表示成特征矢量.它 ...

  2. R+NLP︱text2vec包——BOW词袋模型做监督式情感标注案例(二,情感标注)

    在之前的开篇提到了text2vec,笔者将其定义为R语言文本分析"No.1",她是一个文本分析的生态系统.笔者在学习之后发现开发者简直牛!基于分享精神,将自学笔记记录出来.开篇内容 ...

  3. 【ORB-SLAM3】BOW词袋模型

    基于视觉的闭环检测可以描述为,给定一张输入图像,在历史图像数据库中高效准确地搜索出与之相似的图像.而通常的穷举搜索法效率低下,类帧差法受制于图像视角变化.光照变化.曝光等因素无法稳定识别相似图像. 词 ...

  4. dense sift matlab,一个 Dense SIFT 算法的 matlab 实现 | 学步园

    Ce Liu, Jenny Yuen, Antonio Torralba,JosefSivic, andWilliam T. Freeman 版权所有. 修改的部分函数与变量的名字,使其好懂了一些.不 ...

  5. BoW词袋模型Bag of Words cpp实现(stable version 0.01)

    致谢:基础框架来源BoW,开发版本在此基础上进行,已在Ubuntu.OS X上测试通过,Windows需要支持c++11的编译器(VS2012及其以上). 使用 代码下载地址:bag-of-words ...

  6. 词袋 图像检索 matlab,词袋模型BoW图像检索Python实战

    前几天把HABI哈希图像检索工具包更新到V2.0版本后,小白菜又重新回头来用Python搞BoW词袋模型,一方面主要是练练Python,另一方面也是为了CBIR群开讲的关于图像检索群活动第二期而准备的 ...

  7. 词袋模型BoW图像检索Python实战

    前几天把HABI哈希图像检索工具包更新到V2.0版本后,小白菜又重新回头来用Python搞BoW词袋模型,一方面主要是练练Python,另一方面也是为了CBIR群开讲的关于图像检索群活动第二期而准备的 ...

  8. 词袋模型BoW和词集模型SoW比较

    Bag-of-Words词袋模型,经常用在自然语言处理和信息检索当中.在词袋模型中,一篇文本(文章)被表示成"装着词的袋子",也就是说忽略文章的词序和语法,句法;将文章看做词的组合 ...

  9. 如何设计好词袋模型BoW模型的类类型

    回顾过去自己写过的一些词袋模型,比如BoW图像检索Python实战.图像检索(CBIR)三剑客之BoF.VLAD.FV以及Bag of Words cpp实现,这些写出来的要么只是助于自己理解词袋模型 ...

  10. 词袋模型 matlab,【火炉炼AI】机器学习051-视觉词袋模型+极端随机森林建立图像分类器...

    [火炉炼AI]机器学习051-视觉词袋模型+极端随机森林建立图像分类器 (本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, m ...

最新文章

  1. 【Flutter】监听滚动动作 控制组件 透明度渐变 ( 移除顶部状态栏空白 | 帧布局组件 | 透明度组件 | 监听滚动组件 )
  2. 组播IP地址到底是谁的IP?
  3. XML fragments parsed from previous mappers already contains value for xxxxx
  4. Asp.Net高级知识回顾_HttpModule及应用程序生命周期_1
  5. MyBatis Plus EntityWarpper参数的介绍
  6. day09【后台】权限控制-下
  7. PHPmail 亲测可用
  8. hdu 2142 Can you find it?
  9. 北理工c语言作业 2048,C语言实现2048小游戏
  10. 海信电视root后误删软件无法进入主页键解决办法
  11. 计算机批量制作邀请函步骤,如何利用Word批量制作邀请函
  12. win10系统 - U盘启动盘制作教程
  13. CSS3中的一些新特性(CSS)
  14. 程序员之间丧心病狂的鄙视链 你在哪一层?
  15. matlab读文件函数程序,Matlab 文件读写函数
  16. Class<?>和Class的区别
  17. 浅谈vue2与vue3的区别
  18. 三天完成企业官网ICP备案与公安备案-详细流程
  19. Android studio集成flutter
  20. 互联网的主流与非主流

热门文章

  1. 配置nginx+wordpress的https
  2. apache jmeter 使用
  3. PHP7实战开发简单CMS内容管理系统(3) 引入后台首页
  4. PLSQL连接本地的Oracle数据库
  5. 程序functionLua基础 小结(两个Lua程序示例)
  6. Sqlite程序及库文件——整理(懒人)
  7. Scapy 函数传值问题,解决多层数据获取
  8. keep怎么生成运动轨迹_空间新物种 !| 垂直运动路径与商业综合体的整合与植入...
  9. C++网络编程实例(初识多线程)
  10. JS使用setInterval定时器导致前端页面卡死