问题场景
在使用kaggle, colab, aistutio这些平台工具时,使用的都是远程的Jupyterlab环境。
当在这样的环境里使用Gradio模块时,默认会弹出一个localhost的端口,但这个localhost只是在服务器端的。此时,如果用户想去体验创建好的AI应用时(例如图片应用),添加图片时,应用默认会打开服务器端的文件浏览器去查找图片(如果远程环境支持的话,但通常基于安全性考虑都是是不支持的)。对于用户来说,更方便的做法是打开本地电脑上的图片来进行处理。因此,用户只能将本地图片传到服务器端再处理,这就造成了一定的麻烦。
一个通常的解决办法就是,在app.launch()
里传入share=True
参数,来获取一个public_url
,通过访问这个公开的链接,就可以上传本地的照片啦。可是,这个public_url
是Gradio官方做了代理转发产生的,在国内的用户经常会遇到网络连接不稳定,这个时候会没办法访问。因此,如果能自定义pubilc_url
就可以很好的解决这个问题。
解决办法
通过设置app的root 和 share_url属性来自定义转发代理和public_url
代码示例
import gradio as gr
import os
def to_black(image):
output = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
return output
app = gr.Interface(fn=to_black, inputs=gr.Image(shape=(200, 200)), outputs="image")
# 服务端口
port=5005
# 代理转发
app.root = "/" + os.environ.get("JUPYTER_BASE_URL")+"/http-proxy/"+ str(port) #因为是在Jupyterlab里运行,因此加上JUPYTER_BASE_URL
app.share_url ="https://xxx.com" + app.root + "/" #https://xxx.com 是Jupyterlab环境所在的域名
gr.close_all() #关闭所有正在运行的端口
app.launch(share=True,server_port=port)
运行结果
Running on local URL: http://127.0.0.1:5005
Running on public URL: https://xxx.com/ai-lab-v1-21i485e61b/http-proxy/5005/
This share link expires in 72 hours. For free permanent hosting and GPU upgrades (NEW!), check out Spaces: https://huggingface.co/spaces
说明
可以看出,分享后的public URL 是一个自定义的链接,而不是Gradio官方的那个域名。