@cww97
2017-12-28T18:25:31.000000Z
字数 1956
阅读 857
机器学习
陈伟文 10152510217
一张图片 转换成一个列向量,各个像素点就是列向量中的元素,然后 这些训练的图片集就是A(训练数据集)。b就是testing,一张图片,我们要迭代x,使得让最后b作为测试的图片带入这个方程
人脸的稀疏表示是基于光照模型。即一张人脸图像,可以用数据库中同一个人所有的人脸图像的线性组合表示。而对于数据库中其它人的脸,其线性组合的系数理论上为零。由于数据库中一般有很多个不同的人脸的多张图像,如果把数据库中所有的图像的线性组合来表示这张给定的测试人脸,其系数向量是稀疏的。因为除了这张和同一个人的人脸的图像组合系数不为零外,其它的系数都为零。
Src算法
在这里,我们将每一张图片转换为一个列向量,行数为像素点的个数。一组照片为一系列列向量的集合。然后把 30 组的照片的测试集合都集合在一个矩阵中,用于迭代系数x(每组照片五张用于训练,一张用于测试)。另外,将用于预测的图片 testImg 转换为单独的列向量
N, M = 112, 92
EPS = 0.025
def Normalize(A):
m = A.shape[1] # col
B = np.empty(shape=[N*M, 0])
for i in range(m):
b = A[:, i] / np.linalg.norm(A[:, i], ord=2)
b = np.reshape(b, (N*M, 1))
B = np.concatenate((B, b), axis=1)
return B
def load_data():
testImg = np.array(Image.open('data/feret/1-1.bmp'))
testImg = np.reshape(testImg, (N*M, 1))
testImg = testImg / np.linalg.norm(testImg, ord=2)
#print(testImg)
A = np.empty(shape=[N*M, 0])
for i in np.arange(1, 31):
for j in np.arange(1, 6):
img = np.array(Image.open('data/feret/' + str(i) + '-' + str(j) + '.bmp'))
img = np.reshape(img, (N*M, 1))
A = np.concatenate((A, img), axis=1)
A = Normalize(A)
print(A, 'shape = ', A.shape)
return A, testImg
近端梯度下降法实现,数值计算很重要啊
def proximal_gradient(A, testImg):
L = np.linalg.norm(2*np.dot(A, A.T))**2
lamada = 5
x1 = np.ones((A.shape[1], 1))
cnt = 0
while True:
cnt += 1
x0 = x1
gradient = 2*np.dot(np.dot(A.T, A), x0) - 2*np.dot(A.T, testImg)
z = x0 - gradient / L
e0 = np.linalg.norm(np.dot(A, x0) - testImg, ord=2)**2 + lamada*np.linalg.norm(x0, ord=1)
for i in np.arange(0, x0.shape[0]):
if z[i, 0] > lamada/L:
x1[i, 0] = z[i, 0] - lamada/L
elif z[i, 0] < -lamada/L:
x1[i, 0] = z[i, 0] + lamada/L
else:
x1[i, 0] = 0
e1 = np.linalg.norm(np.dot(A, x1) - testImg, ord=2)**2 + lamada*np.linalg.norm(x1, ord=1)
print('cnt = ', cnt, ', :', e0-e1)
if e0-e1 < EPS: break
return x1
def get_group_data(x, i):
new_x = np.zeros((x.shape[1], 1))
for j in np.arange(5*i,i*i+5):
new_x[j, 0] = x[j, 0]
return new_x
def test(A, x, y):
Min = float(np.inf)
idx = -1
for i in range(29):
dis = np.ninalg.norm(y - np.dot(A, get_group_data(x, i)))
if dis < Min:
Min, idx = dis, i
return idx
正确率100%,大概是所有给的数据都是很正的,即人脸都充满整张图,大概如果数据没这么舒服可能就会难很多,明年有个项目想做人脸识别模块,数据预处理果然永远比机器学习算法更重要,灰度化,从照片中抠出一张人脸,再压缩成规定像素,哇哦,这门课叫数字图像处理