关于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:\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个人

28a157ec799725245d52cececd6c3cb2.png

乌克兰大兵妹纸

9dfe7e60554927e0461aeff0dc139df4.png

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

e3171536f3d3e3860501235e5841b38f.png

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

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

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

f049db12eb55bd239f125161c3302c6e.png

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

python与大数据分析

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值