gradio/README.md

239 lines
11 KiB
Markdown
Raw Normal View History

2020-10-27 06:27:28 +08:00
[![CircleCI](https://circleci.com/gh/gradio-app/gradio.svg?style=svg)](https://circleci.com/gh/gradio-app/gradio) [![PyPI version](https://badge.fury.io/py/gradio.svg)](https://badge.fury.io/py/gradio)
2020-06-09 17:01:12 +08:00
2020-10-27 06:27:28 +08:00
# Welcome to Gradio
2019-09-18 02:05:54 +08:00
2020-10-27 06:27:28 +08:00
Quickly create customizable UI components around your models. Gradio makes it easy for you to "play around" with your model in your browser by dragging-and-dropping in your own images, pasting your own text, recording your own voice, etc. and seeing what the model outputs.
2020-07-14 19:48:34 +08:00
2020-10-27 06:27:28 +08:00
![Interface montage](demo/screenshots/montage.gif)
2020-06-23 06:27:14 +08:00
2019-06-20 01:21:15 +08:00
Gradio is useful for:
2020-10-27 06:27:28 +08:00
2019-07-26 14:47:57 +08:00
* Creating demos of your machine learning code for clients / collaborators / users
2020-10-27 06:27:28 +08:00
2019-07-26 14:47:57 +08:00
* Getting feedback on model performance from users
2020-10-27 06:27:28 +08:00
2019-07-26 14:47:57 +08:00
* Debugging your model interactively during development
2019-06-20 01:18:07 +08:00
2019-01-25 15:34:09 +08:00
2020-10-27 06:27:28 +08:00
## Getting Started
You can find an interactive version of this README at [https://gradio.app/getting_started](https://gradio.app/getting_started).
### Quick Start
To get Gradio running with a simple example, follow these three steps:
1. Install Gradio from pip.
````bash
2019-02-20 12:39:21 +08:00
pip install gradio
2020-10-27 06:27:28 +08:00
````
2. Run the code below as a Python script or in a Python notebook (or in a [colab notebook](https://colab.research.google.com/drive/18ODkJvyxHutTN0P5APWyGFO_xwNcgHDZ?usp=sharing)).
````python
import gradio as gr
def greet(name):
return "Hello " + name + "!"
iface = gr.Interface(fn=greet, inputs="text", outputs="text")
iface.launch()
2019-02-20 12:39:21 +08:00
```
2020-10-27 06:27:28 +08:00
3. The interface below will appear automatically within the Python notebook, or pop in a browser on [http://localhost:7860](http://localhost:7860/) if running from a script.
![hello_world interface](demo/screenshots/hello_world/1.gif)
### The Interface
Gradio can wrap almost any Python function with an easy to use interface. That function could be anything from a simple tax calculator to a pretrained model.
2019-02-20 12:39:21 +08:00
2020-10-27 06:27:28 +08:00
The core `Interface` class is initialized with three parameters:
2019-02-20 12:39:21 +08:00
2020-10-27 06:27:28 +08:00
- `fn`: the function to wrap
- `inputs`: the input component type(s)
- `outputs`: the output component type(s)
2019-02-20 12:39:21 +08:00
2020-10-27 06:27:28 +08:00
With these three arguments, we can quickly create interfaces and `launch()` them. But what if you want to change how the UI components look or behave?
2019-02-20 12:39:21 +08:00
2020-10-27 06:27:28 +08:00
### Customizable Components
What if we wanted to customize the input text field - for example, we wanted it to be larger and have a text hint? If we use the actual input class for `Textbox` instead of using the string shortcut, we have access to much more customizability. To see a list of all the components we support and how you can customize them, check out the [Docs](https://gradio.app/docs)
````python
2020-07-08 06:10:54 +08:00
import gradio as gr
2020-06-12 03:44:44 +08:00
2020-07-08 06:10:54 +08:00
def greet(name):
return "Hello " + name + "!"
2020-06-12 03:44:44 +08:00
2020-10-27 06:27:28 +08:00
iface = gr.Interface(
fn=greet,
inputs=gr.inputs.Textbox(lines=2, placeholder="Name Here..."),
outputs="text")
iface.launch()
2019-02-20 12:39:21 +08:00
```
2020-10-27 06:27:28 +08:00
![hello_world_2 interface](demo/screenshots/hello_world_2/1.gif)
2019-02-20 12:39:21 +08:00
2020-10-27 06:27:28 +08:00
### Multiple Inputs and Outputs
2020-06-12 03:48:38 +08:00
2020-10-27 06:27:28 +08:00
Let's say we had a much more complex function, with multiple inputs and outputs. In the example below, we have a function that takes a string, boolean, and number, and returns a string and number. Take a look how we pass a list of input and output components.
2020-06-12 03:48:38 +08:00
2020-10-27 06:27:28 +08:00
````python
import gradio as gr
def greet(name, is_morning, temperature):
salutation = "Good morning" if is_morning else "Good evening"
greeting = "%s %s. It is %s degrees today" % (
salutation, name, temperature)
celsius = (temperature - 32) * 5 / 9
return greeting, round(celsius, 2)
iface = gr.Interface(
fn=greet,
inputs=["text", "checkbox", gr.inputs.Slider(0, 100)],
outputs=["text", "number"])
iface.launch()
```
![hello_world_3 interface](demo/screenshots/hello_world_3/1.gif)
2019-02-20 12:39:21 +08:00
2020-10-27 06:27:28 +08:00
We simply wrap the components in a list. Furthermore, if we wanted to compare multiple functions that have the same input and return types, we can even pass a list of functions for quick comparison.
2019-02-20 12:39:21 +08:00
2020-10-27 06:27:28 +08:00
### Working with Images
2019-02-20 12:39:21 +08:00
2020-10-27 06:27:28 +08:00
Let's try an image to image function. When using the `Image` component, your function will receive a numpy array of your specified size, with the shape `(width, height, 3)`, where the last dimension represents the RGB values. We'll return an image as well in the form of a numpy array.
2019-02-20 12:39:21 +08:00
2020-10-27 06:27:28 +08:00
````python
2020-07-08 06:10:54 +08:00
import gradio as gr
import numpy as np
2019-02-20 12:46:44 +08:00
2020-10-27 06:27:28 +08:00
def sepia(img):
sepia_filter = np.array([[.393, .769, .189],
[.349, .686, .168],
[.272, .534, .131]])
sepia_img = img.dot(sepia_filter.T)
sepia_img /= sepia_img.max()
return sepia_img
2019-02-20 12:47:45 +08:00
2020-10-27 06:27:28 +08:00
iface = gr.Interface(sepia, gr.inputs.Image(shape=(200, 200)), "image")
iface.launch()
```
![sepia_filter interface](demo/screenshots/sepia_filter/1.gif)
2019-02-20 14:26:48 +08:00
2020-10-27 06:27:28 +08:00
Additionally, our `Image` input interface comes with an 'edit' button which opens tools for cropping, flipping, rotating, drawing over, and applying filters to images. We've found that manipulating images in this way will often reveal hidden flaws in a model.
2019-02-20 14:26:48 +08:00
2020-10-27 06:27:28 +08:00
### Example Data
2019-02-20 14:24:29 +08:00
2020-10-27 06:27:28 +08:00
You can provide example data that a user can easily load into the model. This can be helpful to demonstrate the types of inputs the model expects, as well as to provide a way to explore your dataset in conjunction with your model. To load example data, you provide a nested list to the `examples=` keyword argument of the Interface constructor. Each sublist within the outer list represents a data sample, and each element within the sublist represents an input for each input component. The format of example data for each component is specified in the [Docs](https://gradio.app/docs).
````python
2020-07-08 06:10:54 +08:00
import gradio as gr
2020-10-27 06:27:28 +08:00
def calculator(num1, operation, num2):
if operation == "add":
return num1 + num2
elif operation == "subtract":
return num1 - num2
elif operation == "multiply":
return num1 * num2
elif operation == "divide":
return num1 / num2
iface = gr.Interface(calculator,
["number", gr.inputs.Radio(["add", "subtract", "multiply", "divide"]), "number"],
"number",
examples=[
[5, "add", 3],
[12, "divide", -2]
]
)
iface.launch()
```
![calculator interface](demo/screenshots/calculator/1.gif)
### Flagging
Underneath the output interfaces, there is a button marked "Flag". When a user testing your model sees input with interesting output, such as erroneous or unexpected model behaviour, they can flag the input for review. Within the directory provided by the `flagging_dir=` argument to the Interface constructor, a CSV file will log the flagged inputs. If the interface involved file inputs, such as for Image and Audio interfaces, folders will be created to store those flagged inputs as well.
You can review these flagged inputs by manually exploring the flagging directory, or load them into the Gradio interface by pointing the `examples=` argument to the flagged CSV file.
### Interpretation
Most models are black boxes such that the internal logic of the function is hidden from the end user. To encourage transparency, we've added the ability for interpretation so that users can understand what parts of the input are responsible for the output. Take a look at the simple interface below:
````python
import gradio as gr
import re
2020-07-08 06:10:54 +08:00
2020-10-27 06:27:28 +08:00
male_words, female_words = ["he", "his", "him"], ["she", "her"]
def gender_of_sentence(sentence):
male_count = len([word for word in sentence.split() if word.lower() in male_words])
female_count = len([word for word in sentence.split() if word.lower() in female_words])
total = max(male_count + female_count, 1)
return {"male": male_count / total, "female": female_count / total}
2020-07-08 06:10:54 +08:00
2020-10-27 06:27:28 +08:00
iface = gr.Interface(
fn=gender_of_sentence, inputs=gr.inputs.Textbox(default="She went to his house to get her keys."),
outputs="label", interpretation="default")
iface.launch()
2020-07-08 06:10:54 +08:00
2019-02-20 14:26:48 +08:00
```
2020-10-27 06:27:28 +08:00
![gender_sentence_default_interpretation interface](demo/screenshots/gender_sentence_default_interpretation/1.gif)
Notice the `interpretation` keyword argument. We're going to use Gradio's default interpreter here. After you submit and click Interpret, you'll see the interface automatically highlights the parts of the text that contributed to the final output orange! The parts that conflict with the output are highlight blue.
Gradio's default interpretation works with single output type interfaces, where the output is either a Label or Number. We're working on expanding the default interpreter to be much more customizable and support more interfaces.
2019-02-20 14:26:48 +08:00
2020-10-27 06:27:28 +08:00
You can also write your own interpretation function. The demo below adds custom interpretation to the previous demo. This function will take the same inputs as the main wrapped function. The output of this interpretation function will be used to highlight the input of each input interface - therefore the number of outputs here corresponds to the number of input interfaces. To see the format for interpretation for each input interface, check the [Docs](https://gradio.app/docs).
````python
import gradio as gr
import re
male_words, female_words = ["he", "his", "him"], ["she", "her"]
def gender_of_sentence(sentence):
male_count = len([word for word in sentence.split() if word.lower() in male_words])
female_count = len([word for word in sentence.split() if word.lower() in female_words])
total = max(male_count + female_count, 1)
return {"male": male_count / total, "female": female_count / total}
def interpret_gender(sentence):
result = gender_of_sentence(sentence)
is_male = result["male"] > result["female"]
interpretation = []
for word in re.split('( )', sentence):
score = 0
token = word.lower()
if (is_male and token in male_words) or (not is_male and token in female_words):
score = 1
elif (is_male and token in female_words) or (not is_male and token in male_words):
score = -1
interpretation.append((word, score))
return interpretation
iface = gr.Interface(
fn=gender_of_sentence, inputs=gr.inputs.Textbox(default="She went to his house to get her keys."),
outputs="label", interpretation=interpret_gender)
iface.launch()
```
![gender_sentence_custom_interpretation interface](demo/screenshots/gender_sentence_custom_interpretation/1.gif)
2020-07-08 06:10:54 +08:00
2020-10-27 06:27:28 +08:00
## Contributing:
2020-07-08 06:10:54 +08:00
2020-06-19 00:40:19 +08:00
If you would like to contribute and your contribution is small, you can directly open a pull request (PR). If you would like to contribute a larger feature, we recommend first creating an issue with a proposed design for discussion. Please see our contributing guidelines for more info.
2020-10-27 06:27:28 +08:00
## License:
2020-07-03 13:21:10 +08:00
Gradio is licensed under the Apache License 2.0
2020-10-27 06:27:28 +08:00
## See more:
2020-07-08 06:20:30 +08:00
You can find many more examples (like GPT-2, model comparison, multiple inputs, and numerical interfaces) as well as more info on usage on our website: www.gradio.app
2019-02-20 12:46:44 +08:00
2020-07-08 06:10:54 +08:00
See, also, the accompanying paper: ["Gradio: Hassle-Free Sharing and Testing of ML Models in the Wild"](https://arxiv.org/pdf/1906.02569.pdf), *ICML HILL 2019*, and please use the citation below.
```
@article{abid2019gradio,
title={Gradio: Hassle-Free Sharing and Testing of ML Models in the Wild},
author={Abid, Abubakar and Abdalla, Ali and Abid, Ali and Khan, Dawood and Alfozan, Abdulrahman and Zou, James},
journal={arXiv preprint arXiv:1906.02569},
year={2019}
}
2020-10-27 06:27:28 +08:00
```