基于gradio快速部署自己的深度学习模型(目标检测、图像分类、语义分割模型)

gradio是一款基于python的算法快速部署工具,本博文主要介绍使用gradio部署目标检测、图像分类、语义分割模型的部署。相比于flask,使用gradio不需要自己构造前端代码,只需要将后端接口写好即可。此外,基于gradio实现的项目,可以托管到huggingface。

官网地址:https://www.gradio.app/guides/quickstart
文档地址:https://www.gradio.app/docs/interface
优质教程:https://zhuanlan.zhihu.com/p/624712372
安装命令:pip install gradio

托管到huggingface具体步骤如下:
在这里插入图片描述

1、基本用法

1.1 输入图像返回文本

基本使用方法如下所示

import gradio as grdef image_classifier(inp):return {'cat': 0.3, 'dog': 0.7}demo = gr.Interface(fn=image_classifier, inputs="image", outputs="label")
demo.launch()

每一个参数的描述如下所示
在这里插入图片描述
页面部署效果如下所示
在这里插入图片描述

1.2 输入文本返回文本

import random
import gradio as grdef random_response(message, history):return random.choice(["Yes "+message, "No"+message])demo = gr.ChatInterface(random_response, examples=["hello", "hola", "merhaba"], title="Echo Bot")if __name__ == "__main__":demo.launch()

在这里插入图片描述

1.3 输入图像返回图像

import numpy as np
import gradio as gr
def sepia(input_img):#处理图像sepia_filter = np.array([[0.393, 0.769, 0.189],[0.349, 0.686, 0.168],[0.272, 0.534, 0.131]])sepia_img = input_img.dot(sepia_filter.T)sepia_img /= sepia_img.max()return sepia_img
#shape设置输入图像大小
#demo = gr.Interface(sepia, gr.Image(height=200, width=200), "image")
demo = gr.Interface(sepia, inputs=gr.Image(), outputs="image")
demo.launch()

在这里插入图片描述

2、部署模型

以下部署代码中的ppDeploy 源自博客paddle 57 基于paddle_infer以面向对象方式2行代码部署目标检测模型、图像分类模型、语义分割模型

2.1 图像分类

部署代码如下所示

from ppDeploy import *
import gradio as gr 
from PIL import Imagecls=clsModel("model/resnet50/",'imagenet1000.txt',imgsz=256)
def cls_predict(input_img):res=cls.forword(input_img,topk=5)print(res)return resif __name__=="__main__":gr.close_all() demo = gr.Interface(fn = cls_predict,inputs = gr.Image(type='pil'), outputs = gr.Label(num_top_classes=5), examples = ['examples/1.jpg','examples/2.jpg','examples/3.jpg','examples/4.jpg','examples/5.jpg',])demo.launch()

部署效果如下所示
在这里插入图片描述

2.2 目标检测

部署代码如下所示,其特点是输入为image+float,输出为flaot,然后examples 需要给出多个(在显示时变成了表格)


from ppDeploy import *
import gradio as gr 
from PIL import Image#cls=clsModel("model/resnet50/",'imagenet1000.txt',imgsz=256)
det=detModel("model/ppyoloe_m/",'object365.txt',imgsz=640)
def det_predict(input_img,conf):res=det.forword(input_img,conf)return res
if __name__=="__main__":gr.close_all() #demo = gr.Interface(fn = cls_predict,inputs = gr.Image(type='pil'), outputs = gr.Label(num_top_classes=5), examples = ['examples/1.jpg','examples/2.jpg','examples/3.jpg','examples/4.jpg','examples/5.jpg',])demo = gr.Interface(fn = det_predict,inputs = [gr.Image(type='pil'),gr.Number(precision=2,minimum=0.01,maximum=1,value=0.3)], outputs = "image",examples = [['examples/1.jpg',0.3],['examples/2.jpg',0.3],['examples/3.jpg',0.3],['examples/4.jpg',0.3],['examples/5.jpg',0.3],])demo.launch()

运行效果如下所示
在这里插入图片描述

通过对部署代码进行修改,examples仅给出一个nx1的二维数组,其又变成了图片列表

from ppDeploy import *
import gradio as gr 
from PIL import Image#cls=clsModel("model/resnet50/",'imagenet1000.txt',imgsz=256)
det=detModel("model/ppyoloe_m/",'object365.txt',imgsz=640)
def det_predict(input_img,conf):res=det.forword(input_img,conf)return res
if __name__=="__main__":gr.close_all() #demo = gr.Interface(fn = cls_predict,inputs = gr.Image(type='pil'), outputs = gr.Label(num_top_classes=5), examples = ['examples/1.jpg','examples/2.jpg','examples/3.jpg','examples/4.jpg','examples/5.jpg',])demo = gr.Interface(fn = det_predict,inputs = [gr.Image(type='pil'),gr.Number(precision=2,minimum=0.01,maximum=1,value=0.3)], outputs = "image",examples = [['examples/1.jpg'],['examples/2.jpg'],['examples/3.jpg'],['examples/4.jpg'],['examples/5.jpg'],])demo.launch()

此时执行效果如下所示:
在这里插入图片描述

2.3 语义分割

部署代码如下

from ppDeploy import *
import gradio as gr 
from PIL import Image#cls=clsModel("model/resnet50/",'imagenet1000.txt',imgsz=256)
#det=detModel("model/ppyoloe_m/",'object365.txt',imgsz=640)
seg=segModel("model/segformerb1/",imgsz=1024)
def seg_predict(input_img,conf):res=seg.forword(input_img,conf)return res
if __name__=="__main__":gr.close_all() #demo = gr.Interface(fn = cls_predict,inputs = gr.Image(type='pil'), outputs = gr.Label(num_top_classes=5), examples = ['examples/1.jpg','examples/2.jpg','examples/3.jpg','examples/4.jpg','examples/5.jpg',])demo = gr.Interface(fn = seg_predict,inputs = [gr.Image(type='pil')], outputs = "image",examples = ['examples/1.jpg','examples/2.jpg','examples/3.jpg','examples/4.jpg','examples/5.jpg',])demo.launch()

部署效果如下
在这里插入图片描述

3、同时部署多个模型

3.1 部署代码

通过以下代码可以用选项卡的形式,同时部署3个模型。
以下代码中,通过with gr.Tab("图像分类"):可以开启一个新的选项卡,通过with gr.Row():可以强制是控件在同一行,通过with gr.Column():可以强制使控件在同一列。具体效果图见章节3.2


from ppDeploy import *
import gradio as gr 
from PIL import Imagewith gr.Blocks() as demo:gr.Markdown("功能选项卡")with gr.Tab("图像分类"):cls_input = gr.Image(type='pil')cls_button = gr.Button("submit",)cls_output = gr.Label(num_top_classes=5)gr.Examples(examples=['examples/1.jpg','examples/2.jpg','examples/3.jpg','examples/4.jpg','examples/5.jpg',],inputs=[cls_input])with gr.Tab("语义分割"):with gr.Row():with gr.Column():seg_input = gr.Image(type='pil')seg_button = gr.Button("submit")with gr.Column():seg_output = gr.Image(type='pil')gr.Examples(examples=['examples/1.jpg','examples/2.jpg','examples/3.jpg','examples/4.jpg','examples/5.jpg',],inputs=[seg_input])with gr.Tab("目标检测"):with gr.Row():with gr.Column():det_input_image = gr.Image(type='pil')det_input_number = gr.Number(precision=2,minimum=0.01,maximum=1,value=0.3,label='置信度')det_button = gr.Button("submit")with gr.Column():det_output = gr.Image(type='pil')gr.Examples(examples=['examples/1.jpg','examples/2.jpg','examples/3.jpg','examples/4.jpg','examples/5.jpg',],inputs=[det_input_image])#[['examples/1.jpg'],['examples/2.jpg'],['examples/3.jpg'],['examples/4.jpg'],['examples/5.jpg'],['examples/6.jpg'],]with gr.Accordion("功能说明"):gr.Markdown("点击选项卡可以切换功能选项,点击Examples中的图片可以使用示例图片")cls=clsModel("model/resnet50/",'imagenet1000.txt',imgsz=256)det=detModel("model/ppyoloe_m/",'object365.txt',imgsz=640)seg=segModel("model/segformerb1/",imgsz=1024)cls_button.click(cls.forword, inputs=cls_input, outputs=cls_output)seg_button.click(seg.forword, inputs=seg_input, outputs=seg_output)det_button.click(det.forword, inputs=[det_input_image,det_input_number], outputs=det_output)if __name__ == "__main__":demo.launch()

3.2 部署效果

图像分类效果
在这里插入图片描述
语义分割效果
在这里插入图片描述
目标检测效果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/579185.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法分析的

&#xff08;1&#xff09;一个顾客买了价值x元的商品&#xff08;不考虑角、分&#xff09;&#xff0c;并将y元的钱交给售货员&#xff1a;编写代码&#xff1a;在各种币值的钱都很充分的情况下&#xff0c;使售货员能用张数最少的钱币找给顾客 #include<stdio.h> int…

舒心减压,益路同行,黄埔区惠民社会服务中心开展残障人士冬至漫游活动

“走出家门&#xff0c;共享阳光”残障人士游读广州项目是由广州市慈善会、广州市善城社区公益基金会资助、广州市黄埔区惠民社会服务中心实施的第四届“创善*微创投”广州市社区公益微创投项目&#xff0c;黄埔区康园工疗站约120名残障人士为服务对象&#xff0c;通过游玩与教…

leetcode 371. 两整数之和(优质解法)

链接&#xff1a;371. 两整数之和 代码&#xff1a; class Solution {public int getSum(int a, int b) {while(b!0){int numa^b; //无进位值int bit(a&b)<<1; //进位anum;bbit;}return a;} } 题解&#xff1a; 要计算两个数相加并且不能使用 - 号&#xff0…

【代码混淆】react-native 代码混淆

​ 混淆是指对源代码进行加密、重命名等操作&#xff0c;以增加代码的复杂度&#xff0c;使其难以理解和反编译。 在React Native中&#xff0c;混淆可以通过以下步骤实现&#xff1a; 将JavaScript源代码转换为基于本机平台的二进制代码&#xff0c;可以使用工具如Metro Bun…

HarmonyOS4.0系统性深入开发04UIAbility组件详解(下)

UIAbility组件间交互&#xff08;设备内&#xff09; UIAbility是系统调度的最小单元。在设备内的功能模块之间跳转时&#xff0c;会涉及到启动特定的UIAbility&#xff0c;该UIAbility可以是应用内的其他UIAbility&#xff0c;也可以是其他应用的UIAbility&#xff08;例如启…

DBeaver Community(社区版)下载及安装自用版

DBeaver Community&#xff08;社区版&#xff09;下载及安装自用版 数据库管理工具好用的都收费&#xff0c;收费的都好用。 DBeaver Community&#xff08;社区版&#xff09;免费&#xff0c;功能够用&#xff0c;性能可以&#xff0c;推荐。商业版的强大&#xff0c;收费&a…

leetcode 面试题 17.19. 消失的两个数字 (hard)(优质解法)

链接&#xff1a;面试题 17.19. 消失的两个数字 代码&#xff1a; class Solution {public int[] missingTwo(int[] nums) {int lengthnums.length;int tmp0;//将完整数据以及 nums 中的数据都进行异或&#xff0c;得到的就是缺失的两个数字 a^b 的结果for(int i1;i<length…

vue3项目 - 使用 pnpm 包管理器来创建项目

创建项目 npm install -g pnpm pnpm create vue 输入项目名称、包名称、选择要安装的依赖&#xff0c;最后 pnpm install pnpm format #规范格式 pnpm dev #启动项目

使用vite创建vue3项目

1、使用管理员身份打开命令行窗口&#xff0c;输入命令: npm create vuelatest TypeScript语法选择是&#xff0c;其他依次选择否&#xff0c;创建完毕。 2、 创建完毕后打开项目&#xff0c;vscode会提示安装开发相关的插件&#xff0c;选择install 3、打开vscode终端&#x…

【力扣】199.二叉树的右视图

看到这个题目的一瞬间&#xff0c;我想递归&#xff0c;必须用递归。最近被递归折磨的有点狠&#xff0c;但是我感觉我快要打败它了&#xff0c;就是现在稍稍有点处于劣势。不过没关系&#xff0c;来日方长不是。 法一&#xff1a;递归 题解&#xff1a; 之前想的就是先递归&…

2024哪款洗地机最值得入手?热门洗地机推荐

近年来&#xff0c;洗地机的被大家熟悉&#xff0c;越来越多的家庭购置洗地机来清洁家里的卫生&#xff0c;集吸、拖、洗为一体的三重清洁方式&#xff0c;为经常打扫卫生的宝妈脱离了做家务的困境&#xff0c;不用再经历繁琐的清洁步骤(扫地→拖地→拖干)&#xff0c;一拖一拉…

华为数通方向HCIP-DataCom H12-831题库(多选题:221-240)

第221题 在割接项目的项目调研阶段需要对现网硬件环境进行观察,主要包括以下哪些内容? A、设备的位置 B、ODF位置 C、接口标识 D、光纤接口对应关系 答案:ABCD 解析: 在项目割接前提的项目调研阶段,需要记录下尽可能详细的信息。 第222题 以下哪些项能被正则表达式10*成…

2024年山东省安全员B证证考试题库及山东省安全员B证试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年山东省安全员B证证考试题库及山东省安全员B证试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大…

SQL server 数据库练习题及答案(练习2)

使用你的名字创建一个数据库 创建表&#xff1a; 数据库中有三张表&#xff0c;分别为student,course,SC&#xff08;即学生表&#xff0c;课程表&#xff0c;选课表&#xff09; 问题&#xff1a; --1.分别查询学生表和学生修课表中的全部数据。--2.查询成绩在70到80分之间…

JBoss JMXInvokerServlet 反序列化漏洞 CVE-2015-7501 已亲自复现

JBoss JMXInvokerServlet 反序列化漏洞 CVE-2015-7501 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用 修复建议总结 漏洞名称 漏洞描述 在Oracle Rapid Planning 12.1/12.2.2中发现了一个被归类为“严重”的漏洞。受到影响的是一些未知的组件处理中间层。升…

JAVA日志

日志 Slf4j slf4j 的全称是 Simple Loging Facade For Java&#xff0c;即它仅仅是一个为 Java 程序提供日志输出的统一接口&#xff0c;并不是一个具体的日志实现方案&#xff0c;就比如 JDBC 一样&#xff0c;只是一种规则而已。所以单独的 slf4j 是不能工作的&#xff0c;…

如何使用 Matplotlib 绘制 3D 圣诞树

系列文章目录 前言 转自&#xff1a;How to draw a 3D Christmas Tree with Matplotlib | by Timur Bakibayev, Ph.D. | Analytics Vidhya | Mediumhttps://medium.com/analytics-vidhya/how-to-draw-a-3d-christmas-tree-with-matplotlib-aabb9bc27864 因为我们把圣诞树安装…

Sql 动态行转列

SELECT ID, Name, [Month],auth FROM dbo.Test3 数据列表&#xff1a; 1.静态行专列 Select auth, MAX( CASE WHEN [Month] 一月 then Name else null end) 一月, MAX( CASE WHEN [Month] 二月 then Name else null end) 二月, MAX( CASE WHEN…

零基础学Java第一天

1.什么是Java Java是一门编程语言 思考问题&#xff1a; 人和人沟通? 中文 英文 人和计算机沟通&#xff1f; 计算机语言&#xff1a; C C C# php python 2. Java诞生 前身叫Oak&#xff08;橡树&#xff09; 目前最流行的版本还是JDK8 3.Java三大平台体系 JavaSE&#xff08…

(企业 / 公司项目)微服务OpenFeign怎么实现服务间调用?(含面试题)

Feign: 远程调用组件使用步骤&#xff0c;理解上面的图  后台系统中, 微服务和微服务之间的调用可以通过Feign组件来完成.  Feign组件集成了Ribbon负载均衡策略(默认开启的, 使用轮询机制),Hystrix熔断器 (默认关闭的, 需要通过配置文件进行设置开启)  被调用的微服务…