dlib.cnn_face_detection_model_v1实现人脸检测

在用JupyterLab使用cnn_face_detection_model_v1时遇到了一些问题在此全部解决了,具体可使用以下代码:

import os
import cv2
import sys
import dlib
import matplotlib.pyplot as plt

prefix = '.'
detector_path = os.path.join(prefix, 'Data/net-data/mmod_human_face_detector.dat')
detector = dlib.cnn_face_detection_model_v1(detector_path)
img = cv2.imread('QF.jpg')

首先是引入一堆包,读取加载路径之类的基本操作,mmod_human_face_detector.dat文件需要下载,如果需要的话可以来找我。

rgb_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)    
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 这里转换为灰度图是为了加速计算

这里转换为RGB空间才能显示原始图像,可以通过

'''这部分代码不是主要部分,可以不加'''
plt.subplot(1, 2, 1)
plt.imshow(img)
plt.subplot(1, 2, 2)
plt.imshow(rgb_img)
plt.show()

来看看如果不加这行的结果,为了省去各位的麻烦在这里展示一下,不过还是自己跑一下比较好

左边是原始的img读取进来的,右边是转换为rgb通道以后的样子,也就是我们正常看到的图片,原因可以参考这篇blog 【AI-1000问】为什么OpenCV读取的图像格式是BGR?_opencv图像为什么是bgr格式-CSDN博客

 

OpenCV在1999年由Intel建立,当时主流的摄像头制造商和软件供应商提供的摄像头采集的图像的通道排列顺序为BGR,另外对于图片,位图BMP是最简单的,也是Windows显示图片的基本格式,其文件扩展名为*.BMP。在Windows下,任何格式的图片文件(包括视频播放)都要转化为位图才能显示出来,各种格式的图片文件也都是在位图格式的基础上采用不同的压缩算法生成的,值得注意的是位图BMP的格式就是BGR。正是基于BGR在当时被广泛使用,于是早期OpenCV开发者就选择BGR颜色格式,这也就成为了一种规范一直用到现在。

接下来就是主要用于检测人脸的操作,可以通过计算time来测试一下运算时间 

start = cv2.getTickCount()
faces = detector(img_gray, 1)  # 检测输入的img,参数1表示1次上采样
time = (cv2.getTickCount() - start) / cv2.getTickFrequency() * 1000    #测试一下速度

print("Number of faces detected: {}".format(len(faces)))   
print ('dlib cnn average time: %.3f ms'%time)

接下来就是我遇到的两个主要问题:

dlib.rectangle类读取数值

detector函数运行出来的结果是mmod_rectangles的一个结果,导致找了很多方法没有办法取出来其中的结果,比如我运行出来的faces结果是mmod_rectangles[[(199, 166) (403, 370)]],直接输出其中的face的结果是个<_dlib_pybind11.mmod_rectangle object at 0x7fd124049b70>,也就是说face是个mmod_rectangle object也就是dlib.rectangle的类型的函数定义可以参看dlib的官方文档Classes — dlib documentation

那我如何从中取出其中的参数结果呢,就需要采用其中的函数来实现(文档链接里有全面的,此处我只截取使用的部分):

利用这四个函数来获取其中的值即可

cv2在JupyterLab显示图片内核崩溃

 第二个问题是,在其他代码中经常使用cv2库直接生成结果图,但是不知道为什么我的JupyterLab一用cv2显示图片绘图就开始内核崩溃,所以我用plt重新编写了一下这部分代码

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
for i, face in enumerate(faces):  # 可能有多于1张脸
    dlib_rect = face.rect
    l = dlib_rect.left()
    t = dlib_rect.top()
    r = dlib_rect.right()
    b = dlib_rect.bottom()
    rect = plt.Rectangle((l, t), abs(r-l), abs(t-b), fill=False, edgecolor = 'red',linewidth=2)
    ax.add_patch(rect)
plt.imshow(rgb_img) # 图像数组
plt.show()

运行结果如图所示:

在此借用一下青峰的图嘿嘿(*^▽^*)

哦对如果要换其他的图片可以直接修改img对应的路径参数 

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值