前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于OpenCV for Python入门-DNN模块实现人脸检测

关于OpenCV for Python入门-DNN模块实现人脸检测

作者头像
python与大数据分析
发布2022-04-02 14:48:37
1K0
发布2022-04-02 14:48:37
举报

OpenCV在OpenCV增加了DNN模块,DNN模块可以加载预先训练好的Caffe/tensorflow等模型数据,基本支持所有主流的深度学习框架训练生成与导出模型数据加载。

下面用到的SSD人脸检测器的骨干网络是REsNet-10,当前它提供了两个训练好的模型:基于深度学习框架caffe训练的模型(原始Caffe实现的16位浮点型版本)和基于TensorFlow训练的模型(TensorFlow实现的8位量化版本)。

这两个模型基本是一致的,测试结果也是如此,据传识别率不错,但笔者在测试过以后,发现并非如想象的那么乐观,当然降低阈值可以提升识别率。

关于caffe训练的模型和基于TensorFlow训练的模型,在git上是无法打开了,笔者也是费了不少周章才获取到了,为了增加大家的一点热情和好奇心,还是自行百度下载吧。

详看具体代码吧

代码语言:javascript
复制
from cv2 import dnn
import numpy as np
import cv2

# 设定图片路径
imgname = r'C:\Python\Pycharm\docxprocess\picture\other\renwu\juhui1.jpg'
imgname = r'C:\Python\Pycharm\docxprocess\picture\other\renwu\juhui2.png'
imgname = r'C:\Python\Pycharm\docxprocess\picture\other\renwu\juhui3.jpg'
imgname = r'C:\Python\Pycharm\docxprocess\picture\other\renwu\juhui4.png'
# imgname = r'C:\Python\Pycharm\docxprocess\picture\other\renwu\wukelan.jpeg'
#
# Caffe模型
prototxt_path = r"C:\Python\Pycharm\docxprocess\face_detector\deploy.prototxt"
model_path = r"C:\Python\Pycharm\docxprocess\face_detector\res10_300x300_ssd_iter_140000.caffemodel"
model = dnn.readNetFromCaffe(prototxt_path, model_path)
# tensorflow模型
# prototxt_path = r"C:\Python\Pycharm\docxprocess\face_detector\opencv_face_detector.pbtxt"
# model_path = r"C:\Python\Pycharm\docxprocess\face_detector\opencv_face_detector_uint8.pb"
# model=cv2.dnn.readNetFromTensorflow(model_path,prototxt_path)
# 读取图片
image = cv2.imread(imgname)

# 获取图像高度和宽度
h, w = image.shape[:2]

# 设置置信度阈值
confThreshold = 0.2
# 函数cv2.dnn.blobFromImage(image[, scalefactor[, size[, mean[, swapRB[, crop[, ddepth]]]]]])
# 对图像进行预处理,包括减均值,比例缩放,裁剪,交换通道等,返回一个4通道的blob(blob可以简单理解为一个N维的数组,用于神经网络的输入)
# 参数:
# image:输入图像(1、3或者4通道)
#     可选参数
# scalefactor:图像各通道数值的缩放比例
# size:输出图像的空间尺寸,如size=(200,300)表示高h=300,宽w=200
# mean:用于各通道减去的值,以降低光照的影响(e.g. image为bgr3通道的图像,mean=[104.0, 177.0, 123.0],表示b通道的值-104,g-177,r-123)
# swapRB:交换RB通道,默认为False.(cv2.imread读取的是彩图是bgr通道)
# crop:图像裁剪,默认为False.当值为True时,先按比例缩放,然后从中心裁剪成size尺寸
# depth:输出的图像深度,可选CV_32F 或者 CV_8U.
# 对图像进行预处理
blob = cv2.dnn.blobFromImage(image, 1.0, (300, 300), (104.0, 177.0, 123.0))
# 设置模型的入参
model.setInput(blob)
# 从数组的形状中删除单维度条目
output = np.squeeze(model.forward())

font_scale = 1.0
for i in range(0, output.shape[0]):
    confidence = output[i, 2]
    if confidence > confThreshold:
        box = output[i, 3:7] * np.array([w, h, w, h])
        start_x, start_y, end_x, end_y = box.astype(np.int)
        cv2.rectangle(image, (start_x, start_y), (end_x, end_y), color=(255, 0, 0), thickness=2)
        cv2.putText(image, f"{confidence*100:.2f}%", (start_x, start_y - 5), cv2.FONT_HERSHEY_SIMPLEX, font_scale,
                    (255, 0, 0), 2)
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.imwrite("beauty_detected.jpg", image)

1924年林徽因等与访问中国的泰戈尔合影,共7个人

乌克兰大兵妹纸

1927年在比利时布鲁塞尔召开的第五次索尔维会议,共29个人,但是是彩色照片,一个也未识别出来。

感觉上在对不清晰的图片,或者人物较小的图片上检测效果要差很多。

凡事不能人云亦云,绝知此事要躬行就是这个道理。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python与大数据分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
人脸识别
腾讯云神图·人脸识别(Face Recognition)基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、比对、搜索、验证、五官定位、活体检测等多种功能,为开发者和企业提供高性能高可用的人脸识别服务。 可应用于在线娱乐、在线身份认证等多种应用场景,充分满足各行业客户的人脸属性识别及用户身份确认等需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档