计算机器视觉(十)
补:
那个在Mean shift中的移动是在大圈里面再画一个小圈,然后在小圈里的点一起同时移动到最后的中心。
识别&词袋模型
- 分类问题:对一张图像做出一个结论
图像分类的一些应用点:
- 检测问题:不仅仅要告诉图像中是否有这个物品还要告诉这个物品的位置
检测最后很多是给出的是一个区域答案,一个区域+一个答案:区域是答案对应的区域
要求从图像中提取的信息要更丰富一些。
- 分割任务:一些像素一个label(实例分割)
- 在检测的基础上得到更多的信息:
分类识别和单实例识别:比如下图,类别识别是识别所有的塔,单实例识别是只识别比萨斜塔。
应用:能够在一个不了解的地方拍摄特定的元素,然后从数据库中调用出相应的信息,可以给出这个位置的信息知道自己的方位。 - 时间和行为识别
识别任务分类
这些任务为啥难呢?
⚠️面对一个问题的时候首先分析这个问题有哪些影响因素,每个影响因素都有哪些解决方案,把这些解决方案放在一起去建立自己的模型。
- 视角因素:
- 识别的种类数:
- 光照问题:
- 尺度问题:
- 形变问题:解决形变现在应用最多的方法是机器学习的方法(只要见的多就行)
- 遮挡问题:(抗遮挡能力)SIFT特征的方法
- 背景杂波
- 人为设计困难:
人还可以结合其他的模态来做,但是对于一个单视觉就比较困难。
图像识别涉及的基本问题:
- 表达
- 如何从数据中学习
- 应用在新数据集上
Representation
一般用区域进行表达而没有用整个图进行表达,因为整个图存在一个遮挡的问题,依靠全局特征提取就很容易失败,所以通常使用局部来表达。
- SIFT提取区域
- 直接将区域等分成格
- 其他提取区域的核
- 随机采集
左上角的图代表一个信息袋,里面有很多的图片,右上角的图结合了信息袋中的图之间的拓扑关系给出了更加详细的信息。
希望的表达方式具有的特点
处理类内变化一个简便的方法是概率模型;现在常用的方法有两个一个是产生式、一个是判别式还有产生式和判别式的混合。
产生式和判别式的区别:
产生式模型是个算个的,判别式的区别就是只要能找到一个方式把两个类分开,产生式模型需要事物的内部规律然后将这个事物建模出来,但是判别式不需要知道内部规律只需要知道这两个东西之间有啥区别直接将这两个东西分开即可。
生成式模型和判别式模型的本质差异在于模型中观测序列x和状态序列y之间的决定关系。观测序列是可以观测到的,而状态序列无法观测,所以可以把观测序列看成是结果,把状态序列看成是影响这个结果的原因。从这个角度上来说,生成式模型假设的y决定x(就是我假设了一个y这个y决定了x),而判别式模型是假设y决定了x(就是现在的y一定决定x)
我们的分类器是:给定输入x,分类变量y,求得p(y|x)。
Vapnik:人们应该更直接去解决问题,永远不要把求解更加复杂的问题作为中间阶段。
Andrew.Ng的有一篇文章就对这两个模型进行了全面的比较。生成式模型(朴素贝叶斯(NB))在少量样本的情况下,能够获得很好的精确率,而判别式模型(逻辑回归)在样本量增加的情况下,逐渐逼近前者的精确率。
具体而言:
生成式模型:由数据学习联合概率分布P(X,Y), 然后由P(Y|X)=P(X,Y)/P(X)求出概率分布P(Y|X)作为预测的模型。该方法表示了给定输入X与产生输出Y的生成关系
判别式模型:由数据直接学习决策函数Y=f(X)或条件概率分布P(Y|X)作为预测模型,即判别模型。判别方法关心的是对于给定的输入X,应该预测什么样的输出Y。
判别式模型似乎要方便很多,因为生成式模型要学习一个X,Y的联合分布往往需要很多数据,而判别式模型需要的数据则相对少,因为判别式模型更关注输入特征的差异性。不过生成式既然使用了更多数据来生成联合分布,自然也能够提供更多的信息
比如分类山羊和绵羊:生成式模型是根据数据分别建立山羊和绵羊的两个模型,然后把要判断的特征丢进去判断分别属于山羊和绵羊的概率,然后比较这两个概率的大小判断是山羊还是绵羊,而判别式模型是直接从历史数据的特征进行分类,学习到一个羊分类的模型,然后输入羊的特征就可以直接判断出来是山羊还是绵羊。一个关注机理,一个关注差异
Learning
- 样本标注的方式
- 样本的获取图片
增量学习:直接在原来数据建立的模型上继续学习,而不再考虑之前的数据,要达到的目标是这样的学习方式可以得到和使用所有数据进行学习得到的模型结果相同(全量识别)。 - 先验
通常会把行业知识建模成先验,这样就能把行业知识和已有的数据联系起来,把专家信息当作先验和把数据中看到的规律和在一起,这样就可以增加模型的准确性 - 过拟合和欠拟合
训练模型和泛化之间是有一定的约束的
非此类的事物如何收集,负样本的设计很重要
检测任务是判断每一个窗口是否是我需要的目标:窗体的尺寸、角度啥的,检测任务就要求分类的更快,要求实时性。会有很多个框框都有要检测的目标,这里也涉及到非最大化抑制
如何把图像表示成向量?
Bag-of-features models(词袋模型)
对于遮挡、平移视角的变化不太敏感,通常用一个词袋来表示这个图片。
词袋模型的起源
直方图上的信息和词袋中的信息是一一对应的,只不过直方图的表达更加方便一些(那直方图的纵轴表示啥啊?就是纹理基元出现的次数,每一个就相当于一个向量,向量的每一个分量的数值就是直方图的纵轴数据)
把文档中的常用单词都放在一个库里,把一个文档可以表示一个向量,也可以表示成一个直方图,x轴代表着每个特征种类,y轴表示每个特征出现的频率。通过磁带可以来描述单词出现的次数来表示。
先把图片分成袋子里的小块,然后根据词典画成直方图,这个直方图就可以写成一个向量。这样就完成了磁带模型的构建。
- 提取特征
- 学习视觉词典(图像和文档最大的区别:文档的单词是预先知道的,图像没有词典的预先概念,所以需要预先将图像进行处理整理出一个词典)
- 用辞典的每个单词的频率来表示图像
具体步骤实现
提取特征,然后进行归一化,然后进行描述(SIFT描述符可以做)
然后是视觉词典的构建:
从每张图像上都去提取特征,然后指定一个词典的个数大小,然后将提取到的所有特征都投影到特征空间中去做聚类,把每个类的中心记录下来
这个个数影响了将来表示的图像的向量的维数:
codebook:视觉词汇
codevector:视觉向量、视觉单词
issues(面临问题)
- 如何选择codebook中单词的数量?如何划分?
10-100倍
- 计算效率问题
k-means是比较慢的
直方图更加直观,向量的形式更适合于运算。
传统的词袋模型的缺点:
咩有一定的空间位置关系的影响,因为分割把空间特征都分开了。
既比较了粗旷的又表示了细节的,这样可以减少上面缺点的影响。多级别的更好些。