SML实现图像标注/分类
本文分享《信息搜索与人工智能》大作业的实现。题目的实现过程全在PPT,下面结合进行说明。
题目描述:任选某类图像为训练样本,编程实现其基于 SML 算法的类模型。要求图像的 GMM 为 6 个分量,类模型的 GMM 为 10 个分量。两级 GMM 模型 的初值均由 k-means 算法获得。
1、实现过程总述
图像特征抽取
先用混合高斯模型拟合一组含有共同语义类的图片(就是说我们的数据集,是按类别一批一批处理的),以提取图片的各个特征。
图像语义类建模
之后把描述图片特征的高斯混合模型的参数再作为数据集,用新的一组高斯混合模型来拟合,这样就相当于是对图片的特征进行整合,得到这一类图片的总体样貌。
图像标注或检索
在建模了多组语义类的模型后,对测试图片在不同的模型下计算似然,选择前几进行标注,表示含有相应的语义类。
2、具体实现
数据预处理
对于一个语义类的所有图片:
1)空间变换:读取图片后,从RGB空间转到YBR空间;
2)分块:图片分割成 8*8 的小块,相邻重叠 2 ,相当于一个 8*8 的窗隔 6 滑动一次;
3)补0:对于不满 8*8 的小块,进行补 0 操作,有点像信号插值里的补 0;
4)DCT 变换:对于每个小块进行 DCT 变换,获得特征;
ps,如果你的算法在后面的输入需要把图片展出一维,还需要:
5)zigzag 扫描:在 DCT 变换后,可以输出一个小块观察一下,高频在右下,低频在左上,直接按行按列扫描展开,效果不太好,故还需要zigzag扫描(这一部分实现代码在另外一篇文章)
这里其实也可以进行滤波,滤出高频信息,留下低频信息(查找一些资料可以知道能量主要集中在低频,高频反映边缘和细节,这里我没有做,直接展开了,你也可以补充进行,我选择直接zigzag扫描展开,尽量保留原始的信息,因为没有做过图像处理,害怕漏掉一些特征,捂脸)
6)对每个小块 YBR 空间交替扫描展成一维;
特征提取和语义类建模
对一个语义类图片集 D 里一张图片 I 进行分块,可得到 L 个小块(每个图片可以分割成 L 个小块),共有 M 个数据集(即 D 中共含 M 张图片):
1)每个小块相当于一个样本,每个样本集有 L 个数据,基于这些数据,建立含 6 个分量的高斯混合模型,得到模型参数分别为:每个分量的概率,相应的均值和均方差
2)对同一个语义类的每幅图片都通过高斯混合模型进行建模,提取特征,每幅图片都用 6 个分量的高斯混合模型,共有 M 张图片。把一张图片的高斯混合模型参数(即每个分量的概率,相应的均值和均方差)作为一个样本,一个语义类就有 6*M 个样本数据作为数据集。用含 10 个分量的高斯混合模型拟合这一类图片的参数特征,得到该语义类的整体描绘;
ps:可用拓展EM算法获得更多分量
标注
在获得了不同语义类的模型特征后,对于一个测试图片,分别在不同的语义类下计算似然,最大的几个作为标注。
三、代码部分
这里只稍作说明,详细。希望还是先自己尝试一下,作业每年都一模一样,参数不同而已,可以在学期开始有空做完,后面可以节约不少时间。
数据预处理部分可用opencv实现,GMM可以用sklearn现有的模块实现,里面GMM初始化参数的方法,包含了k-means。我觉得我前面已经写的很详细了,照着那个步骤,剩下的就是查代码,找模块带的事。唯一一个没有模块的zigzag,我公开了,我有看过一个学长的实现,k-means、GMM、EM全程手撕,很厉害,但是也容易出错,我运行时没有bug,但是跑不动,特别费时间,细看其实也有很多问题的,最后弃疗自己写了。还是建议用模块,如果你很强,也可以试试,但是其实也没必要,我记得老师说这个作业重在过程。
k-means、GMM、EM 算法详解我觉得比较基础,网上有很多,不必写了,写这篇是因为自己在完成作业时发现可以参考的很少,希望对后来者有帮助。祝学业顺利