一步步实现人脸识别<1>

一步步实现人脸识别<1> Marc 2023-11-13 11:11:28 603

这篇(以及这个系列文章)都整理自恩培老师的课程.
首先, 人脸识别算是跟OCR一样的一个普遍的话题, 解决思路也有点类似, 首先, 找到画面中的人脸的区域.
第一步, 找到一个数据集, 这个数据集是爬虫从上网爬到的公众人物的图片, 用人名作为目录组织好了, 相当于做好了标签.

当然这个目录名可能是中文的.

然后使用opencv的dnn的模型res10_300x300_ssd_iter_140000, 对所有的图片做一个处理, 取出图片中,包含人脸的部分:

# 实例化dnn模型
face_detector = cv2.dnn.readNetFromCaffe('./weights/deploy.prototxt.txt','./weights/res10_300x300_ssd_iter_140000.caffemodel')

定义一个裁剪图片的函数:

def getCropedFace(img_file, conf_thresh=0.5 ):
    """
    将图片进行人脸裁剪
    @param:
        img_file: str 文件名
        conf_thresh: float 置信度预支
        w_thresh,h_thresh: 人脸长度宽度阈值,小于它则丢弃
    @return
        croped_face: numpy img 裁剪后的人脸,如果没有符合条件的,则返回None
    """
    # 读取图片
    # img = cv2.imread(img_file)
    # 解决中文路径问题
    img=cv2.imdecode(np.fromfile(img_file,dtype=np.uint8),-1)
    if img is None:
        return None
    # 画面原来高度和宽度
    img_height,img_width = img.shape[:2]
    # 缩放图片
    img_resize = cv2.resize(img,(300,300))
    # 图像转为blob
    img_blob = cv2.dnn.blobFromImage(img_resize,1.0,(300,300),(104.0, 177.0, 123.0))
    # 输入
    face_detector.setInput(img_blob)
    # 推理
    detections = face_detector.forward()
    # 查看检测人脸数量
    num_of_detections = detections.shape[2]
    # 遍历人脸
    for index in range(num_of_detections):
        # 置信度
        detection_confidence = detections[0,0,index,2]
        # 挑选置信度,找到一个人返回
        if detection_confidence > conf_thresh:
            # 位置
            locations = detections[0,0,index,3:7] * np.array([img_width,img_height,img_width,img_height])
            # 矩形坐标
            l,t,r,b  = locations.astype('int')
            # 长度宽度判断
            w = r - l
            h = b - t
            # print(w,h)
            croped_face = img[t:b,l:r]
            return croped_face

    # 都不满足
    return None

然后把数据集中的所有图片, 挨个的进行裁剪

import glob,tqdm,os
# 获取人名列表
person_list = glob.glob('C:\\Users\\zunly\\OneDrive\\media_sample\\chinese_faces\\*')

# 遍历人名
for person in tqdm.tqdm( person_list ,desc='处理中...'):
    # 获取人名(这里需要根据自己系统来改一下,Windows用\\,Unix系系统用/))
    person_class = person.split('\\')[-1]
    # 创建需要保存的目录
    save_dir = 'C:\\Users\\zunly\\OneDrive\\media_sample\\chinese_faces\\chinese_faces_cleaned\\' + person_class
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)
    # 获取该人名下的所有图片
    file_name = person+'\\*.jpg'
    img_list = glob.glob(file_name)

    # 遍历图片
    for img_file in img_list:
        # 处理图片
        croped_face = getCropedFace(img_file)
        if croped_face is not None:
            # 获取文件名(这里需要根据自己系统来改一下,Windows用\\,Unix系系统用/))
            file_name = img_file.split('\\')[-1]
            save_file_name = save_dir+'\\'+file_name
            # 保存,同样要解决中文路径
            # cv2.imwrite(save_file_name,croped_face)
            cv2.imencode('.jpg', croped_face)[1].tofile(save_file_name)

最终得到一个文件夹中的数据, 都是已经裁剪好的人脸, 并同样在人名的目录下:

可以看到, 人脸的部分都被裁剪出来, 成了一个新的文件, 放在这个标签所在的目录.

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
Marc
红包 4 1 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
Marc
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区