我是靠谱客的博主 鲤鱼鸡,最近开发中收集的这篇文章主要介绍关于OpenCV for Python入门-DNN模块实现人脸检测,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

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

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

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

详看具体代码吧

from cv2 import dnn
import numpy as np
import cv2

# 设定图片路径
imgname = r'C:PythonPycharmdocxprocesspictureotherrenwujuhui1.jpg'
imgname = r'C:PythonPycharmdocxprocesspictureotherrenwujuhui2.png'
imgname = r'C:PythonPycharmdocxprocesspictureotherrenwujuhui3.jpg'
imgname = r'C:PythonPycharmdocxprocesspictureotherrenwujuhui4.png'
# imgname = r'C:PythonPycharmdocxprocesspictureotherrenwuwukelan.jpeg'
#
# Caffe模型
prototxt_path = r"C:PythonPycharmdocxprocessface_detectordeploy.prototxt"
model_path = r"C:PythonPycharmdocxprocessface_detectorres10_300x300_ssd_iter_140000.caffemodel"
model = dnn.readNetFromCaffe(prototxt_path, model_path)
# tensorflow模型
# prototxt_path = r"C:PythonPycharmdocxprocessface_detectoropencv_face_detector.pbtxt"
# model_path = r"C:PythonPycharmdocxprocessface_detectoropencv_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个人

28a157ec799725245d52cececd6c3cb2.png

乌克兰大兵妹纸

9dfe7e60554927e0461aeff0dc139df4.png

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

e3171536f3d3e3860501235e5841b38f.png

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

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

最后,谢谢关注,谢谢支持!

f049db12eb55bd239f125161c3302c6e.png

最后

以上就是鲤鱼鸡为你收集整理的关于OpenCV for Python入门-DNN模块实现人脸检测的全部内容,希望文章能够帮你解决关于OpenCV for Python入门-DNN模块实现人脸检测所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部