使用 Python 开发的深度学习模型想要提供给客户使用,往往需要先把代码打包成 docker 镜像,然后前后端代码,最后才能展示给客户。这一过程繁琐且给开发人员带来巨大的工作量。本篇介绍一种快速展示、部署和调试 Python 开发的深度学习模型的方法,那就是 gradio(一种 Python 包)。借助 Gradio,您可以围绕机器学习模型或数据科学工作流程快速创建漂亮的用户界面,并让人们通过拖放自己的图像、粘贴文本、录制自己的声音以及与其他人进行交互来“​​尝试一下”您的演示,全部通过浏览器进行。

安装

1
pip install gradio

使用

假设我要使用 SAM 来进行图像分割,那么我首先需要根据 github官网 配置环境。然后,安装 gradio。

当所有环境都配置好后,我们编写简单的几行代码就能够把命令行或者 notebook 上的 SAM 代码在网页端展示。首先,创建一个目录,并把一些图像存放在其下的 images 文件夹下:

1
2
3
4
5
6
7
mkdir /disk0/documents/codes/gradio_web
mkdir -p /disk0/documents/codes/gradio_web/images

cp ~/Pictures/girl.jpg /disk0/documents/codes/gradio_web/images
cp ~/Pictures/zdt.png /disk0/documents/codes/gradio_web/images
cp ~/Pictures/green wormcopy.jpg /disk0/documents/codes/gradio_web/images
cp ~/Pictures/icon.ico /disk0/documents/codes/gradio_web/images

然后编写代码:

1
vim /disk0/documents/codes/gradio_web/sam_image.py

写入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# 使用SAM分割图像
import random

import cv2
import gradio as gr
import matplotlib.pyplot as plt
import numpy as np
import torch
from segment_anything import SamAutomaticMaskGenerator, SamPredictor, sam_model_registry


def setup_seed(seed=33):
"""
设置随机种子函数,采用固定的随机种子使得结果可复现
seed:种子值,int
"""
torch.manual_seed(seed) # 为CPU设置随机种子
torch.cuda.manual_seed_all(seed) # 为所有GPU设置随机种子
np.random.seed(seed) # numpy 设置随机种子
random.seed(seed) # random 设置随机种子
torch.backends.cudnn.benchmark = (
False # cudnn中对卷积操作进行了优化,牺牲了精度来换取计算效率。对精度影响不大,仅仅是小数点后几位的差别,微小差异容忍可注释
)
torch.backends.cudnn.deterministic = True


def show_anns(anns, image):
if len(anns) == 0:
return image
sorted_anns = sorted(anns, key=(lambda x: x["area"]), reverse=True)
img = np.zeros(
(
sorted_anns[0]["segmentation"].shape[0],
sorted_anns[0]["segmentation"].shape[1],
3,
),
dtype=np.uint8,
)

for ann in sorted_anns:
m = ann["segmentation"]
color_mask = np.random.choice(range(256), size=3)
img[m] = color_mask

return cv2.add(image, img)


sam_checkpoint = "/disk1/datasets/models/sam/sam_vit_h_4b8939.pth"
model_type = "vit_h"
device = "cuda"
sam = sam_model_registry[model_type](checkpoint=sam_checkpoint)
sam.to(device=device)


def segment_anything(image, points_per_side, pred_iou_thresh, seed, sam=sam):
"""
使用SAM分割自动一副图像,并给出分割后的效果图,在gradio上显示
"""

# 只需要在代码运行入口添加如下代码,设置随机数种子
setup_seed(seed)
mask_generator = SamAutomaticMaskGenerator(
sam, points_per_side=points_per_side, pred_iou_thresh=pred_iou_thresh
)
masks = mask_generator.generate(image)
seg_res_img = show_anns(masks, image)
return seg_res_img, len(masks)


interface = gr.Interface(
fn=segment_anything,
inputs=[
gr.components.Image(label="输入图像", height=500),
gr.Slider(16, 128),
gr.Slider(0, 1, step=0.01),
gr.Slider(1, 999),
],
outputs=[
gr.components.Image(label="分割结果", height=500, interactive=True),
gr.components.Number(label="分割数"),
],
examples=[
["./images/girl.jpg", 32, 0.86, 31],
["./images/zdt.png", 64, 0.86, 33],
["./images/green wormcopy.jpg", 64, 0.86, 33],
],
).queue(concurrency_count=5)

# gr.close_all()

interface.launch(
share=False,
server_name="0.0.0.0",
server_port=7860,
# auth=("admin", "123456"),
favicon_path="./images/icon.ico",
)

运行程序:

1
python sam_image.py

日志:

1
2
3
Running on local URL:  http://0.0.0.0:7860

To create a public link, set `share=True` in `launch()`.

或者使用如下方式运行程序,开启自动重装代码,当代码修改时,程序会自动重新加载代码,而不需要重启程序:

1
gradio sam_image.py

或者将上面的代码在 jupyterlab 中运行,此时,如果是远程服务器上运行的 jupyterlab 请将 server_name 从’0.0.0.0’修改为远程服务器 ip 地址。那么将在 jupyterlab 中打开一个交互式界面。

如果是本地,在浏览器上打开链接:localhost:7860。如果是远程服务器,请将 localhost 替换为远程服务器的 ip 地址。可以看到如下内容:

更多个性化设置请参考下面的文献。

参考文献

  1. gradio github
  2. Gradio入门到进阶全网最详细教程