Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
S
Stable Diffusion Webui
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
novelai-storage
Stable Diffusion Webui
Commits
68931242
Commit
68931242
authored
Oct 24, 2022
by
不会画画的中医不是好程序员
Committed by
GitHub
Oct 24, 2022
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'AUTOMATIC1111:master' into Inspiron
parents
f132923d
e9a410b5
Changes
9
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
1104 additions
and
323 deletions
+1104
-323
launch.py
launch.py
+1
-1
localizations/ko_KR.json
localizations/ko_KR.json
+497
-0
modules/bsrgan_model.py
modules/bsrgan_model.py
+0
-76
modules/bsrgan_model_arch.py
modules/bsrgan_model_arch.py
+0
-102
modules/esrgan_model.py
modules/esrgan_model.py
+128
-62
modules/esrgan_model_arch.py
modules/esrgan_model_arch.py
+435
-52
modules/hypernetworks/hypernetwork.py
modules/hypernetworks/hypernetwork.py
+24
-16
modules/processing.py
modules/processing.py
+17
-14
webui.py
webui.py
+2
-0
No files found.
launch.py
View file @
68931242
...
...
@@ -111,7 +111,7 @@ def prepare_enviroment():
gfpgan_package
=
os
.
environ
.
get
(
'GFPGAN_PACKAGE'
,
"git+https://github.com/TencentARC/GFPGAN.git@8d2447a2d918f8eba5a4a01463fd48e45126a379"
)
clip_package
=
os
.
environ
.
get
(
'CLIP_PACKAGE'
,
"git+https://github.com/openai/CLIP.git@d50d76daa670286dd6cacf3bcd80b5e4823fc8e1"
)
deepdanbooru_package
=
os
.
environ
.
get
(
'DEEPDANBOORU_PACKAGE'
,
"git+https://github.com/KichangKim/DeepDanbooru.git@
edf73df4cdaeea2cf00e9ac08bd8a9026b7a7b26
"
)
deepdanbooru_package
=
os
.
environ
.
get
(
'DEEPDANBOORU_PACKAGE'
,
"git+https://github.com/KichangKim/DeepDanbooru.git@
d91a2963bf87c6a770d74894667e9ffa9f6de7ff
"
)
xformers_windows_package
=
os
.
environ
.
get
(
'XFORMERS_WINDOWS_PACKAGE'
,
'https://github.com/C43H66N12O12S2/stable-diffusion-webui/releases/download/f/xformers-0.0.14.dev0-cp310-cp310-win_amd64.whl'
)
...
...
localizations/ko_KR.json
0 → 100644
View file @
68931242
This diff is collapsed.
Click to expand it.
modules/bsrgan_model.py
deleted
100644 → 0
View file @
f132923d
import
os.path
import
sys
import
traceback
import
PIL.Image
import
numpy
as
np
import
torch
from
basicsr.utils.download_util
import
load_file_from_url
import
modules.upscaler
from
modules
import
devices
,
modelloader
from
modules.bsrgan_model_arch
import
RRDBNet
class
UpscalerBSRGAN
(
modules
.
upscaler
.
Upscaler
):
def
__init__
(
self
,
dirname
):
self
.
name
=
"BSRGAN"
self
.
model_name
=
"BSRGAN 4x"
self
.
model_url
=
"https://github.com/cszn/KAIR/releases/download/v1.0/BSRGAN.pth"
self
.
user_path
=
dirname
super
()
.
__init__
()
model_paths
=
self
.
find_models
(
ext_filter
=
[
".pt"
,
".pth"
])
scalers
=
[]
if
len
(
model_paths
)
==
0
:
scaler_data
=
modules
.
upscaler
.
UpscalerData
(
self
.
model_name
,
self
.
model_url
,
self
,
4
)
scalers
.
append
(
scaler_data
)
for
file
in
model_paths
:
if
"http"
in
file
:
name
=
self
.
model_name
else
:
name
=
modelloader
.
friendly_name
(
file
)
try
:
scaler_data
=
modules
.
upscaler
.
UpscalerData
(
name
,
file
,
self
,
4
)
scalers
.
append
(
scaler_data
)
except
Exception
:
print
(
f
"Error loading BSRGAN model: {file}"
,
file
=
sys
.
stderr
)
print
(
traceback
.
format_exc
(),
file
=
sys
.
stderr
)
self
.
scalers
=
scalers
def
do_upscale
(
self
,
img
:
PIL
.
Image
,
selected_file
):
torch
.
cuda
.
empty_cache
()
model
=
self
.
load_model
(
selected_file
)
if
model
is
None
:
return
img
model
.
to
(
devices
.
device_bsrgan
)
torch
.
cuda
.
empty_cache
()
img
=
np
.
array
(
img
)
img
=
img
[:,
:,
::
-
1
]
img
=
np
.
moveaxis
(
img
,
2
,
0
)
/
255
img
=
torch
.
from_numpy
(
img
)
.
float
()
img
=
img
.
unsqueeze
(
0
)
.
to
(
devices
.
device_bsrgan
)
with
torch
.
no_grad
():
output
=
model
(
img
)
output
=
output
.
squeeze
()
.
float
()
.
cpu
()
.
clamp_
(
0
,
1
)
.
numpy
()
output
=
255.
*
np
.
moveaxis
(
output
,
0
,
2
)
output
=
output
.
astype
(
np
.
uint8
)
output
=
output
[:,
:,
::
-
1
]
torch
.
cuda
.
empty_cache
()
return
PIL
.
Image
.
fromarray
(
output
,
'RGB'
)
def
load_model
(
self
,
path
:
str
):
if
"http"
in
path
:
filename
=
load_file_from_url
(
url
=
self
.
model_url
,
model_dir
=
self
.
model_path
,
file_name
=
"
%
s.pth"
%
self
.
name
,
progress
=
True
)
else
:
filename
=
path
if
not
os
.
path
.
exists
(
filename
)
or
filename
is
None
:
print
(
f
"BSRGAN: Unable to load model from {filename}"
,
file
=
sys
.
stderr
)
return
None
model
=
RRDBNet
(
in_nc
=
3
,
out_nc
=
3
,
nf
=
64
,
nb
=
23
,
gc
=
32
,
sf
=
4
)
# define network
model
.
load_state_dict
(
torch
.
load
(
filename
),
strict
=
True
)
model
.
eval
()
for
k
,
v
in
model
.
named_parameters
():
v
.
requires_grad
=
False
return
model
modules/bsrgan_model_arch.py
deleted
100644 → 0
View file @
f132923d
import
functools
import
torch
import
torch.nn
as
nn
import
torch.nn.functional
as
F
import
torch.nn.init
as
init
def
initialize_weights
(
net_l
,
scale
=
1
):
if
not
isinstance
(
net_l
,
list
):
net_l
=
[
net_l
]
for
net
in
net_l
:
for
m
in
net
.
modules
():
if
isinstance
(
m
,
nn
.
Conv2d
):
init
.
kaiming_normal_
(
m
.
weight
,
a
=
0
,
mode
=
'fan_in'
)
m
.
weight
.
data
*=
scale
# for residual block
if
m
.
bias
is
not
None
:
m
.
bias
.
data
.
zero_
()
elif
isinstance
(
m
,
nn
.
Linear
):
init
.
kaiming_normal_
(
m
.
weight
,
a
=
0
,
mode
=
'fan_in'
)
m
.
weight
.
data
*=
scale
if
m
.
bias
is
not
None
:
m
.
bias
.
data
.
zero_
()
elif
isinstance
(
m
,
nn
.
BatchNorm2d
):
init
.
constant_
(
m
.
weight
,
1
)
init
.
constant_
(
m
.
bias
.
data
,
0.0
)
def
make_layer
(
block
,
n_layers
):
layers
=
[]
for
_
in
range
(
n_layers
):
layers
.
append
(
block
())
return
nn
.
Sequential
(
*
layers
)
class
ResidualDenseBlock_5C
(
nn
.
Module
):
def
__init__
(
self
,
nf
=
64
,
gc
=
32
,
bias
=
True
):
super
(
ResidualDenseBlock_5C
,
self
)
.
__init__
()
# gc: growth channel, i.e. intermediate channels
self
.
conv1
=
nn
.
Conv2d
(
nf
,
gc
,
3
,
1
,
1
,
bias
=
bias
)
self
.
conv2
=
nn
.
Conv2d
(
nf
+
gc
,
gc
,
3
,
1
,
1
,
bias
=
bias
)
self
.
conv3
=
nn
.
Conv2d
(
nf
+
2
*
gc
,
gc
,
3
,
1
,
1
,
bias
=
bias
)
self
.
conv4
=
nn
.
Conv2d
(
nf
+
3
*
gc
,
gc
,
3
,
1
,
1
,
bias
=
bias
)
self
.
conv5
=
nn
.
Conv2d
(
nf
+
4
*
gc
,
nf
,
3
,
1
,
1
,
bias
=
bias
)
self
.
lrelu
=
nn
.
LeakyReLU
(
negative_slope
=
0.2
,
inplace
=
True
)
# initialization
initialize_weights
([
self
.
conv1
,
self
.
conv2
,
self
.
conv3
,
self
.
conv4
,
self
.
conv5
],
0.1
)
def
forward
(
self
,
x
):
x1
=
self
.
lrelu
(
self
.
conv1
(
x
))
x2
=
self
.
lrelu
(
self
.
conv2
(
torch
.
cat
((
x
,
x1
),
1
)))
x3
=
self
.
lrelu
(
self
.
conv3
(
torch
.
cat
((
x
,
x1
,
x2
),
1
)))
x4
=
self
.
lrelu
(
self
.
conv4
(
torch
.
cat
((
x
,
x1
,
x2
,
x3
),
1
)))
x5
=
self
.
conv5
(
torch
.
cat
((
x
,
x1
,
x2
,
x3
,
x4
),
1
))
return
x5
*
0.2
+
x
class
RRDB
(
nn
.
Module
):
'''Residual in Residual Dense Block'''
def
__init__
(
self
,
nf
,
gc
=
32
):
super
(
RRDB
,
self
)
.
__init__
()
self
.
RDB1
=
ResidualDenseBlock_5C
(
nf
,
gc
)
self
.
RDB2
=
ResidualDenseBlock_5C
(
nf
,
gc
)
self
.
RDB3
=
ResidualDenseBlock_5C
(
nf
,
gc
)
def
forward
(
self
,
x
):
out
=
self
.
RDB1
(
x
)
out
=
self
.
RDB2
(
out
)
out
=
self
.
RDB3
(
out
)
return
out
*
0.2
+
x
class
RRDBNet
(
nn
.
Module
):
def
__init__
(
self
,
in_nc
=
3
,
out_nc
=
3
,
nf
=
64
,
nb
=
23
,
gc
=
32
,
sf
=
4
):
super
(
RRDBNet
,
self
)
.
__init__
()
RRDB_block_f
=
functools
.
partial
(
RRDB
,
nf
=
nf
,
gc
=
gc
)
self
.
sf
=
sf
self
.
conv_first
=
nn
.
Conv2d
(
in_nc
,
nf
,
3
,
1
,
1
,
bias
=
True
)
self
.
RRDB_trunk
=
make_layer
(
RRDB_block_f
,
nb
)
self
.
trunk_conv
=
nn
.
Conv2d
(
nf
,
nf
,
3
,
1
,
1
,
bias
=
True
)
#### upsampling
self
.
upconv1
=
nn
.
Conv2d
(
nf
,
nf
,
3
,
1
,
1
,
bias
=
True
)
if
self
.
sf
==
4
:
self
.
upconv2
=
nn
.
Conv2d
(
nf
,
nf
,
3
,
1
,
1
,
bias
=
True
)
self
.
HRconv
=
nn
.
Conv2d
(
nf
,
nf
,
3
,
1
,
1
,
bias
=
True
)
self
.
conv_last
=
nn
.
Conv2d
(
nf
,
out_nc
,
3
,
1
,
1
,
bias
=
True
)
self
.
lrelu
=
nn
.
LeakyReLU
(
negative_slope
=
0.2
,
inplace
=
True
)
def
forward
(
self
,
x
):
fea
=
self
.
conv_first
(
x
)
trunk
=
self
.
trunk_conv
(
self
.
RRDB_trunk
(
fea
))
fea
=
fea
+
trunk
fea
=
self
.
lrelu
(
self
.
upconv1
(
F
.
interpolate
(
fea
,
scale_factor
=
2
,
mode
=
'nearest'
)))
if
self
.
sf
==
4
:
fea
=
self
.
lrelu
(
self
.
upconv2
(
F
.
interpolate
(
fea
,
scale_factor
=
2
,
mode
=
'nearest'
)))
out
=
self
.
conv_last
(
self
.
lrelu
(
self
.
HRconv
(
fea
)))
return
out
\ No newline at end of file
modules/esrgan_model.py
View file @
68931242
...
...
@@ -11,62 +11,109 @@ from modules.upscaler import Upscaler, UpscalerData
from
modules.shared
import
opts
def
fix_model_layers
(
crt_model
,
pretrained_net
):
# this code is adapted from https://github.com/xinntao/ESRGAN
if
'conv_first.weight'
in
pretrained_net
:
return
pretrained_net
if
'model.0.weight'
not
in
pretrained_net
:
is_realesrgan
=
"params_ema"
in
pretrained_net
and
'body.0.rdb1.conv1.weight'
in
pretrained_net
[
"params_ema"
]
if
is_realesrgan
:
raise
Exception
(
"The file is a RealESRGAN model, it can't be used as a ESRGAN model."
)
else
:
raise
Exception
(
"The file is not a ESRGAN model."
)
crt_net
=
crt_model
.
state_dict
()
load_net_clean
=
{}
for
k
,
v
in
pretrained_net
.
items
():
if
k
.
startswith
(
'module.'
):
load_net_clean
[
k
[
7
:]]
=
v
else
:
load_net_clean
[
k
]
=
v
pretrained_net
=
load_net_clean
tbd
=
[]
for
k
,
v
in
crt_net
.
items
():
tbd
.
append
(
k
)
# directly copy
for
k
,
v
in
crt_net
.
items
():
if
k
in
pretrained_net
and
pretrained_net
[
k
]
.
size
()
==
v
.
size
():
crt_net
[
k
]
=
pretrained_net
[
k
]
tbd
.
remove
(
k
)
crt_net
[
'conv_first.weight'
]
=
pretrained_net
[
'model.0.weight'
]
crt_net
[
'conv_first.bias'
]
=
pretrained_net
[
'model.0.bias'
]
for
k
in
tbd
.
copy
():
if
'RDB'
in
k
:
ori_k
=
k
.
replace
(
'RRDB_trunk.'
,
'model.1.sub.'
)
if
'.weight'
in
k
:
ori_k
=
ori_k
.
replace
(
'.weight'
,
'.0.weight'
)
elif
'.bias'
in
k
:
ori_k
=
ori_k
.
replace
(
'.bias'
,
'.0.bias'
)
crt_net
[
k
]
=
pretrained_net
[
ori_k
]
tbd
.
remove
(
k
)
crt_net
[
'trunk_conv.weight'
]
=
pretrained_net
[
'model.1.sub.23.weight'
]
crt_net
[
'trunk_conv.bias'
]
=
pretrained_net
[
'model.1.sub.23.bias'
]
crt_net
[
'upconv1.weight'
]
=
pretrained_net
[
'model.3.weight'
]
crt_net
[
'upconv1.bias'
]
=
pretrained_net
[
'model.3.bias'
]
crt_net
[
'upconv2.weight'
]
=
pretrained_net
[
'model.6.weight'
]
crt_net
[
'upconv2.bias'
]
=
pretrained_net
[
'model.6.bias'
]
crt_net
[
'HRconv.weight'
]
=
pretrained_net
[
'model.8.weight'
]
crt_net
[
'HRconv.bias'
]
=
pretrained_net
[
'model.8.bias'
]
crt_net
[
'conv_last.weight'
]
=
pretrained_net
[
'model.10.weight'
]
crt_net
[
'conv_last.bias'
]
=
pretrained_net
[
'model.10.bias'
]
return
crt_net
def
mod2normal
(
state_dict
):
# this code is copied from https://github.com/victorca25/iNNfer
if
'conv_first.weight'
in
state_dict
:
crt_net
=
{}
items
=
[]
for
k
,
v
in
state_dict
.
items
():
items
.
append
(
k
)
crt_net
[
'model.0.weight'
]
=
state_dict
[
'conv_first.weight'
]
crt_net
[
'model.0.bias'
]
=
state_dict
[
'conv_first.bias'
]
for
k
in
items
.
copy
():
if
'RDB'
in
k
:
ori_k
=
k
.
replace
(
'RRDB_trunk.'
,
'model.1.sub.'
)
if
'.weight'
in
k
:
ori_k
=
ori_k
.
replace
(
'.weight'
,
'.0.weight'
)
elif
'.bias'
in
k
:
ori_k
=
ori_k
.
replace
(
'.bias'
,
'.0.bias'
)
crt_net
[
ori_k
]
=
state_dict
[
k
]
items
.
remove
(
k
)
crt_net
[
'model.1.sub.23.weight'
]
=
state_dict
[
'trunk_conv.weight'
]
crt_net
[
'model.1.sub.23.bias'
]
=
state_dict
[
'trunk_conv.bias'
]
crt_net
[
'model.3.weight'
]
=
state_dict
[
'upconv1.weight'
]
crt_net
[
'model.3.bias'
]
=
state_dict
[
'upconv1.bias'
]
crt_net
[
'model.6.weight'
]
=
state_dict
[
'upconv2.weight'
]
crt_net
[
'model.6.bias'
]
=
state_dict
[
'upconv2.bias'
]
crt_net
[
'model.8.weight'
]
=
state_dict
[
'HRconv.weight'
]
crt_net
[
'model.8.bias'
]
=
state_dict
[
'HRconv.bias'
]
crt_net
[
'model.10.weight'
]
=
state_dict
[
'conv_last.weight'
]
crt_net
[
'model.10.bias'
]
=
state_dict
[
'conv_last.bias'
]
state_dict
=
crt_net
return
state_dict
def
resrgan2normal
(
state_dict
,
nb
=
23
):
# this code is copied from https://github.com/victorca25/iNNfer
if
"conv_first.weight"
in
state_dict
and
"body.0.rdb1.conv1.weight"
in
state_dict
:
crt_net
=
{}
items
=
[]
for
k
,
v
in
state_dict
.
items
():
items
.
append
(
k
)
crt_net
[
'model.0.weight'
]
=
state_dict
[
'conv_first.weight'
]
crt_net
[
'model.0.bias'
]
=
state_dict
[
'conv_first.bias'
]
for
k
in
items
.
copy
():
if
"rdb"
in
k
:
ori_k
=
k
.
replace
(
'body.'
,
'model.1.sub.'
)
ori_k
=
ori_k
.
replace
(
'.rdb'
,
'.RDB'
)
if
'.weight'
in
k
:
ori_k
=
ori_k
.
replace
(
'.weight'
,
'.0.weight'
)
elif
'.bias'
in
k
:
ori_k
=
ori_k
.
replace
(
'.bias'
,
'.0.bias'
)
crt_net
[
ori_k
]
=
state_dict
[
k
]
items
.
remove
(
k
)
crt_net
[
f
'model.1.sub.{nb}.weight'
]
=
state_dict
[
'conv_body.weight'
]
crt_net
[
f
'model.1.sub.{nb}.bias'
]
=
state_dict
[
'conv_body.bias'
]
crt_net
[
'model.3.weight'
]
=
state_dict
[
'conv_up1.weight'
]
crt_net
[
'model.3.bias'
]
=
state_dict
[
'conv_up1.bias'
]
crt_net
[
'model.6.weight'
]
=
state_dict
[
'conv_up2.weight'
]
crt_net
[
'model.6.bias'
]
=
state_dict
[
'conv_up2.bias'
]
crt_net
[
'model.8.weight'
]
=
state_dict
[
'conv_hr.weight'
]
crt_net
[
'model.8.bias'
]
=
state_dict
[
'conv_hr.bias'
]
crt_net
[
'model.10.weight'
]
=
state_dict
[
'conv_last.weight'
]
crt_net
[
'model.10.bias'
]
=
state_dict
[
'conv_last.bias'
]
state_dict
=
crt_net
return
state_dict
def
infer_params
(
state_dict
):
# this code is copied from https://github.com/victorca25/iNNfer
scale2x
=
0
scalemin
=
6
n_uplayer
=
0
plus
=
False
for
block
in
list
(
state_dict
):
parts
=
block
.
split
(
"."
)
n_parts
=
len
(
parts
)
if
n_parts
==
5
and
parts
[
2
]
==
"sub"
:
nb
=
int
(
parts
[
3
])
elif
n_parts
==
3
:
part_num
=
int
(
parts
[
1
])
if
(
part_num
>
scalemin
and
parts
[
0
]
==
"model"
and
parts
[
2
]
==
"weight"
):
scale2x
+=
1
if
part_num
>
n_uplayer
:
n_uplayer
=
part_num
out_nc
=
state_dict
[
block
]
.
shape
[
0
]
if
not
plus
and
"conv1x1"
in
block
:
plus
=
True
nf
=
state_dict
[
"model.0.weight"
]
.
shape
[
0
]
in_nc
=
state_dict
[
"model.0.weight"
]
.
shape
[
1
]
out_nc
=
out_nc
scale
=
2
**
scale2x
return
in_nc
,
out_nc
,
nf
,
nb
,
plus
,
scale
class
UpscalerESRGAN
(
Upscaler
):
def
__init__
(
self
,
dirname
):
...
...
@@ -109,20 +156,39 @@ class UpscalerESRGAN(Upscaler):
print
(
"Unable to load
%
s from
%
s"
%
(
self
.
model_path
,
filename
))
return
None
pretrained_net
=
torch
.
load
(
filename
,
map_location
=
'cpu'
if
devices
.
device_esrgan
.
type
==
'mps'
else
None
)
crt_model
=
arch
.
RRDBNet
(
3
,
3
,
64
,
23
,
gc
=
32
)
state_dict
=
torch
.
load
(
filename
,
map_location
=
'cpu'
if
devices
.
device_esrgan
.
type
==
'mps'
else
None
)
if
"params_ema"
in
state_dict
:
state_dict
=
state_dict
[
"params_ema"
]
elif
"params"
in
state_dict
:
state_dict
=
state_dict
[
"params"
]
num_conv
=
16
if
"realesr-animevideov3"
in
filename
else
32
model
=
arch
.
SRVGGNetCompact
(
num_in_ch
=
3
,
num_out_ch
=
3
,
num_feat
=
64
,
num_conv
=
num_conv
,
upscale
=
4
,
act_type
=
'prelu'
)
model
.
load_state_dict
(
state_dict
)
model
.
eval
()
return
model
if
"body.0.rdb1.conv1.weight"
in
state_dict
and
"conv_first.weight"
in
state_dict
:
nb
=
6
if
"RealESRGAN_x4plus_anime_6B"
in
filename
else
23
state_dict
=
resrgan2normal
(
state_dict
,
nb
)
elif
"conv_first.weight"
in
state_dict
:
state_dict
=
mod2normal
(
state_dict
)
elif
"model.0.weight"
not
in
state_dict
:
raise
Exception
(
"The file is not a recognized ESRGAN model."
)
in_nc
,
out_nc
,
nf
,
nb
,
plus
,
mscale
=
infer_params
(
state_dict
)
pretrained_net
=
fix_model_layers
(
crt_model
,
pretrained_net
)
crt_model
.
load_state_dict
(
pretrained_ne
t
)
crt_
model
.
eval
()
model
=
arch
.
RRDBNet
(
in_nc
=
in_nc
,
out_nc
=
out_nc
,
nf
=
nf
,
nb
=
nb
,
upscale
=
mscale
,
plus
=
plus
)
model
.
load_state_dict
(
state_dic
t
)
model
.
eval
()
return
crt_
model
return
model
def
upscale_without_tiling
(
model
,
img
):
img
=
np
.
array
(
img
)
img
=
img
[:,
:,
::
-
1
]
img
=
np
.
moveaxis
(
img
,
2
,
0
)
/
255
img
=
np
.
ascontiguousarray
(
np
.
transpose
(
img
,
(
2
,
0
,
1
))
)
/
255
img
=
torch
.
from_numpy
(
img
)
.
float
()
img
=
img
.
unsqueeze
(
0
)
.
to
(
devices
.
device_esrgan
)
with
torch
.
no_grad
():
...
...
modules/esrgan_model_arch.py
View file @
68931242
This diff is collapsed.
Click to expand it.
modules/hypernetworks/hypernetwork.py
View file @
68931242
...
...
@@ -16,6 +16,7 @@ from modules.textual_inversion import textual_inversion
from
modules.textual_inversion.learn_schedule
import
LearnRateScheduler
from
torch
import
einsum
from
collections
import
defaultdict
,
deque
from
statistics
import
stdev
,
mean
class
HypernetworkModule
(
torch
.
nn
.
Module
):
...
...
@@ -269,19 +270,18 @@ def stack_conds(conds):
return
torch
.
stack
(
conds
)
def
log_statistics
(
loss_info
:
dict
,
key
,
value
):
if
key
not
in
loss_info
:
loss_info
[
key
]
=
[
value
]
else
:
loss_info
[
key
]
.
append
(
value
)
if
len
(
loss_info
)
>
1024
:
loss_info
.
pop
(
0
)
def
statistics
(
data
):
total_information
=
f
"loss:{mean(data):.3f}"
+
u"
\u00B1
"
+
f
"({stdev(data)/ (len(data)**0.5):.3f})"
if
len
(
data
)
<
2
:
std
=
0
else
:
std
=
stdev
(
data
)
total_information
=
f
"loss:{mean(data):.3f}"
+
u"
\u00B1
"
+
f
"({std/ (len(data) ** 0.5):.3f})"
recent_data
=
data
[
-
32
:]
recent_information
=
f
"recent 32 loss:{mean(recent_data):.3f}"
+
u"
\u00B1
"
+
f
"({stdev(recent_data)/ (len(recent_data)**0.5):.3f})"
if
len
(
recent_data
)
<
2
:
std
=
0
else
:
std
=
stdev
(
recent_data
)
recent_information
=
f
"recent 32 loss:{mean(recent_data):.3f}"
+
u"
\u00B1
"
+
f
"({std / (len(recent_data) ** 0.5):.3f})"
return
total_information
,
recent_information
...
...
@@ -290,7 +290,7 @@ def report_statistics(loss_info:dict):
for
key
in
keys
:
try
:
print
(
"Loss statistics for file "
+
key
)
info
,
recent
=
statistics
(
l
oss_info
[
key
]
)
info
,
recent
=
statistics
(
l
ist
(
loss_info
[
key
])
)
print
(
info
)
print
(
recent
)
except
Exception
as
e
:
...
...
@@ -341,8 +341,9 @@ def train_hypernetwork(hypernetwork_name, learn_rate, batch_size, data_root, log
weight
.
requires_grad
=
True
size
=
len
(
ds
.
indexes
)
loss_dict
=
{}
loss_dict
=
defaultdict
(
lambda
:
deque
(
maxlen
=
1024
))
losses
=
torch
.
zeros
((
size
,))
previous_mean_losses
=
[
0
]
previous_mean_loss
=
0
print
(
"Mean loss of {} elements"
.
format
(
size
))
...
...
@@ -364,7 +365,8 @@ def train_hypernetwork(hypernetwork_name, learn_rate, batch_size, data_root, log
for
i
,
entries
in
pbar
:
hypernetwork
.
step
=
i
+
ititial_step
if
len
(
loss_dict
)
>
0
:
previous_mean_loss
=
sum
(
i
[
-
1
]
for
i
in
loss_dict
.
values
())
/
len
(
loss_dict
)
previous_mean_losses
=
[
i
[
-
1
]
for
i
in
loss_dict
.
values
()]
previous_mean_loss
=
mean
(
previous_mean_losses
)
scheduler
.
apply
(
optimizer
,
hypernetwork
.
step
)
if
scheduler
.
finished
:
...
...
@@ -383,7 +385,7 @@ def train_hypernetwork(hypernetwork_name, learn_rate, batch_size, data_root, log
losses
[
hypernetwork
.
step
%
losses
.
shape
[
0
]]
=
loss
.
item
()
for
entry
in
entries
:
lo
g_statistics
(
loss_dict
,
entry
.
filename
,
loss
.
item
())
lo
ss_dict
[
entry
.
filename
]
.
append
(
loss
.
item
())
optimizer
.
zero_grad
()
weights
[
0
]
.
grad
=
None
...
...
@@ -399,7 +401,13 @@ def train_hypernetwork(hypernetwork_name, learn_rate, batch_size, data_root, log
if
torch
.
isnan
(
losses
[
hypernetwork
.
step
%
losses
.
shape
[
0
]]):
raise
RuntimeError
(
"Loss diverged."
)
pbar
.
set_description
(
f
"dataset loss: {previous_mean_loss:.7f}"
)
if
len
(
previous_mean_losses
)
>
1
:
std
=
stdev
(
previous_mean_losses
)
else
:
std
=
0
dataset_loss_info
=
f
"dataset loss:{mean(previous_mean_losses):.3f}"
+
u"
\u00B1
"
+
f
"({std / (len(previous_mean_losses) ** 0.5):.3f})"
pbar
.
set_description
(
dataset_loss_info
)
if
hypernetwork
.
step
>
0
and
hypernetwork_dir
is
not
None
and
hypernetwork
.
step
%
save_hypernetwork_every
==
0
:
# Before saving, change name to match current checkpoint.
...
...
modules/processing.py
View file @
68931242
...
...
@@ -46,6 +46,20 @@ def apply_color_correction(correction, image):
return
image
def
apply_overlay
(
overlay_exists
,
overlay
,
paste_loc
,
image
):
if
overlay_exists
:
if
paste_loc
is
not
None
:
x
,
y
,
w
,
h
=
paste_loc
base_image
=
Image
.
new
(
'RGBA'
,
(
overlay
.
width
,
overlay
.
height
))
image
=
images
.
resize_image
(
1
,
image
,
w
,
h
)
base_image
.
paste
(
image
,
(
x
,
y
))
image
=
base_image
image
=
image
.
convert
(
'RGBA'
)
image
.
alpha_composite
(
overlay
)
image
=
image
.
convert
(
'RGB'
)
return
image
def
get_correct_sampler
(
p
):
if
isinstance
(
p
,
modules
.
processing
.
StableDiffusionProcessingTxt2Img
):
...
...
@@ -449,22 +463,11 @@ def process_images(p: StableDiffusionProcessing) -> Processed:
if
p
.
color_corrections
is
not
None
and
i
<
len
(
p
.
color_corrections
):
if
opts
.
save
and
not
p
.
do_not_save_samples
and
opts
.
save_images_before_color_correction
:
images
.
save_image
(
image
,
p
.
outpath_samples
,
""
,
seeds
[
i
],
prompts
[
i
],
opts
.
samples_format
,
info
=
infotext
(
n
,
i
),
p
=
p
,
suffix
=
"-before-color-correction"
)
image_without_cc
=
apply_overlay
(
p
.
overlay_images
is
not
None
and
i
<
len
(
p
.
overlay_images
),
p
.
overlay_images
[
i
],
p
.
paste_to
,
image
)
images
.
save_image
(
image_without_cc
,
p
.
outpath_samples
,
""
,
seeds
[
i
],
prompts
[
i
],
opts
.
samples_format
,
info
=
infotext
(
n
,
i
),
p
=
p
,
suffix
=
"-before-color-correction"
)
image
=
apply_color_correction
(
p
.
color_corrections
[
i
],
image
)
if
p
.
overlay_images
is
not
None
and
i
<
len
(
p
.
overlay_images
):
overlay
=
p
.
overlay_images
[
i
]
if
p
.
paste_to
is
not
None
:
x
,
y
,
w
,
h
=
p
.
paste_to
base_image
=
Image
.
new
(
'RGBA'
,
(
overlay
.
width
,
overlay
.
height
))
image
=
images
.
resize_image
(
1
,
image
,
w
,
h
)
base_image
.
paste
(
image
,
(
x
,
y
))
image
=
base_image
image
=
image
.
convert
(
'RGBA'
)
image
.
alpha_composite
(
overlay
)
image
=
image
.
convert
(
'RGB'
)
image
=
apply_overlay
(
p
.
overlay_images
is
not
None
and
i
<
len
(
p
.
overlay_images
),
p
.
overlay_images
[
i
],
p
.
paste_to
,
image
)
if
opts
.
samples_save
and
not
p
.
do_not_save_samples
:
images
.
save_image
(
image
,
p
.
outpath_samples
,
""
,
seeds
[
i
],
prompts
[
i
],
opts
.
samples_format
,
info
=
infotext
(
n
,
i
),
p
=
p
)
...
...
webui.py
View file @
68931242
...
...
@@ -139,6 +139,8 @@ def webui():
inbrowser
=
cmd_opts
.
autolaunch
,
prevent_thread_lock
=
True
)
# after initial launch, disable --autolaunch for subsequent restarts
cmd_opts
.
autolaunch
=
False
app
.
add_middleware
(
GZipMiddleware
,
minimum_size
=
1000
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment