OpenCV在OpenCV增加了DNN模块,DNN模块可以加载预先训练好的Caffe/tensorflow等模型数据,基本支持所有主流的深度学习框架训练生成与导出模型数据加载。
下面用到的SSD人脸检测器的骨干网络是REsNet-10,当前它提供了两个训练好的模型:基于深度学习框架caffe训练的模型(原始Caffe实现的16位浮点型版本)和基于TensorFlow训练的模型(TensorFlow实现的8位量化版本)。
这两个模型基本是一致的,测试结果也是如此,据传识别率不错,但笔者在测试过以后,发现并非如想象的那么乐观,当然降低阈值可以提升识别率。
关于caffe训练的模型和基于TensorFlow训练的模型,在git上是无法打开了,笔者也是费了不少周章才获取到了,为了增加大家的一点热情和好奇心,还是自行百度下载吧。
详看具体代码吧
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57from 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内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复