文章目录
- 1、概述
- 2、图像识别
- 2.1 名词解释
- 2.2 基本方式
- 3、图像识别的基本方法
- 3.1 统计分类方法
- 3.2 句法结构方法
- 4、算法介绍
- 4.1 CNN
- 4.2 RCNN
- 4.3 SPP-net
- 4.4 Fast RCNN
- 5 总结
1、概述
目标识别是指一个特殊目标(或一种类型的目标)从其它目标(或其它类型的目标)中被区分出来的过程。
一般,我们可将识别能力由高到低分为三个层次:
1)仪器水平:物理识别
2)动物水平:模糊识别
3)人类智能水平:情感识别
其中,物理识别是对接受到的信息实现物理、化学和生物学的量化认识。这种识别的特点是识别内容分别独立互不相关,事件具有精确的重复性,无需经验和智能,完全可以程序化。所以它是最低层次的识别。模糊识别是在大量复杂的信息中识别出有用的部分,即对接收的信息与以往的记忆和经验进行关联认识,剔除无关的信息。
2、图像识别
2.1 名词解释
样本:一类事物的一个具体体现,对具体的个别事物进行观测所得到的某种形式的信号或表达
模式:表示一类事物,表示对某类事物特征或属性的抽象的描述。由多个描述子组成
模式类:模式所属的类别或同一类中模式的总体成为模式类,是具有某些公共特征的模式的系列,模式类与模式联合使用时,模式表示具体的事物,而模式类则是对这一类事物的概念性描述。
2.2 基本方式
1)从待分类的图像中提取能够代表或排除某些类别的特征
2)根据特征将图像目标分到相应的类别中
其中,图像的分类过程为:
1)学习过程:首先分离具有典型性的特征,根据这些特征对每个类别建立独立的描述,建立特征相应的特征空间。
2)测试过程:根据输入的样本和特征空间的划分,对全体图像进行分类。
3、图像识别的基本方法
● 统计分类方法:在对分类图像进行大量统计分析的基础上,找出规律性,抽取能够反映目标特征的统计向量进行识别。
● 句法结构方法:通过对图像结构的分析,将图像用一些语句来表达,通过符号匹配、语法分析等,实现图像中目标的识别。
3.1 统计分类方法
对样本x进行分类主要经过两个阶段:
● 分析阶段(学习阶段):确定需分类的目标与类别
对每一种类别,选定一组目标样本,然后对样本数据进行分析,形成不同类别目标的特征向量,每个向量构成一个模式。
● 识别阶段
对待分类图像进行必要的预处理与特征提取,按照上述各类别的特征向量,对提取的特征进行判决分类,确定其归属的类别。
下面我们来了解一下决策论法:
设模式向量x,对M个模式类,寻找M个决策函数,若模式x属于类,则;
换句话说,若一个未知的模式x属于第i个模式类,把x代入所有判别函数,di(x)的值最大。
决策边界:
对于模式x,如果,则x被称为Wi与Wj的决策边界,通常用一个单一的函数来标识两个类之间的决策边界,定义为:
统计分类方法中有一些常见的方法:
方法一:最小距离分类器
假设现有两个模板m1和m2,判断未知模式向量x,判断x与m1和m2距离,如果与m1的距离小于与m2的距离,则x属于w1,否则属于w2。
方法二:相关匹配
用样板子图像直接作为模式,通过子图像与原图像直接进行相关计算,把相关计算结果作为决策函数,相关计算获得最大值的位置就被认为匹配成功。
存在问题:
1)在边界处将失去准确性,其误差与子图像的尺寸成正比。
2)相关函数对振幅的变化太敏感
方法三:贝叶斯分析
贝叶斯分析包括:贝叶斯决策方法,贝叶斯分类器,贝叶斯估计理论,贝叶斯距离等。
贝叶斯公式:设有N个互不相容的事件b1,b2,…bn.事件a发生条件下事件bi发生的概率为
贝叶斯分类法:设有M类图像B1,B2,…Bi对事件X,若P(B1/X)>P(B2/X),则X属于B1类,否则属于B2类。
那么下面我们来看一个对水果分类的例子,
#水果数据
datasets = {'banala':{'long':400,'not_long':100,'sweet':350,'not_sweet':150,'yellow':450,'not_yellow':50},
'orange':{'long':0,'not_long':300,'sweet':150,'not_sweet':150,'yellow':300,'not_yellow':0},
'other_fruit':{'long':100,'not_long':100,'sweet':150,'not_sweet':50,'yellow':50,'not_yellow':150}
}
#计算水果总数
def count_total(data):
count = {}
total = 0
for fruit in data:
#因为水果要么甜要么不甜,可以用 这两种特征来统计总数
count[fruit] = data[fruit]['sweet'] + data[fruit]['not_sweet']
total += count[fruit]
return count,total
#计算每种水果出现的概率
def cal_base_rates(data):
categories,total = count_total(data)
cal_base_rates = {}
for label in categories:
priori_prob = categories[label]/total
cal_base_rates[label] = priori_prob
return cal_base_rates
#计算在已知水果种类时个特征的概率
def likelihold_prob(data):
count,_ = count_total(data)
likelihold = {}
for fruit in data:
attr_prob = {}
for attr in data[fruit]:
attr_prob[attr] = data[fruit][attr]/count[fruit]
likelihold[fruit] = attr_prob
return likelihold
#判定水果种类
class navie_bayes_classifier:
'''初始化贝叶斯分类器,实例化时会调用__init__函数'''
def __init__(self,data=datasets):
self._data = datasets
self._labels = [key for key in self._data.keys()]
self._priori_prob = cal_base_rates(self._data)
self._likelihold_prob = likelihold_prob(self._data)
self._evidence_prob = evidence_prob(self._data)
#下面的函数可以直接调用上面类中定义的变量
def get_label(self,length,sweetness,color):
'''获取某一组特征值的类别'''
self._attrs = [length,sweetness,color]
res = {}
for label in self._labels:
prob = self._priori_prob[label]#取某水果占比率
#print("各个水果的占比率:",prob)
for attr in self._attrs:
#单个水果的某个特征概率除以总的某个特征概率 再乘以某水果占比率
prob*=self._likelihold_prob[label][attr]/self._evidence_prob[attr]
res[label] = prob
return res
3.2 句法结构方法
句法结构方法中的各个环节都围绕着语法的研究展开,定义了字符集、句子、语言,字符组成句子,句子组成语言。常见的方法有匹配形状树法和串匹配法。
- 匹配形状数
形状数:描述一个对象的边界,结构时,所得到的表达式或特征数,可视为模式串、模式数的一种通用表述。
匹配形状数法是通过两个对象边界的形状数的相似程度来匹配对象。两个区域边界的相似级别k是指相同形状数的最大序号,两个区域边界的形状数的距离D定义为相似级别K的倒数。用不同密度的网格划分边界区域,就会获得不同序数的形状数。
如果使用相似级别k,k越大说明越相似;如果使用相似距离D,D越小说明越相似 - 串匹配
串匹配是指比较两个边界的串编码的相似程度来进行匹配
设两个区域边界A和B已分别被编码为和,则当时我们说发生了一个匹配。设A和B匹配总数为M,则A和B的相似度为
4、算法介绍
接下来,带大家来了解一下现在目标识别时常用的算法。
4.1 CNN
卷积神经网络是目前图像识别用途最广,最简单的深度学习算法。它的工作原理如下图:
向网络中输入一张图片,接着将它传递到多个卷积和池化层中,最后输出目标所属的类别。
- 输入图片
- 将图片分成几个区域
- 将每个区域堪称单独的图片
- 把这些图片分成不同的类别
- 把结果结合在一起,完成。
这种方法的问题是有时需要划分多个区域,导致计算量比较大,为解决这一问题,就有了RCNN。
4.2 RCNN
在RCNN中,我们会事先创建多个边界框,其主要步骤如下:
- 预先取一个预训练卷积神经网络。
- 根据需要检测的目标类别数量,训练网络的最后一层。
- 对图片中感兴趣的区域重新改造,以让其符合CNN的输入尺寸要求。
- 得到这些区域后,我们训练支持向量机(SVM)来辨别目标物体和背景,对每个类别训练一个二元SVM。
- 训练一个线性回归模型,为每个辨识到的物体生成更精确的边界框。
因为在RCNN中对每个图像都要提取大量的单独区域,并对每个区域都要进行特征识别,最后的结果是RCNN的速度很慢。为了解决这一问题,SPP-net出现了。
4.3 SPP-net
SPP-Net在最后一个卷积层后,接入了金字塔池化层,使用这种方式,可以让网络输入任意的图片,而且还会生成固定大小的输出。
SPP-net与RCNN最大的区别是在CNN特征提取这一步,在SPP-net中将整张待检测的图片输入CNN中,进行一次性特征提取,得到feature maps,然后在feature maps中找到各个选框的区域,再对各个候选框采用金字塔空间池化,提取出固定长度的特征向量。而R-CNN输入的是每个候选框,然后在进入CNN。
虽然SPP-net贡献很大,但其实并没有解决RCNN中所存在的问题,于是,fast RCNN出现了。
4.4 Fast RCNN
相比R-CNN最大的区别,在于RoI池化层和全连接层中目标分类与检测框回归的统一。
RoI池化层去掉了SPP的多尺度池化,直接用MxN的网格,将每个候选区域均匀分成M×N块,对每个块进行max pooling。从而将特征图上大小不一的候选区域转变为大小统一的特征向量,送入下一层。
fast RCNN提出了多任务损失函数(Multi-task Loss),将边框回归直接加入到CNN网络中训练,同时包含了候选区域分类损失和位置回归损失。
其主要流程如下:
(1) 输入一张待检测图像;
(2) 提取候选区域:利用Selective Search算法在输入图像中提取出候选区域,并把这些候选区域按照空间位置关系映射到最后的卷积特征层;
(3) 区域归一化:对于卷积特征层上的每个候选区域进行RoI Pooling操作,得到固定维度的特征;
(4) 分类与回归:将提取到的特征输入全连接层,然后用Softmax进行分类,对候选区域的位置进行回归。
5 总结
本章我们学习了目标识别的一些基础知识及目标识别过程中使用的基本方法,并且介绍了当前目标识别中使用的算法的发展过程。目标识别是极为重要的一门技术,在多个领域都有广泛的应用,我们必须要重视。