ipywidgets 是一个在jupyter notebook 中开发用户交互界面的简单工具。
可以用它来做机器学习模型的演示,构建数据分析dashboard,或者做一些小工具。
先看个效果,再介绍原理~
公众号算法美食屋后台回复关键词:源码,获取本文notebook源代码~
相比streamlit和gradio,ipywidgets具有如下优势:
⚫️ 灵活高效:ipywidgets的组件可以和notebook的输出很好地结合在一起。
⚫️ 方便调试:ipywidgets和代码一起直接在jupyter中展示和运行, all in one notebook。
⚫️ 便于分享:任何可以托管notebook的环境都可以使用和展示它。
大多数的ipywidgets应用一般由如下最常用的基础模块构成。
⚫️ 应用界面:interact(简易场景), interact_manual(简易场景手动触发), interactive_output(定制化输入), display(完全定制化场景)
⚫️ 输入输出:Output(笔记本输出), Image(图像), Text(文本框), Textarea(文本块), Dropdown(下拉选项), IntSlider(整数滑条), FloatSlider(浮点数滑条), HTML, Viedio(视频),
⚫️ 控制组件:Button(按钮), Play(播放器)
⚫️ 布局组件:Tab(标签页), HBox(行布局), VBox(列布局), Layout(外观)
我们将由易到难通过4个范例来介绍ipywidgets的使用方法。
⚫️ hello world范例
⚫️ 文本分类
⚫️ 图片浏览工具
⚫️ 图片分类
import ipywidgets as widgets
def greet(name):
return "Hello " + name + "!!"
w = widgets.interact(greet,name='LiLei');
w
from ipywidgets import widgets,interact
from pathlib import Path
from PIL import Image
from torchkeras.data import download_baidu_pictures
download_baidu_pictures(keyword='猫咪表情包',needed_pics_num=20, save_dir = 'cats')
files = [str(x) for x in Path('cats').rglob('*.jpg') if 'checkpoint' not in str(x)]
def browser_image(path):
return Image.open(path)
interact(browser_image, path=files)
#解决国内下载huggingface仓库慢的问题
import os
os.environ['HF_ENDPOINT']='https://hf-mirror.com'
import ipywidgets as widgets
from transformers import pipeline
pipe = pipeline("text-classification")
@widgets.interact_manual(text='Good morning')
def clf(text):
result = pipe(text)
label = result[0]['label']
score = result[0]['score']
res = {label:score,'POSITIVE' if label=='NEGATIVE' else 'NEGATIVE': 1-score}
return res
import ipywidgets as widgets
from IPython.display import HTML,display
import pandas as pd
from ultralytics import YOLO
from skimage import data
from PIL import Image
model = YOLO('yolov8n-cls.pt')
def predict(img):
...
return res
title = ...
files = widgets.Dropdown(
...
)
button = widgets.Button(...)
button.style.button_color = 'lightgreen'
out1 = widgets.Output() #widgets.Textarea(value='',layout=widgets.Layout(width='100%',height='100px'))
out2 = widgets.Output()
output = widgets.HBox([out1,out2])
display(title,files,button,output)
def on_button_clicked(btn):
...
with out1:
display(Image.open(files.value))
with out2:
display(fig)
button.on_click(on_button_clicked)