Gradio入門到進(jìn)階全網(wǎng)最詳細(xì)教程[二]:快速搭建AI算法可視化部署演示(側(cè)重參數(shù)詳解和案例實(shí)踐)
相關(guān)文章:Gradio入門到進(jìn)階全網(wǎng)最詳細(xì)教程[一]:快速搭建AI算法可視化部署演示(側(cè)重項(xiàng)目搭建和案例分享)
在教程一中主要側(cè)重講解gradio的基礎(chǔ)模塊搭建以及demo展示,本篇文章則會(huì)側(cè)重實(shí)際任務(wù)的搭建。
1.經(jīng)典案例簡單的RGB轉(zhuǎn)灰度
保持一貫作風(fēng)簡單展示一下如何使用
import gradio as gr
import cv2
def to_black(image):
output = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
return output
interface = gr.Interface(fn=to_black, inputs="image", outputs="image")
interface.launch()
gradio的核心是它的gr.Interface函數(shù),用來構(gòu)建可視化界面。
- fn:放你用來處理的函數(shù)
- inputs:寫你的輸入類型,這里輸入的是圖像,所以是"image"
- outputs:寫你的輸出類型,這里輸出的是圖像,所以是"image"
最后我們用interface.lauch()把頁面一發(fā)布,一個(gè)本地靜態(tài)交互頁面就完成了!在瀏覽器輸入http://127.0.0.1:7860/,查收你的頁面:
- 上傳一張圖片,點(diǎn)擊「SUBMIT」
對(duì)于任何圖像處理類的ML代碼來說,只要定義好一個(gè)圖像輸入>>模型推理>>返回圖片的函數(shù)(邏輯和RGB轉(zhuǎn)灰度圖本質(zhì)上沒區(qū)別),放到fn中即可。
1.1 增加example
可以在頁面下方添加供用戶選擇的測試樣例。
在gr.Interface里的examples中放入圖片路徑,格式為[[路徑1],[路徑2],...]。
import gradio as gr
import cv2
def to_black(image):
output = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
return output
interface = gr.Interface(fn=to_black, inputs="image", outputs="image",
examples=[["gradio/test.png"]])
interface.launch()
增加example不僅能讓你的UI界面更美觀,邏輯更完善,也有一些其他意義:比如做了一個(gè)圖像去噪算法,但是用戶手頭并沒有躁點(diǎn)照片,example能讓他更快的體驗(yàn)到效果
-
創(chuàng)建一個(gè)外部訪問鏈接
-
創(chuàng)建外部訪問鏈接非常簡單,只需要launch(share=True)即可,在打印信息中會(huì)看到你的外部訪問鏈接。
-
需要注意:免費(fèi)用戶的鏈接可以使用24小時(shí),想要長期的話需要在gradio官方購買云服務(wù)。
-
2. 文本分類
在Gradio中搭建一個(gè)實(shí)用的自然語言處理應(yīng)用最少只需要三行代碼!讓我們?nèi)写a來搭建一個(gè)文本分類模型的演示系統(tǒng),這里使用的模型是uer/roberta-base-finetuned-dianping-chinese,代碼如下
#導(dǎo)入gradio
import gradio as gr
#導(dǎo)入transformers相關(guān)包
from transformers import *
#通過Interface加載pipeline并啟動(dòng)服務(wù)
gr.Interface.from_pipeline(pipeline("text-classification", model="uer/roberta-base-finetuned-dianping-chinese")).launch()
過程中需要加載一個(gè)400MB的模型。
直接運(yùn)行即可,運(yùn)行后,服務(wù)默認(rèn)會(huì)啟動(dòng)在本地的7860端口,打開鏈接即可。
可以在左側(cè)輸入待分類文本,而后點(diǎn)擊submit按鈕,右側(cè)便會(huì)展示出預(yù)測的標(biāo)簽及概率,如下圖所示
3. 閱讀理解
#導(dǎo)入gradio
import gradio as gr
#導(dǎo)入transformers相關(guān)包
from transformers import *
#通過Interface加載pipeline并啟動(dòng)服務(wù)
gr.Interface.from_pipeline(pipeline("question-answering", model="uer/roberta-base-finetuned-dianping-chinese")).launch()
再次打開,可以看到界面中除了幾個(gè)按鈕外的內(nèi)容全部進(jìn)行了更新,變成了閱讀理解相關(guān)的內(nèi)容,輸入部分包括了context和question兩部分,輸出也變成了answer和score兩部分。
效果上不佳可以考慮重新加載以及微調(diào)模型
3.1完善頁面
盡管我們快速的啟動(dòng)了一個(gè)demo,但是頁面整體還是較為簡陋的,除了標(biāo)題和實(shí)際的調(diào)用部分,缺少一些其他內(nèi)容,我們可以通過配置幾個(gè)簡單的參數(shù),將頁面進(jìn)行完善,還是以閱讀理解任務(wù)為例,代碼如下:
import gradio as gr
from transformers import *
#標(biāo)題
title = "抽取式問答"
#標(biāo)題下的描述,支持md格式
description = "輸入上下文與問題后,點(diǎn)擊submit按鈕,可從上下文中抽取出答案,趕快試試吧!"
#輸入樣例
examples = [
["普希金從那里學(xué)習(xí)人民的語言,吸取了許多有益的養(yǎng)料,這一切對(duì)普希金后來的創(chuàng)作產(chǎn)生了很大的影響。這兩年里,普希金創(chuàng)作了不少優(yōu)秀的作品,如《囚徒》、《致大?!贰ⅰ吨聞P恩》和《假如生活欺騙了你》等幾十首抒情詩,敘事詩《努林伯爵》,歷史劇《鮑里斯·戈都諾夫》,以及《葉甫蓋尼·奧涅金》前六章。", "著名詩歌《假如生活欺騙了你》的作者是"],
["普希金從那里學(xué)習(xí)人民的語言,吸取了許多有益的養(yǎng)料,這一切對(duì)普希金后來的創(chuàng)作產(chǎn)生了很大的影響。這兩年里,普希金創(chuàng)作了不少優(yōu)秀的作品,如《囚徒》、《致大?!?、《致凱恩》和《假如生活欺騙了你》等幾十首抒情詩,敘事詩《努林伯爵》,歷史劇《鮑里斯·戈都諾夫》,以及《葉甫蓋尼·奧涅金》前六章。", "普希金創(chuàng)作的敘事詩叫什么"]
]
#頁面最后的信息,可以選擇引用文章,支持md格式
article = "感興趣的小伙伴可以閱讀[gradio專欄](https://blog.csdn.net/sinat_39620217/category_12298724.html?spm=1001.2014.3001.5482)"
gr.Interface.from_pipeline(
pipeline("question-answering", model="uer/roberta-base-chinese-extractive-qa"),
title=title, description=description, examples=examples, article=article).launch()
- 運(yùn)行上述代碼,將看到如下頁面,這里的example是可以點(diǎn)擊的,點(diǎn)擊后將自動(dòng)填充至context和question中
- 由于description和article字段支持md語法,因此我們可以根據(jù)需求,自行的去豐富完善各部分內(nèi)容
4.Interface使用詳解
前面的內(nèi)容中構(gòu)建演示系統(tǒng)都是基于pipeline的,各個(gè)部分的模塊都是定義好的,快速啟動(dòng)的同時(shí),在靈活性上有所欠缺。
簡單的說,就需要兩步:
- 第一步,定義執(zhí)行函數(shù);
- 第二步,綁定執(zhí)行函數(shù)并指定輸入輸出組件。
假設(shè)還是閱讀理解任務(wù),但是我們這次不適用基于pipeline的加載方式,而是自定義實(shí)現(xiàn),要求輸入包含context、question,輸出包含answer和score,但是這里的answer要求要把問題拼接上,如前面的示例,answer為普希金,這里的答案要變?yōu)椋褐姼琛都偃缟钇垓_了你》的作者是:普希金 ,針對(duì)這一需求,我們看下要如何實(shí)現(xiàn)。
- 首先,定義執(zhí)行函數(shù)。該函數(shù)輸入包括context和question兩部分,輸出包括answer和score,本質(zhì)上還是調(diào)用pipeline進(jìn)行推理,但是在答案生成時(shí)我們做了額外的拼接處理。
qa = pipeline("question-answering", model="uer/roberta-base-chinese-extractive-qa")
def custom_predict(context, question):
answer_result = qa(context=context, question=question)
answer = question + ": " + answer_result["answer"]
score = answer_result["score"]
return answer, score
- 接下來,在Interface中綁定執(zhí)行函數(shù)并指定輸入輸出組件,fn字段綁定執(zhí)行函數(shù);inputs字段指定輸入組件,這里是context和question兩個(gè)文本輸入,因此inputs字段的值為["text", "text"]數(shù)組(這里的text表示輸入組件為TextBox,text只是一種便捷的指定方式);outputs字段指定輸出組件,answer是文本輸出,score可以用標(biāo)簽輸出,這里采取了和inputs字段不一樣的創(chuàng)建方式,我們直接創(chuàng)建了對(duì)應(yīng)的組件,這種方式的使用優(yōu)勢在于可以對(duì)組件進(jìn)行更精細(xì)的配置,例如這里我們便分別指定了兩個(gè)輸出模塊的label 。
gr.Interface(fn=custom_predict, inputs=["text", "text"], outputs=[gr.Textbox(label="answer"), gr.Label(label="score")],
title=title, description=description, examples=examples, article=article).launch()
注意點(diǎn):
- 輸入輸出要與函數(shù)的輸入輸出個(gè)數(shù)一致
- outputs字段,推薦使用創(chuàng)建的方式,否則頁面顯示的標(biāo)簽都是output*,不夠清晰
完整代碼:
import gradio as gr
from transformers import *
#標(biāo)題
title = "抽取式問答"
#題下的描述,支持md格式
description = "輸入上下文與問題后,點(diǎn)擊submit按鈕,可從上下文中抽取出答案,趕快試試吧!"
#輸入樣例
examples = [
["普希金從那里學(xué)習(xí)人民的語言,吸取了許多有益的養(yǎng)料,這一切對(duì)普希金后來的創(chuàng)作產(chǎn)生了很大的影響。這兩年里,普希金創(chuàng)作了不少優(yōu)秀的作品,如《囚徒》、《致大海》、《致凱恩》和《假如生活欺騙了你》等幾十首抒情詩,敘事詩《努林伯爵》,歷史劇《鮑里斯·戈都諾夫》,以及《葉甫蓋尼·奧涅金》前六章。", "著名詩歌《假如生活欺騙了你》的作者是"],
["普希金從那里學(xué)習(xí)人民的語言,吸取了許多有益的養(yǎng)料,這一切對(duì)普希金后來的創(chuàng)作產(chǎn)生了很大的影響。這兩年里,普希金創(chuàng)作了不少優(yōu)秀的作品,如《囚徒》、《致大?!?、《致凱恩》和《假如生活欺騙了你》等幾十首抒情詩,敘事詩《努林伯爵》,歷史劇《鮑里斯·戈都諾夫》,以及《葉甫蓋尼·奧涅金》前六章。", "普希金創(chuàng)作的敘事詩叫什么"]
]
#頁面最后的信息,可以選擇引用文章,支持md格式
article = "感興趣的小伙伴可以閱讀[gradio專欄](https://blog.csdn.net/sinat_39620217/category_12298724.html?spm=1001.2014.3001.5482)"
qa = pipeline("question-answering", model="uer/roberta-base-chinese-extractive-qa")
def custom_predict(context, question):
answer_result = qa(context=context, question=question)
answer = question + ": " + answer_result["answer"]
score = answer_result["score"]
return answer, score
gr.Interface(fn=custom_predict, inputs=["text", "text"], outputs=[gr.Textbox(label="answer"), gr.Label(label="score")],
title=title, description=description, examples=examples, article=article).launch()
可以看到,其他的部分與我們使用pipeline創(chuàng)建的方式都一致,只是在answer部分有了變化。通過這種方式,我們可以創(chuàng)建出更加復(fù)雜的包含任意輸入、輸出的系統(tǒng)。
5.Blocks使用詳解
事實(shí)上,Interface是一個(gè)更加高級(jí)的組件,雖然它已經(jīng)支持了了一定的自定義內(nèi)容,但是靈活性還是略差一些,如果有注意的話,可以回到上文看下,所有的組件都是被劃分為了左右兩部分,左側(cè)輸入,右側(cè)輸出。使用Interface就要接受這樣的默認(rèn)設(shè)定,那么假設(shè)你現(xiàn)在就想做成上下結(jié)構(gòu),上面輸入,下面輸出,那么,我們就需要用到Block。
Blocks是比Interface更加底層一些的模塊,支持一些簡單的自定義排版,那么下面就讓我們來重構(gòu)一下上面組件排列。整體是上下結(jié)構(gòu),從上到下,依次是context輸入、question輸入,clear按鈕和submit按鈕(在一橫排),answer輸出,score輸出,其余如title、examples等內(nèi)容不變,代碼如下
import gradio as gr
from transformers import *
title = "抽取式問答"
description = "輸入上下文與問題后,點(diǎn)擊submit按鈕,可從上下文中抽取出答案,趕快試試吧!"
examples = [
["普希金從那里學(xué)習(xí)人民的語言,吸取了許多有益的養(yǎng)料,這一切對(duì)普希金后來的創(chuàng)作產(chǎn)生了很大的影響。這兩年里,普希金創(chuàng)作了不少優(yōu)秀的作品,如《囚徒》、《致大?!?、《致凱恩》和《假如生活欺騙了你》等幾十首抒情詩,敘事詩《努林伯爵》,歷史劇《鮑里斯·戈都諾夫》,以及《葉甫蓋尼·奧涅金》前六章。", "著名詩歌《假如生活欺騙了你》的作者是"],
["普希金從那里學(xué)習(xí)人民的語言,吸取了許多有益的養(yǎng)料,這一切對(duì)普希金后來的創(chuàng)作產(chǎn)生了很大的影響。這兩年里,普希金創(chuàng)作了不少優(yōu)秀的作品,如《囚徒》、《致大海》、《致凱恩》和《假如生活欺騙了你》等幾十首抒情詩,敘事詩《努林伯爵》,歷史劇《鮑里斯·戈都諾夫》,以及《葉甫蓋尼·奧涅金》前六章。", "普希金創(chuàng)作的敘事詩叫什么"]
]
article = "感興趣的小伙伴可以閱讀[Transformers實(shí)用指南](https://zhuanlan.zhihu.com/p/548336726)"
#預(yù)測函數(shù)
qa = pipeline("question-answering", model="uer/roberta-base-chinese-extractive-qa")
def custom_predict(context, question):
answer_result = qa(context=context, question=question)
answer = question + ": " + answer_result["answer"]
score = answer_result["score"]
return answer, score
#清除輸入輸出
def clear_input():
return "", "", "", ""
#構(gòu)建Blocks上下文
with gr.Blocks() as demo:
gr.Markdown("# 抽取式問答")
gr.Markdown("輸入上下文與問題后,點(diǎn)擊submit按鈕,可從上下文中抽取出答案,趕快試試吧!")
with gr.Column(): # 列排列
context = gr.Textbox(label="context")
question = gr.Textbox(label="question")
with gr.Row(): # 行排列
clear = gr.Button("clear")
submit = gr.Button("submit")
with gr.Column(): # 列排列
answer = gr.Textbox(label="answer")
score = gr.Label(label="score")
#綁定submit點(diǎn)擊函數(shù)
submit.click(fn=custom_predict, inputs=[context, question], outputs=[answer, score])
# 綁定clear點(diǎn)擊函數(shù)
clear.click(fn=clear_input, inputs=[], outputs=[context, question, answer, score])
gr.Examples(examples, inputs=[context, question])
gr.Markdown("感興趣的小伙伴可以閱讀[Transformers實(shí)用指南](https://zhuanlan.zhihu.com/p/548336726)")
demo.launch()
當(dāng)我們的服務(wù)啟動(dòng)起來后,還是在本地的,雖然訪問是能訪問了,但是還是會(huì)受到網(wǎng)絡(luò)的限制。Gradio提供了一種非常方便的方式,可以使得本地的服務(wù)在任何地方都可以調(diào)用。代碼上,我們只需要在launch方法調(diào)用時(shí),指定share參數(shù)值為True。服務(wù)除了有一個(gè)本地地址,還有一個(gè)公網(wǎng)的地址https://11886.gradio.app,雖然時(shí)間只有72小時(shí)
demo.launch(inbrowser=True, inline=False, validate=False, share=True)
- inbrowser - 模型是否應(yīng)在新的瀏覽器窗口中啟動(dòng)。
- inline - 模型是否應(yīng)該嵌入在交互式python環(huán)境中(如jupyter notebooks或colab notebooks)。
- validate - gradio是否應(yīng)該在啟動(dòng)之前嘗試驗(yàn)證接口模型兼容性。
- share - 是否應(yīng)創(chuàng)建共享模型的公共鏈接。用于處理。
參考鏈接:
Gradio官方倉庫
基于Gradio可視化部署機(jī)器學(xué)習(xí)應(yīng)用文章來源:http://www.zghlxwxcb.cn/news/detail-425911.html
gradio官方文檔文章來源地址http://www.zghlxwxcb.cn/news/detail-425911.html
到了這里,關(guān)于Gradio入門到進(jìn)階全網(wǎng)最詳細(xì)教程[二]:快速搭建AI算法可視化部署演示(側(cè)重參數(shù)詳解和案例實(shí)踐)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!