0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenCV的视频处理之人脸检测 2

jf_78858299 来源:小白玩转Python 作者:小白 2023-02-07 15:27 次阅读

我们尝试模块化并分离管道构建块,这种方法将为我们提供易于管理的代码,并使测试更容易编写:

import os
import cv2


from pipeline.libs.face_detector import FaceDetector
import tests.config as config




class TestFaceDetector:
    def test_face_detector(self):
        prototxt = os.path.join(config.MODELS_FACE_DETECTOR_DIR, "deploy.prototxt.txt")
        model = os.path.join(config.MODELS_FACE_DETECTOR_DIR, "res10_300x300_ssd_iter_140000.caffemodel")
        detector = FaceDetector(prototxt, model)


        test_image = cv2.imread(os.path.join(config.ASSETS_IMAGES_DIR, "friends", "friends_01.jpg"))
        faces = detector.detect([test_image])


        assert len(faces) == 1
        assert len(faces[0])  # Should recognize some faces from friends_01.jpg

使用管道架构,可以很容易地CascadeDetectFaces从上一篇文章换成更准确的深度学习人脸检测器模型。让我们FaceDetector在新的DetectFaces管道步骤中使用:

from pipeline.pipeline import Pipeline
from pipeline.libs.face_detector import FaceDetector


class DetectFaces(Pipeline):
    def __init__(self, prototxt, model, batch_size=1, confidence=0.5):
        self.detector = FaceDetector(prototxt, model, confidence=confidence)
        self.batch_size = batch_size


        super(DetectFaces, self).__init__()


    def generator(self):
        batch = []
        stop = False
        while self.has_next() and not stop:
            try:
                # Buffer the pipeline stream
                data = next(self.source)
                batch.append(data)
            except StopIteration:
                stop = True


            # Check if there is anything in batch.
            # Process it if the size match batch_size or there is the end of the input stream.
            if len(batch) and (len(batch) == self.batch_size or stop):
                # Prepare images batch
                images = [data["image"] for data in batch]
                # Detect faces on all images at once
                faces = self.detector.detect(images)


                # Extract the faces and attache them to the proper image
                for image_idx, image_faces in faces.items():
                    batch[image_idx]["faces"] = image_faces


                # Yield all the data from buffer
                for data in batch:
                    if self.filter(data):
                        yield self.map(data)


                batch = []

我们对图像流(第15–20行)进行缓冲,直到到达batch_size(第24行)为止,然后在所有缓冲的图像上(第28行)检测面部,收集面部坐标和置信度(第31–32行),然后重新生成图像(第35-37行)。

当我们使用GPU(图形处理单元)时,我们的武器库中同时运行着数千个处理内核,这些内核专门用于矩阵运算。批量执行推理总是更快,一次向深度学习模型展示的图像多于一张一张。

保存面孔和摘要

SaveFaces并SaveSummary产生输出结果。在SaveFaces类,使用map功能,遍历所有检测到的面部,从图像裁剪他们并保存到输出目录。

SaveSummary类的任务是收集有关已识别面部的所有元数据,并将它们保存为结构良好的JSON文件,该map函数用于缓冲元数据。接下来,我们使用额外的write功能扩展我们的类,我们将需要在管道的末尾触发以将JSON文件与摘要一起保存。脸部图像针对每一帧存储在单独的目录中。

视频输出

为了观察流水线的结果,很高兴可以显示带有带注释的面孔的视频。关于AnnotateImage(pipeline/annotate_image.py)/DisplayVideo(pipeline/display_video.py)的全部内容。

运行中的管道

在process_video_pipeline.py文件中我们可以看到,整个管道的定义如下:

pipeline = (capture_video |
            detect_faces |
            save_faces |
            annotate_image |
            display_video |
            save_video |
            save_summary)

上面有很多解释,但是视频和图像胜于雄辩。让我们来看一下触发命令的管道:

python process_video_pipeline.py -i assets/videos/faces.mp4 -p -d -ov faces.avi,M,];

-p将显示进度条,

-d显示带有批注面孔的视频结果,

-ov faces.avi并将视频结果保存到output文件夹。

正如我们在示例视频中看到的那样,并不是所有脸孔都能被识别。我们可以降低设置参数的深度学习模型的置信度confidence 0.2(默认值为0.5)。降低置信度阈值会增加假阳性的发生(在图像中没有脸的位置出现脸)。

DetectFaces类的批量处理大小:

$ python process_video_pipeline.py -i assets/videos/faces.mp4 -p
--batch-size 1
100%|███████████████████████████| 577/577 [00:11<00:00, 52.26it/s]
[INFO] Saving summary to output/summary.json...


$ python process_video_pipeline.py -i assets/videos/faces.mp4 -p
--batch-size 4
100%|███████████████████████████| 577/577 [00:09<00:00, 64.66it/s]
[INFO] Saving summary to output/summary.json...
$ python process_video_pipeline.py -i assets/videos/faces.mp4 -p
--batch-size 8
100%|███████████████████████████| 577/577 [00:10<00:00, 56.04it/s]
[INFO] Saving summary to output/summary.json...

在我们的硬件上(2.20GHz的Core i7–8750H CPU和NVIDIA RTX 2080 Ti),我门每秒获得52.26帧的图像--batch-size 1,但是对于--batch-size 4我们来说,速度却提高到了每秒64.66帧。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 摄像头
    +关注

    关注

    59

    文章

    4797

    浏览量

    95334
  • OpenCV
    +关注

    关注

    29

    文章

    626

    浏览量

    41227
  • JSON
    +关注

    关注

    0

    文章

    117

    浏览量

    6933
收藏 人收藏

    评论

    相关推荐

    基于OPENCV的相机捕捉视频进行人脸检测--米尔NXP i.MX93开发板

    本文将介绍基于米尔电子MYD-LMX93开发板(米尔基于NXPi.MX93开发板)的基于OpenCV人脸检测方案测试。OpenCV提供了一个非常简单的接口,用于相机捕捉一个
    的头像 发表于 11-07 09:03 768次阅读
    基于<b class='flag-5'>OPENCV</b>的相机捕捉<b class='flag-5'>视频</b>进行<b class='flag-5'>人脸</b><b class='flag-5'>检测</b>--米尔NXP i.MX93开发板

    如何用OpenCV的相机捕捉视频进行人脸检测--基于米尔NXP i.MX93开发板

    : breakvideo.release()cv2.destroyAllWindows() 保存后执行”python3 opencv_test.py OpenCV装好后,可以为后面的人脸
    发表于 11-15 17:58

    基于openCV人脸检测系统的设计

    通过对基于Adaboost人脸检测算法的研究,利用该算法与计算机视觉类库openCV进行人脸检测系统的设计,实现了对出现在
    发表于 12-23 14:19

    【TL6748 DSP申请】基于TMS320C6748 DSP人脸检测及跟踪

    申请理由:我们是公司的研发团队,正在研发人脸检测及跟踪。之前使用的是TI达芬奇系列DM6446芯片,将OpenCV移植到DM6446的DSP上发现处理效率太低。分析主要原因是dm644
    发表于 09-10 11:09

    【NanoPi2申请】基于ARM的智能家居视频监控系统

    获取图像或视频 图像处理灰度 二值 去噪增强 (边缘检测 腐蚀 膨胀)等 JPEG/H.264 压缩编码解码TCP/IP网络传输2.智能家居视频
    发表于 12-02 16:10

    【NanoPi2申请】基于opencv人脸识别门禁系统

    opencv API,研究图像处理算法。5、学习机器学习,利用模板匹配方法进行人脸识别。6、在linux上配置opencv,利用opencv
    发表于 12-18 14:34

    【NanoPi2申请】基于NanoPi2人脸识别及表情检测

    本帖最后由 ypw 于 2015-12-19 00:38 编辑 申请理由:目前正在学习OpenCV,以及人脸表情检测的研究,NanoPi2的性价比很高,同时集成了WiFi,是研发
    发表于 12-18 14:37

    【EASY EAI Nano开源套件试用体验】4AI功能测试之人脸检测

    ,rknn_context句柄path:输入参数,算法模型路径input_image:输入参数, Opencv Mat格式图像result:输出参数, 人脸检测的结果输出3 代码分析与修改官方例程使用的是双目摄像头
    发表于 09-27 22:39

    【飞凌RK3568开发板试用体验】使用OpenCV进行人脸识别

    RK3568四核Arm Cortex-A55 处理器的主板,从厂商的宣传看,其主要市场就是人脸识别等视频和图像应用。今天就使用OpenCV自带的DNN模块进行
    发表于 01-11 22:06

    【飞凌RK3588开发板试用】实现人脸检测

    ))[2:-1] return img_date_url添加代码后,重新启动服务,打开网页,当图像中出现人脸时就可以检测出来了:CPU占用情况如下图,占用率非常小。【小结】tornado的服务+
    发表于 03-09 14:10

    基于openCV人脸检测识别系统的设计

    通过对基于Adaboost人脸检测算法的研究,利用该算法与计算机视觉类库openCV进行人脸检测系统的设计,实现了对出现在
    发表于 06-15 10:53 477次下载
    基于<b class='flag-5'>openCV</b>的<b class='flag-5'>人脸</b><b class='flag-5'>检测</b>识别系统的设计

    Android系统下OpenCV人脸检测模块的设计

    针对解决OpenCV人脸检测模块在Android平台编译和移植的问题,提出一种利用JNI技术(Java Native Interface)调用OpenCV以及采用Android NDK
    发表于 11-07 17:40 118次下载
    Android系统下<b class='flag-5'>OpenCV</b>的<b class='flag-5'>人脸</b><b class='flag-5'>检测</b>模块的设计

    openCV人脸检测系统的设计方案探究

    摘要: 通过对基于 Adaboost 人脸检测算法的研究,利用该算法与计算机视觉类库 openCV 进行人脸检测系统的设计,实现了对出现在
    发表于 10-20 16:39 3次下载

    OpenCV视频处理之人脸检测 1

    目前可依靠模块化方式实现图像处理管道,检测一堆图像文件中的人脸,并将其与漂亮的结构化JSON摘要文件一起保存在单独的文件夹中。 让我们对视频流也可以进行同样的操作。 首先,
    的头像 发表于 02-07 15:27 770次阅读

    Android系统下OpenCV人脸检测模块的设计

    电子发烧友网站提供《Android系统下OpenCV人脸检测模块的设计.pdf》资料免费下载
    发表于 10-23 09:37 0次下载
    Android系统下<b class='flag-5'>OpenCV</b>的<b class='flag-5'>人脸</b><b class='flag-5'>检测</b>模块的设计