乐趣区

关于算法: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 之类的框架渲染出的网页好看许多,实乃算法工程师的利器。

退出移动版