网上的文章千篇一律
有用的代码万里挑一
毕设做人脸识别,eigenface作为人脸识别基础的算法,一定不能落下。但是我仔细找了许多文章,发现他们都是出自同一篇文章,用的字母没有标识没有注解,语言也是前后不搭,所以很难根据文章复现代码。各种找有用的文章,一周才完成这个eigenface的算法,这里不谈论深入的东西,只看实现的过程。
- 数据库的选取与读入。
我选取的是Yaleface数据库,看文件的样子比较老了
我们看到文件的类型也未知,看了许多文章,他们都将这些图片认为是 . p g m .pgm .pgm的格式,我打不开这些文件,索性就把它们转换一下格式,变成 . p n g .png .png格式的,这样比较好处理。
介绍一下图库,这个图库是用15个人的不同表情光照的照片组成,每个人有11张图片,共165张图。每个人的第一张图片是正常图片。我们要对这11个人的正常脸做训练,然后取出165张图片中的任意一张进行判断是否是图库中的脸(我的判断结果很不理想,判断结果误差非常大,我的推断是图库中人脸位置不同,所以训练出的数据也有问题)
def readings(img_src):
init_images = []
list_of_dir = os.listdir(img_src)
count = 0
for i in list_of_dir:
if "png" in i and count % 11 == 0:
absolute_path = os.path.join(img_src, i)
img = cv2.imread(absolute_path, 2)
init_images.append(img)
count += 1
return init_images
- 数据拉平
注意:Yalefaces中的图像都是 243 ∗ 320 243*320 243∗320像素的
所谓数据拉平,就是把二维矩阵变成一维数组的过程,这个数组不是真正的数组,而是一个类似于数组的一维矩阵。
比如:
[ 1 2 3 4 5 6 7 8 9 ] \begin{bmatrix}1&2&3\\4&5&6\\7&8&9\end{bmatrix} ⎣⎡147258369⎦⎤
这样的矩阵,将它拉平,可以有两种方式,一种是横着,一种是竖着:
[ 1 2 3 4 5 6 7 8 9 ] \begin{bmatrix}1&2&3&4&5&6&7&8&9\end{bmatrix} [12345<