在文章中: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框架有关。