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

2022-04-02 14:48:37 浏览数 (1)

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: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个人

乌克兰大兵妹纸

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

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

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

0 人点赞