稀疏表示及MP算法
天天在实验室划,回宿舍了就好好总结一下写篇博客吧
-----------------------------分割线--------------------------------
上一次介绍了用均值漂移(meanshift)算法来实现目标跟踪,有许多的局限性。同样是生成式的目标跟踪算法,稀疏表示(sparse coding)更加受到研究者的重视。
稀疏表示即将二维的图像用一个系数矩阵和稀疏字典来近似表示,打个比方:如果图象a是M×N的矩阵,我们只需一个M×K的系数矩阵b和一个K×N稀疏字典c,使得a近似于b×c。
那么参数不是更多使得信号更复杂了吗?
答案是NO,因为系数矩阵b的大部分参数都是为0的,而稀疏字典c是已知的,所以图像a就被压缩成了极少的数字。
这是借鉴了人类的大脑记忆方式(我猜的):我们在记住一个物体时,不可能记住该物体的全部图像信息,而只是记住了一个模糊的“印象”,使得我们下次见到它时能够识别出来。
回到我们的问题,我们需要找到一个稀疏字典,并让稀疏字典内尽可能少的向量来表示我们的原始图像。若我们一个一个去试的话,无疑会耗费大量的算力,所以这是一个np难的问题。所以我们只能找出一个尽可能优的解。
有如下方法解决:
1.贪婪算法
2.松弛算法
在这里只给出贪婪算法中的MP算法(因为暂时只学到这里hiahia)。
MP算法步骤:
- step1 初始化系数矩阵为0,找到稀疏字典C(关于稀疏字典的学习以后再说,这里用随机正交矩阵代替)令要表示的图像的一个向量为误差f 。
- step2 在稀疏字典中找出与f最为相近的向量m
- step3 求出f在m向量上的投影与m的比值alpha,使得f=alpha*m+k,其中k为新的误差
- step4 判断该误差是否小于误差阈值,若小于,则退出程序;否则,令f=k,回到step2
这样,经过多次迭代,最终得到初始向量:
f0=alpha1m1 + alpha2m2 + alpha3*m3 + c(c为可容忍的误差)
python实现如下:
import math
import numpy as np
import cv2
img = cv2.imread("./img/image.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#生成稀疏基DCT矩阵
mat_dct_1d=np.zeros((60, 60))
v=range(60)
for k in range(0, 60):
dct_1d=np