Gradio入门到进阶全网最详细教程[二]:快速搭建AI算法可视化部署演示(侧重参数详解和案例实践)

相关文章:Gradio入门到进阶全网最详细教程[一]:快速搭建AI算法可视化部署演示(侧重项目搭建和案例分享)

在教程一中主要侧重讲解gradio的基础模块搭建以及demo展示,本篇文章则会侧重实际任务的搭建。

1.经典案例简单的RGB转灰度

保持一贯作风简单展示一下如何使用

  1. import gradio as gr
  2. import cv2
  3. def to_black(image):
  4. output = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  5. return output
  6. interface = gr.Interface(fn=to_black, inputs="image", outputs="image")
  7. interface.launch()

gradio的核心是它的gr.Interface函数,用来构建可视化界面。

  • fn:放你用来处理的函数
  • inputs:写你的输入类型,这里输入的是图像,所以是"image"
  • outputs:写你的输出类型,这里输出的是图像,所以是"image"

最后我们用interface.lauch()把页面一发布,一个本地静态交互页面就完成了!在浏览器输入http://127.0.0.1:7860/,查收你的页面:

  • 上传一张图片,点击「SUBMIT」

对于任何图像处理类的ML代码来说,只要定义好一个图像输入>>模型推理>>返回图片的函数(逻辑和RGB转灰度图本质上没区别),放到fn中即可。

1.1 增加example

可以在页面下方添加供用户选择的测试样例。

在gr.Interface里的examples中放入图片路径,格式为[[路径1],[路径2],...]。

  1. import gradio as gr
  2. import cv2
  3. def to_black(image):
  4. output = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  5. return output
  6. interface = gr.Interface(fn=to_black, inputs="image", outputs="image",
  7. examples=[["gradio/test.png"]])
  8. interface.launch()

增加example不仅能让你的UI界面更美观,逻辑更完善,也有一些其他意义:比如做了一个图像去噪算法,但是用户手头并没有躁点照片,example能让他更快的体验到效果

  • 创建一个外部访问链接

    • 创建外部访问链接非常简单,只需要launch(share=True)即可,在打印信息中会看到你的外部访问链接。

    • 需要注意:免费用户的链接可以使用24小时,想要长期的话需要在gradio官方购买云服务。

2. 文本分类

在Gradio中搭建一个实用的自然语言处理应用最少只需要三行代码!让我们三行代码来搭建一个文本分类模型的演示系统,这里使用的模型是uer/roberta-base-finetuned-dianping-chinese,代码如下

  1. #导入gradio
  2. import gradio as gr
  3. #导入transformers相关包
  4. from transformers import *
  5. #通过Interface加载pipeline并启动服务
  6. gr.Interface.from_pipeline(pipeline("text-classification", model="uer/roberta-base-finetuned-dianping-chinese")).launch()

过程中需要加载一个400MB的模型。

直接运行即可,运行后,服务默认会启动在本地的7860端口,打开链接即可。

可以在左侧输入待分类文本,而后点击submit按钮,右侧便会展示出预测的标签及概率,如下图所示

3. 阅读理解

  1. #导入gradio
  2. import gradio as gr
  3. #导入transformers相关包
  4. from transformers import *
  5. #通过Interface加载pipeline并启动服务
  6. gr.Interface.from_pipeline(pipeline("question-answering", model="uer/roberta-base-finetuned-dianping-chinese")).launch()

再次打开,可以看到界面中除了几个按钮外的内容全部进行了更新,变成了阅读理解相关的内容,输入部分包括了context和question两部分,输出也变成了answer和score两部分。

效果上不佳可以考虑重新加载以及微调模型

3.1完善页面

尽管我们快速的启动了一个demo,但是页面整体还是较为简陋的,除了标题和实际的调用部分,缺少一些其他内容,我们可以通过配置几个简单的参数,将页面进行完善,还是以阅读理解任务为例,代码如下:

  1. import gradio as gr
  2. from transformers import *
  3. #标题
  4. title = "抽取式问答"
  5. #标题下的描述,支持md格式
  6. description = "输入上下文与问题后,点击submit按钮,可从上下文中抽取出答案,赶快试试吧!"
  7. #输入样例
  8. examples = [
  9. ["普希金从那里学习人民的语言,吸取了许多有益的养料,这一切对普希金后来的创作产生了很大的影响。这两年里,普希金创作了不少优秀的作品,如《囚徒》、《致大海》、《致凯恩》和《假如生活欺骗了你》等几十首抒情诗,叙事诗《努林伯爵》,历史剧《鲍里斯·戈都诺夫》,以及《叶甫盖尼·奥涅金》前六章。", "著名诗歌《假如生活欺骗了你》的作者是"],
  10. ["普希金从那里学习人民的语言,吸取了许多有益的养料,这一切对普希金后来的创作产生了很大的影响。这两年里,普希金创作了不少优秀的作品,如《囚徒》、《致大海》、《致凯恩》和《假如生活欺骗了你》等几十首抒情诗,叙事诗《努林伯爵》,历史剧《鲍里斯·戈都诺夫》,以及《叶甫盖尼·奥涅金》前六章。", "普希金创作的叙事诗叫什么"]
  11. ]
  12. #页面最后的信息,可以选择引用文章,支持md格式
  13. article = "感兴趣的小伙伴可以阅读[gradio专栏](https://blog.csdn.net/sinat_39620217/category_12298724.html?spm=1001.2014.3001.5482)"
  14. gr.Interface.from_pipeline(
  15. pipeline("question-answering", model="uer/roberta-base-chinese-extractive-qa"),
  16. title=title, description=description, examples=examples, article=article).launch()
  • 运行上述代码,将看到如下页面,这里的example是可以点击的,点击后将自动填充至context和question中
  • 由于description和article字段支持md语法,因此我们可以根据需求,自行的去丰富完善各部分内容

4.Interface使用详解

前面的内容中构建演示系统都是基于pipeline的,各个部分的模块都是定义好的,快速启动的同时,在灵活性上有所欠缺。

简单的说,就需要两步:

  • 第一步,定义执行函数;
  • 第二步,绑定执行函数并指定输入输出组件。

假设还是阅读理解任务,但是我们这次不适用基于pipeline的加载方式,而是自定义实现,要求输入包含context、question,输出包含answer和score,但是这里的answer要求要把问题拼接上,如前面的示例,answer为普希金,这里的答案要变为:著名诗歌《假如生活欺骗了你》的作者是:普希金 ,针对这一需求,我们看下要如何实现。

  • 首先,定义执行函数。该函数输入包括context和question两部分,输出包括answer和score,本质上还是调用pipeline进行推理,但是在答案生成时我们做了额外的拼接处理。
  1. qa = pipeline("question-answering", model="uer/roberta-base-chinese-extractive-qa")
  2. def custom_predict(context, question):
  3. answer_result = qa(context=context, question=question)
  4. answer = question + ": " + answer_result["answer"]
  5. score = answer_result["score"]
  6. return answer, score
  • 接下来,在Interface中绑定执行函数并指定输入输出组件,fn字段绑定执行函数;inputs字段指定输入组件,这里是context和question两个文本输入,因此inputs字段的值为["text", "text"]数组(这里的text表示输入组件为TextBox,text只是一种便捷的指定方式);outputs字段指定输出组件,answer是文本输出,score可以用标签输出,这里采取了和inputs字段不一样的创建方式,我们直接创建了对应的组件,这种方式的使用优势在于可以对组件进行更精细的配置,例如这里我们便分别指定了两个输出模块的label 。
  1. gr.Interface(fn=custom_predict, inputs=["text", "text"], outputs=[gr.Textbox(label="answer"), gr.Label(label="score")],
  2. title=title, description=description, examples=examples, article=article).launch()

注意点:

  1. 输入输出要与函数的输入输出个数一致
  2. outputs字段,推荐使用创建的方式,否则页面显示的标签都是output*,不够清晰

完整代码:

  1. import gradio as gr
  2. from transformers import *
  3. #标题
  4. title = "抽取式问答"
  5. #题下的描述,支持md格式
  6. description = "输入上下文与问题后,点击submit按钮,可从上下文中抽取出答案,赶快试试吧!"
  7. #输入样例
  8. examples = [
  9. ["普希金从那里学习人民的语言,吸取了许多有益的养料,这一切对普希金后来的创作产生了很大的影响。这两年里,普希金创作了不少优秀的作品,如《囚徒》、《致大海》、《致凯恩》和《假如生活欺骗了你》等几十首抒情诗,叙事诗《努林伯爵》,历史剧《鲍里斯·戈都诺夫》,以及《叶甫盖尼·奥涅金》前六章。", "著名诗歌《假如生活欺骗了你》的作者是"],
  10. ["普希金从那里学习人民的语言,吸取了许多有益的养料,这一切对普希金后来的创作产生了很大的影响。这两年里,普希金创作了不少优秀的作品,如《囚徒》、《致大海》、《致凯恩》和《假如生活欺骗了你》等几十首抒情诗,叙事诗《努林伯爵》,历史剧《鲍里斯·戈都诺夫》,以及《叶甫盖尼·奥涅金》前六章。", "普希金创作的叙事诗叫什么"]
  11. ]
  12. #页面最后的信息,可以选择引用文章,支持md格式
  13. article = "感兴趣的小伙伴可以阅读[gradio专栏](https://blog.csdn.net/sinat_39620217/category_12298724.html?spm=1001.2014.3001.5482)"
  14. qa = pipeline("question-answering", model="uer/roberta-base-chinese-extractive-qa")
  15. def custom_predict(context, question):
  16. answer_result = qa(context=context, question=question)
  17. answer = question + ": " + answer_result["answer"]
  18. score = answer_result["score"]
  19. return answer, score
  20. gr.Interface(fn=custom_predict, inputs=["text", "text"], outputs=[gr.Textbox(label="answer"), gr.Label(label="score")],
  21. title=title, description=description, examples=examples, article=article).launch()

可以看到,其他的部分与我们使用pipeline创建的方式都一致,只是在answer部分有了变化。通过这种方式,我们可以创建出更加复杂的包含任意输入、输出的系统。

5.Blocks使用详解

事实上,Interface是一个更加高级的组件,虽然它已经支持了了一定的自定义内容,但是灵活性还是略差一些,如果有注意的话,可以回到上文看下,所有的组件都是被划分为了左右两部分,左侧输入,右侧输出。使用Interface就要接受这样的默认设定,那么假设你现在就想做成上下结构,上面输入,下面输出,那么,我们就需要用到Block。

Blocks是比Interface更加底层一些的模块,支持一些简单的自定义排版,那么下面就让我们来重构一下上面组件排列。整体是上下结构,从上到下,依次是context输入、question输入,clear按钮和submit按钮(在一横排),answer输出,score输出,其余如title、examples等内容不变,代码如下

  1. import gradio as gr
  2. from transformers import *
  3. title = "抽取式问答"
  4. description = "输入上下文与问题后,点击submit按钮,可从上下文中抽取出答案,赶快试试吧!"
  5. examples = [
  6. ["普希金从那里学习人民的语言,吸取了许多有益的养料,这一切对普希金后来的创作产生了很大的影响。这两年里,普希金创作了不少优秀的作品,如《囚徒》、《致大海》、《致凯恩》和《假如生活欺骗了你》等几十首抒情诗,叙事诗《努林伯爵》,历史剧《鲍里斯·戈都诺夫》,以及《叶甫盖尼·奥涅金》前六章。", "著名诗歌《假如生活欺骗了你》的作者是"],
  7. ["普希金从那里学习人民的语言,吸取了许多有益的养料,这一切对普希金后来的创作产生了很大的影响。这两年里,普希金创作了不少优秀的作品,如《囚徒》、《致大海》、《致凯恩》和《假如生活欺骗了你》等几十首抒情诗,叙事诗《努林伯爵》,历史剧《鲍里斯·戈都诺夫》,以及《叶甫盖尼·奥涅金》前六章。", "普希金创作的叙事诗叫什么"]
  8. ]
  9. article = "感兴趣的小伙伴可以阅读[Transformers实用指南](https://zhuanlan.zhihu.com/p/548336726)"
  10. #预测函数
  11. qa = pipeline("question-answering", model="uer/roberta-base-chinese-extractive-qa")
  12. def custom_predict(context, question):
  13. answer_result = qa(context=context, question=question)
  14. answer = question + ": " + answer_result["answer"]
  15. score = answer_result["score"]
  16. return answer, score
  17. #清除输入输出
  18. def clear_input():
  19. return "", "", "", ""
  20. #构建Blocks上下文
  21. with gr.Blocks() as demo:
  22. gr.Markdown("# 抽取式问答")
  23. gr.Markdown("输入上下文与问题后,点击submit按钮,可从上下文中抽取出答案,赶快试试吧!")
  24. with gr.Column(): # 列排列
  25. context = gr.Textbox(label="context")
  26. question = gr.Textbox(label="question")
  27. with gr.Row(): # 行排列
  28. clear = gr.Button("clear")
  29. submit = gr.Button("submit")
  30. with gr.Column(): # 列排列
  31. answer = gr.Textbox(label="answer")
  32. score = gr.Label(label="score")
  33. #绑定submit点击函数
  34. submit.click(fn=custom_predict, inputs=[context, question], outputs=[answer, score])
  35. # 绑定clear点击函数
  36. clear.click(fn=clear_input, inputs=[], outputs=[context, question, answer, score])
  37. gr.Examples(examples, inputs=[context, question])
  38. gr.Markdown("感兴趣的小伙伴可以阅读[Transformers实用指南](https://zhuanlan.zhihu.com/p/548336726)")
  39. demo.launch()

当我们的服务启动起来后,还是在本地的,虽然访问是能访问了,但是还是会受到网络的限制。Gradio提供了一种非常方便的方式,可以使得本地的服务在任何地方都可以调用。代码上,我们只需要在launch方法调用时,指定share参数值为True。服务除了有一个本地地址,还有一个公网的地址https://11886.gradio.app,虽然时间只有72小时

  1. demo.launch(inbrowser=True, inline=False, validate=False, share=True)
  • inbrowser - 模型是否应在新的浏览器窗口中启动。
  • inline - 模型是否应该嵌入在交互式python环境中(如jupyter notebooks或colab notebooks)。
  • validate - gradio是否应该在启动之前尝试验证接口模型兼容性。
  • share - 是否应创建共享模型的公共链接。用于处理。

参考链接:

Gradio官方仓库

基于Gradio可视化部署机器学习应用

gradio官方文档

Gradio入门到进阶全网最详细教程[二]:快速搭建AI算法可视化部署演示(侧重参数详解和案例实践)的更多相关文章

  1. Spring Data JPA系列2:SpringBoot集成JPA详细教程,快速在项目中熟练使用JPA

    大家好,又见面了. 这是Spring Data JPA系列的第2篇,在上一篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring Data JPA,傻傻分不清楚?给你个 ...

  2. Zookeeper从入门到精通(开发详解,案例实战,Web界面监控)

    ZooKeeper是Hadoop的开源子项目(Google Chubby的开源实现),它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.命名服务.分布式同步.组服务等. Zookee ...

  3. 《手把手教你》系列技巧篇(三十二)-java+ selenium自动化测试-select 下拉框(详解教程)

    1.简介 在实际自动化测试过程中,我们也避免不了会遇到下拉选择的测试,因此宏哥在这里直接分享和介绍一下,希望小伙伴或者童鞋们在以后工作中遇到可以有所帮助. 2.select 下拉框 2.1Select ...

  4. 第15.12节PyQt(Python+Qt)入门学习:可视化设计界面组件布局详解

    一.引言 在Qt Designer中,在左边部件栏的提供了界面布局相关部件,如图: 可以看到共包含有四种布局部件,分别是垂直布局(Vertical Layout).水平布局(Horizontal La ...

  5. Kotlin——最详细的抽象类(abstract)、内部类(嵌套类)详解

    如果您对Kotlin很有兴趣,或者很想学好这门语言,可以关注我的掘金,或者进入我的QQ群大家一起学习.进步. 欢迎各位大佬进群共同研究.探索QQ群号:497071402 进入正题 在前面几个章节中,详 ...

  6. H5网页应用打包安卓App (全网最详细教程)

    img { box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important } .red { color: rgba(255, 0, 0, 1) } ...

  7. httprunner3.x全网最详细教程

    一.所需环境 wiindows10以上 python3.6以上 httprunner3.1.6(最新版本) pycharm社区版 二.安装httprunner 1.卸载旧版本 卸载之前版本的命令为:p ...

  8. Java进阶篇之十五 ----- JDK1.8的Lambda、Stream和日期的使用详解(很详细)

    前言 本篇主要讲述是Java中JDK1.8的一些新语法特性使用,主要是Lambda.Stream和LocalDate日期的一些使用讲解. Lambda Lambda介绍 Lambda 表达式(lamb ...

  9. 转载:【Oracle 集群】RAC知识图文详细教程(二)--Oracle 集群概念及原理

    文章导航 集群概念介绍(一) ORACLE集群概念和原理(二) RAC 工作原理和相关组件(三) 缓存融合技术(四) RAC 特殊问题和实战经验(五) ORACLE 11 G版本2 RAC在LINUX ...

  10. Python 爬虫从入门到进阶之路(十二)

    之前的文章我们介绍了 re 模块和 lxml 模块来做爬虫,本章我们再来看一个 bs4 模块来做爬虫. 和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也 ...

随机推荐

  1. linux系统下载redis时make报错:没有名为什么》》》》》

    明明自己下载了gcc-c++环境,但是make还是一直报错,没有名为什么的>>>>> 其实这个问题主要的原因的是gcc的版本过低了,你可以gcc -v查看一下你的版本,是 ...

  2. mysql知识点一

    1.mysql中造成索引失效的原因有哪些?如何分析和解决? 原因: 1.like以通配符%开头索引失效 通常用的索引数据结构是B+树,而索引是有序排列的 优化:一种是使用覆盖索引,另一种是把%放后面 ...

  3. 怎样清空 DNS 缓存?

    在 Windows 下命令行执行:ipconfig /flushdns 在 macOS 下执行命令:sudo killall -HUP mDNSResponder

  4. curl解决乱码

    mb_convert_encoding($str, 'UTF-8', 'UTF-8,GBK,GB2312,BIG5');

  5. [Unity热更新]Addressables

    参考链接: https://linxinfa.blog.csdn.net/article/details/122390621?spm=1001.2014.3001.5502 总结: 1.

  6. 关与python面向对象的认识

    面向对象编程 类:从一堆对象中以抽象的方式把相同的特征归类得到. 抽象类 类 实列 子类抽象为父类,子类继承父类特征. 类实例化为实例,实例抽象为类. class Human(object): cen ...

  7. 执行sql语句,查询sql版本

    SELECT VERSION();

  8. vsftpd配置FTP服务器(Centos7.x安装)

    安装配置 1. 安装vsftpd 检查是否安装了vsftpd # rpm -qa | grep vsftpdvsftpd-2.2.2-24.el6.x86_64 如果有展示则已经安装,不需要重新安装 ...

  9. Python学习笔记--循环的知识以及应用

    while循环 代码: 结果: 案例:求1-100的和 实现: 案例:while循环猜数字 实现: while循环的嵌套使用 案例:打印九九乘法表 (注意:要是想要输出不换行,代码可以这样写:prin ...

  10. Axios的相关应用

    Axios 的案例应用 要求利用axios实现之前利用AJAX实现的验证用户是否登录的案例 鉴于这两种语法的相似性,只需要在AJAX里面的注册界面里面的script标签里面包含的代码修改为如下代码即可 ...