网站首页 > 教程文章 正文
在文章中: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 机器视觉之人脸识别(机器视觉人脸识别原理)
- 最近发表
-
- 一课译词:一刀两断(一刀两断成语解释)
- 核心短语break up用法解析(breakd短语)
- HTML+CSS 实现商品图片列表放大视觉效果 复制完整代码即可马上调用
- 前端实现右键自定义菜单(前端实现右键自定义菜单怎么设置)
- Python中docx与docxcompose批量合并多个Word文档并添加分页符
- Java 将Excel转为XML(java将xls转换成xlsx)
- jq+ajax+bootstrap改了一个动态分页的表格
- css兼容性问题及一些常见问题汇总大全,赶快收藏!
- Java 的业务逻辑验证框架 之-fluent-validator
- 小程序cover-view踩坑系列2(微信小程序overflow)
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- mybatis plus page (35)
- vue @scroll (38)
- 堆栈区别 (33)
- 什么是容器 (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)
- redis aof rdb 区别 (33)
- 302跳转 (33)
- http method (35)
- js array splice (33)