balthou's picture
update tutorial (fix image compression issues on gradio with interactive pipe)
ebfe618

A newer version of the Gradio SDK is available: 6.5.1

Upgrade

⏯ interactive pipe website

Full tutorial

Note : The same tutorial is also available on Google Colab to learn about the Jupyter notebook backend.

Analyzing the headless pipeline

headless_tutorial_pipeline = interactive_pipeline(gui=None)(tutorial_pipeline)
# gui=None allows retuning a HeadlessPipeline instance.
headless_tutorial_pipeline.graph_representation("__tuto_pipeline")

Let's now call the pipeline several times with varying parameters.

🎁 We provide a basic code sample to generate the gif animation.

from PIL import Image as PILImage
img_list = []
for freq in np.linspace(1, 100, 10):
    # Let's first override some of the default parameters.
    headless_tutorial_pipeline.parameters = {
        "gen_color": {"frequency": freq, 'isotropy': freq/100.},
        "compare_by_splitting": {"ratio": freq/100.}}
    # Let's execute
    headless_tutorial_pipeline()
    img = (255.*headless_tutorial_pipeline.results[1][1]).astype(np.uint8)
    img_list.append(PILImage.fromarray(img))

img_list[0].save("animation.gif", save_all=True, append_images=img_list[1:], duration=1, loop=1000)

animation

Advice

Keep separation between "production code" (library / not interactive) & interactivity

  • πŸ’‘ One of the strength of interactive pipe is to avoid adding hundreds of lines of code dedicated to GUI (graphical user interfaces).
  • With interactive pipe, you have the choice to keep this design choice. Each processing block can be defined as a regular function, without even importing the interactive decorator. In a separate file, you'll add sliders.

Several ways to decorate building blocks

1.Decorate afterward πŸ† = Recommended approach

  • βž– Less elegant to read (add_interactivity may be in a different file)
  • βž• The decorated function can be re-used somewhere else (before being decorated).
  • βž• Possibility to add conditions (debug flag)
def gen_color(frequency=0, isotropy=0.):
    ...


def add_interactivity(debug=True):
    interactive(
        frequency=(80, [1, 100]),
        isotropy=(0.8, [0.1, 1.]) if debug else 0.8
    )(gen_color)

2.Decorate using @

@interactive(
    frequency=(80, [1, 100]),
    isotropy=(0.8, [0.1, 1.])
)
def gen_color(frequency=0, isotropy=0.):
    ...
  • βž• Easy to read
  • βž– The decorated function can't be re-used somewhere else.
  • βž– No possibility to add condition to hide/show slider. To hide the slider, you need to comment!

3. Shorter code using @

@interactive()
def gen_color(
    frequency=(80, [1, 100]),
    isotropy=(0.8, [0.1, 1.])
):
  • βž• Shortest code
  • βž– The decorated function can't be re-used somewhere else

Pipeline visualization

Internally, interactive_pipe builds an execution graph of the pipeline.

  • If you're using the qt backend, press G to build the graph.
  • If you're in a notebook, it's possible to easily plot the graph.
headless_tutorial_pipeline = interactive_pipeline(gui=None)(tutorial_pipeline)
headless_tutorial_pipeline.graph_representation()
pipeline's execution graph
Pipeline

Backend choice

Backend πŸš€ Qt 🐒 Gradio
Responsiveness βž• Very fast βž– Slower
Shareable βž– No, only 1 local Qt Window βž• Share a link with others, (βž• Optional: standalone hosting on HF spaces πŸ€— )
Keyboard controls βž• Yes βž– No
Full screen βž• Yes βž– No
πŸš€ Qt 🐒 Gradio
QT Gradio

Matplotlib backend

Please note that there's also a matplotlib gui="mpl" backend in case of environments where you really don't have access to Qt or Jupyter notebooks.