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
098d2fda
Commit
098d2fda
authored
May 11, 2023
by
Aarni Koskela
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Reindent autocrop with 4 spaces
parent
48354525
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
102 additions
and
100 deletions
+102
-100
modules/textual_inversion/autocrop.py
modules/textual_inversion/autocrop.py
+102
-100
No files found.
modules/textual_inversion/autocrop.py
View file @
098d2fda
...
...
@@ -10,63 +10,64 @@ RED = "#F00"
def
crop_image
(
im
,
settings
):
""" Intelligently crop an image to the subject matter """
scale_by
=
1
if
is_landscape
(
im
.
width
,
im
.
height
):
scale_by
=
settings
.
crop_height
/
im
.
height
elif
is_portrait
(
im
.
width
,
im
.
height
):
scale_by
=
settings
.
crop_width
/
im
.
width
elif
is_square
(
im
.
width
,
im
.
height
):
if
is_square
(
settings
.
crop_width
,
settings
.
crop_height
):
scale_by
=
settings
.
crop_width
/
im
.
width
elif
is_landscape
(
settings
.
crop_width
,
settings
.
crop_height
):
scale_by
=
settings
.
crop_width
/
im
.
width
elif
is_portrait
(
settings
.
crop_width
,
settings
.
crop_height
):
scale_by
=
settings
.
crop_height
/
im
.
height
im
=
im
.
resize
((
int
(
im
.
width
*
scale_by
),
int
(
im
.
height
*
scale_by
)))
im_debug
=
im
.
copy
()
focus
=
focal_point
(
im_debug
,
settings
)
# take the focal point and turn it into crop coordinates that try to center over the focal
# point but then get adjusted back into the frame
y_half
=
int
(
settings
.
crop_height
/
2
)
x_half
=
int
(
settings
.
crop_width
/
2
)
x1
=
focus
.
x
-
x_half
if
x1
<
0
:
x1
=
0
elif
x1
+
settings
.
crop_width
>
im
.
width
:
x1
=
im
.
width
-
settings
.
crop_width
y1
=
focus
.
y
-
y_half
if
y1
<
0
:
y1
=
0
elif
y1
+
settings
.
crop_height
>
im
.
height
:
y1
=
im
.
height
-
settings
.
crop_height
x2
=
x1
+
settings
.
crop_width
y2
=
y1
+
settings
.
crop_height
crop
=
[
x1
,
y1
,
x2
,
y2
]
results
=
[]
results
.
append
(
im
.
crop
(
tuple
(
crop
)))
if
settings
.
annotate_image
:
d
=
ImageDraw
.
Draw
(
im_debug
)
rect
=
list
(
crop
)
rect
[
2
]
-=
1
rect
[
3
]
-=
1
d
.
rectangle
(
rect
,
outline
=
GREEN
)
results
.
append
(
im_debug
)
if
settings
.
destop_view_image
:
im_debug
.
show
()
return
results
""" Intelligently crop an image to the subject matter """
scale_by
=
1
if
is_landscape
(
im
.
width
,
im
.
height
):
scale_by
=
settings
.
crop_height
/
im
.
height
elif
is_portrait
(
im
.
width
,
im
.
height
):
scale_by
=
settings
.
crop_width
/
im
.
width
elif
is_square
(
im
.
width
,
im
.
height
):
if
is_square
(
settings
.
crop_width
,
settings
.
crop_height
):
scale_by
=
settings
.
crop_width
/
im
.
width
elif
is_landscape
(
settings
.
crop_width
,
settings
.
crop_height
):
scale_by
=
settings
.
crop_width
/
im
.
width
elif
is_portrait
(
settings
.
crop_width
,
settings
.
crop_height
):
scale_by
=
settings
.
crop_height
/
im
.
height
im
=
im
.
resize
((
int
(
im
.
width
*
scale_by
),
int
(
im
.
height
*
scale_by
)))
im_debug
=
im
.
copy
()
focus
=
focal_point
(
im_debug
,
settings
)
# take the focal point and turn it into crop coordinates that try to center over the focal
# point but then get adjusted back into the frame
y_half
=
int
(
settings
.
crop_height
/
2
)
x_half
=
int
(
settings
.
crop_width
/
2
)
x1
=
focus
.
x
-
x_half
if
x1
<
0
:
x1
=
0
elif
x1
+
settings
.
crop_width
>
im
.
width
:
x1
=
im
.
width
-
settings
.
crop_width
y1
=
focus
.
y
-
y_half
if
y1
<
0
:
y1
=
0
elif
y1
+
settings
.
crop_height
>
im
.
height
:
y1
=
im
.
height
-
settings
.
crop_height
x2
=
x1
+
settings
.
crop_width
y2
=
y1
+
settings
.
crop_height
crop
=
[
x1
,
y1
,
x2
,
y2
]
results
=
[]
results
.
append
(
im
.
crop
(
tuple
(
crop
)))
if
settings
.
annotate_image
:
d
=
ImageDraw
.
Draw
(
im_debug
)
rect
=
list
(
crop
)
rect
[
2
]
-=
1
rect
[
3
]
-=
1
d
.
rectangle
(
rect
,
outline
=
GREEN
)
results
.
append
(
im_debug
)
if
settings
.
destop_view_image
:
im_debug
.
show
()
return
results
def
focal_point
(
im
,
settings
):
corner_points
=
image_corner_points
(
im
,
settings
)
if
settings
.
corner_points_weight
>
0
else
[]
...
...
@@ -86,7 +87,7 @@ def focal_point(im, settings):
corner_centroid
=
None
if
len
(
corner_points
)
>
0
:
corner_centroid
=
centroid
(
corner_points
)
corner_centroid
.
weight
=
settings
.
corner_points_weight
/
weight_pref_total
corner_centroid
.
weight
=
settings
.
corner_points_weight
/
weight_pref_total
pois
.
append
(
corner_centroid
)
entropy_centroid
=
None
...
...
@@ -98,7 +99,7 @@ def focal_point(im, settings):
face_centroid
=
None
if
len
(
face_points
)
>
0
:
face_centroid
=
centroid
(
face_points
)
face_centroid
.
weight
=
settings
.
face_points_weight
/
weight_pref_total
face_centroid
.
weight
=
settings
.
face_points_weight
/
weight_pref_total
pois
.
append
(
face_centroid
)
average_point
=
poi_average
(
pois
,
settings
)
...
...
@@ -132,7 +133,7 @@ def focal_point(im, settings):
d
.
rectangle
(
f
.
bounding
(
4
),
outline
=
color
)
d
.
ellipse
(
average_point
.
bounding
(
max_size
),
outline
=
GREEN
)
return
average_point
...
...
@@ -260,10 +261,11 @@ def image_entropy(im):
hist
=
hist
[
hist
>
0
]
return
-
np
.
log2
(
hist
/
hist
.
sum
())
.
sum
()
def
centroid
(
pois
):
x
=
[
poi
.
x
for
poi
in
pois
]
y
=
[
poi
.
y
for
poi
in
pois
]
return
PointOfInterest
(
sum
(
x
)
/
len
(
pois
),
sum
(
y
)
/
len
(
pois
))
x
=
[
poi
.
x
for
poi
in
pois
]
y
=
[
poi
.
y
for
poi
in
pois
]
return
PointOfInterest
(
sum
(
x
)
/
len
(
pois
),
sum
(
y
)
/
len
(
pois
))
def
poi_average
(
pois
,
settings
):
...
...
@@ -281,59 +283,59 @@ def poi_average(pois, settings):
def
is_landscape
(
w
,
h
):
return
w
>
h
return
w
>
h
def
is_portrait
(
w
,
h
):
return
h
>
w
return
h
>
w
def
is_square
(
w
,
h
):
return
w
==
h
return
w
==
h
def
download_and_cache_models
(
dirname
):
download_url
=
'https://github.com/opencv/opencv_zoo/blob/91fb0290f50896f38a0ab1e558b74b16bc009428/models/face_detection_yunet/face_detection_yunet_2022mar.onnx?raw=true'
model_file_name
=
'face_detection_yunet.onnx'
download_url
=
'https://github.com/opencv/opencv_zoo/blob/91fb0290f50896f38a0ab1e558b74b16bc009428/models/face_detection_yunet/face_detection_yunet_2022mar.onnx?raw=true'
model_file_name
=
'face_detection_yunet.onnx'
if
not
os
.
path
.
exists
(
dirname
):
os
.
makedirs
(
dirname
)
if
not
os
.
path
.
exists
(
dirname
):
os
.
makedirs
(
dirname
)
cache_file
=
os
.
path
.
join
(
dirname
,
model_file_name
)
if
not
os
.
path
.
exists
(
cache_file
):
print
(
f
"downloading face detection model from '{download_url}' to '{cache_file}'"
)
response
=
requests
.
get
(
download_url
)
with
open
(
cache_file
,
"wb"
)
as
f
:
f
.
write
(
response
.
content
)
cache_file
=
os
.
path
.
join
(
dirname
,
model_file_name
)
if
not
os
.
path
.
exists
(
cache_file
):
print
(
f
"downloading face detection model from '{download_url}' to '{cache_file}'"
)
response
=
requests
.
get
(
download_url
)
with
open
(
cache_file
,
"wb"
)
as
f
:
f
.
write
(
response
.
content
)
if
os
.
path
.
exists
(
cache_file
):
return
cache_file
return
None
if
os
.
path
.
exists
(
cache_file
):
return
cache_file
return
None
class
PointOfInterest
:
def
__init__
(
self
,
x
,
y
,
weight
=
1.0
,
size
=
10
):
self
.
x
=
x
self
.
y
=
y
self
.
weight
=
weight
self
.
size
=
size
def
__init__
(
self
,
x
,
y
,
weight
=
1.0
,
size
=
10
):
self
.
x
=
x
self
.
y
=
y
self
.
weight
=
weight
self
.
size
=
size
def
bounding
(
self
,
size
):
return
[
self
.
x
-
size
//
2
,
self
.
y
-
size
//
2
,
self
.
x
+
size
//
2
,
self
.
y
+
size
//
2
]
def
bounding
(
self
,
size
):
return
[
self
.
x
-
size
//
2
,
self
.
y
-
size
//
2
,
self
.
x
+
size
//
2
,
self
.
y
+
size
//
2
]
class
Settings
:
def
__init__
(
self
,
crop_width
=
512
,
crop_height
=
512
,
corner_points_weight
=
0.5
,
entropy_points_weight
=
0.5
,
face_points_weight
=
0.5
,
annotate_image
=
False
,
dnn_model_path
=
None
):
self
.
crop_width
=
crop_width
self
.
crop_height
=
crop_height
self
.
corner_points_weight
=
corner_points_weight
self
.
entropy_points_weight
=
entropy_points_weight
self
.
face_points_weight
=
face_points_weight
self
.
annotate_image
=
annotate_image
self
.
destop_view_image
=
False
self
.
dnn_model_path
=
dnn_model_path
def
__init__
(
self
,
crop_width
=
512
,
crop_height
=
512
,
corner_points_weight
=
0.5
,
entropy_points_weight
=
0.5
,
face_points_weight
=
0.5
,
annotate_image
=
False
,
dnn_model_path
=
None
):
self
.
crop_width
=
crop_width
self
.
crop_height
=
crop_height
self
.
corner_points_weight
=
corner_points_weight
self
.
entropy_points_weight
=
entropy_points_weight
self
.
face_points_weight
=
face_points_weight
self
.
annotate_image
=
annotate_image
self
.
destop_view_image
=
False
self
.
dnn_model_path
=
dnn_model_path
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