概述
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个人
乌克兰大兵妹纸
1927年在比利时布鲁塞尔召开的第五次索尔维会议,共29个人,但是是彩色照片,一个也未识别出来。
感觉上在对不清晰的图片,或者人物较小的图片上检测效果要差很多。
凡事不能人云亦云,绝知此事要躬行就是这个道理。
最后,谢谢关注,谢谢支持!
最后
以上就是鲤鱼鸡为你收集整理的关于OpenCV for Python入门-DNN模块实现人脸检测的全部内容,希望文章能够帮你解决关于OpenCV for Python入门-DNN模块实现人脸检测所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复