网站首页 > 教程文章 正文
在文章中: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框架有关。
- 上一篇: 实战小项目:利用 OpenCV 快速完成人脸检测
- 下一篇: c# 实现图片识别?(c#图片识别库)
猜你喜欢
- 2025-05-08 使用Transformer来做物体检测(基于transformer的目标检测)
- 2025-05-08 仅用CPU就能跑到1000FPS,这是开源的C++跨平台人脸检测项目
- 2025-05-08 C# 构建一个人脸识别AI的简单例子
- 2025-05-08 c# 实现图片识别?(c#图片识别库)
- 2025-05-08 实战小项目:利用 OpenCV 快速完成人脸检测
- 2025-05-08 [OpenCV实战]2 人脸识别算法对比(opencv人脸识别函数)
- 2025-05-08 Python人脸识别实现方法与步骤(python人脸识别实例源代码)
- 2025-05-08 Java版人脸跟踪三部曲之三:编码实战
- 2025-05-08 OpenCV-Python速查表:从导入图像到人脸检测
- 2025-05-08 机器视觉之人脸识别(机器视觉人脸识别原理)
- 05-08云虚拟电脑与操作云电脑:相同还是不同?
- 05-08【三.丰.云】免费虚拟主机和免费云服务器,真的不错
- 05-08三丰云免费虚拟主机和云服务器评测
- 05-08阿贝云:免费的虚拟主机和云服务器,让我爱上云计算
- 05-08云服务器与虚拟主机的区别解析(云服务器与虚拟主机的区别解析图)
- 05-08(可以搭建游戏无盘)推荐一个免费云服务器,免费虚拟主机
- 05-08【阿贝云】免费云主机,免费虚拟主机
- 05-08免费云服务器和虚拟主机(免费云服务器和虚拟主机的区别)
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- md5 sha1 (32)
- mybatis plus page (35)
- semaphore 使用详解 (32)
- update from 语句 (32)
- vue @scroll (38)
- 堆栈区别 (33)
- 在线子域名爆破 (32)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)