Skip to content

Commit d04518e

Browse files
committed
resolved conflicts in use of batch vs iterations
2 parents 4ec21a5 + 91966e9 commit d04518e

File tree

4 files changed

+185
-159
lines changed

4 files changed

+185
-159
lines changed

scripts/dream_web.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import json
22
import base64
3+
import mimetypes
34
import os
45
from pytorch_lightning import logging
56
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
@@ -25,11 +26,15 @@ def do_GET(self):
2526
with open("./static/index.html", "rb") as content:
2627
self.wfile.write(content.read())
2728
elif os.path.exists("." + self.path):
28-
self.send_response(200)
29-
self.send_header("Content-type", "image/png")
30-
self.end_headers()
31-
with open("." + self.path, "rb") as content:
32-
self.wfile.write(content.read())
29+
mime_type = mimetypes.guess_type(self.path)[0]
30+
if mime_type is not None:
31+
self.send_response(200)
32+
self.send_header("Content-type", mime_type)
33+
self.end_headers()
34+
with open("." + self.path, "rb") as content:
35+
self.wfile.write(content.read())
36+
else:
37+
self.send_response(404)
3338
else:
3439
self.send_response(404)
3540

@@ -85,6 +90,12 @@ def do_POST(self):
8590
self.wfile.write(bytes(json.dumps(result), "utf-8"))
8691

8792
if __name__ == "__main__":
93+
# Change working directory to the stable-diffusion directory
94+
os.chdir(
95+
os.path.abspath(os.path.join(os.path.dirname( __file__ ), '..'))
96+
)
97+
98+
# Start server
8899
dream_server = ThreadingHTTPServer(("0.0.0.0", 9090), DreamServer)
89100
print("\n\n* Started Stable Diffusion dream server! Point your browser at http://localhost:9090 or use the host's DNS name or IP address. *")
90101

scripts/static/index.css

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
* {
2+
font-family: 'Arial';
3+
}
4+
#header {
5+
text-decoration: dotted underline;
6+
}
7+
#search {
8+
margin-top: 20vh;
9+
margin-left: auto;
10+
margin-right: auto;
11+
max-width: 800px;
12+
13+
text-align: center;
14+
}
15+
fieldset {
16+
border: none;
17+
}
18+
#fieldset-search {
19+
display: flex;
20+
}
21+
#prompt {
22+
flex-grow: 1;
23+
24+
border-radius: 20px 0px 0px 20px;
25+
padding: 5px 10px 5px 10px;
26+
border: 1px solid black;
27+
border-right: none;
28+
outline: none;
29+
}
30+
#submit {
31+
border-radius: 0px 20px 20px 0px;
32+
padding: 5px 10px 5px 10px;
33+
border: 1px solid black;
34+
}
35+
#results {
36+
text-align: center;
37+
max-width: 1000px;
38+
margin: auto;
39+
padding-top: 10px;
40+
}
41+
img {
42+
cursor: pointer;
43+
height: 30vh;
44+
border-radius: 5px;
45+
margin: 10px;
46+
}
47+
#fieldset-config {
48+
line-height:2em;
49+
}
50+
input[type="number"] {
51+
width: 60px;
52+
}
53+
#seed {
54+
width: 150px;
55+
}
56+
hr {
57+
width: 200px;
58+
}
59+
label {
60+
white-space: nowrap;
61+
}

scripts/static/index.js

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
function toBase64(file) {
2+
return new Promise((resolve, reject) => {
3+
const r = new FileReader();
4+
r.readAsDataURL(file);
5+
r.onload = () => resolve(r.result);
6+
r.onerror = (error) => reject(error);
7+
});
8+
}
9+
10+
function appendOutput(output) {
11+
let outputNode = document.createElement("img");
12+
outputNode.src = output[0];
13+
14+
let outputConfig = output[2];
15+
let altText = output[1].toString() + " | " + outputConfig.prompt;
16+
outputNode.alt = altText;
17+
outputNode.title = altText;
18+
19+
// Reload image config
20+
outputNode.addEventListener('click', () => {
21+
let form = document.querySelector("#generate-form");
22+
for (const [k, v] of new FormData(form)) {
23+
form.querySelector(`*[name=${k}]`).value = outputConfig[k];
24+
}
25+
document.querySelector("#seed").value = output[1];
26+
27+
saveFields(document.querySelector("#generate-form"));
28+
});
29+
30+
document.querySelector("#results").prepend(outputNode);
31+
}
32+
33+
function appendOutputs(outputs) {
34+
for (const output of outputs) {
35+
appendOutput(output);
36+
}
37+
}
38+
39+
function saveFields(form) {
40+
for (const [k, v] of new FormData(form)) {
41+
if (typeof v !== 'object') { // Don't save 'file' type
42+
localStorage.setItem(k, v);
43+
}
44+
}
45+
}
46+
function loadFields(form) {
47+
for (const [k, v] of new FormData(form)) {
48+
const item = localStorage.getItem(k);
49+
if (item != null) {
50+
form.querySelector(`*[name=${k}]`).value = item;
51+
}
52+
}
53+
}
54+
55+
async function generateSubmit(form) {
56+
const prompt = document.querySelector("#prompt").value;
57+
58+
// Convert file data to base64
59+
let formData = Object.fromEntries(new FormData(form));
60+
formData.initimg = formData.initimg.name !== '' ? await toBase64(formData.initimg) : null;
61+
62+
// Post as JSON
63+
fetch(form.action, {
64+
method: form.method,
65+
body: JSON.stringify(formData),
66+
}).then(async (result) => {
67+
let data = await result.json();
68+
69+
// Re-enable form, remove no-results-message
70+
form.querySelector('fieldset').removeAttribute('disabled');
71+
document.querySelector("#prompt").value = prompt;
72+
73+
if (data.outputs.length != 0) {
74+
document.querySelector("#no-results-message")?.remove();
75+
appendOutputs(data.outputs);
76+
} else {
77+
alert("Error occurred while generating.");
78+
}
79+
});
80+
81+
// Disable form while generating
82+
form.querySelector('fieldset').setAttribute('disabled','');
83+
document.querySelector("#prompt").value = `Generating: "${prompt}"`;
84+
}
85+
86+
window.onload = () => {
87+
document.querySelector("#generate-form").addEventListener('submit', (e) => {
88+
e.preventDefault();
89+
const form = e.target;
90+
91+
generateSubmit(form);
92+
});
93+
document.querySelector("#generate-form").addEventListener('change', (e) => {
94+
saveFields(e.target.form);
95+
});
96+
document.querySelector("#reset").addEventListener('click', (e) => {
97+
document.querySelector("#seed").value = -1;
98+
saveFields(e.target.form);
99+
});
100+
loadFields(document.querySelector("#generate-form"));
101+
};

static/index.html

Lines changed: 7 additions & 154 deletions
Original file line numberDiff line numberDiff line change
@@ -2,170 +2,23 @@
22
<head>
33
<title>Stable Diffusion Dream Server</title>
44
<link rel="icon" href="data:,">
5-
<style>
6-
* {
7-
font-family: 'Arial';
8-
}
9-
#header {
10-
text-decoration: dotted underline;
11-
}
12-
#search {
13-
margin-top: 20vh;
14-
text-align: center;
15-
}
16-
fieldset {
17-
border: none;
18-
}
19-
#prompt {
20-
width: 500px;
21-
border-radius: 20px 0px 0px 20px;
22-
padding: 5px 10px 5px 10px;
23-
border: 1px solid black;
24-
outline: none;
25-
}
26-
#submit {
27-
border-radius: 0px 20px 20px 0px;
28-
padding: 5px 10px 5px 10px;
29-
border: 1px solid black;
30-
}
31-
#results {
32-
text-align: center;
33-
padding-left: 20vw;
34-
padding-right: 20vw;
35-
padding-top: 10px;
36-
}
37-
img {
38-
cursor: pointer;
39-
height: 30vh;
40-
border-radius: 5px;
41-
margin: 10px;
42-
}
43-
#generate-config {
44-
line-height:2em;
45-
}
46-
input[type="number"] {
47-
width: 60px;
48-
}
49-
#seed {
50-
width: 150px;
51-
}
52-
</style>
53-
<script>
54-
function toBase64(file) {
55-
return new Promise((resolve, reject) => {
56-
const r = new FileReader();
57-
r.readAsDataURL(file);
58-
r.onload = () => resolve(r.result);
59-
r.onerror = (error) => reject(error);
60-
});
61-
}
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
626

63-
function appendOutput(output) {
64-
let outputNode = document.createElement("img");
65-
outputNode.src = output[0];
66-
67-
let outputConfig = output[2];
68-
let altText = output[1].toString() + " | " + outputConfig.prompt;
69-
outputNode.alt = altText;
70-
outputNode.title = altText;
71-
72-
// Reload image config
73-
outputNode.addEventListener('click', () => {
74-
let form = document.querySelector("#generate-form");
75-
for (const [k, v] of new FormData(form)) {
76-
form.querySelector(`*[name=${k}]`).value = outputConfig[k];
77-
}
78-
document.querySelector("#seed").value = output[1];
79-
80-
saveFields(document.querySelector("#generate-form"));
81-
});
82-
83-
document.querySelector("#results").prepend(outputNode);
84-
}
85-
86-
function appendOutputs(outputs) {
87-
for (const output of outputs) {
88-
appendOutput(output);
89-
}
90-
}
91-
92-
function saveFields(form) {
93-
for (const [k, v] of new FormData(form)) {
94-
if (typeof v !== 'object') { // Don't save 'file' type
95-
localStorage.setItem(k, v);
96-
}
97-
}
98-
}
99-
function loadFields(form) {
100-
for (const [k, v] of new FormData(form)) {
101-
const item = localStorage.getItem(k);
102-
if (item != null) {
103-
form.querySelector(`*[name=${k}]`).value = item;
104-
}
105-
}
106-
}
107-
108-
async function generateSubmit(form) {
109-
const prompt = document.querySelector("#prompt").value;
110-
111-
// Convert file data to base64
112-
let formData = Object.fromEntries(new FormData(form));
113-
formData.initimg = formData.initimg.name !== '' ? await toBase64(formData.initimg) : null;
114-
115-
// Post as JSON
116-
fetch(form.action, {
117-
method: form.method,
118-
body: JSON.stringify(formData),
119-
}).then(async (result) => {
120-
let data = await result.json();
121-
122-
// Re-enable form, remove no-results-message
123-
form.querySelector('fieldset').removeAttribute('disabled');
124-
document.querySelector("#prompt").value = prompt;
125-
126-
if (data.outputs.length != 0) {
127-
document.querySelector("#no-results-message")?.remove();
128-
appendOutputs(data.outputs);
129-
} else {
130-
alert("Error occurred while generating.");
131-
}
132-
});
133-
134-
// Disable form while generating
135-
form.querySelector('fieldset').setAttribute('disabled','');
136-
document.querySelector("#prompt").value = `Generating: "${prompt}"`;
137-
}
138-
139-
window.onload = () => {
140-
document.querySelector("#generate-form").addEventListener('submit', (e) => {
141-
e.preventDefault();
142-
const form = e.target;
143-
144-
generateSubmit(form);
145-
});
146-
document.querySelector("#generate-form").addEventListener('change', (e) => {
147-
saveFields(e.target.form);
148-
});
149-
document.querySelector("#reset").addEventListener('click', (e) => {
150-
document.querySelector("#seed").value = -1;
151-
saveFields(e.target.form);
152-
});
153-
loadFields(document.querySelector("#generate-form"));
154-
};
155-
</script>
7+
<link rel="stylesheet" href="scripts/static/index.css">
8+
<script src="scripts/static/index.js"></script>
1569
</head>
15710
<body>
15811
<div id="search">
15912
<h2 id="header">Stable Diffusion Dream Server</h2>
16013

16114
<form id="generate-form" method="post" action="#">
162-
<fieldset>
15+
<fieldset id="fieldset-search">
16316
<input type="text" id="prompt" name="prompt">
16417
<input type="submit" id="submit" value="Generate">
16518
</fieldset>
166-
<fieldset id="generate-config">
19+
<fieldset id="fieldset-config">
16720
<label for="iterations">Images to generate:</label>
168-
<input value="1" type="number" id="iterations" name="iterations">
21+
<input value="1" type="number" id="batch" name="batch">
16922
<label for="steps">Steps:</label>
17023
<input value="50" type="number" id="steps" name="steps">
17124
<label for="cfgscale">Cfg Scale:</label>
@@ -185,7 +38,7 @@ <h2 id="header">Stable Diffusion Dream Server</h2>
18538
</form>
18639
<div id="about">For news and support for this web service, visit our <a href="http://github.com/lstein/stable-diffusion">GitHub site</a></div>
18740
</div>
188-
<hr style="width: 200px">
41+
<hr>
18942
<div id="results">
19043
<div id="no-results-message">
19144
<i><p>No results...</p></i>

0 commit comments

Comments
 (0)