import gradio as gr from PIL import Image import os def get_images(path): images = [Image.open(os.path.join(path,im)) for im in os.listdir(path)] paths = os.listdir(path) return([(im, path) for im, path in zip(images,paths)]) with gr.Blocks() as demo: gr.Markdown(""" ## Stable Bias: Analyzing Societal Representations in Diffusion Models """) gr.HTML('''

This is the demo page for the "Stable Bias" paper, which aims to explore and quantify social biases in text-to-image systems.
This work was done by Alexandra Sasha Luccioni (Hugging Face) , Christopher Akiki (ScaDS.AI, Leipzig University), Margaret Mitchell (Hugging Face) and Yacine Jernite (Hugging Face) .

''') examples_path= "images/examples" examples_gallery = gr.Gallery(get_images(examples_path), label="Example images", show_label=False, elem_id="gallery").style(grid=[1,6], height="auto") gr.HTML('''

Example images generated by three text-to-image models (Dall-E 2, Stable Diffusion v1.4 and v.2).

''') gr.HTML('''

As AI-enabled Text-to-Image systems are becoming increasingly used, characterizing the social biases they exhibit is a necessary first step to lowering their risk of discriminatory outcomes.
We propose a new method for exploring and quantifying social biases in these kinds of systems by directly comparing collections of generated images designed to showcase a system’s variation across social attributes — gender and ethnicity — and target attributes for bias evaluation — professions and gender-coded adjectives.
We compare three models: Stable Diffusion v.1.4, Stable Diffusion v.2., and Dall-E 2 and find clear evidence of ethnicity and gender biases .
You can explore these findings in the collapsed sections below, which present our findings:

''') with gr.Accordion("Identity group results (ethnicity and gender)", open=False): gr.HTML('''

One of the approaches that we adopted in our work is hierarchical clustering of the images generated by the text-to-image systems in response to prompts that include identity terms with regards to ethnicity and gender.
We computed 3 different numbers of clusters (12, 24 and 48) and created an Identity Representation Demo that allows for the exploration of the different clusters and their contents.

''') with gr.Row(): impath = "images/identities" identity_gallery = gr.Gallery([os.path.join(impath,im) for im in os.listdir(impath)], label="Identity cluster images", show_label=False, elem_id="gallery" ).style(grid=3, height="auto") gr.HTML('''

TO DO: talk about what we see above.
Continue exploring the demo on your own to uncover other patterns!

''') with gr.Accordion("Bias Exploration", open=False): gr.HTML('''

We queried our 3 systems with prompts that included names of professions, and one of our goals was to explore the social biases of these models.
Since artificial depictions of fictive humans have no inherent gender or ethnicity nor do they belong to socially-constructed groups, we pursued our analysis without ascribing gender and ethnicity categories to the images generated. We do this by calculating the correlations between the professions and the different identity clusters that we identified.
Using both the Diffusion Cluster Explorer and the Identity Representation Demo , we can see which clusters are most correlated with each profession and what identities are in these clusters.

''') with gr.Row(): gr.HTML('''

Using the Diffusion Cluster Explorer , we can see that the top cluster for the CEO and director professions is Cluster 4:

''') ceo_img = gr.Image(Image.open("images/bias/ceo_dir.png"), label = "CEO Image", show_label=False) with gr.Row(): gr.HTML('''

Going back to the Identity Representation Demo , we can see that the most represented gender term is man (56% of the cluster) and White (29% of the cluster).

''') cluster4 = gr.Image(Image.open("images/bias/Cluster4.png"), label = "Cluster 4 Image", show_label=False) with gr.Row(): gr.HTML('''

If we look at the cluster representation of professions such as social assistant and social worker, we can observe that the former is best represented by Cluster 2, whereas the latter has a more uniform representation across multiple clusters:

''') social_img = gr.Image(Image.open("images/bias/social.png"), label = "social image", show_label=False) with gr.Row(): gr.HTML('''

Cluster 2 is best represented by the gender term is woman (81%) as well as Latinx (19%).

''') cluster4 = gr.Image(Image.open("images/bias/Cluster2.png"), label = "Cluster 2 Image", show_label=False) with gr.Row(): gr.HTML('''

TO DO: talk about what we see above.
Continue exploring the demo on your own to uncover other patterns!

''') with gr.Accordion("Comparing model generations", open=False): gr.HTML('''

One of the goals of our study was allowing users to compare model generations across professions in an open-ended way, uncovering patterns and trends on their own. This is why we created the Diffusion Bias Explorer and the Average Diffusion Faces tools.
We show some of their functionalities below:

''') with gr.Row(): with gr.Column(): impath = "images/biasexplorer" biasexplorer_gallery = gr.Gallery([os.path.join(impath,im) for im in os.listdir(impath)], label="Bias explorer images", show_label=False, elem_id="gallery").style(grid=2, height="auto") with gr.Column(): gr.HTML('''

Comparing generations both between two models and within a single model can help uncover trends and patterns that are hard to measure using quantitative approaches.

''') with gr.Row(): impath = "images/averagefaces" average_gallery = gr.Gallery([os.path.join(impath,im) for im in os.listdir(impath)], label="Average Face images", show_label=False, elem_id="gallery").style(grid=3, height="auto") gr.HTML('''

Looking at the average faces for a given profession across multiple models can help see the dominant characteristics of that profession, as well as how much variation there is (based on how fuzzy the image is).

''') with gr.Accordion("Exploring the color space of generated images", open=False): gr.HTML('''

TODO Chris

''') with gr.Accordion("Exploring the nearest neighbors of generated images", open=False): gr.HTML('''

TODO Chris

''') gr.Markdown(""" ### All of the tools created as part of this project: """) gr.HTML('''

Average Diffusion Faces
Diffusion Bias Explorer
Diffusion Cluster Explorer Identity Representation Demo BoVW Nearest Neighbors Explorer
BoVW Professions Explorer
Colorfulness Profession Explorer
Colorfulness Identities Explorer

''') gr.Interface.load("spaces/society-ethics/DiffusionBiasExplorer") demo.launch(debug=True)