模式识别 - 纹理图片里的目标检测
理论设计
本次大作业,我从每个像素的 RGB、该像素点相对周边像素的关系两方面,选择了几个基础的特征,分别计算该特征方面某个像素点的"权重"。在此基础上,通过组合这些权重构造出一个,描述某个像素点属于目标的概率的表达式。通过调整这个表达式中各特征占比,找到最佳的检测出对象目标的系数组。
其实这是参考了机器学习的神经网络概念,理论上说,如果有足够的样本点给我拿来训练,有足够的时间给我将这些基本特征进行各种随机的组合,就可以将系数调整到最佳,得到非常高的准确率。但这里只是参考了这个概念,因为没有训练样本,并没有实现这个神经网络,特征的组合和各特征参与计算的系数是我自己随便调的。
具体来说,颜色方面,对于每个像素点,我提取了 RgbFar
与 RgbRare
两个特征,另一方面,根据每个像素点与周围像素点的关系,我提取了 GroupNum
与 BlockRare
两个特征,下面将详细解释:
- RgbFar:
与某个像素的 RGB 点到整张图平均 RGB 的欧式距离正比,当最终系数组里这个特征的系数增大时,与背景纹理的色彩差距最大像素将更可能被选择。 - RgbRare:
与某个像素的 RGB 在整张图上出现的频数成反比,这个特征系数的提高将会使得整张图里最少出现的像素被更多的选择。 - GroupNum:
对于某个点,这个特征取决于,与其色值相近的、连通的像素点的数量。这个特征系数与最终被选择的目标的大小关系紧密。 - BlockRare:
当某个点与周边的点连成一片后,将会有一些"边境点",而这个特征描述了这些边境点与组内的点的比例。该特征的系数与目标的形状有关系。
以上 4 个基本的特征,分别从一个方面描述了一个点属于目标的概率。这 4 个特征里,1、2 特征与 3、4 特征应该算是正交的吧,但 1 与 2、3 与 4 之间有一定的交叉,不过也是可以构成一个特征的投影平面的。另外,为了节省运算,实际代码里 3、4 特征的计算是基于 1、2 基础上的,也就是说实际运行时的系数组长度为 6,分别是 1、2 特征、3-1、3-2、4-1、4-2 特征组(这可能就是为什么对于有些图片检测效果非常差的原因,3、4 特征一定程度上被 1、2 限制了)。其实之后还应该有更多交叉互组,形成多层神经元,但同样没时间做了。
以上四个特征里其实还嵌套了许多系数因子,比如,GroupNum 的数量与像素点是目标的概率之间就不是简单的线性关系,硬要说的话,根据我简单统计,应该类似高斯分布,num 分布在 60~300 之间时是目标的概率较大。显然,这里的期望值与标准差应该也可以通过样本训练来自动调优的。类似的,BlockRare 里,边境点的比例也不是越高或越低就越好,较高时目标形状类似树形,较低时则偏向于一个圆形,而我们要的,面积大概 50~300 像素的长方形对应是多少呢?我同样是简单统计了一下填了个 0.5~1。其它类似的地方,如果仔细调整的话,准确率会得到很大的提升。
另一方面,现在各个特征之间其实只简单组合了一层,没有多层神经元之间的繁杂组合,最终判别也是一个简单的一次方程组,实际上各特征与目标的关系也有可能是次方甚至指数关系等,这些都没有纳入考虑,如果要优化的话,改进空间其实还很大。
成果展示
各中间特征等高图详见 out
目录
01


02


03


04


05


06


07


08


09


10


11


12


13


结论及验证
RgbFar
与 RgbRare
特征的表述能力对比:
03.bmp 中,可以看到 RgbFar
对于上方的那个目标不太敏感,但对于右下方目标十分敏感。相反,RgbRare
对于上方目标很敏感,对于下方那个完全不行。


在 06.bmp 中,RgbRare
的有效度近乎为 0:


反之,在 09.bmp 中,RgbFar
的有效度近乎为 0:


以上,经过这些对比可以得出,RgbFar
与 RgbRare
经过一定比例的叠加,可以更为有效的描述目标
GroupNum
与 BlockRare
特征的表述能力对比:
综合所有图片提取的特征的分析,可以发现,GroupNum
得到的权重等高图普遍更为"干净",但经常性的出现目标的部分乃至整体缺失。 BlockRare
得到的图噪点较多,但相对来说出现遗漏的情况也更少。这表明,GroupNum
与 BlockRare
特征的比例调和,可以得到一个最佳的目标检测的中间值。
下面以分类效果较好的 04.bmp
为例,展示具体效果:
推导过程

权重等高图:

检测目标标示:

结论是,02、10、12 的识别效果很差,13 漏了一个。值得注意的是,可以看到对于其它人来说普遍较难的 08 号在这里效果却很好,这充分说明了这种方法的独特性,而识别 08 的系数组则反映了,08 中某像素是否为目标,与该像素的稀有度、与该像素近似的周边像素的数量两个因素相关性较大。而 02、10、12 很差的原因,如之前所说,可能是 3、4 特征被 1、2 限制了,目标像素的 RGB 离均色不远且出现较多时,1、2 几乎不起作用,3、4 也就跟着挂了,没有起到预想的,用一组正交坐标轴表述一个特征平面的模型。
最后,关于效率的问题,虽然没做优化,但我大致测了一下,每张图线性处理,多张图之间多进程并行(用 launcher.bat 批量启动),在我的一般配置的个人 PC 上,用时 16min(但 CPU 占用较高,任务管理器里居然报 99% 占用率...)。而在运行过一次之后,如果要调整各特征的系数再跑的话,可以使用之前的特征等高图缓存,速度会快上许多(TextureRecognize <filename> --use-cache [--default-weights or 0.1,0.1,0.2,0.2,0.2,0.2 ...] --finish
)。