领先的免费Web技术教程,涵盖HTML到ASP.NET

网站首页 > 知识剖析 正文

170.Python——使用Gradio来展示实时人脸检测

nixiaole 2025-03-06 18:11:06 知识剖析 16 ℃

在文章中:169.人工智能——模型展示gradio的使用,有初步体验如何使用Gradio来展示计算机视觉模型。

在实际应用中,有很多图像的输入并不是单张的图像,而是通过视频文件或摄像头来实时输入视频帧。

本文主要就是通过实时人脸检测,来演示如何使用Gradio进行实时图像处理(摄像头或视频文件),并展示结果。

这里的主要解决问题:Gradio是通过处理函数的返回值来作为输出,而处理视频帧是连续的,不能直接使用return来返回视频帧的处理结果,因为return会直接退出函数了。

注意:这里使用迭代生成器yield,代替return,来返回帧图像和位置

为了演示方便,按图像输入方式分成三个单独功能界面(单张图像人脸检测、摄像头实时人脸检测、视频文件实时人脸检测

程序完整代码:

import gradio as gr
import cv2
import time

#加载人脸检测模型
face_detector = cv2.CascadeClassifier("haarcascade_frontalface_alt.xml")
#人脸检测,返回人脸框图像和位置
def detect_faces(image):
    gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    faces=face_detector.detectMultiScale(image, 1.3,5)    
    if len(faces)>0:
        for face in faces:
            x, y, w, h = face
            cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)        
    else:
        faces=[["","","",""]]        
    #图像右下角显示当前时间戳
    time_str = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    cv2.putText(image, time_str, (image.shape[1]-200, image.shape[0]-20), 
                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)  
    return image,faces

#打视频文件,处理视频帧
def video_process(input_video):
    #读取视频文件
    cap = cv2.VideoCapture(input_video)
    while(cap.isOpened()):
        #读取帧图像
        ret, frame = cap.read()
        if ret:
            frame,lst = detect_faces(frame)          
            #使用迭代生成器yield,返回帧图像和位置
            yield cv2.cvtColor(frame, cv2.COLOR_BGR2RGB),lst

#单张图像检测
iface0 = gr.Interface(
    title="单张图像人脸检测",
    fn=detect_faces, #人脸检测函数
    inputs=gr.Image(label="原始图像"),
    outputs=[gr.Image(label="检测结果"),gr.List(label="人脸框位置")],    
    examples=[["img/andy1.jpg"],["img/face.jpg"],["img/cat.jpg"]],
    allow_flagging="never",
)

#摄像头实时检测
iface1 = gr.Interface(
    title="摄像头实时人脸检测",
    fn=detect_faces, #人脸检测函数
    inputs=gr.Image(sources=["webcam"],streaming=True,label="原始图像"),
    outputs=[gr.Image(label="检测结果"),gr.List(label="人脸框位置")],
    live=True,
    allow_flagging="never",
)
#视频文件实时检测
iface2 = gr.Interface(
    title="视频文件实时人脸检测",
    fn=video_process, #视频处理函数
    inputs=gr.Video(label="原始视频",autoplay=True),
    outputs=[gr.Image(label="检测结果"),gr.List(label="人脸框位置")],
    live=True,
    examples=[["img/catdog.mp4"],["img/facev5.mp4"]],
    allow_flagging="never",    
)

ifaces=gr.TabbedInterface(
    title="人脸实时检测",
    interface_list=[iface0,iface1,iface2],
    tab_names=["图像输入","摄像头输入","视频输入"],
    )

if __name__ == "__main__":
    ifaces.launch()

演示结果

启动界面

单张图像输入


视频文件输入

摄像头输入

从执行效率来看,运行性能表现并不是很好,实际应用中需要多进程或多线程处理,进一步优化,可能也与Gradio框架有关。

最近发表
标签列表