人工智能大作业——人脸识别系统(最终)

写在前面
  时间过得飞快,时间已经距离我发第一篇文章过去2年多了,也不再从事代码工作,偶然间上到csdn翻看文章经过,看到还是有些人关注人脸识别系统的后续的,我猜大概率是学弟学妹们正在被期末实验折磨中,翻了翻原先的代码还能找到就一并更完了吧,如果抄了我的作业记得来学长的评论区表示一下感谢哦(代码完全照抄必被老师发现,别那么傻)。
  一、作业要求
  基本任务:开发一个人脸识别系统,要求以ORL人脸数据库为实验数据,构造出一个完整的人脸识别系统,要求有界面,可选择输入单张图像并显示该图像,然后实现该图像的识别,并输出对应的识别结果图像。要求数据库中每个人的5张照片作为训练集,另外5张照片作为测试集,并统计其识别正确率。(实验采用的程序语言不限、人脸识别算法不限)
扩展任务:1、实现一个完整的人脸识别系统,照片自己采集,要求30人以上,实现摄像头与照片两种模式作为输入的人脸检测与识别,正确率要求95%以上。2、实现一个完整的多人人脸识别系统,照片自己采集,要求30人以上,实现摄像头与照片两种模式作为输入的多人脸检测与识别,正确率要求95%以上。
  二、算法原理
  基本思路是利用knn算法实现人脸识别,orl数据集的人脸识别系统与自定义数据集的多人人脸识别系统的系统大致逻辑为:模型训练,加载模型查找最邻近解,显示匹配到的信息。
  模型训练过程为利用face_recognition模块识别出人脸位置,加上人脸信息标签后利用sklearn模块进行训练,得到相应的.clf分类器并保存,识别过程为利用保存的分类器进行相邻判断并找到最相邻的解的图像。
  在机器的学习以及图像处理显示方面,调用sklearn、PIL、face_recognition等模块。在界面的展示以及用户的交互上,调用了tkinter模块。
  三、人脸识别系统流程图与步骤说明
  (一)orl数据集的人脸识别系统 流程图:在这里插入图片描述
步骤说明:
(1)选择训练集路径
在使用该系统前,需要先对人脸图像进行训练,所以首先得先指定训练集的路径位置。注意:训练集路径不能为空,且目录结构应大致为./train/s1/img1 img2 … ./train/s2 ./train/s3/img1 im2 …
(2)训练模型
进行模型训练,提示用户会造成系统卡顿,请耐心等待。
注意:①卡顿属于正常现象,是因为在模型训练过程中需要对大量图片进行处理,需要耐心等待。训练后会生成“trained_knn_model_orl.clf”文件,表示训练后形成的Knn分类器。默认保存路径是与该python文件同级目录下的位置。②训练过后系统会自动读取对应目录下的knn分类器,故下次使用时可不必再次训练。
(3)显示识别准确率
在模型训练完成后会自动对orl数据集中200张人像进行识别匹配进而计算正确率并显示。
(4)选择数据集中的待匹配图像
选择数据集中待匹配的图像进行检测,若格式不正确,系统会给予相应的提示。
(5)输出匹配的图像
从对应的训练集中查找到对应人像的照片进行显示。
(二)自定义数据集的多人人脸识别系统 流程图:
在这里插入图片描述
步骤说明:
(1)选择训练集路径
在使用该系统前,需要先对人脸图像进行训练,所以首先要先指定训练集的路径位置。注意:目录结构应大致为./train/s1/img1 img2 … ./train/s2 ./train/s3/img1 im2 …(这一步流程与上一个系统要求一致,如:目录结构要合理,训练集目录下有n个文件夹表示n个人的训练数据,文件夹名表示人物的名字,目录内的图片文件只能是这个人的单人的照片,否则不会训练成功)
(2)训练模型
进行模型训练,提示用户会造成系统卡顿,请耐心等待。训练后会在于文件同级目录上保存trained_knn_model_manyface_video.clf文件,这样下次使用时系统就会自动利用上面这个分类器进行图像识别。
(3)本地识别多人像照片
按下按钮后,会打开文件管理器,让用户选择一张照片进行识别。系统会利用trained_knn_model_manyface_video.clf这个分类器找出图像中所有人物的头像并利用knn算法匹配与它最相近的人物。之后系统会打开用户选中的图片并在图片上对人物图像加框和显示匹配到人物的名字。
(4)从摄像头识别多人像照片
按下按钮后,会打开摄像头采集用户当前的场景,对场景中的人物进行最近相邻匹配人物,并加框显示识别结果。

四、部分核心代码

训练模型的算法:
#模型训练,得到分类器,即同级目录下的.clf文件
def train_model(train_dir):
    #指定KNN算法训练后分类器的文件名
    model_save_path = "trained_knn_model_orl.clf"
    X = []
    y = []
    #flag变量用于判断训练集的有效性
    flag=False
    # 对训练集中每个人的目录进行遍历,如C:/Users/Haifeng/OneDrive/桌面/face_identity_orl/knn_examples_orl2/train\s1..s2..s3....
    for class_dir in os.listdir(train_dir):
        #判断当前路径是目录,若s1 s2 s3 不是目录是文件则抛弃
        if not os.path.isdir(os.path.join(train_dir, class_dir)):
            continue
        #对图像进行格式转换,转成jpg格式的图像,便于训练
        bmpTojpg(os.path.join(train_dir, class_dir))
        # 对每个人的图像进行遍历
        for img_path in image_files_in_folder(os.path.join(train_dir, class_dir)):
            # 将图片导入到numpy数组中
            image = face_recognition.load_image_file(img_path)
            # 查找图片中人脸(上下左右)的位置,图像中可能有多个人脸  face_locations的值类似[(135,536,198,474),()]
            face_bounding_boxes = face_recognition.face_locations(image)
            #若训练集中的图像只存在一张人脸,说明这是张合格的训练集,则加入集合进一步处理
            if len(face_bounding_boxes) == 1:
                #只要有一张脸被训练到,即为训练成功
                flag=True
                # 将现在图像的脸部编码加载到训练集中
                X.append(face_recognition.face_encodings(image, known_face_locations=face_bounding_boxes)[0])
                y.append(class_dir)
            # X加的是这个图像和人脸的位置Y加的是图像外面的文件夹名字
    # 创建并训练KNN分类器
    knn_clf = neighbors.KNeighborsClassifier(n_neighbors=2, algorithm='ball_tree', weights='distance')
    knn_clf.fit(X, y)
    # 以保存路径的格式要求保存分类器
    if model_save_path is not None:
        with open(model_save_path, 'wb') as f:
            pickle.dump(knn_clf, f)

#人脸预测匹配,根据传入的图像路径,进行人脸的匹配,返回匹配到人物的名字,以及原图像中相应的人脸坐标,以及是否存在匹配的人脸
def predict(X_img_path):
    #读入knn_clf模型
    if knn_clf is None:
        with open(model_path, 'rb') as f:
            knn_clf = pickle.load(f)
    # 加载图像和找到脸的位置
    X_img = face_recognition.load_im
  • 18
    点赞
  • 200
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值