基于摄像头的签到系统(考试)(二)----tkinter

12 篇文章 2 订阅
7 篇文章 0 订阅


前言

face_features_csv:通过对采集的人脸图像提取128D特征,保存到csv文件里面,并汇总到一个csv文件里。
128D特征提取,人脸检测,对csv文件操作,对文件操作


一、描述

示例:把人脸数据化,使用到了残差网,获取128D特征,上一节中提到的功能是每人保存10张人脸图像,把每人的人脸图像都提取128D特征,求平均值,保存到csv文件里,最后把所有的人脸平均128D特征保存到一个csv文件里,便于下一步的操作。

二、代码

1.引入库

代码如下:

import cv2
import os
import dlib
from skimage import io
import csv
import numpy as np
import pandas as pd

2.代码

代码如下:

# -*- codeing = utf-8 -*-
# @Time :2021/5/14 14:50
# @Author : 刘念卿
# @File : face_features_csv.py
# @Software : PyCharm
import cv2
import os
import dlib
from skimage import io
import csv
import numpy as np
import pandas as pd

#存储的脸部照片路径
path_faces_rd = "../data/faces_from_camera/"
#存储脸部特征路径
path_csv = "../data/csvs_from_camera/"
# 预测脸部
detector = dlib.get_frontal_face_detector()
# 预测脸部5点面部标志检测器将面部分为5个点,左眼2点、右眼2点、鼻子1点;这个模型更快,对于本项目来说
predictor = dlib.shape_predictor("../resource/shape_predictor_5_face_landmarks.dat")
# 深度残差网络,实现人脸识别
facerec = dlib.face_recognition_model_v1("../resource/dlib_face_recognition_resnet_model_v1.dat")
# 返回单张图像的128D特征
def return_128d_features(path_img):
    img = io.imread(path_img)
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    dets = detector(img_gray, 1)
    print("检测的人脸图像:", path_img)
    # 因为有可能截下来的人脸再去检测,检测不出来人脸了
    # 所以要确保是 检测到人脸的人脸图像 拿去算特征
    if len(dets) != 0:
        shape = predictor(img_gray, dets[0])
        face_descriptor = facerec.compute_face_descriptor(img_gray, shape)#计算128D特征点,速度较慢,可使用gup加速,对于本项目来说十分重要
    else:
        face_descriptor = 0
        print("no face")
    # print(face_descriptor)
    return face_descriptor
# 将文件夹中照片特征提取出来,写入csv
# 输入input:
#   path_faces_personX:     图像文件夹的路径
#   path_csv:               要生成的csv路径
def write_into_csv(path_faces_personX, Path_csv):
    print(path_faces_personX)
    dir_pics = os.listdir(path_faces_personX)
    print('len',len(dir_pics))
    with open(Path_csv, "w", newline="") as Csvfile:
        Writer = csv.writer(Csvfile)
        for I in range(len(dir_pics)):
            print('I',I)
            # 调用return_128d_features()得到128d特征
            print("正在读的人脸图像:", path_faces_personX + "/" + dir_pics[I])
            features_128d = return_128d_features(path_faces_personX + "/" + dir_pics[I])
            #  print(features_128d)
            # 遇到没有检测出人脸的图片跳过
            if features_128d == 0:
                print(dir_pics[I]+'读取失败')
                I += 1
            else:
                Writer.writerow(features_128d)
# 读取 某人 所有的人脸图像的数据,写入 person_X.csv
faces = os.listdir(path_faces_rd)
for person in faces:
    print(path_csv + person + ".csv")
    write_into_csv(path_faces_rd + person, path_csv + person + ".csv")

# 从csv中读取数据,计算128d特征的均值
def compute_the_mean(Path_csv_rd):
    column_names = []
    # 128列特征
    for I in range(128):
        column_names.append("features_" + str(I + 1))
    # 利用pandas读取csv
    rd = pd.read_csv(Path_csv_rd, names=column_names)
    # 存放128维特征的均值
    Feature_mean = []
    for I in range(128):
        tmp_arr = rd["features_" + str(I + 1)]
        tmp_arr = np.array(tmp_arr)
        # 计算某一个特征的均值
        tmp_mean = np.mean(tmp_arr)
        Feature_mean.append(tmp_mean)
    return Feature_mean

# 存放所有特征均值的 CSV 的路径
path_csv_feature_all = "../data/features_all.csv"
if  os.path.exists(path_csv_feature_all):
    # 存放人脸特征的csv的路径
    path_csv_rd = "../data/csvs_from_camera/"
    #把所有的特征值写入一个总的.csv中
    with open(path_csv_feature_all, "w", newline="") as csvfile:
        writer = csv.writer(csvfile)
        csv_rd = os.listdir(path_csv_rd)
        print("特征均值: ")
        for i in range(len(csv_rd)):
            feature_mean = compute_the_mean(path_csv_rd + csv_rd[i])
            print(path_csv_rd + csv_rd[i])
            writer.writerow(feature_mean)
else:
    file=open(path_csv_feature_all, "w", newline="")
    file.close()

此代码仅为此模块代码,如需全部代码,请用于学习!留下你的邮箱或者点击此处下载


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

trust Tomorrow

感谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值