morinop commited on
Commit
82afe59
·
1 Parent(s): 3be228b

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +95 -0
app.py ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import torch
3
+ from PIL import Image
4
+ from torchvision import transforms
5
+
6
+ from diffusers import StableDiffusionImageVariationPipeline
7
+
8
+ def main(
9
+ input_im,
10
+ scale=3.0,
11
+ n_samples=4,
12
+ steps=25,
13
+ seed=0,
14
+ ):
15
+ generator = torch.Generator(device=device).manual_seed(int(seed))
16
+
17
+ tform = transforms.Compose([
18
+ transforms.ToTensor(),
19
+ transforms.Resize(
20
+ (224, 224),
21
+ interpolation=transforms.InterpolationMode.BICUBIC,
22
+ antialias=False,
23
+ ),
24
+ transforms.Normalize(
25
+ [0.48145466, 0.4578275, 0.40821073],
26
+ [0.26862954, 0.26130258, 0.27577711]),
27
+ ])
28
+ inp = tform(input_im).to(device)
29
+
30
+ images_list = pipe(
31
+ inp.tile(n_samples, 1, 1, 1),
32
+ guidance_scale=scale,
33
+ num_inference_steps=steps,
34
+ generator=generator,
35
+ )
36
+
37
+ images = []
38
+ for i, image in enumerate(images_list["images"]):
39
+ if(images_list["nsfw_content_detected"][i]):
40
+ safe_image = Image.open(r"unsafe.png")
41
+ images.append(safe_image)
42
+ else:
43
+ images.append(image)
44
+ return images
45
+
46
+
47
+ description = \
48
+ """
49
+ __Now using Image Variations v2!__
50
+ Generate variations on an input image using a fine-tuned version of Stable Diffision.
51
+ Trained by [Justin Pinkney](https://www.justinpinkney.com) ([@Buntworthy](https://twitter.com/Buntworthy)) at [Lambda](https://lambdalabs.com/)
52
+ This version has been ported to 🤗 Diffusers library, see more details on how to use this version in the [Lambda Diffusers repo](https://github.com/LambdaLabsML/lambda-diffusers).
53
+ For the original training code see [this repo](https://github.com/justinpinkney/stable-diffusion).
54
+ ![](https://raw.githubusercontent.com/justinpinkney/stable-diffusion/main/assets/im-vars-thin.jpg)
55
+ """
56
+
57
+ article = \
58
+ """
59
+ ## How does this work?
60
+ The normal Stable Diffusion model is trained to be conditioned on text input. This version has had the original text encoder (from CLIP) removed, and replaced with
61
+ the CLIP _image_ encoder instead. So instead of generating images based a text input, images are generated to match CLIP's embedding of the image.
62
+ This creates images which have the same rough style and content, but different details, in particular the composition is generally quite different.
63
+ This is a totally different approach to the img2img script of the original Stable Diffusion and gives very different results.
64
+ The model was fine tuned on the [LAION aethetics v2 6+ dataset](https://laion.ai/blog/laion-aesthetics/) to accept the new conditioning.
65
+ Training was done on 8xA100 GPUs on [Lambda GPU Cloud](https://lambdalabs.com/service/gpu-cloud).
66
+ More details are on the [model card](https://huggingface.co/lambdalabs/sd-image-variations-diffusers).
67
+ """
68
+
69
+ device = "cuda" if torch.cuda.is_available() else "cpu"
70
+ pipe = StableDiffusionImageVariationPipeline.from_pretrained(
71
+ "lambdalabs/sd-image-variations-diffusers",
72
+ )
73
+ pipe = pipe.to(device)
74
+
75
+ inputs = [
76
+ gr.Image(),
77
+ gr.Slider(0, 25, value=3, step=1, label="Guidance scale"),
78
+ gr.Slider(1, 4, value=1, step=1, label="Number images"),
79
+ gr.Slider(5, 50, value=25, step=5, label="Steps"),
80
+ gr.Number(0, label="Seed", precision=0)
81
+ ]
82
+ output = gr.Gallery(label="Generated variations")
83
+ output.style(grid=2)
84
+
85
+
86
+
87
+ demo = gr.Interface(
88
+ fn=main,
89
+ title="Stable Diffusion Image Variations",
90
+ description=description,
91
+ article=article,
92
+ inputs=inputs,
93
+ outputs=output
94
+ )
95
+ demo.launch()