streamlit:算法工程师快速编写demo的利器

本文首发于:行者AI

在工作当中,算法工程师经常需要快速编写一些演示demo,例如快速演示一些算法,或者需要编写数据标注的工具等。常见的实现方式是算法工程师试用flask等框架编写api,再由前端工程师编写相关的网页调用api。这样毫无疑问是非常耗时,效率低下的。

然而,使用streamlit框架就可以快速搭建demo页面,算法工程师只使用python语言就可以编写比较精美的demo页面。streamlit框架内部负责处理网页的渲染工作,算法工程师将重点放在算法的流程方面就好。

框架安装

streamlit框架的安装非常简单,使用pip就可以安装:

pip install streamlit

安装完成之后,可以使用命令进行版本验证:

streamlit --version

在这篇文章当中,我会用一个实际工作中的例子简单介绍streamlit框架的使用流程。

项目准备

Collaborative-Distillation是一个支持高分辨率的图像风格化方案,该模型的输入是风格图片以及待处理的图片,输出是风格化之后的图片。

在这个代码仓库当中,我们需要使用比较复杂的命令行命令来进行风格化操作:

# use original VGG-19, normal images
CUDA_VISIBLE_DEVICES=0 python WCT.py --debug --mode original

# use original VGG-19, ultra-res images
CUDA_VISIBLE_DEVICES=0 python WCT.py --debug --mode original --UHD

# use our pruned VGG-19, normal images
CUDA_VISIBLE_DEVICES=0 python WCT.py --debug --mode 16x

# use our pruned VGG-19, ultra-res images
CUDA_VISIBLE_DEVICES=0 python WCT.py --debug --mode 16x --UHD

# If your RAM cannot afford some large images, you can change the content and style size via '--content_size' and '--style_size'
CUDA_VISIBLE_DEVICES=0 python WCT.py --debug --mode 16x --UHD --content_size 3000 --style_size 2000

但是这样的操作对于用户来说相当复杂,所以我们可以使用streamlit编写一个demo页面,方便用户使用。

在这个demo页面当中,会用到streamlit的以下几种组件:

  • streamlit.file_uploader:文件上传组件,具体见下图

    文件上传组件

    该组件支持拖拽上传文件和文件管理器选择文件,相对来说比较方便,使用方法如下列代码所示:

    style_file = st.file_uploader("请上传风格化图片")
    
    if style_file:
        stringio = style_file.getvalue()
        style_file_path = 'style_file/'+ style_file.name
        with open(style_file_path,'wb') as f:
            f.write(stringio)
    

使用文件上传组件上传文件之后,可以使用上面的代码将文件保存到特定路径等待使用。

  • streamlit.image:图片显示组件,具体见下图:

    图片显示组件

    该组件可以在demo页面中根据图片路径显示图片。

    style_file_path = 'style_file/'+ style_file.name
    st.image(style_file_path)
  • streamlit.write:文字显示组件,该组件可以在网页上显示一些提示信息。

    文字显示组件

    st.write('高分辨率风格化demo')
  • streamlit.button:按钮组件,点击之后可以进行一些任务。

    按钮组件

if st.button('开始进行风格化处理'):
    style_func()
  • streamlit.progress:进度显示组件,可以用来显示任务的进度。

    进度显示组件

for i in range(0,100,10):
    st.progress(i + 1)

streamlit中还有一些重要的组件,例如:

  • streamlit.cache:数据缓存组件,该组件可以作为装饰器使用,用处是缓存数据,加快数据载入速度。可以用在需要反复加载数据或者进行计算的函数当中。

    @st.cache
    def load_dataset(data_link):
        dataset = pd.read_csv(data_link)
        return dataset
    
  • streamlit.audio:音频展示组件,可以根据音频地址播放音频。

音频展示组件

with open('audio.mp3','rb') as f:
    st.audio(f,format="audio/mp3")
  • streamlit.audio:选择组件,该组件可以让用户从多个选项中选择一项。

    选择组件

model_choose = st.radio('请选择分离模型:',['人声+伴奏','人声+钢琴+吉他+鼓+其他'],0)

其中参数0表示默认选择第一项。

streamlit支持的组件还是很多的,如果感兴趣,请参考官方文档

项目编写

这个demo页面的主要功能是让用户分别上传style图片和content图片,然后后台进行风格化操作,风格化操作完成之后显示结果图片。这样用户就可以快速的进行风格化操作并知道结果。

streamlit应用是用python语言编写的。在python文件开头,需要导入streamlit包。

import streamlit as st

接着进行文件的上传与预处理:

style_file = st.file_uploader("请上传风格化图片")
content_file = st.file_uploader("请上传待处理图片")
image_slot = st.empty()

if style_file:
    stringio = style_file.getvalue()
    style_file_path = 'style_file/'+ style_file.name
    with open(style_file_path,'wb') as f:
        f.write(stringio)
    image_slot.image(style_file_path)

if content_file:
    stringio = content_file.getvalue()
    content_file_path = 'content_file/'+ content_file.name
    with open(content_file_path,'wb') as f:
        f.write(stringio)

if content_file and style_file:
    img1 = Image.open( style_file_path)
    img1 = img1.resize((640, 640))

    img2 = Image.open( content_file_path)
    img2 = img2.resize((640, 640))
    new_img = Image.new('RGB', (1280, 640), 255)
    new_img.paste(img1,(0,0))
    new_img.paste(img2,(640,0))
    new_img.save('concrate_file/' + os.path.basename(style_file_path))
    image_slot.image('concrate_file/' + os.path.basename(style_file_path))

文件上传

最后写一个按钮,执行风格化操作,并显示最终结果,同时添加一个进度条:

if st.button('开始进行风格化处理'):
    my_bar = st.progress(10)

    UHD_content_folder_path = 'PytorchWCT/content/UHD_content'
    output_path = WCT_func.process(content_file_path,style_file_path)
    for i in range(0,100,10):
        my_bar.progress(i + 1)
    my_bar.progress(100)
    st.write('风格化之后的图片')
    st.image(output_path)

执行风格化操作

项目的运行和部署

streamlit框架的运行方式非常简单,直接在命令行执行:

$ streamlit run streamlit_demo.py 

就可以在浏览器中进行访问了。

项目部署

总结

streamlit框架非常适合快速编写流程不太复杂且需要可视化操作的demo,作者从开始编写到编写完成这个demo用时不到半个小时,编写代码不到50行,而且运行部署起来非常方便,页面看起来要比使用flask之类的框架渲染出的网页美观许多,实乃算法工程师的利器。

行者AI(成都潜在人工智能科技有限公司)专注于人工智能在游戏领域的研究和应用,凭借自研算法,推出游...

45 声望
6 粉丝
0 条评论
推荐阅读
Unity ML-agents 参数设置解明
Unity 是全球最受欢迎的游戏开发引擎之一,有大量的游戏开发者在使用Unity开发他们的游戏。在这个AI、大数据等流行词遍布各行各业的时代,Unity也没有被潮流抛下,推出了他们自己的基于深度强化学习来训练游戏AI...

行者AI阅读 744

openKylin 0.9.5版本正式发布,加速国产操作系统自主创新进程!
2023年1月12日,中国桌面操作系统根社区openKylin(开放麒麟)正式发布openKylin 0.9.5操作系统版本。此版本充分适应5G时代需求,打通平板,PC等设备,实现多端融合,弥补了国产操作系统的短板,有效推动国产操作...

openKylin5阅读 7.1k

封面图
杨辉三角的5个特性,一个比一个牛皮!
杨辉三角按照杨辉于1261年所编写的《详解九章算法》一书,里面有一张图片,介绍此种算法来自于另外一个数学家贾宪所编写的《释锁算书》一书,但这本书早已失传无从考证。但可以肯定的是这一图形的发现我国不迟于1...

小傅哥3阅读 1.5k

不会数学的程序员,只能走到初级开发工程师!
在我还是初级程序员时,每天也都粘贴着代码和包装着接口。那个阶段并没有意识到数学能在编程中起到什么作用,就算学了数学的部分知识,也没法用到编程中。但后来随着编程越来越久,逐步接手核心代码块开发时候,...

小傅哥3阅读 635

封面图
stackoverflow 提问:“计算两个整数的最小公倍数的最有效方法是什么?”
作者:小傅哥博客:[链接]源码:[链接]沉淀、分享、成长,让自己和他人都能有所收获!😄一、前言嘿,小傅哥怎么突然讲到最大公约数了?这么想你肯定是没有好好阅读前面章节中小傅哥讲到的RSA算法,对于与欧拉结果...

小傅哥3阅读 1.4k

封面图
视频清晰度优化指南
随着移动互联网的深入发展,视频消费场景逐渐变成主流,早期由于手机硬件的限制问题,导致生产出来的视频画质、清晰度存在较大的问题,用户体验不太好,当时的网络也处于4G的发展阶段,网络的限制也无法持续支持...

得物技术2阅读 896

为什么不能用斐波那契散列,做数据库路由算法?
斐波那契数列出现在印度数学中,与梵文韵律有关。在梵语诗歌传统中,人们对列举所有持续时间为 2 单位的长 (L) 音节与 1 单位持续时间的短 (S) 音节并列的模式很感兴趣。用给定的总持续时间计算连续 L 和 S 的不...

小傅哥1阅读 749

封面图

行者AI(成都潜在人工智能科技有限公司)专注于人工智能在游戏领域的研究和应用,凭借自研算法,推出游...

45 声望
6 粉丝
宣传栏