Spaces:
Running
on
Zero
Running
on
Zero
Commit
·
3ab16a9
1
Parent(s):
726206e
0515_first_upload
Browse files- LICENSE +201 -0
- README.md +1 -2
- app.py +373 -124
- datasets_face/face_id.py +1007 -0
- datasets_face/good_names.txt +326 -0
- datasets_face/good_names_man.txt +226 -0
- datasets_face/good_names_woman.txt +100 -0
- datasets_face/identity_space.yaml +38 -0
- demo_embeddings/example_1.pt +3 -0
- demo_embeddings/example_2.pt +3 -0
- demo_embeddings/example_3.pt +3 -0
- demo_embeddings/example_4.pt +3 -0
- demo_embeddings/example_5.pt +3 -0
- demo_embeddings/example_6.pt +3 -0
- models/celeb_embeddings.py +74 -0
- models/embedding_manager.py +217 -0
- models/id_embedding/__init__.py +0 -0
- models/id_embedding/helpers.py +63 -0
- models/id_embedding/meta_net.py +67 -0
- requirements.txt +15 -6
- test.ipynb +243 -0
- test_create_many_characters.ipynb +255 -0
- train.py +767 -0
- training_weight/man_GAN/embeddings_manager-7000.pt +3 -0
- training_weight/normal_GAN/embeddings_manager-10000.pt +3 -0
- training_weight/woman_GAN/embeddings_manager-6000.pt +3 -0
- utils.py +237 -0
LICENSE
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Apache License
|
| 2 |
+
Version 2.0, January 2004
|
| 3 |
+
http://www.apache.org/licenses/
|
| 4 |
+
|
| 5 |
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
| 6 |
+
|
| 7 |
+
1. Definitions.
|
| 8 |
+
|
| 9 |
+
"License" shall mean the terms and conditions for use, reproduction,
|
| 10 |
+
and distribution as defined by Sections 1 through 9 of this document.
|
| 11 |
+
|
| 12 |
+
"Licensor" shall mean the copyright owner or entity authorized by
|
| 13 |
+
the copyright owner that is granting the License.
|
| 14 |
+
|
| 15 |
+
"Legal Entity" shall mean the union of the acting entity and all
|
| 16 |
+
other entities that control, are controlled by, or are under common
|
| 17 |
+
control with that entity. For the purposes of this definition,
|
| 18 |
+
"control" means (i) the power, direct or indirect, to cause the
|
| 19 |
+
direction or management of such entity, whether by contract or
|
| 20 |
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
| 21 |
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
| 22 |
+
|
| 23 |
+
"You" (or "Your") shall mean an individual or Legal Entity
|
| 24 |
+
exercising permissions granted by this License.
|
| 25 |
+
|
| 26 |
+
"Source" form shall mean the preferred form for making modifications,
|
| 27 |
+
including but not limited to software source code, documentation
|
| 28 |
+
source, and configuration files.
|
| 29 |
+
|
| 30 |
+
"Object" form shall mean any form resulting from mechanical
|
| 31 |
+
transformation or translation of a Source form, including but
|
| 32 |
+
not limited to compiled object code, generated documentation,
|
| 33 |
+
and conversions to other media types.
|
| 34 |
+
|
| 35 |
+
"Work" shall mean the work of authorship, whether in Source or
|
| 36 |
+
Object form, made available under the License, as indicated by a
|
| 37 |
+
copyright notice that is included in or attached to the work
|
| 38 |
+
(an example is provided in the Appendix below).
|
| 39 |
+
|
| 40 |
+
"Derivative Works" shall mean any work, whether in Source or Object
|
| 41 |
+
form, that is based on (or derived from) the Work and for which the
|
| 42 |
+
editorial revisions, annotations, elaborations, or other modifications
|
| 43 |
+
represent, as a whole, an original work of authorship. For the purposes
|
| 44 |
+
of this License, Derivative Works shall not include works that remain
|
| 45 |
+
separable from, or merely link (or bind by name) to the interfaces of,
|
| 46 |
+
the Work and Derivative Works thereof.
|
| 47 |
+
|
| 48 |
+
"Contribution" shall mean any work of authorship, including
|
| 49 |
+
the original version of the Work and any modifications or additions
|
| 50 |
+
to that Work or Derivative Works thereof, that is intentionally
|
| 51 |
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
| 52 |
+
or by an individual or Legal Entity authorized to submit on behalf of
|
| 53 |
+
the copyright owner. For the purposes of this definition, "submitted"
|
| 54 |
+
means any form of electronic, verbal, or written communication sent
|
| 55 |
+
to the Licensor or its representatives, including but not limited to
|
| 56 |
+
communication on electronic mailing lists, source code control systems,
|
| 57 |
+
and issue tracking systems that are managed by, or on behalf of, the
|
| 58 |
+
Licensor for the purpose of discussing and improving the Work, but
|
| 59 |
+
excluding communication that is conspicuously marked or otherwise
|
| 60 |
+
designated in writing by the copyright owner as "Not a Contribution."
|
| 61 |
+
|
| 62 |
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
| 63 |
+
on behalf of whom a Contribution has been received by Licensor and
|
| 64 |
+
subsequently incorporated within the Work.
|
| 65 |
+
|
| 66 |
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
| 67 |
+
this License, each Contributor hereby grants to You a perpetual,
|
| 68 |
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
| 69 |
+
copyright license to reproduce, prepare Derivative Works of,
|
| 70 |
+
publicly display, publicly perform, sublicense, and distribute the
|
| 71 |
+
Work and such Derivative Works in Source or Object form.
|
| 72 |
+
|
| 73 |
+
3. Grant of Patent License. Subject to the terms and conditions of
|
| 74 |
+
this License, each Contributor hereby grants to You a perpetual,
|
| 75 |
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
| 76 |
+
(except as stated in this section) patent license to make, have made,
|
| 77 |
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
| 78 |
+
where such license applies only to those patent claims licensable
|
| 79 |
+
by such Contributor that are necessarily infringed by their
|
| 80 |
+
Contribution(s) alone or by combination of their Contribution(s)
|
| 81 |
+
with the Work to which such Contribution(s) was submitted. If You
|
| 82 |
+
institute patent litigation against any entity (including a
|
| 83 |
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
| 84 |
+
or a Contribution incorporated within the Work constitutes direct
|
| 85 |
+
or contributory patent infringement, then any patent licenses
|
| 86 |
+
granted to You under this License for that Work shall terminate
|
| 87 |
+
as of the date such litigation is filed.
|
| 88 |
+
|
| 89 |
+
4. Redistribution. You may reproduce and distribute copies of the
|
| 90 |
+
Work or Derivative Works thereof in any medium, with or without
|
| 91 |
+
modifications, and in Source or Object form, provided that You
|
| 92 |
+
meet the following conditions:
|
| 93 |
+
|
| 94 |
+
(a) You must give any other recipients of the Work or
|
| 95 |
+
Derivative Works a copy of this License; and
|
| 96 |
+
|
| 97 |
+
(b) You must cause any modified files to carry prominent notices
|
| 98 |
+
stating that You changed the files; and
|
| 99 |
+
|
| 100 |
+
(c) You must retain, in the Source form of any Derivative Works
|
| 101 |
+
that You distribute, all copyright, patent, trademark, and
|
| 102 |
+
attribution notices from the Source form of the Work,
|
| 103 |
+
excluding those notices that do not pertain to any part of
|
| 104 |
+
the Derivative Works; and
|
| 105 |
+
|
| 106 |
+
(d) If the Work includes a "NOTICE" text file as part of its
|
| 107 |
+
distribution, then any Derivative Works that You distribute must
|
| 108 |
+
include a readable copy of the attribution notices contained
|
| 109 |
+
within such NOTICE file, excluding those notices that do not
|
| 110 |
+
pertain to any part of the Derivative Works, in at least one
|
| 111 |
+
of the following places: within a NOTICE text file distributed
|
| 112 |
+
as part of the Derivative Works; within the Source form or
|
| 113 |
+
documentation, if provided along with the Derivative Works; or,
|
| 114 |
+
within a display generated by the Derivative Works, if and
|
| 115 |
+
wherever such third-party notices normally appear. The contents
|
| 116 |
+
of the NOTICE file are for informational purposes only and
|
| 117 |
+
do not modify the License. You may add Your own attribution
|
| 118 |
+
notices within Derivative Works that You distribute, alongside
|
| 119 |
+
or as an addendum to the NOTICE text from the Work, provided
|
| 120 |
+
that such additional attribution notices cannot be construed
|
| 121 |
+
as modifying the License.
|
| 122 |
+
|
| 123 |
+
You may add Your own copyright statement to Your modifications and
|
| 124 |
+
may provide additional or different license terms and conditions
|
| 125 |
+
for use, reproduction, or distribution of Your modifications, or
|
| 126 |
+
for any such Derivative Works as a whole, provided Your use,
|
| 127 |
+
reproduction, and distribution of the Work otherwise complies with
|
| 128 |
+
the conditions stated in this License.
|
| 129 |
+
|
| 130 |
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
| 131 |
+
any Contribution intentionally submitted for inclusion in the Work
|
| 132 |
+
by You to the Licensor shall be under the terms and conditions of
|
| 133 |
+
this License, without any additional terms or conditions.
|
| 134 |
+
Notwithstanding the above, nothing herein shall supersede or modify
|
| 135 |
+
the terms of any separate license agreement you may have executed
|
| 136 |
+
with Licensor regarding such Contributions.
|
| 137 |
+
|
| 138 |
+
6. Trademarks. This License does not grant permission to use the trade
|
| 139 |
+
names, trademarks, service marks, or product names of the Licensor,
|
| 140 |
+
except as required for reasonable and customary use in describing the
|
| 141 |
+
origin of the Work and reproducing the content of the NOTICE file.
|
| 142 |
+
|
| 143 |
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
| 144 |
+
agreed to in writing, Licensor provides the Work (and each
|
| 145 |
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
| 146 |
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
| 147 |
+
implied, including, without limitation, any warranties or conditions
|
| 148 |
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
| 149 |
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
| 150 |
+
appropriateness of using or redistributing the Work and assume any
|
| 151 |
+
risks associated with Your exercise of permissions under this License.
|
| 152 |
+
|
| 153 |
+
8. Limitation of Liability. In no event and under no legal theory,
|
| 154 |
+
whether in tort (including negligence), contract, or otherwise,
|
| 155 |
+
unless required by applicable law (such as deliberate and grossly
|
| 156 |
+
negligent acts) or agreed to in writing, shall any Contributor be
|
| 157 |
+
liable to You for damages, including any direct, indirect, special,
|
| 158 |
+
incidental, or consequential damages of any character arising as a
|
| 159 |
+
result of this License or out of the use or inability to use the
|
| 160 |
+
Work (including but not limited to damages for loss of goodwill,
|
| 161 |
+
work stoppage, computer failure or malfunction, or any and all
|
| 162 |
+
other commercial damages or losses), even if such Contributor
|
| 163 |
+
has been advised of the possibility of such damages.
|
| 164 |
+
|
| 165 |
+
9. Accepting Warranty or Additional Liability. While redistributing
|
| 166 |
+
the Work or Derivative Works thereof, You may choose to offer,
|
| 167 |
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
| 168 |
+
or other liability obligations and/or rights consistent with this
|
| 169 |
+
License. However, in accepting such obligations, You may act only
|
| 170 |
+
on Your own behalf and on Your sole responsibility, not on behalf
|
| 171 |
+
of any other Contributor, and only if You agree to indemnify,
|
| 172 |
+
defend, and hold each Contributor harmless for any liability
|
| 173 |
+
incurred by, or claims asserted against, such Contributor by reason
|
| 174 |
+
of your accepting any such warranty or additional liability.
|
| 175 |
+
|
| 176 |
+
END OF TERMS AND CONDITIONS
|
| 177 |
+
|
| 178 |
+
APPENDIX: How to apply the Apache License to your work.
|
| 179 |
+
|
| 180 |
+
To apply the Apache License to your work, attach the following
|
| 181 |
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
| 182 |
+
replaced with your own identifying information. (Don't include
|
| 183 |
+
the brackets!) The text should be enclosed in the appropriate
|
| 184 |
+
comment syntax for the file format. We also recommend that a
|
| 185 |
+
file or class name and description of purpose be included on the
|
| 186 |
+
same "printed page" as the copyright notice for easier
|
| 187 |
+
identification within third-party archives.
|
| 188 |
+
|
| 189 |
+
Copyright [yyyy] [name of copyright owner]
|
| 190 |
+
|
| 191 |
+
Licensed under the Apache License, Version 2.0 (the "License");
|
| 192 |
+
you may not use this file except in compliance with the License.
|
| 193 |
+
You may obtain a copy of the License at
|
| 194 |
+
|
| 195 |
+
http://www.apache.org/licenses/LICENSE-2.0
|
| 196 |
+
|
| 197 |
+
Unless required by applicable law or agreed to in writing, software
|
| 198 |
+
distributed under the License is distributed on an "AS IS" BASIS,
|
| 199 |
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| 200 |
+
See the License for the specific language governing permissions and
|
| 201 |
+
limitations under the License.
|
README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
| 1 |
---
|
| 2 |
-
title: CharacterFactory
|
| 3 |
emoji: 🖼
|
| 4 |
colorFrom: purple
|
| 5 |
colorTo: red
|
|
@@ -7,7 +7,6 @@ sdk: gradio
|
|
| 7 |
sdk_version: 4.26.0
|
| 8 |
app_file: app.py
|
| 9 |
pinned: false
|
| 10 |
-
license: apache-2.0
|
| 11 |
---
|
| 12 |
|
| 13 |
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
|
|
|
| 1 |
---
|
| 2 |
+
title: 'CharacterFactory'
|
| 3 |
emoji: 🖼
|
| 4 |
colorFrom: purple
|
| 5 |
colorTo: red
|
|
|
|
| 7 |
sdk_version: 4.26.0
|
| 8 |
app_file: app.py
|
| 9 |
pinned: false
|
|
|
|
| 10 |
---
|
| 11 |
|
| 12 |
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
app.py
CHANGED
|
@@ -1,146 +1,395 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import gradio as gr
|
| 2 |
-
import
|
|
|
|
| 3 |
import random
|
| 4 |
-
|
| 5 |
import torch
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 6 |
|
| 7 |
-
|
|
|
|
| 8 |
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
pipe.enable_xformers_memory_efficient_attention()
|
| 13 |
-
pipe = pipe.to(device)
|
| 14 |
-
else:
|
| 15 |
-
pipe = DiffusionPipeline.from_pretrained("stabilityai/sdxl-turbo", use_safetensors=True)
|
| 16 |
-
pipe = pipe.to(device)
|
| 17 |
|
| 18 |
-
|
| 19 |
-
|
| 20 |
|
| 21 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 22 |
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
height = height,
|
| 35 |
-
generator = generator
|
| 36 |
-
).images[0]
|
| 37 |
-
|
| 38 |
-
return image
|
| 39 |
-
|
| 40 |
-
examples = [
|
| 41 |
-
"Astronaut in a jungle, cold color palette, muted colors, detailed, 8k",
|
| 42 |
-
"An astronaut riding a green horse",
|
| 43 |
-
"A delicious ceviche cheesecake slice",
|
| 44 |
-
]
|
| 45 |
-
|
| 46 |
-
css="""
|
| 47 |
-
#col-container {
|
| 48 |
-
margin: 0 auto;
|
| 49 |
-
max-width: 520px;
|
| 50 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
| 51 |
"""
|
| 52 |
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 57 |
|
| 58 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 59 |
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 77 |
|
| 78 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 79 |
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 96 |
|
| 97 |
-
|
|
|
|
|
|
|
|
|
|
| 98 |
|
| 99 |
-
|
| 100 |
-
|
| 101 |
-
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
maximum=MAX_IMAGE_SIZE,
|
| 105 |
-
step=32,
|
| 106 |
-
value=512,
|
| 107 |
-
)
|
| 108 |
-
|
| 109 |
-
height = gr.Slider(
|
| 110 |
-
label="Height",
|
| 111 |
-
minimum=256,
|
| 112 |
-
maximum=MAX_IMAGE_SIZE,
|
| 113 |
-
step=32,
|
| 114 |
-
value=512,
|
| 115 |
-
)
|
| 116 |
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
|
| 120 |
-
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
|
| 126 |
-
|
| 127 |
-
|
| 128 |
-
|
| 129 |
-
|
| 130 |
-
|
| 131 |
-
step=1,
|
| 132 |
-
value=2,
|
| 133 |
-
)
|
| 134 |
-
|
| 135 |
-
gr.Examples(
|
| 136 |
-
examples = examples,
|
| 137 |
-
inputs = [prompt]
|
| 138 |
)
|
|
|
|
| 139 |
|
| 140 |
-
|
| 141 |
-
|
| 142 |
-
inputs
|
| 143 |
-
|
|
|
|
|
|
|
| 144 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 145 |
|
| 146 |
-
demo.
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import io
|
| 3 |
+
import IPython.display
|
| 4 |
+
from PIL import Image
|
| 5 |
+
import base64
|
| 6 |
+
import io
|
| 7 |
+
from PIL import Image
|
| 8 |
import gradio as gr
|
| 9 |
+
import requests
|
| 10 |
+
import time
|
| 11 |
import random
|
| 12 |
+
import numpy as np
|
| 13 |
import torch
|
| 14 |
+
import os
|
| 15 |
+
from transformers import ViTModel, ViTImageProcessor
|
| 16 |
+
from utils import text_encoder_forward
|
| 17 |
+
from diffusers import StableDiffusionPipeline, DPMSolverMultistepScheduler
|
| 18 |
+
from utils import latents_to_images, downsampling, merge_and_save_images
|
| 19 |
+
from omegaconf import OmegaConf
|
| 20 |
+
from accelerate.utils import set_seed
|
| 21 |
+
from tqdm import tqdm
|
| 22 |
+
from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion import StableDiffusionPipelineOutput
|
| 23 |
+
from PIL import Image
|
| 24 |
+
from models.celeb_embeddings import embedding_forward
|
| 25 |
+
import models.embedding_manager
|
| 26 |
+
import importlib
|
| 27 |
+
import time
|
| 28 |
|
| 29 |
+
import os
|
| 30 |
+
os.environ['GRADIO_TEMP_DIR'] = 'qinghewang/tmp'
|
| 31 |
|
| 32 |
+
title = r"""
|
| 33 |
+
<h1 align="center">CharacterFactory: Sampling Consistent Characters with GANs for Diffusion Models</h1>
|
| 34 |
+
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 35 |
|
| 36 |
+
description = r"""
|
| 37 |
+
<b>Official Gradio demo</b> for <a href='https://qinghew.github.io/CharacterFactory/' target='_blank'><b>CharacterFactory: Sampling Consistent Characters with GANs for Diffusion Models</b></a>.<br>
|
| 38 |
|
| 39 |
+
How to use:<br>
|
| 40 |
+
1. Enter prompts (the character placeholder is "a person"), where each line will generate an image.
|
| 41 |
+
2. You can choose to create a new character or continue to use the current one. We have provided some examples, click on the examples below to use.
|
| 42 |
+
3. You can choose to use the Normal version (the gender is random), the Man version, and the Woman version.
|
| 43 |
+
4. Click the <b>Generate</b> button to begin (Images are generated one by one).
|
| 44 |
+
5. Our method can be applied to illustrating books and stories, creating brand ambassadors, developing presentations, art design, identity-consistent data construction and more. Looking forward to your explorations!😊
|
| 45 |
+
6. If CharacterFactory is helpful, please help to ⭐ the <a href='https://github.com/qinghew/CharacterFactory' target='_blank'>Github Repo</a>. Thanks!
|
| 46 |
+
"""
|
| 47 |
|
| 48 |
+
article = r"""
|
| 49 |
+
---
|
| 50 |
+
📝 **Citation**
|
| 51 |
+
<br>
|
| 52 |
+
If our work is helpful for your research or applications, please cite us via:
|
| 53 |
+
```bibtex
|
| 54 |
+
@article{wang2024characterfactory,
|
| 55 |
+
title={CharacterFactory: Sampling Consistent Characters with GANs for Diffusion Models},
|
| 56 |
+
author={Wang, Qinghe and Li, Baolu and Li, Xiaomin and Cao, Bing and Ma, Liqian and Lu, Huchuan and Jia, Xu},
|
| 57 |
+
journal={arXiv preprint arXiv:2404.15677},
|
| 58 |
+
year={2024}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 59 |
}
|
| 60 |
+
```
|
| 61 |
+
📧 **Contact**
|
| 62 |
+
<br>
|
| 63 |
+
If you have any questions, please feel free to open an issue or directly reach us out at <b>[email protected]</b>.
|
| 64 |
"""
|
| 65 |
|
| 66 |
+
css = '''
|
| 67 |
+
#color-bg{display:flex;justify-content: center;align-items: center;}
|
| 68 |
+
.color-bg-item{width: 100%; height: 32px}
|
| 69 |
+
#main_button{width:100%}
|
| 70 |
+
<style>
|
| 71 |
+
'''
|
| 72 |
+
|
| 73 |
+
model_id = "stabilityai/stable-diffusion-2-1-base"
|
| 74 |
+
# model_path = "/home/qinghewang/.cache/huggingface/hub/models--stabilityai--stable-diffusion-2-1/snapshots/5cae40e6a2745ae2b01ad92ae5043f95f23644d6"
|
| 75 |
+
pipe = StableDiffusionPipeline.from_pretrained(model_id) # , torch_dtype=torch.float16
|
| 76 |
+
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)
|
| 77 |
+
pipe = pipe.to("cuda")
|
| 78 |
+
|
| 79 |
+
device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
|
| 80 |
+
|
| 81 |
+
vae = pipe.vae
|
| 82 |
+
unet = pipe.unet
|
| 83 |
+
text_encoder = pipe.text_encoder
|
| 84 |
+
tokenizer = pipe.tokenizer
|
| 85 |
+
scheduler = pipe.scheduler
|
| 86 |
+
|
| 87 |
+
input_dim = 64
|
| 88 |
+
|
| 89 |
+
original_forward = text_encoder.text_model.embeddings.forward
|
| 90 |
+
text_encoder.text_model.embeddings.forward = embedding_forward.__get__(text_encoder.text_model.embeddings)
|
| 91 |
+
embedding_manager_config = OmegaConf.load("datasets_face/identity_space.yaml")
|
| 92 |
+
|
| 93 |
+
normal_Embedding_Manager = models.embedding_manager.EmbeddingManagerId_adain(
|
| 94 |
+
tokenizer,
|
| 95 |
+
text_encoder,
|
| 96 |
+
device = device,
|
| 97 |
+
training = True,
|
| 98 |
+
experiment_name = "normal_GAN",
|
| 99 |
+
num_embeds_per_token = embedding_manager_config.model.personalization_config.params.num_embeds_per_token,
|
| 100 |
+
token_dim = embedding_manager_config.model.personalization_config.params.token_dim,
|
| 101 |
+
mlp_depth = embedding_manager_config.model.personalization_config.params.mlp_depth,
|
| 102 |
+
loss_type = embedding_manager_config.model.personalization_config.params.loss_type,
|
| 103 |
+
vit_out_dim = input_dim,
|
| 104 |
+
)
|
| 105 |
+
|
| 106 |
+
man_Embedding_Manager = models.embedding_manager.EmbeddingManagerId_adain(
|
| 107 |
+
tokenizer,
|
| 108 |
+
text_encoder,
|
| 109 |
+
device = device,
|
| 110 |
+
training = True,
|
| 111 |
+
experiment_name = "man_GAN",
|
| 112 |
+
num_embeds_per_token = embedding_manager_config.model.personalization_config.params.num_embeds_per_token,
|
| 113 |
+
token_dim = embedding_manager_config.model.personalization_config.params.token_dim,
|
| 114 |
+
mlp_depth = embedding_manager_config.model.personalization_config.params.mlp_depth,
|
| 115 |
+
loss_type = embedding_manager_config.model.personalization_config.params.loss_type,
|
| 116 |
+
vit_out_dim = input_dim,
|
| 117 |
+
)
|
| 118 |
+
|
| 119 |
+
woman_Embedding_Manager = models.embedding_manager.EmbeddingManagerId_adain(
|
| 120 |
+
tokenizer,
|
| 121 |
+
text_encoder,
|
| 122 |
+
device = device,
|
| 123 |
+
training = True,
|
| 124 |
+
experiment_name = "woman_GAN",
|
| 125 |
+
num_embeds_per_token = embedding_manager_config.model.personalization_config.params.num_embeds_per_token,
|
| 126 |
+
token_dim = embedding_manager_config.model.personalization_config.params.token_dim,
|
| 127 |
+
mlp_depth = embedding_manager_config.model.personalization_config.params.mlp_depth,
|
| 128 |
+
loss_type = embedding_manager_config.model.personalization_config.params.loss_type,
|
| 129 |
+
vit_out_dim = input_dim,
|
| 130 |
+
)
|
| 131 |
+
|
| 132 |
|
| 133 |
+
DEFAULT_STYLE_NAME = "Watercolor"
|
| 134 |
+
MAX_SEED = np.iinfo(np.int32).max
|
| 135 |
+
|
| 136 |
+
def remove_tips():
|
| 137 |
+
return gr.update(visible=False)
|
| 138 |
+
|
| 139 |
+
def response(choice, gender_GAN):
|
| 140 |
+
c = ""
|
| 141 |
+
e = ""
|
| 142 |
+
if choice == "Create a new character":
|
| 143 |
+
c = "create"
|
| 144 |
+
elif choice == "Still use this character":
|
| 145 |
+
c = "continue"
|
| 146 |
|
| 147 |
+
if gender_GAN == "Normal":
|
| 148 |
+
e = "normal_GAN"
|
| 149 |
+
elif gender_GAN == "Man":
|
| 150 |
+
e = "man_GAN"
|
| 151 |
+
elif gender_GAN == "Woman":
|
| 152 |
+
e = "woman_GAN"
|
| 153 |
+
|
| 154 |
+
return c, e
|
| 155 |
+
|
| 156 |
+
def replace_phrases(prompt):
|
| 157 |
+
replacements = {
|
| 158 |
+
"a person": "v1* v2*",
|
| 159 |
+
"a man": "v1* v2*",
|
| 160 |
+
"a woman": "v1* v2*",
|
| 161 |
+
"a boy": "v1* v2*",
|
| 162 |
+
"a girl": "v1* v2*"
|
| 163 |
+
}
|
| 164 |
+
for phrase, replacement in replacements.items():
|
| 165 |
+
prompt = prompt.replace(phrase, replacement)
|
| 166 |
+
return prompt
|
| 167 |
+
|
| 168 |
+
|
| 169 |
+
def handle_prompts(prompts_array):
|
| 170 |
+
prompts = prompts_array.splitlines()
|
| 171 |
+
prompts = [prompt + ', facing to camera, best quality, ultra high res' for prompt in prompts]
|
| 172 |
+
prompts = [replace_phrases(prompt) for prompt in prompts]
|
| 173 |
+
return prompts
|
| 174 |
+
|
| 175 |
+
|
| 176 |
+
|
| 177 |
+
def generate_image(experiment_name, label, prompts_array, chose_emb):
|
| 178 |
+
prompts = handle_prompts(prompts_array)
|
| 179 |
+
|
| 180 |
+
print("experiment_name:",experiment_name)
|
| 181 |
+
|
| 182 |
+
if experiment_name == "normal_GAN":
|
| 183 |
+
steps = 10000
|
| 184 |
+
Embedding_Manager = normal_Embedding_Manager
|
| 185 |
+
elif experiment_name == "man_GAN":
|
| 186 |
+
steps = 7000
|
| 187 |
+
Embedding_Manager = man_Embedding_Manager
|
| 188 |
+
elif experiment_name == "woman_GAN":
|
| 189 |
+
steps = 6000
|
| 190 |
+
Embedding_Manager = woman_Embedding_Manager
|
| 191 |
+
else:
|
| 192 |
+
print("Hello, please notice this ^_^")
|
| 193 |
+
assert 0
|
| 194 |
+
|
| 195 |
+
embedding_path = os.path.join("training_weight", experiment_name, "embeddings_manager-{}.pt".format(str(steps)))
|
| 196 |
+
Embedding_Manager.load(embedding_path)
|
| 197 |
+
print("embedding_path:",embedding_path)
|
| 198 |
+
print("label:",label)
|
| 199 |
+
|
| 200 |
+
index = "0"
|
| 201 |
+
save_dir = os.path.join("test_results/" + experiment_name, index)
|
| 202 |
+
os.makedirs(save_dir, exist_ok=True)
|
| 203 |
+
ran_emb_path = os.path.join(save_dir, "ran_embeddings.pt")
|
| 204 |
+
test_emb_path = os.path.join(save_dir, "id_embeddings.pt")
|
| 205 |
+
|
| 206 |
+
if label == "create":
|
| 207 |
+
print("new")
|
| 208 |
+
random_embedding = torch.randn(1, 1, input_dim).to(device)
|
| 209 |
+
torch.save(random_embedding, ran_emb_path)
|
| 210 |
+
_, emb_dict = Embedding_Manager(tokenized_text=None, embedded_text=None, name_batch=None, random_embeddings = random_embedding, timesteps = None,)
|
| 211 |
+
text_encoder.text_model.embeddings.forward = original_forward
|
| 212 |
+
test_emb = emb_dict["adained_total_embedding"].to(device)
|
| 213 |
+
torch.save(test_emb, test_emb_path)
|
| 214 |
+
elif label == "continue":
|
| 215 |
+
print("old")
|
| 216 |
+
test_emb = torch.load(chose_emb).cuda()
|
| 217 |
+
text_encoder.text_model.embeddings.forward = original_forward
|
| 218 |
+
|
| 219 |
+
v1_emb = test_emb[:, 0]
|
| 220 |
+
v2_emb = test_emb[:, 1]
|
| 221 |
+
embeddings = [v1_emb, v2_emb]
|
| 222 |
+
|
| 223 |
+
tokens = ["v1*", "v2*"]
|
| 224 |
+
tokenizer.add_tokens(tokens)
|
| 225 |
+
token_ids = tokenizer.convert_tokens_to_ids(tokens)
|
| 226 |
+
|
| 227 |
+
text_encoder.resize_token_embeddings(len(tokenizer), pad_to_multiple_of = 8)
|
| 228 |
+
for token_id, embedding in zip(token_ids, embeddings):
|
| 229 |
+
text_encoder.get_input_embeddings().weight.data[token_id] = embedding
|
| 230 |
+
|
| 231 |
+
total_results = []
|
| 232 |
+
for prompt in prompts:
|
| 233 |
+
image = pipe(prompt, guidance_scale = 8.5).images
|
| 234 |
+
total_results = image + total_results
|
| 235 |
+
yield total_results, test_emb_path
|
| 236 |
+
|
| 237 |
+
def get_example():
|
| 238 |
+
case = [
|
| 239 |
+
[
|
| 240 |
+
'demo_embeddings/example_1.pt',
|
| 241 |
+
"Normal",
|
| 242 |
+
"Still use this character",
|
| 243 |
+
"a photo of a person\na person as a small child\na person as a 20 years old person\na person as a 80 years old person\na person reading a book\na person in the sunset\n",
|
| 244 |
+
],
|
| 245 |
+
[
|
| 246 |
+
'demo_embeddings/example_2.pt',
|
| 247 |
+
"Man",
|
| 248 |
+
"Still use this character",
|
| 249 |
+
"a photo of a person\na person with a mustache and a hat\na person wearing headphoneswith red hair\na person with his dog\n",
|
| 250 |
+
],
|
| 251 |
+
[
|
| 252 |
+
'demo_embeddings/example_3.pt',
|
| 253 |
+
"Woman",
|
| 254 |
+
"Still use this character",
|
| 255 |
+
"a photo of a person\na person at a beach\na person as a police officer\na person wearing a birthday hat\n",
|
| 256 |
+
],
|
| 257 |
+
[
|
| 258 |
+
'demo_embeddings/example_4.pt',
|
| 259 |
+
"Man",
|
| 260 |
+
"Still use this character",
|
| 261 |
+
"a photo of a person\na person holding a bunch of flowers\na person in a lab coat\na person speaking at a podium\n",
|
| 262 |
+
],
|
| 263 |
+
[
|
| 264 |
+
'demo_embeddings/example_5.pt',
|
| 265 |
+
"Woman",
|
| 266 |
+
"Still use this character",
|
| 267 |
+
"a photo of a person\na person wearing a kimono\na person in Van Gogh style\nEthereal fantasy concept art of a person\n",
|
| 268 |
+
],
|
| 269 |
+
[
|
| 270 |
+
'demo_embeddings/example_6.pt',
|
| 271 |
+
"Man",
|
| 272 |
+
"Still use this character",
|
| 273 |
+
"a photo of a person\na person in the rain\na person meditating\na pencil sketch of a person\n",
|
| 274 |
+
],
|
| 275 |
+
]
|
| 276 |
+
return case
|
| 277 |
+
|
| 278 |
+
def run_for_examples(example_emb, gender_GAN, choice, prompts_array):
|
| 279 |
+
prompts = handle_prompts(prompts_array)
|
| 280 |
+
label, experiment_name = response(choice, gender_GAN)
|
| 281 |
+
if experiment_name == "normal_GAN":
|
| 282 |
+
steps = 10000
|
| 283 |
+
Embedding_Manager = normal_Embedding_Manager
|
| 284 |
+
elif experiment_name == "man_GAN":
|
| 285 |
+
steps = 7000
|
| 286 |
+
Embedding_Manager = man_Embedding_Manager
|
| 287 |
+
elif experiment_name == "woman_GAN":
|
| 288 |
+
steps = 6000
|
| 289 |
+
Embedding_Manager = woman_Embedding_Manager
|
| 290 |
+
else:
|
| 291 |
+
print("Hello, please notice this ^_^")
|
| 292 |
+
assert 0
|
| 293 |
|
| 294 |
+
embedding_path = os.path.join("training_weight", experiment_name, "embeddings_manager-{}.pt".format(str(steps)))
|
| 295 |
+
Embedding_Manager.load(embedding_path)
|
| 296 |
+
print("embedding_path:",embedding_path)
|
| 297 |
+
print("label:",label)
|
| 298 |
+
|
| 299 |
+
test_emb = torch.load(example_emb).cuda()
|
| 300 |
+
text_encoder.text_model.embeddings.forward = original_forward
|
| 301 |
+
v1_emb = test_emb[:, 0]
|
| 302 |
+
v2_emb = test_emb[:, 1]
|
| 303 |
+
embeddings = [v1_emb, v2_emb]
|
| 304 |
+
|
| 305 |
+
tokens = ["v1*", "v2*"]
|
| 306 |
+
tokenizer.add_tokens(tokens)
|
| 307 |
+
token_ids = tokenizer.convert_tokens_to_ids(tokens)
|
| 308 |
+
|
| 309 |
+
text_encoder.resize_token_embeddings(len(tokenizer), pad_to_multiple_of = 8)
|
| 310 |
+
for token_id, embedding in zip(token_ids, embeddings):
|
| 311 |
+
text_encoder.get_input_embeddings().weight.data[token_id] = embedding
|
| 312 |
+
|
| 313 |
+
total_results = []
|
| 314 |
+
i = 0
|
| 315 |
+
for prompt in prompts:
|
| 316 |
+
image = pipe(prompt, guidance_scale = 8.5).images
|
| 317 |
+
total_results = image + total_results
|
| 318 |
+
i+=1
|
| 319 |
+
if i < len(prompts):
|
| 320 |
+
yield total_results, gr.update(visible=True, value="<h3>(Not Finished) Generating ···</h3>")
|
| 321 |
+
else:
|
| 322 |
+
yield total_results, gr.update(visible=True, value="<h3>Generation Finished</h3>")
|
| 323 |
|
| 324 |
+
|
| 325 |
+
def set_text_unfinished():
|
| 326 |
+
return gr.update(visible=True, value="<h3>(Not Finished) Generating ···</h3>")
|
| 327 |
+
|
| 328 |
+
def set_text_finished():
|
| 329 |
+
return gr.update(visible=True, value="<h3>Generation Finished</h3>")
|
| 330 |
+
|
| 331 |
+
|
| 332 |
+
|
| 333 |
+
|
| 334 |
+
with gr.Blocks(css=css) as demo: # css=css
|
| 335 |
+
# binary_matrixes = gr.State([])
|
| 336 |
+
# color_layout = gr.State([])
|
| 337 |
+
|
| 338 |
+
# gr.Markdown(logo)
|
| 339 |
+
gr.Markdown(title)
|
| 340 |
+
gr.Markdown(description)
|
| 341 |
+
|
| 342 |
+
with gr.Row():
|
| 343 |
+
with gr.Column():
|
| 344 |
+
prompts_array = gr.Textbox(lines = 3,
|
| 345 |
+
label="Prompts (each line corresponds to a frame).",
|
| 346 |
+
info="Give simple prompt is enough to achieve good face fidelity",
|
| 347 |
+
# placeholder="A photo of a person",
|
| 348 |
+
value="a photo of a person\na person in front of the Great Wall\na person reading a book\na person wearing a Christmas hat\n",
|
| 349 |
+
interactive=True)
|
| 350 |
+
choice = gr.Radio(choices=["Create a new character", "Still use this character"], label="Choose your action")
|
| 351 |
+
|
| 352 |
+
gender_GAN = gr.Radio(choices=["Normal", "Man", "Woman"], label="Choose your model version")
|
| 353 |
|
| 354 |
+
label = gr.Text(label="Select the action you want to take", visible=False)
|
| 355 |
+
experiment_name = gr.Text(label="Select the GAN you want to take", visible=False)
|
| 356 |
+
chose_emb = gr.File(label="Uploaded files", type="filepath", visible=False)
|
| 357 |
+
example_emb = gr.File(label="Uploaded files", type="filepath", visible=False)
|
| 358 |
|
| 359 |
+
generate = gr.Button("Generate!😊", variant="primary")
|
| 360 |
+
|
| 361 |
+
with gr.Column():
|
| 362 |
+
gallery = gr.Gallery(label="Generated Images", columns=2, height='auto')
|
| 363 |
+
generated_information = gr.Markdown(label="Generation Details", value="",visible=False)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 364 |
|
| 365 |
+
generate.click(
|
| 366 |
+
fn=set_text_unfinished,
|
| 367 |
+
outputs=generated_information
|
| 368 |
+
).then(
|
| 369 |
+
fn=response,
|
| 370 |
+
inputs=[choice, gender_GAN],
|
| 371 |
+
outputs=[label, experiment_name],
|
| 372 |
+
).then(
|
| 373 |
+
fn=generate_image,
|
| 374 |
+
inputs=[experiment_name, label, prompts_array, chose_emb],
|
| 375 |
+
outputs=[gallery, chose_emb]
|
| 376 |
+
).then(
|
| 377 |
+
fn=set_text_finished,
|
| 378 |
+
outputs=generated_information
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 379 |
)
|
| 380 |
+
|
| 381 |
|
| 382 |
+
gr.Examples(
|
| 383 |
+
examples=get_example(),
|
| 384 |
+
inputs=[example_emb, gender_GAN, choice, prompts_array],
|
| 385 |
+
run_on_click=True,
|
| 386 |
+
fn=run_for_examples,
|
| 387 |
+
outputs=[gallery, generated_information],
|
| 388 |
)
|
| 389 |
+
|
| 390 |
+
gr.Markdown(article)
|
| 391 |
+
# demo.launch(server_name="0.0.0.0", share = False)
|
| 392 |
+
# share_link = demo.launch(share=True)
|
| 393 |
+
# print("Share this link: ", share_link)
|
| 394 |
|
| 395 |
+
demo.launch() # share=True
|
datasets_face/face_id.py
ADDED
|
@@ -0,0 +1,1007 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import numpy as np
|
| 2 |
+
import torch
|
| 3 |
+
from torch.utils.data import Dataset
|
| 4 |
+
from torchvision.transforms import transforms
|
| 5 |
+
import torch.nn.functional as F
|
| 6 |
+
import random
|
| 7 |
+
|
| 8 |
+
imagenet_templates_small = [
|
| 9 |
+
'a photo of {}',
|
| 10 |
+
'{} is sitting at a desk, writing in a notebook',
|
| 11 |
+
'{} is standing in a kitchen, cooking a meal',
|
| 12 |
+
'In a garden, there are flowers and trees. {} is walking around',
|
| 13 |
+
'{} is playing a piano in a music room',
|
| 14 |
+
'In a garden, {} is watering plants',
|
| 15 |
+
'In a gym, there are many machines. {} is lifting weights',
|
| 16 |
+
'{} is reading a book in a cozy armchair',
|
| 17 |
+
'{} is painting on a canvas in a studio',
|
| 18 |
+
'In a museum, there are many paintings. {} is admiring them',
|
| 19 |
+
'{} is jogging on a trail in the woods',
|
| 20 |
+
'In an office, {} is working on a computer',
|
| 21 |
+
'{} is playing with a dog in a backyard',
|
| 22 |
+
'{} is taking a photograph in a city street',
|
| 23 |
+
'In a concert, there are many people. {} is enjoying the music',
|
| 24 |
+
'{} is playing chess in a park',
|
| 25 |
+
'In a library, {} is browsing through books',
|
| 26 |
+
'{} is riding a bicycle on a city street',
|
| 27 |
+
'{} is watching a movie in a living room',
|
| 28 |
+
'In a café, {} is drinking coffee and using a laptop',
|
| 29 |
+
'{} is hiking in the mountains',
|
| 30 |
+
'{} is playing a violin in a concert hall',
|
| 31 |
+
'In a gym, a {} is lifting weights',
|
| 32 |
+
'{} is gardening in his backyard',
|
| 33 |
+
'{} is swimming in a pool',
|
| 34 |
+
'{} is shopping in a grocery stor',
|
| 35 |
+
'In a museum, {} is admiring a painting',
|
| 36 |
+
'In a studio, {} is recording a podcast',
|
| 37 |
+
'{} is doing yoga in a peaceful room',
|
| 38 |
+
'{} is cooking barbecue in a park',
|
| 39 |
+
'In a laboratory, {} is conducting an experiment',
|
| 40 |
+
'In an airport, {} is waiting for a flight',
|
| 41 |
+
'{} is sitting on a bench, smiling at the camera',
|
| 42 |
+
'{} is holding a book in his hands',
|
| 43 |
+
'In a room, {}n is sitting on a chair',
|
| 44 |
+
'{} is standing in front of a window',
|
| 45 |
+
'In a kitchen, {} is cooking food',
|
| 46 |
+
'In a living room, {} is watching TV',
|
| 47 |
+
'In a bedroom, {} is sleeping',
|
| 48 |
+
'{} is holding a cup of coffee',
|
| 49 |
+
'In a classroom, {} is writing on a whiteboard',
|
| 50 |
+
'In a gym, {} is lifting weights',
|
| 51 |
+
'{} is holding a microphone',
|
| 52 |
+
'In a restaurant, {} is eating food',
|
| 53 |
+
'{} is holding a pen and writing on a paper',
|
| 54 |
+
'In a store, {} is shopping for clothes',
|
| 55 |
+
'In a museum, {} is looking at an exhibit',
|
| 56 |
+
'{} is holding a camera and taking a photo',
|
| 57 |
+
'{} is holding a baby in his arms',
|
| 58 |
+
'In a laboratory, {} is conducting an experiment',
|
| 59 |
+
'{} is holding a guitar',
|
| 60 |
+
'In a swimming pool, {} is swimming',
|
| 61 |
+
'In a cafe, {} is drinking tea',
|
| 62 |
+
'In a garden, {} is watering plants',
|
| 63 |
+
'{} is sitting on a bench in a park',
|
| 64 |
+
'In a classroom, {} is writing on a whiteboard',
|
| 65 |
+
'{} is holding a pen and writing on a paper',
|
| 66 |
+
'{} is standing in front of a building',
|
| 67 |
+
'In a museum, {} is looking at an exhibit',
|
| 68 |
+
'In a theater, {} is watching a movie',
|
| 69 |
+
'{} is standing in front of a car',
|
| 70 |
+
'{} is standing in front of a tree',
|
| 71 |
+
'In a meeting room, {} is giving a presentation',
|
| 72 |
+
'In a stadium, {} is watching a game',
|
| 73 |
+
'In a garage, {} is fixing a car',
|
| 74 |
+
'{} is holding a paintbrush and painting a picture',
|
| 75 |
+
'In a classroom, {} is listening to a lecture',
|
| 76 |
+
'{} is standing in front of a mountain',
|
| 77 |
+
'In a park, {} is flying a kite',
|
| 78 |
+
'a rendering of a {}',
|
| 79 |
+
'a cropped photo of the {}',
|
| 80 |
+
'the photo of a {}',
|
| 81 |
+
'a photo of a clean {}',
|
| 82 |
+
'a photo of a dirty {}',
|
| 83 |
+
'a dark photo of the {}',
|
| 84 |
+
'a photo of my {}',
|
| 85 |
+
'a photo of the cool {}',
|
| 86 |
+
'a close-up photo of a {}',
|
| 87 |
+
'a bright photo of the {}',
|
| 88 |
+
'a cropped photo of a {}',
|
| 89 |
+
'a photo of the {}',
|
| 90 |
+
'a good photo of the {}',
|
| 91 |
+
'a photo of one {}',
|
| 92 |
+
'a close-up photo of the {}',
|
| 93 |
+
'a rendition of the {}',
|
| 94 |
+
'a photo of the clean {}',
|
| 95 |
+
'a rendition of a {}',
|
| 96 |
+
'a photo of a nice {}',
|
| 97 |
+
'a good photo of a {}',
|
| 98 |
+
'a photo of the nice {}',
|
| 99 |
+
'a photo of the small {}',
|
| 100 |
+
'a photo of the weird {}',
|
| 101 |
+
'a photo of the large {}',
|
| 102 |
+
'a photo of a cool {}',
|
| 103 |
+
'a photo of a small {}',
|
| 104 |
+
'an illustration of a {}',
|
| 105 |
+
'a rendering of a {}',
|
| 106 |
+
'a cropped photo of the {}',
|
| 107 |
+
'the photo of a {}',
|
| 108 |
+
'an illustration of a clean {}',
|
| 109 |
+
'an illustration of a dirty {}',
|
| 110 |
+
'a dark photo of the {}',
|
| 111 |
+
'an illustration of my {}',
|
| 112 |
+
'an illustration of the cool {}',
|
| 113 |
+
'a close-up photo of a {}',
|
| 114 |
+
'a bright photo of the {}',
|
| 115 |
+
'a cropped photo of a {}',
|
| 116 |
+
'an illustration of the {}',
|
| 117 |
+
'a good photo of the {}',
|
| 118 |
+
'an illustration of one {}',
|
| 119 |
+
'a close-up photo of the {}',
|
| 120 |
+
'a rendition of the {}',
|
| 121 |
+
'an illustration of the clean {}',
|
| 122 |
+
'a rendition of a {}',
|
| 123 |
+
'an illustration of a nice {}',
|
| 124 |
+
'a good photo of a {}',
|
| 125 |
+
'an illustration of the nice {}',
|
| 126 |
+
'an illustration of the small {}',
|
| 127 |
+
'an illustration of the weird {}',
|
| 128 |
+
'an illustration of the large {}',
|
| 129 |
+
'an illustration of a cool {}',
|
| 130 |
+
'an illustration of a small {}',
|
| 131 |
+
'a depiction of a {}',
|
| 132 |
+
'a rendering of a {}',
|
| 133 |
+
'a cropped photo of the {}',
|
| 134 |
+
'the photo of a {}',
|
| 135 |
+
'a depiction of a clean {}',
|
| 136 |
+
'a depiction of a dirty {}',
|
| 137 |
+
'a dark photo of the {}',
|
| 138 |
+
'a depiction of my {}',
|
| 139 |
+
'a depiction of the cool {}',
|
| 140 |
+
'a close-up photo of a {}',
|
| 141 |
+
'a bright photo of the {}',
|
| 142 |
+
'a cropped photo of a {}',
|
| 143 |
+
'a depiction of the {}',
|
| 144 |
+
'a good photo of the {}',
|
| 145 |
+
'a depiction of one {}',
|
| 146 |
+
'a close-up photo of the {}',
|
| 147 |
+
'a rendition of the {}',
|
| 148 |
+
'a depiction of the clean {}',
|
| 149 |
+
'a rendition of a {}',
|
| 150 |
+
'a depiction of a nice {}',
|
| 151 |
+
'a good photo of a {}',
|
| 152 |
+
'a depiction of the nice {}',
|
| 153 |
+
'a depiction of the small {}',
|
| 154 |
+
'a depiction of the weird {}',
|
| 155 |
+
'a depiction of the large {}',
|
| 156 |
+
'a depiction of a cool {}',
|
| 157 |
+
'a depiction of a small {}',
|
| 158 |
+
'{} reads a newspaper in a cozy coffee shop.',
|
| 159 |
+
'{} jogs along a winding trail at sunrise.',
|
| 160 |
+
'{} takes a photograph of the bustling cityscape.',
|
| 161 |
+
'{} bakes cookies in a warm, inviting kitchen.',
|
| 162 |
+
'{} paints a mural on a large outdoor wall.',
|
| 163 |
+
'{} plants a tree in a sunny backyard.',
|
| 164 |
+
'{} repairs an old bicycle in the garage.',
|
| 165 |
+
'{} sketches a portrait with charcoal.',
|
| 166 |
+
'{} dances freely at a lively festival.',
|
| 167 |
+
'{} sows seeds in a flourishing vegetable garden.',
|
| 168 |
+
'{} plays a violin in a quiet room.',
|
| 169 |
+
'{} writes a poem under the shade of an oak tree.',
|
| 170 |
+
'{} feeds ducks at a peaceful lake.',
|
| 171 |
+
'{} practices yoga on a tranquil beach at dawn.',
|
| 172 |
+
'{} repairs a watch with skilled hands.',
|
| 173 |
+
'{} constructs a model airplane with precision.',
|
| 174 |
+
'{} decorates a cake with elaborate icing designs.',
|
| 175 |
+
'{} climbs a rock wall with determination.',
|
| 176 |
+
'{} meditates in a serene temple garden.',
|
| 177 |
+
'{} knits a colorful scarf by the fireside.',
|
| 178 |
+
'{} assembles a puzzle on a rainy afternoon.',
|
| 179 |
+
'{} examines artifacts at a history museum.',
|
| 180 |
+
'{} tends to a beehive in protective gear.',
|
| 181 |
+
'{} composes a new song on a keyboard.',
|
| 182 |
+
'{} stretches before starting a marathon.',
|
| 183 |
+
'{} recites lines for an upcoming play.',
|
| 184 |
+
'{} harvests apples in an orchard.',
|
| 185 |
+
'{} leads a tour group through ancient ruins.',
|
| 186 |
+
'{} creates a scrapbook filled with memories.',
|
| 187 |
+
'{} tutors a student in mathematics.',
|
| 188 |
+
'{} tries a new recipe from a gourmet cookbook.',
|
| 189 |
+
'{} rides a horse through an open field.',
|
| 190 |
+
'{} collects samples on a nature walk.',
|
| 191 |
+
'{} solves a complex mathematical equation.',
|
| 192 |
+
'{} fills the room with the sound of saxophone music.',
|
| 193 |
+
'{} arranges flowers in a beautiful bouquet.',
|
| 194 |
+
'{} hosts a podcast interview.',
|
| 195 |
+
'{} dives into a crystal-clear swimming pool.',
|
| 196 |
+
'{} studies a map before an expedition.',
|
| 197 |
+
'{} makes ceramic pottery on a spinning wheel.',
|
| 198 |
+
'{} trains a puppy to sit and stay.',
|
| 199 |
+
'{} rehearses for a ballet performance.',
|
| 200 |
+
'{} sails a boat across a calm lake.',
|
| 201 |
+
'{} browses through a second-hand bookstore.',
|
| 202 |
+
'{} explores a cave with a flashlight.',
|
| 203 |
+
'{} restores an old car in their home workshop.',
|
| 204 |
+
'{} conducts an orchestra with passion.',
|
| 205 |
+
'{} volunteers at a community food bank.',
|
| 206 |
+
'{} compiles a report in their office.',
|
| 207 |
+
'{} designs a website on their computer.',
|
| 208 |
+
'{} teaches a child to ride a bike.',
|
| 209 |
+
'{} performs a magic trick at a party.',
|
| 210 |
+
'{} packs a suitcase for a journey.',
|
| 211 |
+
'{} prunes roses in a sunlit garden.',
|
| 212 |
+
'{} crafts handmade jewelry from silver and gems.',
|
| 213 |
+
'{} inspects products for quality in a factory.',
|
| 214 |
+
'{} sculpts a figure from a block of marble.',
|
| 215 |
+
'{} organizes a community cleanup day.',
|
| 216 |
+
'{} swings a golf club on a green fairway.',
|
| 217 |
+
'{} develops photos in a darkroom.',
|
| 218 |
+
'{} directs a small indie film.',
|
| 219 |
+
'{} carves a wooden figure with intricate detail.',
|
| 220 |
+
'{} birdwatches with binoculars in the forest.',
|
| 221 |
+
'{} pilots a hot air balloon at dawn.',
|
| 222 |
+
'{} tutors peers in a university library.',
|
| 223 |
+
'{} rides a skateboard down a city street.',
|
| 224 |
+
'{} decorates a storefront for the holidays.',
|
| 225 |
+
'{} mixes cocktails at a busy bar.',
|
| 226 |
+
'{} cuts hair in a stylish salon.',
|
| 227 |
+
'{} researches genealogy to fill out a family tree.',
|
| 228 |
+
'{} writes calligraphy with elegant strokes.',
|
| 229 |
+
'{} edits a manuscript for publication.',
|
| 230 |
+
'{} lectures on environmental science.',
|
| 231 |
+
'{} designs a new board game.',
|
| 232 |
+
'{} hosts a charity auction.',
|
| 233 |
+
'{} laces up skates for an ice-skating lesson.',
|
| 234 |
+
'{} coordinates a wedding at a picturesque venue.',
|
| 235 |
+
'{} builds a sandcastle on the beach.',
|
| 236 |
+
'{} programs a robot for a competition.',
|
| 237 |
+
'{} captures wildlife photography in the jungle.',
|
| 238 |
+
'{} sets up a tent under the stars.',
|
| 239 |
+
'{} debuts a fashion collection on the runway.',
|
| 240 |
+
'{} curates pieces for an art exhibition.',
|
| 241 |
+
'{} conducts a science experiment in the laboratory.',
|
| 242 |
+
'{} provides a walking tour of a historic city.',
|
| 243 |
+
'{} partakes in a coffee cupping session.',
|
| 244 |
+
'{} negotiates a deal in a boardroom.',
|
| 245 |
+
'{} operates a forklift in a warehouse.',
|
| 246 |
+
'{} leads a yoga retreat in a mountain setting.',
|
| 247 |
+
'{} analyzes data on multiple computer screens.',
|
| 248 |
+
'{} paints a picket fence on a sunny day.',
|
| 249 |
+
'{} trains for gymnastics at the gym.',
|
| 250 |
+
'{} teaches a pottery class, guiding students.',
|
| 251 |
+
'{} cares for animals at a wildlife sanctuary.',
|
| 252 |
+
'{} crafts origami creations from colorful paper.',
|
| 253 |
+
'{} deejays a lively dance party.',
|
| 254 |
+
'{} writes code for a new software application.',
|
| 255 |
+
'{} grows an array of herbs in a window garden.',
|
| 256 |
+
'{} instructs a spin class with high energy.',
|
| 257 |
+
'{} navigates rapids in a whitewater raft.',
|
| 258 |
+
'Quietly, {} sets the table for dinner.',
|
| 259 |
+
'Suddenly, {} stops to pick up a fallen object.',
|
| 260 |
+
'Calmly, {} navigates through the crowd.',
|
| 261 |
+
'Gently, {} soothes a crying child.',
|
| 262 |
+
'Quickly, {} dashes out in the rain.',
|
| 263 |
+
'Joyfully, {} embraces a long-lost friend.',
|
| 264 |
+
'Firmly, {} stands their ground in debate.',
|
| 265 |
+
'Loudly, {} cheers on their favorite team.',
|
| 266 |
+
'Patiently, {} waits for their turn.',
|
| 267 |
+
'Anxiously, {} fidgets during an interview.',
|
| 268 |
+
'Easily, {} solves a complex puzzle.',
|
| 269 |
+
'Sadly, {} waves farewell at the departure gates.',
|
| 270 |
+
'Meticulously, {} organizes their collection.',
|
| 271 |
+
'Slyly, {} sneaks a cookie from the jar.',
|
| 272 |
+
'Defiantly, {} marches for change.',
|
| 273 |
+
'Warmly, {} greets newcomers.',
|
| 274 |
+
'Hungrily, {} eyes the banquet table.',
|
| 275 |
+
'Enthusiastically, {} starts their first day of work.',
|
| 276 |
+
'Stealthily, {} moves in the game of hide and seek.',
|
| 277 |
+
'Expertly, {} navigates the rapid waters.',
|
| 278 |
+
'Seamlessly, {} transitions between tasks.',
|
| 279 |
+
'Vigorously, {} cleans the cluttered garage.',
|
| 280 |
+
'Devotedly, {} tends to their garden.',
|
| 281 |
+
'Silently, {} admires the sunrise.',
|
| 282 |
+
'Righteously, {} advocates for justice.',
|
| 283 |
+
'Keenly, {} observes the wildlife.',
|
| 284 |
+
'Desperately, {} searches for their lost item.',
|
| 285 |
+
'Reverently, {} visits a historic monument.',
|
| 286 |
+
'Wistfully, {} looks back on fond memories.',
|
| 287 |
+
'Ambitiously, {} sets their career goals.',
|
| 288 |
+
'Rapidly, {} types up an urgent report.',
|
| 289 |
+
'Generously, {} shares their lunch.',
|
| 290 |
+
'Skillfully, {} crafts a beautiful piece of pottery.',
|
| 291 |
+
'Cautiously, {} approaches the unfamiliar dog.',
|
| 292 |
+
'Inquisitively, {} examines the ancient artifact.',
|
| 293 |
+
'Effortlessly, {} completes the challenging workout.',
|
| 294 |
+
'Frantically, {} looks for the exit.',
|
| 295 |
+
'Discreetly, {} passes a note during class.',
|
| 296 |
+
'Pensively, {} contemplates their next move.',
|
| 297 |
+
'Optimistically, {} plans for the future.',
|
| 298 |
+
'Sorrowfully, {} attends a memorial service.',
|
| 299 |
+
'Methodically, {} assembles the model airplane.',
|
| 300 |
+
'Lazily, {} lounges on the hammock.',
|
| 301 |
+
'Unsuccessfully, {} tries to hail a taxi.',
|
| 302 |
+
'Faithfully, {} follows the recipe.',
|
| 303 |
+
'Dramatically, {} reacts to the plot twist.',
|
| 304 |
+
'Adventurously, {} explores the dense forest.',
|
| 305 |
+
'Gracefully, {} accepts the award.',
|
| 306 |
+
'Theatrically, {} recites lines on stage.',
|
| 307 |
+
'Ardently, {} defends their thesis.',
|
| 308 |
+
'Abstractedly, {} doodles during the meeting.',
|
| 309 |
+
'Vivaciously, {} engages in the lively party.',
|
| 310 |
+
'Stoically, {} endures the challenging ordeal.',
|
| 311 |
+
'Resolutely, {} decides to change their life.',
|
| 312 |
+
'Triumphantly, {} crosses the finish line.',
|
| 313 |
+
'Suspiciously, {} glances over their shoulder.',
|
| 314 |
+
'Fervently, {} prays for good news.',
|
| 315 |
+
'Ruefully, {} acknowledges their mistake.',
|
| 316 |
+
'Industriously, {} works on the project till dusk.',
|
| 317 |
+
'Compassionately, {} comforts a stranger.',
|
| 318 |
+
'Sheepishly, {} admits they forgot the appointment.',
|
| 319 |
+
'Irately, {} disputes the incorrect charge.',
|
| 320 |
+
'Protectively, {} shields the puppy from the rain.',
|
| 321 |
+
'Serenely, {} meditates in the morning light.',
|
| 322 |
+
'Comically, {} slips on the banana peel.',
|
| 323 |
+
'Impressively, {} juggles multiple objects with ease.',
|
| 324 |
+
'Apprehensively, {} approaches the spooky house.',
|
| 325 |
+
'Unwaveringly, {} supports their friend.',
|
| 326 |
+
'Blissfully, {} soaks in the hot spring.',
|
| 327 |
+
'Compulsively, {} checks their notifications.',
|
| 328 |
+
'Tactfully, {} navigates the awkward situation.',
|
| 329 |
+
'Convincingly, {} sells their innovative idea.',
|
| 330 |
+
'Dutifully, {} fulfills their obligations.',
|
| 331 |
+
'Ingeniously, {} solves the critical problem.',
|
| 332 |
+
'Haphazardly, {} packs their suitcase.',
|
| 333 |
+
'Deftly, {} maneuvers the playing pieces.',
|
| 334 |
+
'Intriguedly, {} listens to the mysterious tale.',
|
| 335 |
+
'Ceremoniously, {} unveils the new sculpture.',
|
| 336 |
+
'Sterily, {} organizes the lab equipment.',
|
| 337 |
+
'Unintentionally, {} overhears a private conversation.',
|
| 338 |
+
'Forever, {} holds dear the cherished memories.',
|
| 339 |
+
'Nostalgically, {} revisits their old neighborhood.',
|
| 340 |
+
'Predictably, {} always laughs at the same joke.',
|
| 341 |
+
'Politely, {} inquires about the meeting agenda.',
|
| 342 |
+
'Securely, {} fastens their seatbelt before takeoff.',
|
| 343 |
+
'Casually, {} strolls through the park.',
|
| 344 |
+
'Spontaneously, {} decides to go on a road trip.',
|
| 345 |
+
'Clearly, {} expresses their feelings.',
|
| 346 |
+
'Merrily, {} decorates for the festive season.',
|
| 347 |
+
'Valiantly, {} stands up against injustice.',
|
| 348 |
+
'Diligently, {} studies for the upcoming exam.',
|
| 349 |
+
'Nonchalantly, {} brushes off the slight mishap.',
|
| 350 |
+
'Intensely, {} focuses on the target.',
|
| 351 |
+
'Subtly, {} hints at the surprise party.',
|
| 352 |
+
'Mysteriously, {} vanishes into the foggy night.',
|
| 353 |
+
'Decisively, {} makes their final choice.',
|
| 354 |
+
'Lovingly, {} prepares a home-cooked meal.',
|
| 355 |
+
'Immaculately, {} arranges the storefront display.',
|
| 356 |
+
'Vibrantly, {} adds color to the canvas.',
|
| 357 |
+
'The silhouette of {} casts a long shadow.',
|
| 358 |
+
'Through the fog, {} emerges slowly.',
|
| 359 |
+
'Over the hill, {} rides a bicycle.',
|
| 360 |
+
'After the storm, {} surveys the damage.',
|
| 361 |
+
'Around the bend, {} sails a boat.',
|
| 362 |
+
'Under the tree, {} reads a book.',
|
| 363 |
+
'Beside the fire, {} warms their hands.',
|
| 364 |
+
'Below the surface, {} discovers coral reefs.',
|
| 365 |
+
'Beyond the fence, {} tends to horses.',
|
| 366 |
+
'Above the crowd, {} waves a flag.',
|
| 367 |
+
'Among the flowers, {} finds peace.',
|
| 368 |
+
'Across the field, {} flies a kite.',
|
| 369 |
+
'Near the water, {} sketches the view.',
|
| 370 |
+
'By the road, {} waits patiently.',
|
| 371 |
+
'With careful precision, {} repairs a clock.',
|
| 372 |
+
'In the spotlight, {} performs a solo.',
|
| 373 |
+
'To the beat, {} dances joyfully.',
|
| 374 |
+
'On the stage, {} delivers a monologue.',
|
| 375 |
+
'Underneath the stars, {} makes a wish.',
|
| 376 |
+
'Beside the window, {} sips morning tea.',
|
| 377 |
+
'At the corner, {} hails a cab.',
|
| 378 |
+
'Against the odds, {} triumphs victoriously.',
|
| 379 |
+
'Beneath the waves, {} finds tranquility.',
|
| 380 |
+
'Before the race, {} stretches carefully.',
|
| 381 |
+
'Through the lens, {} captures the moment.',
|
| 382 |
+
'From the bridge, {} observes the river.',
|
| 383 |
+
'Since the dawn, {} has been fishing.',
|
| 384 |
+
'Like a statue, {} stands immovable.',
|
| 385 |
+
'Inside the house, {} feels safe.',
|
| 386 |
+
'The smile of {} brightens the room.',
|
| 387 |
+
'Upon the mountaintop, {} feels awe.',
|
| 388 |
+
'Without a doubt, {} commits to the goal.',
|
| 389 |
+
'Reflecting on life, {} contemplates deeply.',
|
| 390 |
+
'Amidst the chaos, {} remains calm.',
|
| 391 |
+
'Throughout the day, {} maintains focus.',
|
| 392 |
+
'During the performance, {} takes the stage.',
|
| 393 |
+
'Considering all options, {} makes a choice.',
|
| 394 |
+
'Alongside the path, {} picks wildflowers.',
|
| 395 |
+
'Toward the horizon, {} gazes expectantly.',
|
| 396 |
+
'Wrapped in thought, {} ponders life’s mysteries.',
|
| 397 |
+
'Accompanied by music, {} feels uplifted.',
|
| 398 |
+
'Surrounded by books, {} indulges in knowledge.',
|
| 399 |
+
'Guided by intuition, {} chooses a path.',
|
| 400 |
+
'Entertaining guests, {} tells a tale.',
|
| 401 |
+
'Admiring the artwork, {} gains inspiration.',
|
| 402 |
+
'Standing at the crossroads, {} hesitates slightly.',
|
| 403 |
+
'Lost in music, {} enjoys the concert.',
|
| 404 |
+
'Besieged by deadlines, {} works diligently.',
|
| 405 |
+
'Empowered by support, {} achieves greatness.',
|
| 406 |
+
'Gazing into space, {} dreams of stars.',
|
| 407 |
+
'Facing the challenge, {} exudes confidence.',
|
| 408 |
+
'Approaching the podium, {} clears their throat.',
|
| 409 |
+
'Enclosed in glass, {} admires the terrarium.',
|
| 410 |
+
'The reflection of {} shimmers on water.',
|
| 411 |
+
'Clutching the ticket, {} rushes to the gate.',
|
| 412 |
+
'Heeding the warning, {} takes precaution.',
|
| 413 |
+
'Observing the traditions, {} learns respect.',
|
| 414 |
+
'At the museum, {} admires ancient artifacts.',
|
| 415 |
+
'Following the recipe, {} bakes a cake.',
|
| 416 |
+
'Adjusting the telescope, {} explores the heavens.',
|
| 417 |
+
'In the garden, {} relaxes with nature.',
|
| 418 |
+
'Clinging to hope, {} perseveres through trials.',
|
| 419 |
+
'The laughter of {} fills the room.',
|
| 420 |
+
'During the lecture, {} takes diligent notes.',
|
| 421 |
+
'Sitting by the piano, {} composes a melody.',
|
| 422 |
+
'The hands of {} shape the clay.',
|
| 423 |
+
'The courage of {} inspires many others.',
|
| 424 |
+
'Laid on the canvas, {} begins to paint.',
|
| 425 |
+
'Carried by wind, {}’s kite ascends higher.',
|
| 426 |
+
'In the workshop, {} builds a dream.',
|
| 427 |
+
'Mingled with others, {} shares a story.',
|
| 428 |
+
'Learning the ropes, {} adapts quickly.',
|
| 429 |
+
'Fuelled by passion, {} pursues their dreams.',
|
| 430 |
+
'In the office, {} meets a deadline.',
|
| 431 |
+
'With each stride, {} closes the distance.',
|
| 432 |
+
'Mastering the craft, {} excels in their art.',
|
| 433 |
+
'The vision of {} leads to success.',
|
| 434 |
+
'Striving for wellness, {} embraces a change.',
|
| 435 |
+
'Buffeted by wind, {} adjusts their hat.',
|
| 436 |
+
'Engulfed in aroma, {} enjoys the spices.',
|
| 437 |
+
'Surrounded by laughter, {} feels joy.',
|
| 438 |
+
'Avoiding the puddle, {} steps carefully.',
|
| 439 |
+
'Reacting quickly, {} catches the falling vase.',
|
| 440 |
+
'Marked by time, {}’s diary tells tales.',
|
| 441 |
+
'Supported by friends, {} overcomes fear.',
|
| 442 |
+
'Puzzled by clues, {} solves the riddle.',
|
| 443 |
+
'Driving through night, {} reaches their destination.',
|
| 444 |
+
'Splashed by waves, {} laughs heartily.',
|
| 445 |
+
'Confronted with choices, {} deliberates wisely.',
|
| 446 |
+
'Hidden by shadows, {} watches the scene.',
|
| 447 |
+
'Inspired by nature, {} writes poetry.',
|
| 448 |
+
'Guarded by mystery, {}’s past intrigues.',
|
| 449 |
+
'Detouring the path, {} discovers new sights.',
|
| 450 |
+
'Greeted by dawn, {} feels renewed.',
|
| 451 |
+
'Warmed by sunlight, {} enjoys the afternoon.',
|
| 452 |
+
'Answering the call, {} takes action.',
|
| 453 |
+
'Sheltered by canopy, {} escapes the rain.',
|
| 454 |
+
'Bound by duty, {} fulfills their role.',
|
| 455 |
+
'Pulled by curiosity, {} enters the store.',
|
| 456 |
+
'Motivated by change, {} advocates for causes.',
|
| 457 |
+
'In silence, {} stares into space.',
|
| 458 |
+
'Lost in thought, {} stands still.',
|
| 459 |
+
'With excitement, {} opens a gift.',
|
| 460 |
+
'Amid laughter, {} shares a joke.',
|
| 461 |
+
'Surrounded by nature, {} takes a deep breath.',
|
| 462 |
+
'Under the sun, {} stretches out.',
|
| 463 |
+
'Against a backdrop of mountains, {} gazes afar.',
|
| 464 |
+
'Among friends, {} enjoys a conversation.',
|
| 465 |
+
'Before dinner, {} sets the table.',
|
| 466 |
+
'Behind the counter, {} makes coffee.',
|
| 467 |
+
'Below the surface, {} snorkels in clear water.',
|
| 468 |
+
'Beneath the stars, {} lights a campfire.',
|
| 469 |
+
'Beside a bicycle, {} takes a break.',
|
| 470 |
+
'By the seaside, {} collects seashells.',
|
| 471 |
+
'Near the horizon, {} sketches the view.',
|
| 472 |
+
'On the bridge, {} watches the water flow.',
|
| 473 |
+
'Through the window, {} waves goodbye.',
|
| 474 |
+
'To the music, {} taps their feet.',
|
| 475 |
+
'With a book, {} finds escape.',
|
| 476 |
+
'Without a care, {} listens to music.',
|
| 477 |
+
'Around the table, {} shares a story.',
|
| 478 |
+
'Outside the house, {} does some gardening.',
|
| 479 |
+
'From the stage, {} delivers a speech.',
|
| 480 |
+
'After the rain, {} jumps in puddles.',
|
| 481 |
+
'During the party, {} blows up balloons.',
|
| 482 |
+
'Following the path, {} takes a stroll.',
|
| 483 |
+
'Along the river, {} is fishing.',
|
| 484 |
+
'Inside the room, {} practices yoga.',
|
| 485 |
+
'Throughout the day, {} takes photos.',
|
| 486 |
+
'Across the field, {} flies a kite.',
|
| 487 |
+
'Between the lines, {} reads quietly.',
|
| 488 |
+
'Behind the lens, {} captures the moment.',
|
| 489 |
+
'Along the alley, {} walks their dog.',
|
| 490 |
+
'Before the sunrise, {} enjoys the calm.',
|
| 491 |
+
'Over the fence, {} talks to a neighbor.',
|
| 492 |
+
'Under the tree, {} has a picnic.',
|
| 493 |
+
'Beyond the gate, {} starts their journey.',
|
| 494 |
+
'Around the fire, {} tells ghost stories.',
|
| 495 |
+
'Above the clouds, {} skydives.',
|
| 496 |
+
'Among the crowd, {} cheers loudly.',
|
| 497 |
+
'Near the pond, {} feeds the ducks.',
|
| 498 |
+
'On the couch, {} takes a nap.',
|
| 499 |
+
'Before the show, {} checks their ticket.',
|
| 500 |
+
'Under the sky, {} flies a drone.',
|
| 501 |
+
'Behind the wheel, {} sings loudly.',
|
| 502 |
+
'Above the waves, {} surfs with skill.',
|
| 503 |
+
'Within the walls, {} paints their dream.',
|
| 504 |
+
'Beyond the road, {} hikes up the hill.',
|
| 505 |
+
'Beneath the quilt, {} reads at night.',
|
| 506 |
+
'Against the odds, {} tries a new trick.',
|
| 507 |
+
'During the trip, {} savors local cuisine.',
|
| 508 |
+
'Amid the shelves, {} finds an old book.',
|
| 509 |
+
'Across the room, {} waves to a friend.',
|
| 510 |
+
'By the pool, {} basks in the sun.',
|
| 511 |
+
'Beneath the lights, {} takes center stage.',
|
| 512 |
+
'Above the city, {} marvels at the view.',
|
| 513 |
+
'Behind the scenes, {} prepares diligently.',
|
| 514 |
+
'Over the moon, {} celebrates good news.',
|
| 515 |
+
'Under the arch, {} takes memorable photos.',
|
| 516 |
+
'Before the dawn, {} prepares for the day.',
|
| 517 |
+
'Throughout the match, {} cheers enthusiastically.',
|
| 518 |
+
'Between workouts, {} hydrates and rests.',
|
| 519 |
+
'Around the campfire, {} roasts marshmallows.',
|
| 520 |
+
'By the window, {} enjoys the morning light.',
|
| 521 |
+
'After the lecture, {} asks thoughtful questions.',
|
| 522 |
+
'Within the garden, {} admires the flowers.',
|
| 523 |
+
'Beneath the blanket, {} watches a movie.',
|
| 524 |
+
'Beyond the wall, {} hears echoes of laughter.',
|
| 525 |
+
'Behind the book, {} hides a surprise gift.',
|
| 526 |
+
'Under the bridge, {} sketches the river scene.',
|
| 527 |
+
'During the concert, {} loses themselves in the music.',
|
| 528 |
+
'On the terrace, {} sips on iced tea.',
|
| 529 |
+
'Before the alarm, {} wakes up naturally.',
|
| 530 |
+
'Above the rooftops, {} spots a passing balloon.',
|
| 531 |
+
'Across the street, {} helps an elderly neighbor.',
|
| 532 |
+
'Beside the lamp, {} finishes their novel.',
|
| 533 |
+
'With the crowd, {} dances to the festival music.',
|
| 534 |
+
'By the lakeside, {} sets up a fishing rod.',
|
| 535 |
+
'Before the exercise, {} stretches thoroughly.',
|
| 536 |
+
'Near the finish line, {} sprints with determination.',
|
| 537 |
+
'On the balcony, {} tends to potted plants.',
|
| 538 |
+
'After the storm, {} clears the fallen branches.',
|
| 539 |
+
'Under the covers, {} snoozes the alarm clock.',
|
| 540 |
+
'Between the curtains, {} peeks at the sunrise.',
|
| 541 |
+
'Around the corner, {} discovers a quaint café.',
|
| 542 |
+
'By the artwork, {} contemplates the message of the painter.',
|
| 543 |
+
'After the game, {} congratulates the players.',
|
| 544 |
+
'Within the studio, {} edits a documentary film.',
|
| 545 |
+
'Beneath the hat, {} grins at a private joke.',
|
| 546 |
+
'Beyond the dunes, {} takes in the beach view.',
|
| 547 |
+
'Behind the microphone, {} records a podcast.',
|
| 548 |
+
'Under the eaves, {} shelters from the rain.',
|
| 549 |
+
'During the hike, {} spots a rare bird.',
|
| 550 |
+
'On the platform, {} awaits the next train.',
|
| 551 |
+
'Before the meal, {} gives thanks.',
|
| 552 |
+
'Above the fray, {} keeps a level head.',
|
| 553 |
+
'Across the canvas, {} strokes colors with a brush.',
|
| 554 |
+
'Beside the hearth, {} warms their hands.',
|
| 555 |
+
'With affection, {} pets their sleepy cat.',
|
| 556 |
+
'By the harbor, {} watches boats come and go.',
|
| 557 |
+
'In a room, {} reads quietly.',
|
| 558 |
+
'Near the shore, {} fishes calmly.',
|
| 559 |
+
'Behind the counter, {} smiles warmly.',
|
| 560 |
+
'Among the trees, {} jogs daily.',
|
| 561 |
+
'On the bench, {} sits silently.',
|
| 562 |
+
'With a pen, {} writes diligently.',
|
| 563 |
+
'At dawn, {} stretches readily.',
|
| 564 |
+
'Under the stars, {} dreams peacefully.',
|
| 565 |
+
'With the dog, {} walks leisurely.',
|
| 566 |
+
'Against the backdrop, {} stands proudly.',
|
| 567 |
+
'On stage, {} speaks clearly.',
|
| 568 |
+
'In the garden, {} works happily.',
|
| 569 |
+
'At the table, {} eats slowly.',
|
| 570 |
+
'Beside the window, {} gazes thoughtfully.',
|
| 571 |
+
'Within the crowd, {} laughs loudly.',
|
| 572 |
+
'By the painting, {} ponders intently.',
|
| 573 |
+
'On the bridge, {} pauses reflectively.',
|
| 574 |
+
'Under the umbrella, {} waits patiently.',
|
| 575 |
+
'Before the game, {} practices routinely.',
|
| 576 |
+
'Behind the lens, {} captures moments.',
|
| 577 |
+
'In the cafe, {} sips coffee.',
|
| 578 |
+
'With a map, {} explores curiously.',
|
| 579 |
+
'On the couch, {} naps briefly.',
|
| 580 |
+
'At the wheel, {} drives safely.',
|
| 581 |
+
'Beside the fire, {} warms up.',
|
| 582 |
+
'During the concert, {} claps excitedly.',
|
| 583 |
+
'By the bookshelf, {} selects a novel.',
|
| 584 |
+
'On the path, {} bikes steadily.',
|
| 585 |
+
'Under the quilt, {} snoozes comfortably.',
|
| 586 |
+
'Before the screen, {} types consistently.',
|
| 587 |
+
'Within the room, {} dances joyfully.',
|
| 588 |
+
'At the market, {} shops carefully.',
|
| 589 |
+
'Beside the pool, {} sunbathes lazily.',
|
| 590 |
+
'On the road, {} hitches northward.',
|
| 591 |
+
'Against the clock, {} races swiftly.',
|
| 592 |
+
'By the door, {} knocks promptly.',
|
| 593 |
+
'In the silence, {} meditates profoundly.',
|
| 594 |
+
'With a brush, {} paints a canvas.',
|
| 595 |
+
'On a horse, {} rides boldly.',
|
| 596 |
+
'At the concert, {} listens attentively.',
|
| 597 |
+
'Beside the lamp, {} reads a letter.',
|
| 598 |
+
'On the field, {} throws a ball.',
|
| 599 |
+
'Under the sun, {} basks leisurely.',
|
| 600 |
+
'Before the microphone, {} sings softly.',
|
| 601 |
+
'Within the frame, {} looks stern.',
|
| 602 |
+
'In the studio, {} records a podcast.',
|
| 603 |
+
'By the seaside, {} collects shells.',
|
| 604 |
+
'On the mattress, {} lies awake.',
|
| 605 |
+
'Behind the bar, {} mixes drinks.',
|
| 606 |
+
'During the meeting, {} takes notes.',
|
| 607 |
+
'At the podium, {} delivers a speech.',
|
| 608 |
+
'Beside the pond, {} feeds ducks.',
|
| 609 |
+
'On the swing, {} rocks gently.',
|
| 610 |
+
'Under the sky, {} dreams freely.',
|
| 611 |
+
'Before the class, {} sets up.',
|
| 612 |
+
'Within the pages, {} finds adventure.',
|
| 613 |
+
'At the corner, {} waves hello.',
|
| 614 |
+
'By the stove, {} cooks breakfast.',
|
| 615 |
+
'On the terrace, {} breathes deeply.',
|
| 616 |
+
'Against the wall, {} rests momentarily.',
|
| 617 |
+
'In the lineup, {} waits calmly.',
|
| 618 |
+
'With a joystick, {} plays a game.',
|
| 619 |
+
'On the floor, {} stretches out.',
|
| 620 |
+
'At the crossroads, {} chooses a path.',
|
| 621 |
+
'Beside the bag, {} finds keys.',
|
| 622 |
+
'On the track, {} runs laps.',
|
| 623 |
+
'Under the tree, {} enjoys shade.',
|
| 624 |
+
'Before the journey, {} packs essentials.',
|
| 625 |
+
'Within the box, {} discovers treasures.',
|
| 626 |
+
'In the mirror, {} sees reflection.',
|
| 627 |
+
'By the lake, {} skips stones.',
|
| 628 |
+
'On the steps, {} sits waiting.',
|
| 629 |
+
'Against the flow, {} stands firm.',
|
| 630 |
+
'Before the event, {} feels nervous.',
|
| 631 |
+
'Within the heart, {} holds love.',
|
| 632 |
+
'At the keyboard, {} composes music.',
|
| 633 |
+
'By the fence, {} watches sunset.',
|
| 634 |
+
'On the ledge, {} takes in views.',
|
| 635 |
+
'Under the moon, {} makes wishes.',
|
| 636 |
+
'Before the crowd, {} shows courage.',
|
| 637 |
+
'Within the house, {} calls family.',
|
| 638 |
+
'At the desk, {} solves puzzles.',
|
| 639 |
+
'Beside the car, {} checks tires.',
|
| 640 |
+
'On the peak, {} celebrates triumph.',
|
| 641 |
+
'Against the odds, {} perseveres always.',
|
| 642 |
+
'In the foyer, {} welcomes guests.',
|
| 643 |
+
'With the team, {} collaborates effectively.',
|
| 644 |
+
'On the grass, {} rolls playfully.',
|
| 645 |
+
'At the junction, {} signals left.',
|
| 646 |
+
'Beside the easel, {} studies the painting.',
|
| 647 |
+
'On the quilt, {} patches holes.',
|
| 648 |
+
'Under the coat, {} hides a gift.',
|
| 649 |
+
'Before the dawn, {} dreams of success.',
|
| 650 |
+
'Within the shadows, {} moves silently.',
|
| 651 |
+
'At the beach, {} builds castles.',
|
| 652 |
+
'By the gate, {} waits anxiously.',
|
| 653 |
+
'On the island, {} finds peace.',
|
| 654 |
+
'Against the breeze, {} flies a kite.',
|
| 655 |
+
'Before the altar, {} takes a vow.',
|
| 656 |
+
'Within the orchestra, {} tunes their instrument.',
|
| 657 |
+
'An exciting magic trick is being performed by {}.',
|
| 658 |
+
'A quiet library is being enjoyed by {}.',
|
| 659 |
+
'A delicious meal is being cooked in the kitchen by {}.',
|
| 660 |
+
'A challenging rock wall is being climbed by {}.',
|
| 661 |
+
'A fast-paced basketball game is being played by {}.',
|
| 662 |
+
'A beautiful melody is being played on a violin by {}.',
|
| 663 |
+
'A serene lake is being fished by {}.',
|
| 664 |
+
'An intense workout is being completed in the gym by {}.',
|
| 665 |
+
'A mysterious book is being read under the tree by {}.',
|
| 666 |
+
'A spirited dance is being performed on stage by {}.',
|
| 667 |
+
'A serene afternoon picnic is being enjoyed by {}.',
|
| 668 |
+
'A thrilling skateboarding trick is being attempted by {}.',
|
| 669 |
+
'An intricate jigsaw puzzle is being solved by {}.',
|
| 670 |
+
'A high note is being sung in a rehearsal room by {}.',
|
| 671 |
+
'A new recipe is being tried out in the kitchen by {}.',
|
| 672 |
+
'A bookshelf is being organized in the study by {}.',
|
| 673 |
+
'A large canvas is being painted with bold colors by {}.',
|
| 674 |
+
'An ancient ruin is being carefully explored by {}.',
|
| 675 |
+
'A lengthy novel is being written at the desk by {}.',
|
| 676 |
+
'A pottery wheel is being used to shape clay by {}.',
|
| 677 |
+
'A soft melody is being played on a guitar by {}.',
|
| 678 |
+
'A new language is being learned with enthusiasm by {}.',
|
| 679 |
+
'An early morning jog is being taken along the beach by {}.',
|
| 680 |
+
'A handmade quilt is being stitched with care by {}.',
|
| 681 |
+
'A tropical fruit stand is being set up at the market by {}.',
|
| 682 |
+
'A hot beverage is being brewed in a cozy cafe by {}.',
|
| 683 |
+
'A winter bonfire is being lit to warm up the night by {}.',
|
| 684 |
+
'A peaceful kayak trip is being embarked upon by {}.',
|
| 685 |
+
'Bold graffiti is being sprayed on an urban wall by {}.',
|
| 686 |
+
'A lively story is being told around the campfire by {}.',
|
| 687 |
+
'A crafty sculpture is being created from recycled materials by {}.',
|
| 688 |
+
'A vibrant mural is being painted on a downtown alley by {}.',
|
| 689 |
+
'A dusty trail is being hiked at dawn by {}.',
|
| 690 |
+
'A tricky crossword puzzle is being filled out by {}.',
|
| 691 |
+
'A homemade pie is being baked for a special occasion by {}.',
|
| 692 |
+
'An elaborate garden is being tended to by {}.',
|
| 693 |
+
'A suspenseful movie is being watched with excitement by {}.',
|
| 694 |
+
'A difficult yoga pose is being mastered in the studio by {}.',
|
| 695 |
+
'A new skateboard is being ridden down a hill by {}.',
|
| 696 |
+
'A savory soup is being stirred in a pot by {}.',
|
| 697 |
+
'Cheerful holiday decorations are being hung around the house by {}.',
|
| 698 |
+
'A thrilling novel is being devoured on a rainy afternoon by {}.',
|
| 699 |
+
'A chess game is being thoughtfully played in the park by {}.',
|
| 700 |
+
'A burst of laughter is being shared with friends by {}.',
|
| 701 |
+
'Bright city lights are being admired from a rooftop by {}.',
|
| 702 |
+
'An old family recipe is being followed in the kitchen by {}.',
|
| 703 |
+
'A marshmallow is being roasted over a campfire by {}.',
|
| 704 |
+
'Careful brush strokes are being applied to a model figurine by {}.',
|
| 705 |
+
'A challenging video game is being played with focus by {}.',
|
| 706 |
+
'An evening class is being attended with interest by {}.',
|
| 707 |
+
'A delicate pastry is being decorated with icing by {}.',
|
| 708 |
+
'An excited puppy is being trained in the backyard by {}.',
|
| 709 |
+
'A basketball is being shot into a hoop by {}.',
|
| 710 |
+
'A lively drumbeat is being played at a concert by {}.',
|
| 711 |
+
'Colorful fall leaves are being photographed in the woods by {}.',
|
| 712 |
+
'A new song is being composed on the piano by {}.',
|
| 713 |
+
'A long-lost friend is being hugged in a warm embrace by {}.',
|
| 714 |
+
'Bright fireworks are being watched in awe by {}.',
|
| 715 |
+
'A favorite TV show is being binge-watched by {}.',
|
| 716 |
+
'A new trail is being biked through the forest by {}.',
|
| 717 |
+
'Freshly baked cookies are being taken out of the oven by {}.',
|
| 718 |
+
'A difficult problem is being solved with satisfaction by {}.',
|
| 719 |
+
'Colorful balloons are being blown up for a party by {}.',
|
| 720 |
+
'A joyful tune is being whistled while walking by {}.',
|
| 721 |
+
'An old film camera is being loaded with film by {}.',
|
| 722 |
+
'An empty canvas is being gazed upon before painting by {}.',
|
| 723 |
+
'An exciting soccer match is being watched with friends by {}.',
|
| 724 |
+
'A warm cup of tea is being sipped quietly by {}.',
|
| 725 |
+
'A good book is being enjoyed in a comfy armchair by {}.',
|
| 726 |
+
'A gentle horse is being groomed in the stable by {}.',
|
| 727 |
+
'A tense board game is being strategized over by {}.',
|
| 728 |
+
'Fresh laundry is being folded neatly by {}.',
|
| 729 |
+
'A thrilling roller coaster ride is being braved by {}.',
|
| 730 |
+
'A favorite song is being sung in the shower by {}.',
|
| 731 |
+
'A rainy day is being spent baking cookies by {}.',
|
| 732 |
+
'Classic tunes are being listened to on vinyl by {}.',
|
| 733 |
+
'An interesting documentary is being watched intently by {}.',
|
| 734 |
+
'A busy day is being relaxed from with a bubble bath by {}.',
|
| 735 |
+
'A sunflower field is being walked through by {}.',
|
| 736 |
+
'A new plant is being potted with care by {}.',
|
| 737 |
+
'A sunny terrace is being enjoyed with a cold drink by {}.',
|
| 738 |
+
'Morning birds are being listened to at dawn by {}.',
|
| 739 |
+
'A quiet museum hall is being wandered through by {}.',
|
| 740 |
+
'An experimental recipe is being tested in the kitchen by {}.',
|
| 741 |
+
'A homemade kite is being flown on a breezy day by {}.',
|
| 742 |
+
'A colorful aquarium is being cleaned by {}.',
|
| 743 |
+
'A new blog post is being composed on a laptop by {}.',
|
| 744 |
+
'A wild trail is being trekked with enthusiasm by {}.',
|
| 745 |
+
'An ice cream cone is being savored on a warm day by {}.',
|
| 746 |
+
'A peaceful sunrise is being watched from a hilltop by {}.',
|
| 747 |
+
'Freshly ground coffee is being brewed in the morning by {}.',
|
| 748 |
+
'A comfortable hammock is being swayed in gently by {}.',
|
| 749 |
+
'A nostalgic video game is being revisited with joy by {}.',
|
| 750 |
+
'A challenging Sudoku puzzle is being completed by {}.',
|
| 751 |
+
'A dusty attic is being explored for treasures by {}.',
|
| 752 |
+
'A hefty stack of pancakes is being devoured for breakfast by {}.',
|
| 753 |
+
'Delicate origami is being folded by {}.',
|
| 754 |
+
'A peaceful moment is being cherished on a quiet porch by {}.',
|
| 755 |
+
'On a quiet street, {} is jogging.',
|
| 756 |
+
'With a gentle smile, {} offers help.',
|
| 757 |
+
'Behind the old bookstore, {} reads quietly.',
|
| 758 |
+
'Near a calm lake, {} sketches the scenery.',
|
| 759 |
+
'By the bright window, {} sips coffee.',
|
| 760 |
+
'Under the warm sun, {} relaxes.',
|
| 761 |
+
'Around the bustling square, {} dances.',
|
| 762 |
+
'Beside the campfire, {} tells stories.',
|
| 763 |
+
'Above the city noise, {} daydreams.',
|
| 764 |
+
'Through the crowded fair, {} navigates.',
|
| 765 |
+
'Against the evening sky, {} takes photos.',
|
| 766 |
+
'Among the tall trees, {} hikes.',
|
| 767 |
+
'Before the morning rush, {} stretches.',
|
| 768 |
+
'Amid the garden blooms, {} seeks peace.',
|
| 769 |
+
'Across the open field, {} runs freely.',
|
| 770 |
+
'During the lively party, {} laughs.',
|
| 771 |
+
'Following the winding path, {} explores.',
|
| 772 |
+
'Outside the cozy cottage, {} gazes at stars.',
|
| 773 |
+
'Within the silent walls, {} contemplates.',
|
| 774 |
+
'Beneath the ancient arch, {} pauses reflectively.',
|
| 775 |
+
'Along the riverbank, {} fishes.',
|
| 776 |
+
'Beside a bubbling brook, {} writes poetry.',
|
| 777 |
+
'Underneath the vibrant mural, {} admires art.',
|
| 778 |
+
'Beyond the bustling streets, {} finds quiet.',
|
| 779 |
+
'Behind the heavy curtain, {} rehearses lines.',
|
| 780 |
+
'Upon the windswept hill, {} flies a kite.',
|
| 781 |
+
'Throughout the sunny day, {} tends the shop.',
|
| 782 |
+
'Despite the hectic pace, {} stays calm.',
|
| 783 |
+
'Behind the lens of a camera, {} captures moments.',
|
| 784 |
+
'Inside the warm bakery, {} savors aromas.',
|
| 785 |
+
'Beneath the star-filled sky, {} makes a wish.',
|
| 786 |
+
'Beyond the garden gate, {} enters serenity.',
|
| 787 |
+
'Between the bookshelves, {} finds adventure.',
|
| 788 |
+
'Across the dance floor, {} moves gracefully.',
|
| 789 |
+
'Around the festive decorations, {} feels joy.',
|
| 790 |
+
'Amidst the quiet sanctuary, {} prays.',
|
| 791 |
+
'Near the bustling café, {} watches the world.',
|
| 792 |
+
'Under the shade of a tree, {} enjoys a picnic.',
|
| 793 |
+
'By the glow of the fireplace, {} reads.',
|
| 794 |
+
'After the long journey, {} rests.',
|
| 795 |
+
'Outside the lively market, {} samples flavors.',
|
| 796 |
+
'Upon the old wooden bench, {} sits.',
|
| 797 |
+
'Around the warm campfire, {} sings.',
|
| 798 |
+
'Through the busy terminal, {} travels.',
|
| 799 |
+
'Within the walls of home, {} feels safe.',
|
| 800 |
+
'Beside the flowing river, {} reflects.',
|
| 801 |
+
'Against the cool breeze, {} wraps up warm.',
|
| 802 |
+
'Across the silent library, {} seeks knowledge.',
|
| 803 |
+
'Beneath the towering cliff, {} gazes up.',
|
| 804 |
+
'Beyond the colorful horizon, {} dreams.',
|
| 805 |
+
'Between the office cubicles, {} takes a breath.',
|
| 806 |
+
'Behind the vibrant easel, {} paints.',
|
| 807 |
+
'Upon the peaceful shore, {} collects shells.',
|
| 808 |
+
'Throughout the old village, {} discovers history.',
|
| 809 |
+
'Despite the falling rain, {} smiles.',
|
| 810 |
+
'Inside the bustling diner, {} enjoys breakfast.',
|
| 811 |
+
'By the edge of the fountain, {} tosses a coin.',
|
| 812 |
+
'Outside the charming bookstore, {} chooses a novel.',
|
| 813 |
+
'Upon the rooftop terrace, {} views the skyline.',
|
| 814 |
+
'Through the frosty window, {} longs for spring.',
|
| 815 |
+
'Within the hushed auditorium, {} listens intently.',
|
| 816 |
+
'Beside the crackling bonfire, {} cozies up.',
|
| 817 |
+
'Against the morning chill, {} jogs.',
|
| 818 |
+
'Across the golden meadow, {} strolls.',
|
| 819 |
+
'Amidst the echo of laughter, {} joins in.',
|
| 820 |
+
'Beyond the realm of the city, {} seeks nature.',
|
| 821 |
+
'Between the lush vines, {} harvests grapes.',
|
| 822 |
+
'Behind the frosted glass, {} sips tea.',
|
| 823 |
+
'Upon the creaky floorboards, {} tip-toes.',
|
| 824 |
+
'Throughout the silent movie, {} is mesmerized.',
|
| 825 |
+
'Despite the room’s clutter, {} finds order.',
|
| 826 |
+
'Beneath the bright marquee, {} awaits the opening.',
|
| 827 |
+
'By the light of the lanterns, {} feels warmth.',
|
| 828 |
+
'After the rain has passed, {} splashes in puddles.',
|
| 829 |
+
'Outside the local theater, {} buys a ticket.',
|
| 830 |
+
'Upon the green expanse, {} practices yoga.',
|
| 831 |
+
'Through the historic district, {} admires architecture.',
|
| 832 |
+
'Within the quiet of dawn, {} takes a moment.',
|
| 833 |
+
'Beside the ice-covered pond, {} feeds the ducks.',
|
| 834 |
+
'Against the setting sun, {} cherishes the moment.',
|
| 835 |
+
'Across the crowded room, {} finds a friend.',
|
| 836 |
+
'Amidst the morning calm, {} sows seeds.',
|
| 837 |
+
'Beneath the overcast sky, {} contemplates change.',
|
| 838 |
+
'Beyond the busy crosswalk, {} finds solitude.',
|
| 839 |
+
'Between two towering pines, {} hangs a hammock.',
|
| 840 |
+
'Behind the cool shade, {} enjoys an ice cream.',
|
| 841 |
+
'Upon the deserted path, {} embraces stillness.',
|
| 842 |
+
'Throughout the lively tune, {} taps their foot.',
|
| 843 |
+
'Despite the distance apart, {} feels connected.',
|
| 844 |
+
'Inside the crowded bus, {} daydreams.',
|
| 845 |
+
'Beneath the vast universe, {} feels wonder.',
|
| 846 |
+
'By the vibrant mural, {} appreciates art.',
|
| 847 |
+
'After the final curtain call, {} feels inspired.',
|
| 848 |
+
'Outside the quaint café, {} inhales the fresh morning air.',
|
| 849 |
+
'Sitting calmly with a book in their lap is {}.',
|
| 850 |
+
'Holding the reins of a horse stands {}.',
|
| 851 |
+
'Laughing at a joke just heard is {}.',
|
| 852 |
+
'Taking a deep breath of fresh air on a hike is {}.',
|
| 853 |
+
'Reaching for an apple on a tree is {}.',
|
| 854 |
+
'Playing a violin with focused attention is {}.',
|
| 855 |
+
'Taking a photo of the sunset is {}.',
|
| 856 |
+
'Lying on the grass and looking at the clouds is {}.',
|
| 857 |
+
'Standing with an umbrella in the rain is {}.',
|
| 858 |
+
'Throwing a frisbee in the park is {}.',
|
| 859 |
+
'Riding a skateboard down the sidewalk is {}.',
|
| 860 |
+
'Juggling three balls skillfully is {}.',
|
| 861 |
+
'Swinging on a swing with a smile is {}.',
|
| 862 |
+
'Pulling a suitcase in an airport is {}.',
|
| 863 |
+
'Dipping a paintbrush into paint before a canvas is {}.',
|
| 864 |
+
'Stretching before a run along the track is {}.',
|
| 865 |
+
'Pouring a cup of coffee in the morning is {}.',
|
| 866 |
+
'Bouncing a basketball on the court is {}.',
|
| 867 |
+
'Holding an ice cream cone upside down is {}.',
|
| 868 |
+
'Standing at the podium about to speak is {}.',
|
| 869 |
+
'Waiting for a train at the station is {}.',
|
| 870 |
+
'Typing rapidly on a keyboard is {}.',
|
| 871 |
+
'Riding a bicycle along the river path is {}.',
|
| 872 |
+
'Blowing out candles on a birthday cake is {}.',
|
| 873 |
+
'Feeding ducks by the pond is {}.',
|
| 874 |
+
'Hiking with a backpack up a mountain trail is {}.',
|
| 875 |
+
'Lifting weights in the gym is {}.',
|
| 876 |
+
'Contemplating a piece of art in a gallery is {}.',
|
| 877 |
+
'Sipping a milkshake through a straw is {}.',
|
| 878 |
+
'Planting seedlings in a garden bed is {}.',
|
| 879 |
+
'Wading through a stream with a fishing pole is {}.',
|
| 880 |
+
'Assembling a model airplane with focus is {}.',
|
| 881 |
+
'Whipping up a smoothie in a blender is {}.',
|
| 882 |
+
'Rolling out dough for a pie is {}.',
|
| 883 |
+
'Peering through a telescope at night is {}.',
|
| 884 |
+
'Flying a kite in the open field is {}.',
|
| 885 |
+
'Playing chess and contemplating the next move is {}.',
|
| 886 |
+
'Brushing a horse in the stable is {}.',
|
| 887 |
+
'Sitting on the pier with feet dangling over water is {}.',
|
| 888 |
+
'Tuning a guitar before a performance is {}.',
|
| 889 |
+
'Practicing yoga in a peaceful room is {}.',
|
| 890 |
+
'Sculpting clay on a pottery wheel is {}.',
|
| 891 |
+
'Skimming a stone across a lake is {}.',
|
| 892 |
+
'Building a sandcastle at the beach is {}.',
|
| 893 |
+
'Fishing at the crack of dawn on a boat is {}.',
|
| 894 |
+
'Roasting marshmallows over a campfire is {}.',
|
| 895 |
+
'Watching the horizon from the deck of a ship is {}.',
|
| 896 |
+
'Admiring the view from the top of a ferris wheel is {}.',
|
| 897 |
+
'Reading a map under the streetlight is {}.',
|
| 898 |
+
'Twirling a pen thoughtfully while studying is {}.',
|
| 899 |
+
'Writing in a journal quietly is {}.',
|
| 900 |
+
'Inspecting a gadget with curiosity is {}.',
|
| 901 |
+
'Balancing on a slackline between two trees is {}.',
|
| 902 |
+
'Mixing ingredients for a recipe is {}.',
|
| 903 |
+
'Waiting patiently for the crosswalk signal is {}.',
|
| 904 |
+
'Riding an escalator up to the next floor is {}.',
|
| 905 |
+
'Sitting on a bench feeding pigeons is {}.',
|
| 906 |
+
'Standing at the edge of the diving board is {}.',
|
| 907 |
+
'Looking at merchandise in a shop window is {}.',
|
| 908 |
+
'Sitting on the floor wrapping gifts is {}.',
|
| 909 |
+
'Climbing up a ladder to reach a high shelf is {}.',
|
| 910 |
+
'Waiting for the bus at the bus stop is {}.',
|
| 911 |
+
'Sipping tea while gazing out the window is {}.',
|
| 912 |
+
'Swinging a tennis racquet on the court is {}.',
|
| 913 |
+
'Watching a movie with 3D glasses on is {}.',
|
| 914 |
+
'Carving a piece of wood into a sculpture is {}.',
|
| 915 |
+
'Hula hooping in the backyard is {}.',
|
| 916 |
+
'Rowing a boat down the river is {}.',
|
| 917 |
+
'Bending down to tie a shoelace is {}.',
|
| 918 |
+
'Playing the drums with enthusiasm is {}.',
|
| 919 |
+
'Waiting in line at the grocery store checkout is {}.',
|
| 920 |
+
'Blowing bubbles with gum is {}.',
|
| 921 |
+
'Sketching a landscape on a notepad is {}.',
|
| 922 |
+
'Jumping into a pile of autumn leaves is {}.',
|
| 923 |
+
'Standing with hands on hips after a workout is {}.',
|
| 924 |
+
'Conducting an orchestra with intensity is {}.',
|
| 925 |
+
'Leaning against a fence watching the sunrise is {}.',
|
| 926 |
+
'Tossing a salad in a bowl for dinner is {}.',
|
| 927 |
+
'Crossing a footbridge over a stream is {}.',
|
| 928 |
+
'Bobbing their head to music on headphones is {}.',
|
| 929 |
+
'Attaching a lock to a bridge railing as a symbol of love is {}.',
|
| 930 |
+
'Pumping air into a bicycle tire is {}.',
|
| 931 |
+
'Repairing a computer with various tools is {}.',
|
| 932 |
+
'Doodling in a notebook during a lecture is {}.',
|
| 933 |
+
'Lining up a shot with a camera is {}.',
|
| 934 |
+
'Kneading dough on a floured surface is {}.',
|
| 935 |
+
'Waving goodbye at the train station is {}.',
|
| 936 |
+
'Lying on the beach soaking up the sun is {}.',
|
| 937 |
+
'Reading street signs in an unfamiliar city is {}.',
|
| 938 |
+
'Casting a fishing line from the shore is {}.',
|
| 939 |
+
'Blowing on a dandelion with seeds dispersing is {}.',
|
| 940 |
+
'Dancing alone in the living room is {}.',
|
| 941 |
+
'Watching the stars with a blanket wrapped around is {}.',
|
| 942 |
+
'Peeling an orange in one long spiral is {}.',
|
| 943 |
+
'Picking flowers from a field is {}.',
|
| 944 |
+
'Studying a museum exhibit with interest is {}.',
|
| 945 |
+
'Hanging laundry out to dry on a sunny day is {}.',
|
| 946 |
+
'Cuddling a pet cat on the couch is {}.',
|
| 947 |
+
'Arranging books on a shelf by color is {}.',
|
| 948 |
+
'Standing silent in a moment of gratitude is {}.'
|
| 949 |
+
]
|
| 950 |
+
|
| 951 |
+
|
| 952 |
+
random.shuffle(imagenet_templates_small)
|
| 953 |
+
|
| 954 |
+
per_img_token_list = ['*']
|
| 955 |
+
|
| 956 |
+
|
| 957 |
+
class FaceIdDataset(Dataset):
|
| 958 |
+
def __init__(self, experiment_name, **kwargs):
|
| 959 |
+
super(FaceIdDataset, self).__init__()
|
| 960 |
+
|
| 961 |
+
self.experiment_name = experiment_name
|
| 962 |
+
if self.experiment_name == "normal_GAN":
|
| 963 |
+
name_path = "datasets_face/good_names.txt"
|
| 964 |
+
elif self.experiment_name == "man_GAN":
|
| 965 |
+
name_path = "datasets_face/good_names_man.txt"
|
| 966 |
+
elif self.experiment_name == "woman_GAN":
|
| 967 |
+
name_path = "datasets_face/good_names_woman.txt"
|
| 968 |
+
else:
|
| 969 |
+
print("Hello, please notice this ^_^")
|
| 970 |
+
assert 0
|
| 971 |
+
print("now experiment_name:", self.experiment_name)
|
| 972 |
+
|
| 973 |
+
with open(name_path, "r") as f:
|
| 974 |
+
self.names = f.read().splitlines()
|
| 975 |
+
|
| 976 |
+
if self.experiment_name == "normal_GAN":
|
| 977 |
+
with open("datasets_face/good_names_man.txt", "r") as f_man, open("datasets_face/good_names_woman.txt", "r") as f_woman:
|
| 978 |
+
self.man_names = f_man.read().splitlines()
|
| 979 |
+
self.woman_names = f_woman.read().splitlines()
|
| 980 |
+
|
| 981 |
+
self._length = len(self.names)
|
| 982 |
+
|
| 983 |
+
|
| 984 |
+
|
| 985 |
+
def __len__(self):
|
| 986 |
+
return self._length
|
| 987 |
+
|
| 988 |
+
def __getitem__(self, i):
|
| 989 |
+
example = {}
|
| 990 |
+
|
| 991 |
+
name = self.names[i]
|
| 992 |
+
|
| 993 |
+
# if normal_GAN, this trick will be used for gender balance.
|
| 994 |
+
if self.experiment_name == "normal_GAN":
|
| 995 |
+
if random.random() < 0.5:
|
| 996 |
+
name = random.choice(self.man_names)
|
| 997 |
+
else:
|
| 998 |
+
name = random.choice(self.woman_names)
|
| 999 |
+
|
| 1000 |
+
''' text '''
|
| 1001 |
+
placeholder_string = per_img_token_list[0]
|
| 1002 |
+
text = random.choice(imagenet_templates_small).format('%s person' % placeholder_string)
|
| 1003 |
+
|
| 1004 |
+
example["caption"] = text
|
| 1005 |
+
example["name"] = name
|
| 1006 |
+
|
| 1007 |
+
return example
|
datasets_face/good_names.txt
ADDED
|
@@ -0,0 +1,326 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Adam Savage
|
| 2 |
+
Adam Scott
|
| 3 |
+
Alan Alda
|
| 4 |
+
Alan Hale
|
| 5 |
+
Albert Brooks
|
| 6 |
+
Alec Baldwin
|
| 7 |
+
Alec Guinness
|
| 8 |
+
Alice Cooper
|
| 9 |
+
Alicia Alonso
|
| 10 |
+
Amy Adams
|
| 11 |
+
Amy Schumer
|
| 12 |
+
Anderson Cooper
|
| 13 |
+
Andrea Martin
|
| 14 |
+
Andy Richter
|
| 15 |
+
Angelina Jolie
|
| 16 |
+
Ann Curry
|
| 17 |
+
Ann Miller
|
| 18 |
+
Anne Hathaway
|
| 19 |
+
Anne Murray
|
| 20 |
+
Aubrey Plaza
|
| 21 |
+
Audrey Hepburn
|
| 22 |
+
Aziz Ansari
|
| 23 |
+
BD Wong
|
| 24 |
+
Barbara Walters
|
| 25 |
+
Ben Affleck
|
| 26 |
+
Ben Kingsley
|
| 27 |
+
Ben Miller
|
| 28 |
+
Ben Schwartz
|
| 29 |
+
Benedict Cumberbatch
|
| 30 |
+
Bill Burr
|
| 31 |
+
Bill Cosby
|
| 32 |
+
Bill Irwin
|
| 33 |
+
Bill Maher
|
| 34 |
+
Bill Murray
|
| 35 |
+
Bill Nye
|
| 36 |
+
Billy Chow
|
| 37 |
+
Billy Connolly
|
| 38 |
+
Billy Crystal
|
| 39 |
+
Billy Joel
|
| 40 |
+
Billy Porter
|
| 41 |
+
Billy Wilder
|
| 42 |
+
Bob Hope
|
| 43 |
+
Bob Marley
|
| 44 |
+
Bonnie Hunt
|
| 45 |
+
Brad Pitt
|
| 46 |
+
Brandon Lee
|
| 47 |
+
Brian Cox
|
| 48 |
+
Brian Tee
|
| 49 |
+
Britney Spears
|
| 50 |
+
Bron James
|
| 51 |
+
Bruce Springsteen
|
| 52 |
+
Bruce Willis
|
| 53 |
+
Bryan Cranston
|
| 54 |
+
Buck Henry
|
| 55 |
+
Burt Lancaster
|
| 56 |
+
Burt Reynolds
|
| 57 |
+
Cameron Diaz
|
| 58 |
+
Carol Burnett
|
| 59 |
+
Carol Channing
|
| 60 |
+
Carol Kane
|
| 61 |
+
Carrie Underwood
|
| 62 |
+
Cary Grant
|
| 63 |
+
Cate Blanchett
|
| 64 |
+
Celia Cruz
|
| 65 |
+
Celine Dion
|
| 66 |
+
Charlie Sheen
|
| 67 |
+
Cheryl Hines
|
| 68 |
+
Chris Pratt
|
| 69 |
+
Christina Hendricks
|
| 70 |
+
Christopher Guest
|
| 71 |
+
Cindy Williams
|
| 72 |
+
Claire Danes
|
| 73 |
+
Craig Ferguson
|
| 74 |
+
Craig Robinson
|
| 75 |
+
Cristiano Ronaldo
|
| 76 |
+
Crystal Gayle
|
| 77 |
+
Dan Harmon
|
| 78 |
+
Dan Levy
|
| 79 |
+
Dan Rather
|
| 80 |
+
Dana Gould
|
| 81 |
+
Daniel Radcliffe
|
| 82 |
+
Danny Thomas
|
| 83 |
+
Daryl Hall
|
| 84 |
+
Dave Bautista
|
| 85 |
+
Dave Matthews
|
| 86 |
+
David Beckham
|
| 87 |
+
David Bowie
|
| 88 |
+
David Butler
|
| 89 |
+
David Spade
|
| 90 |
+
Dax Shepard
|
| 91 |
+
Dean Martin
|
| 92 |
+
Debra Messing
|
| 93 |
+
Dennis Chan
|
| 94 |
+
Dennis Franz
|
| 95 |
+
Dennis Hopper
|
| 96 |
+
Dennis Quaid
|
| 97 |
+
Dev Patel
|
| 98 |
+
Devon Aoki
|
| 99 |
+
Diana Ross
|
| 100 |
+
Diane Sawyer
|
| 101 |
+
Dizzy Gillespie
|
| 102 |
+
Donald Crisp
|
| 103 |
+
Donald Glover
|
| 104 |
+
Donna Reed
|
| 105 |
+
Donnie Yen
|
| 106 |
+
Doris Roberts
|
| 107 |
+
Drew Barrymore
|
| 108 |
+
Drew Carey
|
| 109 |
+
Dudley Moore
|
| 110 |
+
Dwayne Johnson
|
| 111 |
+
Ed Sheeran
|
| 112 |
+
Eddie Murphy
|
| 113 |
+
Edgar Wright
|
| 114 |
+
Edward Norton
|
| 115 |
+
Elaine May
|
| 116 |
+
Eleanor Powell
|
| 117 |
+
Eli Roth
|
| 118 |
+
Elizabeth Banks
|
| 119 |
+
Ellen Pompeo
|
| 120 |
+
Elon Musk
|
| 121 |
+
Elton John
|
| 122 |
+
Emma Thompson
|
| 123 |
+
Eric Idle
|
| 124 |
+
Ernie Reyes
|
| 125 |
+
Floyd Mayweather
|
| 126 |
+
Forest Whitaker
|
| 127 |
+
Fred Savage
|
| 128 |
+
Garry Marshall
|
| 129 |
+
Gene Lockhart
|
| 130 |
+
George Benson
|
| 131 |
+
George Burns
|
| 132 |
+
George Clooney
|
| 133 |
+
George Lopez
|
| 134 |
+
George Lucas
|
| 135 |
+
George Marshall
|
| 136 |
+
George Miller
|
| 137 |
+
Gillian Murphy
|
| 138 |
+
Ginger Rogers
|
| 139 |
+
Gregory Hines
|
| 140 |
+
Gregory Peck
|
| 141 |
+
Halle Berry
|
| 142 |
+
Harold Lloyd
|
| 143 |
+
Harrison Ford
|
| 144 |
+
Harry Carey
|
| 145 |
+
Helen Mirren
|
| 146 |
+
Helen Reddy
|
| 147 |
+
Howard Stern
|
| 148 |
+
Hugh Jackman
|
| 149 |
+
Hugh Laurie
|
| 150 |
+
Ira Glass
|
| 151 |
+
Isabel Sanford
|
| 152 |
+
Jack Conway
|
| 153 |
+
Jack Nicholson
|
| 154 |
+
Jackie Chan
|
| 155 |
+
Jackie Mason
|
| 156 |
+
James Burrows
|
| 157 |
+
James Cameron
|
| 158 |
+
James Franco
|
| 159 |
+
James Patterson
|
| 160 |
+
Jamie Foxx
|
| 161 |
+
Jane Lynch
|
| 162 |
+
Janet Jackson
|
| 163 |
+
Jason Alexander
|
| 164 |
+
Jason Bateman
|
| 165 |
+
Jason Biggs
|
| 166 |
+
Jason Nash
|
| 167 |
+
Jay Leno
|
| 168 |
+
Jay Pharoah
|
| 169 |
+
Jeff Gordon
|
| 170 |
+
Jennifer Aniston
|
| 171 |
+
Jennifer Garner
|
| 172 |
+
Jennifer Hudson
|
| 173 |
+
Jennifer Lopez
|
| 174 |
+
Jennifer Saunders
|
| 175 |
+
Jenny Slate
|
| 176 |
+
Jerome Robbins
|
| 177 |
+
Jerry Lewis
|
| 178 |
+
Jerry Seinfeld
|
| 179 |
+
Jim Parsons
|
| 180 |
+
Jodie Foster
|
| 181 |
+
Joe Cornish
|
| 182 |
+
John Cho
|
| 183 |
+
John Legend
|
| 184 |
+
John Ritter
|
| 185 |
+
Johnny Depp
|
| 186 |
+
Jon Hamm
|
| 187 |
+
Joseph Gordon
|
| 188 |
+
Josh Gad
|
| 189 |
+
Julia Roberts
|
| 190 |
+
Julie Bowen
|
| 191 |
+
Julie Kent
|
| 192 |
+
Julie Walters
|
| 193 |
+
Justin Bieber
|
| 194 |
+
Kanye West
|
| 195 |
+
Katy Perry
|
| 196 |
+
Kay Cannon
|
| 197 |
+
Keanu Reeves
|
| 198 |
+
Kelly Clarkson
|
| 199 |
+
Kelly Hu
|
| 200 |
+
Ken Dodd
|
| 201 |
+
Ken Jeong
|
| 202 |
+
Kenny Ortega
|
| 203 |
+
Kerry Washington
|
| 204 |
+
Kevin Dillon
|
| 205 |
+
Kevin Hart
|
| 206 |
+
Kevin James
|
| 207 |
+
Kevin Kline
|
| 208 |
+
Kevin Spacey
|
| 209 |
+
Kiefer Sutherland
|
| 210 |
+
Kim Coles
|
| 211 |
+
Kim Kardashian
|
| 212 |
+
Kobe Bryant
|
| 213 |
+
Kristen Bell
|
| 214 |
+
Kylie Jenner
|
| 215 |
+
Lady Gaga
|
| 216 |
+
Larry King
|
| 217 |
+
LeBron James
|
| 218 |
+
Lee Daniels
|
| 219 |
+
Lena Dunham
|
| 220 |
+
Leonardo DiCaprio
|
| 221 |
+
Leslie Mann
|
| 222 |
+
Leslie Nielsen
|
| 223 |
+
Lillian Hurst
|
| 224 |
+
Lilly Singh
|
| 225 |
+
Lily Tomlin
|
| 226 |
+
Lionel Messi
|
| 227 |
+
Loretta Lynn
|
| 228 |
+
Lucy Liu
|
| 229 |
+
Mackenzie Crook
|
| 230 |
+
Madeline Kahn
|
| 231 |
+
Marcia Wallace
|
| 232 |
+
Margaret Cho
|
| 233 |
+
Mariah Carey
|
| 234 |
+
Mark Wahlberg
|
| 235 |
+
Martin Scorsese
|
| 236 |
+
Mel Brooks
|
| 237 |
+
Mel Gibson
|
| 238 |
+
Michael Cera
|
| 239 |
+
Michael Jackson
|
| 240 |
+
Michael Jordan
|
| 241 |
+
Michael Landon
|
| 242 |
+
Michael Palin
|
| 243 |
+
Mike Myers
|
| 244 |
+
Molly Shannon
|
| 245 |
+
Morgan Freeman
|
| 246 |
+
Naomi Watts
|
| 247 |
+
Natalie Morales
|
| 248 |
+
Natalie Portman
|
| 249 |
+
Nathan Fielder
|
| 250 |
+
Nathan Lane
|
| 251 |
+
Nick Park
|
| 252 |
+
Nicolas Cage
|
| 253 |
+
Nicole Kidman
|
| 254 |
+
Norman Lear
|
| 255 |
+
Patrick Stewart
|
| 256 |
+
Paul McCartney
|
| 257 |
+
Paul Rudd
|
| 258 |
+
Paula Abdul
|
| 259 |
+
Penny Marshall
|
| 260 |
+
Pete Holmes
|
| 261 |
+
Peter Jackson
|
| 262 |
+
Phil McGraw
|
| 263 |
+
Piers Morgan
|
| 264 |
+
Quentin Tarantino
|
| 265 |
+
Randy Jackson
|
| 266 |
+
Randy Travis
|
| 267 |
+
Ray Romano
|
| 268 |
+
Rich Sommer
|
| 269 |
+
Richard Attenborough
|
| 270 |
+
Ricky Gervais
|
| 271 |
+
Ridley Scott
|
| 272 |
+
Rita Moreno
|
| 273 |
+
Rob Lowe
|
| 274 |
+
Robert Downey
|
| 275 |
+
Robin Williams
|
| 276 |
+
Roger Federer
|
| 277 |
+
Roger Moore
|
| 278 |
+
Ron Howard
|
| 279 |
+
Rose Marie
|
| 280 |
+
Russell Brand
|
| 281 |
+
Ryan Murphy
|
| 282 |
+
Ryan Reynolds
|
| 283 |
+
Sally Field
|
| 284 |
+
Sandra Bullock
|
| 285 |
+
Sarah Shahi
|
| 286 |
+
Seth Rogen
|
| 287 |
+
Shirley Jones
|
| 288 |
+
Sidney Franklin
|
| 289 |
+
Simon Cowell
|
| 290 |
+
Snoop Dogg
|
| 291 |
+
Spike Lee
|
| 292 |
+
Stan Lee
|
| 293 |
+
Stephen Curry
|
| 294 |
+
Stephen Fry
|
| 295 |
+
Stephen King
|
| 296 |
+
Stephen Merchant
|
| 297 |
+
Steven Spielberg
|
| 298 |
+
Sung Kang
|
| 299 |
+
Susan Egan
|
| 300 |
+
Taylor Swift
|
| 301 |
+
Terrence Howard
|
| 302 |
+
Terry Bradshaw
|
| 303 |
+
Terry Jones
|
| 304 |
+
Tim Conway
|
| 305 |
+
Tim Robbins
|
| 306 |
+
Tina Fey
|
| 307 |
+
Tom Cruise
|
| 308 |
+
Tom Hanks
|
| 309 |
+
Tom Hiddleston
|
| 310 |
+
Tom Jones
|
| 311 |
+
Tommy Chong
|
| 312 |
+
Tony Bennett
|
| 313 |
+
Tracy Morgan
|
| 314 |
+
Trey Parker
|
| 315 |
+
Tyler Perry
|
| 316 |
+
Valerie Harper
|
| 317 |
+
Vanessa Bayer
|
| 318 |
+
Vanessa Williams
|
| 319 |
+
Viola Davis
|
| 320 |
+
Walt Disney
|
| 321 |
+
Wanda Sykes
|
| 322 |
+
Wayne Brady
|
| 323 |
+
Wendy Whelan
|
| 324 |
+
Will Ferrell
|
| 325 |
+
Will Smith
|
| 326 |
+
Zachary Levi
|
datasets_face/good_names_man.txt
ADDED
|
@@ -0,0 +1,226 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Adam Savage
|
| 2 |
+
Adam Scott
|
| 3 |
+
Alan Alda
|
| 4 |
+
Alan Hale
|
| 5 |
+
Albert Brooks
|
| 6 |
+
Alec Baldwin
|
| 7 |
+
Alec Guinness
|
| 8 |
+
Alice Cooper
|
| 9 |
+
Amy Adams
|
| 10 |
+
Anderson Cooper
|
| 11 |
+
Andy Richter
|
| 12 |
+
Aziz Ansari
|
| 13 |
+
BD Wong
|
| 14 |
+
Ben Affleck
|
| 15 |
+
Ben Kingsley
|
| 16 |
+
Ben Miller
|
| 17 |
+
Ben Schwartz
|
| 18 |
+
Benedict Cumberbatch
|
| 19 |
+
Bill Burr
|
| 20 |
+
Bill Cosby
|
| 21 |
+
Bill Irwin
|
| 22 |
+
Bill Maher
|
| 23 |
+
Bill Murray
|
| 24 |
+
Bill Nye
|
| 25 |
+
Billy Chow
|
| 26 |
+
Billy Connolly
|
| 27 |
+
Billy Crystal
|
| 28 |
+
Billy Joel
|
| 29 |
+
Billy Porter
|
| 30 |
+
Billy Wilder
|
| 31 |
+
Bob Hope
|
| 32 |
+
Bob Marley
|
| 33 |
+
Brad Pitt
|
| 34 |
+
Brandon Lee
|
| 35 |
+
Brian Cox
|
| 36 |
+
Brian Tee
|
| 37 |
+
Britney Spears
|
| 38 |
+
Bron James
|
| 39 |
+
Bruce Springsteen
|
| 40 |
+
Bruce Willis
|
| 41 |
+
Bryan Cranston
|
| 42 |
+
Buck Henry
|
| 43 |
+
Burt Lancaster
|
| 44 |
+
Burt Reynolds
|
| 45 |
+
Cary Grant
|
| 46 |
+
Charlie Sheen
|
| 47 |
+
Chris Pratt
|
| 48 |
+
Christopher Guest
|
| 49 |
+
Craig Ferguson
|
| 50 |
+
Craig Robinson
|
| 51 |
+
Cristiano Ronaldo
|
| 52 |
+
Dan Harmon
|
| 53 |
+
Dan Levy
|
| 54 |
+
Dan Rather
|
| 55 |
+
Dana Gould
|
| 56 |
+
Daniel Radcliffe
|
| 57 |
+
Danny Thomas
|
| 58 |
+
Daryl Hall
|
| 59 |
+
Dave Bautista
|
| 60 |
+
Dave Matthews
|
| 61 |
+
David Beckham
|
| 62 |
+
David Bowie
|
| 63 |
+
David Butler
|
| 64 |
+
David Spade
|
| 65 |
+
Dax Shepard
|
| 66 |
+
Dean Martin
|
| 67 |
+
Dennis Chan
|
| 68 |
+
Dennis Franz
|
| 69 |
+
Dennis Hopper
|
| 70 |
+
Dennis Quaid
|
| 71 |
+
Dev Patel
|
| 72 |
+
Dizzy Gillespie
|
| 73 |
+
Donald Crisp
|
| 74 |
+
Donald Glover
|
| 75 |
+
Donnie Yen
|
| 76 |
+
Drew Carey
|
| 77 |
+
Dudley Moore
|
| 78 |
+
Dwayne Johnson
|
| 79 |
+
Ed Sheeran
|
| 80 |
+
Eddie Murphy
|
| 81 |
+
Edgar Wright
|
| 82 |
+
Edward Norton
|
| 83 |
+
Eli Roth
|
| 84 |
+
Elon Musk
|
| 85 |
+
Elton John
|
| 86 |
+
Eric Idle
|
| 87 |
+
Ernie Reyes
|
| 88 |
+
Floyd Mayweather
|
| 89 |
+
Forest Whitaker
|
| 90 |
+
Fred Savage
|
| 91 |
+
Garry Marshall
|
| 92 |
+
Gene Lockhart
|
| 93 |
+
George Benson
|
| 94 |
+
George Burns
|
| 95 |
+
George Clooney
|
| 96 |
+
George Lopez
|
| 97 |
+
George Lucas
|
| 98 |
+
George Marshall
|
| 99 |
+
George Miller
|
| 100 |
+
Gregory Hines
|
| 101 |
+
Gregory Peck
|
| 102 |
+
Harold Lloyd
|
| 103 |
+
Harrison Ford
|
| 104 |
+
Harry Carey
|
| 105 |
+
Howard Stern
|
| 106 |
+
Hugh Jackman
|
| 107 |
+
Hugh Laurie
|
| 108 |
+
Ira Glass
|
| 109 |
+
Jack Conway
|
| 110 |
+
Jack Nicholson
|
| 111 |
+
Jackie Chan
|
| 112 |
+
Jackie Mason
|
| 113 |
+
James Burrows
|
| 114 |
+
James Cameron
|
| 115 |
+
James Franco
|
| 116 |
+
James Patterson
|
| 117 |
+
Jamie Foxx
|
| 118 |
+
Jason Alexander
|
| 119 |
+
Jason Bateman
|
| 120 |
+
Jason Biggs
|
| 121 |
+
Jason Nash
|
| 122 |
+
Jay Leno
|
| 123 |
+
Jay Pharoah
|
| 124 |
+
Jeff Gordon
|
| 125 |
+
Jerome Robbins
|
| 126 |
+
Jerry Lewis
|
| 127 |
+
Jerry Seinfeld
|
| 128 |
+
Jim Parsons
|
| 129 |
+
Joe Cornish
|
| 130 |
+
John Cho
|
| 131 |
+
John Legend
|
| 132 |
+
John Ritter
|
| 133 |
+
Johnny Depp
|
| 134 |
+
Jon Hamm
|
| 135 |
+
Joseph Gordon
|
| 136 |
+
Josh Gad
|
| 137 |
+
Justin Bieber
|
| 138 |
+
Kanye West
|
| 139 |
+
Keanu Reeves
|
| 140 |
+
Ken Dodd
|
| 141 |
+
Ken Jeong
|
| 142 |
+
Kenny Ortega
|
| 143 |
+
Kevin Dillon
|
| 144 |
+
Kevin Hart
|
| 145 |
+
Kevin James
|
| 146 |
+
Kevin Kline
|
| 147 |
+
Kevin Spacey
|
| 148 |
+
Kiefer Sutherland
|
| 149 |
+
Kobe Bryant
|
| 150 |
+
Larry King
|
| 151 |
+
LeBron James
|
| 152 |
+
Lee Daniels
|
| 153 |
+
Leonardo DiCaprio
|
| 154 |
+
Lionel Messi
|
| 155 |
+
Mackenzie Crook
|
| 156 |
+
Mark Wahlberg
|
| 157 |
+
Martin Scorsese
|
| 158 |
+
Mel Brooks
|
| 159 |
+
Mel Gibson
|
| 160 |
+
Michael Cera
|
| 161 |
+
Michael Jackson
|
| 162 |
+
Michael Jordan
|
| 163 |
+
Michael Landon
|
| 164 |
+
Michael Palin
|
| 165 |
+
Mike Myers
|
| 166 |
+
Morgan Freeman
|
| 167 |
+
Nathan Fielder
|
| 168 |
+
Nathan Lane
|
| 169 |
+
Nick Park
|
| 170 |
+
Nicolas Cage
|
| 171 |
+
Norman Lear
|
| 172 |
+
Patrick Stewart
|
| 173 |
+
Paul McCartney
|
| 174 |
+
Paul Rudd
|
| 175 |
+
Pete Holmes
|
| 176 |
+
Peter Jackson
|
| 177 |
+
Phil McGraw
|
| 178 |
+
Piers Morgan
|
| 179 |
+
Quentin Tarantino
|
| 180 |
+
Randy Jackson
|
| 181 |
+
Randy Travis
|
| 182 |
+
Ray Romano
|
| 183 |
+
Rich Sommer
|
| 184 |
+
Richard Attenborough
|
| 185 |
+
Ricky Gervais
|
| 186 |
+
Ridley Scott
|
| 187 |
+
Rob Lowe
|
| 188 |
+
Robert Downey
|
| 189 |
+
Robin Williams
|
| 190 |
+
Roger Federer
|
| 191 |
+
Roger Moore
|
| 192 |
+
Ron Howard
|
| 193 |
+
Russell Brand
|
| 194 |
+
Ryan Murphy
|
| 195 |
+
Ryan Reynolds
|
| 196 |
+
Seth Rogen
|
| 197 |
+
Sidney Franklin
|
| 198 |
+
Simon Cowell
|
| 199 |
+
Snoop Dogg
|
| 200 |
+
Spike Lee
|
| 201 |
+
Stan Lee
|
| 202 |
+
Stephen Curry
|
| 203 |
+
Stephen Fry
|
| 204 |
+
Stephen King
|
| 205 |
+
Stephen Merchant
|
| 206 |
+
Steven Spielberg
|
| 207 |
+
Sung Kang
|
| 208 |
+
Terrence Howard
|
| 209 |
+
Terry Bradshaw
|
| 210 |
+
Terry Jones
|
| 211 |
+
Tim Conway
|
| 212 |
+
Tim Robbins
|
| 213 |
+
Tom Cruise
|
| 214 |
+
Tom Hanks
|
| 215 |
+
Tom Hiddleston
|
| 216 |
+
Tom Jones
|
| 217 |
+
Tommy Chong
|
| 218 |
+
Tony Bennett
|
| 219 |
+
Tracy Morgan
|
| 220 |
+
Trey Parker
|
| 221 |
+
Tyler Perry
|
| 222 |
+
Walt Disney
|
| 223 |
+
Wayne Brady
|
| 224 |
+
Will Ferrell
|
| 225 |
+
Will Smith
|
| 226 |
+
Zachary Levi
|
datasets_face/good_names_woman.txt
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Alicia Alonso
|
| 2 |
+
Amy Schumer
|
| 3 |
+
Andrea Martin
|
| 4 |
+
Angelina Jolie
|
| 5 |
+
Ann Curry
|
| 6 |
+
Ann Miller
|
| 7 |
+
Anne Hathaway
|
| 8 |
+
Anne Murray
|
| 9 |
+
Aubrey Plaza
|
| 10 |
+
Audrey Hepburn
|
| 11 |
+
Barbara Walters
|
| 12 |
+
Bonnie Hunt
|
| 13 |
+
Cameron Diaz
|
| 14 |
+
Carol Burnett
|
| 15 |
+
Carol Channing
|
| 16 |
+
Carol Kane
|
| 17 |
+
Carrie Underwood
|
| 18 |
+
Cate Blanchett
|
| 19 |
+
Celia Cruz
|
| 20 |
+
Celine Dion
|
| 21 |
+
Cheryl Hines
|
| 22 |
+
Christina Hendricks
|
| 23 |
+
Cindy Williams
|
| 24 |
+
Claire Danes
|
| 25 |
+
Crystal Gayle
|
| 26 |
+
Debra Messing
|
| 27 |
+
Devon Aoki
|
| 28 |
+
Diana Ross
|
| 29 |
+
Diane Sawyer
|
| 30 |
+
Donna Reed
|
| 31 |
+
Doris Roberts
|
| 32 |
+
Drew Barrymore
|
| 33 |
+
Elaine May
|
| 34 |
+
Eleanor Powell
|
| 35 |
+
Elizabeth Banks
|
| 36 |
+
Ellen Pompeo
|
| 37 |
+
Emma Thompson
|
| 38 |
+
Gillian Murphy
|
| 39 |
+
Ginger Rogers
|
| 40 |
+
Halle Berry
|
| 41 |
+
Helen Mirren
|
| 42 |
+
Helen Reddy
|
| 43 |
+
Isabel Sanford
|
| 44 |
+
Jane Lynch
|
| 45 |
+
Janet Jackson
|
| 46 |
+
Jennifer Aniston
|
| 47 |
+
Jennifer Garner
|
| 48 |
+
Jennifer Hudson
|
| 49 |
+
Jennifer Lopez
|
| 50 |
+
Jennifer Saunders
|
| 51 |
+
Jenny Slate
|
| 52 |
+
Jodie Foster
|
| 53 |
+
Julia Roberts
|
| 54 |
+
Julie Bowen
|
| 55 |
+
Julie Kent
|
| 56 |
+
Julie Walters
|
| 57 |
+
Katy Perry
|
| 58 |
+
Kay Cannon
|
| 59 |
+
Kelly Clarkson
|
| 60 |
+
Kelly Hu
|
| 61 |
+
Kerry Washington
|
| 62 |
+
Kim Coles
|
| 63 |
+
Kim Kardashian
|
| 64 |
+
Kristen Bell
|
| 65 |
+
Kylie Jenner
|
| 66 |
+
Lady Gaga
|
| 67 |
+
Lena Dunham
|
| 68 |
+
Leslie Mann
|
| 69 |
+
Leslie Nielsen
|
| 70 |
+
Lillian Hurst
|
| 71 |
+
Lilly Singh
|
| 72 |
+
Lily Tomlin
|
| 73 |
+
Loretta Lynn
|
| 74 |
+
Lucy Liu
|
| 75 |
+
Madeline Kahn
|
| 76 |
+
Marcia Wallace
|
| 77 |
+
Margaret Cho
|
| 78 |
+
Mariah Carey
|
| 79 |
+
Molly Shannon
|
| 80 |
+
Naomi Watts
|
| 81 |
+
Natalie Morales
|
| 82 |
+
Natalie Portman
|
| 83 |
+
Nicole Kidman
|
| 84 |
+
Paula Abdul
|
| 85 |
+
Penny Marshall
|
| 86 |
+
Rita Moreno
|
| 87 |
+
Rose Marie
|
| 88 |
+
Sally Field
|
| 89 |
+
Sandra Bullock
|
| 90 |
+
Sarah Shahi
|
| 91 |
+
Shirley Jones
|
| 92 |
+
Susan Egan
|
| 93 |
+
Taylor Swift
|
| 94 |
+
Tina Fey
|
| 95 |
+
Valerie Harper
|
| 96 |
+
Vanessa Bayer
|
| 97 |
+
Vanessa Williams
|
| 98 |
+
Viola Davis
|
| 99 |
+
Wanda Sykes
|
| 100 |
+
Wendy Whelan
|
datasets_face/identity_space.yaml
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
model:
|
| 2 |
+
use_celeb: True
|
| 3 |
+
use_svd: True
|
| 4 |
+
rm_repeats: True
|
| 5 |
+
n_components: 512 # consistent with meta_inner_dim, should be <= n_samples-1
|
| 6 |
+
use_sample_reduce: False
|
| 7 |
+
n_samples: 513
|
| 8 |
+
use_flatten: False
|
| 9 |
+
num_embeds_per_token: 2 # consistent with personalization_config
|
| 10 |
+
target: models.embedding_manager.EmbeddingManagerId
|
| 11 |
+
params:
|
| 12 |
+
linear_start: 0.00085
|
| 13 |
+
linear_end: 0.0120
|
| 14 |
+
num_timesteps_cond: 1
|
| 15 |
+
log_every_t: 200
|
| 16 |
+
timesteps: 1000
|
| 17 |
+
first_stage_key: image
|
| 18 |
+
cond_stage_key: caption
|
| 19 |
+
image_size: 64
|
| 20 |
+
channels: 4
|
| 21 |
+
cond_stage_trainable: true # Note: different from the one we trained before
|
| 22 |
+
conditioning_key: crossattn
|
| 23 |
+
monitor: val/loss_simple_ema
|
| 24 |
+
scale_factor: 0.18215
|
| 25 |
+
use_ema: False
|
| 26 |
+
embedding_reg_weight: 0.0
|
| 27 |
+
unfreeze_model: False
|
| 28 |
+
model_lr: 0.0
|
| 29 |
+
|
| 30 |
+
personalization_config:
|
| 31 |
+
params:
|
| 32 |
+
num_embeds_per_token: 2 # consistent with cond_stage_config
|
| 33 |
+
mlp_depth: 2
|
| 34 |
+
input_dim: 64
|
| 35 |
+
token_dim: 1024
|
| 36 |
+
loss_type: 'none'
|
| 37 |
+
|
| 38 |
+
|
demo_embeddings/example_1.pt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:3d77090f8d1c6cb049c491dd0ffc74a05c1df9e272d9a5788f358b4073f63b75
|
| 3 |
+
size 9288
|
demo_embeddings/example_2.pt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:523e07d8ea4af7f74a4bc4e40ea3bd246562389b6f52aa81ad79ba900eeef040
|
| 3 |
+
size 9288
|
demo_embeddings/example_3.pt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:0a09e71305dd6a1a6ad2f8e387012c64f7f38728f33667a776e40456435e4d5a
|
| 3 |
+
size 9288
|
demo_embeddings/example_4.pt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:03deeeb1438237f2e69467a8afc0841c644c336c74f7703b39c78cbf211983f7
|
| 3 |
+
size 9288
|
demo_embeddings/example_5.pt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:b4b3a8e990d1b374748d514a031e617e5230215e9619d97441855bf734b05439
|
| 3 |
+
size 9288
|
demo_embeddings/example_6.pt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:5888c106b5b574a0f015e9d294f86cc62c77f2d3afb197cdc3f71fbabbceec5d
|
| 3 |
+
size 9283
|
models/celeb_embeddings.py
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import torch
|
| 2 |
+
import torch.nn as nn
|
| 3 |
+
from functools import partial
|
| 4 |
+
import clip
|
| 5 |
+
from einops import rearrange, repeat
|
| 6 |
+
from transformers import CLIPTokenizer, CLIPTextModel
|
| 7 |
+
import kornia
|
| 8 |
+
import numpy as np
|
| 9 |
+
import os
|
| 10 |
+
|
| 11 |
+
def embedding_forward(
|
| 12 |
+
self,
|
| 13 |
+
input_ids = None,
|
| 14 |
+
position_ids = None,
|
| 15 |
+
name_batch = None,
|
| 16 |
+
inputs_embeds = None,
|
| 17 |
+
embedding_manager = None,
|
| 18 |
+
only_embedding=True,
|
| 19 |
+
random_embeddings = None,
|
| 20 |
+
timesteps = None,
|
| 21 |
+
) -> torch.Tensor:
|
| 22 |
+
|
| 23 |
+
seq_length = input_ids.shape[-1] if input_ids is not None else inputs_embeds.shape[-2]
|
| 24 |
+
|
| 25 |
+
if inputs_embeds is None:
|
| 26 |
+
inputs_embeds = self.token_embedding(input_ids)
|
| 27 |
+
if only_embedding:
|
| 28 |
+
return inputs_embeds
|
| 29 |
+
|
| 30 |
+
if embedding_manager is not None:
|
| 31 |
+
inputs_embeds, other_return_dict = embedding_manager(input_ids, inputs_embeds, name_batch, random_embeddings, timesteps)
|
| 32 |
+
|
| 33 |
+
if position_ids is None:
|
| 34 |
+
position_ids = self.position_ids[:, :seq_length]
|
| 35 |
+
|
| 36 |
+
position_embeddings = self.position_embedding(position_ids)
|
| 37 |
+
embeddings = inputs_embeds + position_embeddings
|
| 38 |
+
|
| 39 |
+
return embeddings, other_return_dict
|
| 40 |
+
|
| 41 |
+
|
| 42 |
+
@torch.no_grad()
|
| 43 |
+
def _get_celeb_embeddings_basis(tokenizer, text_encoder, good_names_txt):
|
| 44 |
+
|
| 45 |
+
device = text_encoder.device
|
| 46 |
+
max_length = 77
|
| 47 |
+
|
| 48 |
+
with open(good_names_txt, "r") as f:
|
| 49 |
+
celeb_names = f.read().splitlines()
|
| 50 |
+
|
| 51 |
+
''' get tokens and embeddings '''
|
| 52 |
+
all_embeddings = []
|
| 53 |
+
for name in celeb_names:
|
| 54 |
+
batch_encoding = tokenizer(name, truncation=True, return_tensors="pt")
|
| 55 |
+
tokens = batch_encoding["input_ids"].to(device)[:, 1:3]
|
| 56 |
+
embeddings = text_encoder.text_model.embeddings(input_ids=tokens, only_embedding=True)
|
| 57 |
+
all_embeddings.append(embeddings)
|
| 58 |
+
|
| 59 |
+
all_embeddings: torch.Tensor = torch.cat(all_embeddings, dim=0)
|
| 60 |
+
|
| 61 |
+
|
| 62 |
+
print('[all_embeddings loaded] shape =', all_embeddings.shape,
|
| 63 |
+
'max:', all_embeddings.max(),
|
| 64 |
+
'min={}', all_embeddings.min())
|
| 65 |
+
|
| 66 |
+
name_emb_mean = all_embeddings.mean(0)
|
| 67 |
+
name_emb_std = all_embeddings.std(0)
|
| 68 |
+
|
| 69 |
+
print('[name_emb_mean loaded] shape =', name_emb_mean.shape,
|
| 70 |
+
'max:', name_emb_mean.max(),
|
| 71 |
+
'min={}', name_emb_mean.min())
|
| 72 |
+
|
| 73 |
+
return name_emb_mean, name_emb_std
|
| 74 |
+
|
models/embedding_manager.py
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import torch
|
| 2 |
+
from torch import nn
|
| 3 |
+
from einops import rearrange
|
| 4 |
+
import numpy as np
|
| 5 |
+
from typing import List
|
| 6 |
+
from models.id_embedding.helpers import get_rep_pos, shift_tensor_dim0
|
| 7 |
+
from models.id_embedding.meta_net import StyleVectorizer
|
| 8 |
+
from models.celeb_embeddings import _get_celeb_embeddings_basis
|
| 9 |
+
|
| 10 |
+
from functools import partial
|
| 11 |
+
import torch.nn.functional as F
|
| 12 |
+
import torch.nn as nn
|
| 13 |
+
import torch.nn.init as init
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
DEFAULT_PLACEHOLDER_TOKEN = ["*"]
|
| 17 |
+
|
| 18 |
+
PROGRESSIVE_SCALE = 2000
|
| 19 |
+
|
| 20 |
+
def get_clip_token_for_string(tokenizer, string):
|
| 21 |
+
batch_encoding = tokenizer(string, return_length=True, padding=True, truncation=True, return_overflowing_tokens=False, return_tensors="pt")
|
| 22 |
+
tokens = batch_encoding["input_ids"]
|
| 23 |
+
|
| 24 |
+
return tokens
|
| 25 |
+
|
| 26 |
+
|
| 27 |
+
def get_embedding_for_clip_token(embedder, token):
|
| 28 |
+
return embedder(token.unsqueeze(0))
|
| 29 |
+
|
| 30 |
+
|
| 31 |
+
class EmbeddingManagerId_adain(nn.Module):
|
| 32 |
+
def __init__(
|
| 33 |
+
self,
|
| 34 |
+
tokenizer,
|
| 35 |
+
text_encoder,
|
| 36 |
+
device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu"),
|
| 37 |
+
experiment_name = "normal_GAN",
|
| 38 |
+
num_embeds_per_token: int = 2,
|
| 39 |
+
loss_type: str = None,
|
| 40 |
+
mlp_depth: int = 2,
|
| 41 |
+
token_dim: int = 1024,
|
| 42 |
+
input_dim: int = 1024,
|
| 43 |
+
**kwargs
|
| 44 |
+
):
|
| 45 |
+
super().__init__()
|
| 46 |
+
self.device = device
|
| 47 |
+
self.num_es = num_embeds_per_token
|
| 48 |
+
|
| 49 |
+
self.get_token_for_string = partial(get_clip_token_for_string, tokenizer)
|
| 50 |
+
self.get_embedding_for_tkn = partial(get_embedding_for_clip_token, text_encoder.text_model.embeddings)
|
| 51 |
+
|
| 52 |
+
|
| 53 |
+
self.token_dim = token_dim
|
| 54 |
+
|
| 55 |
+
''' 1. Placeholder mapping dicts '''
|
| 56 |
+
self.placeholder_token = self.get_token_for_string("*")[0][1]
|
| 57 |
+
|
| 58 |
+
if experiment_name == "normal_GAN":
|
| 59 |
+
self.celeb_embeddings_mean, self.celeb_embeddings_std = _get_celeb_embeddings_basis(tokenizer, text_encoder, "datasets_face/good_names.txt")
|
| 60 |
+
elif experiment_name == "man_GAN":
|
| 61 |
+
self.celeb_embeddings_mean, self.celeb_embeddings_std = _get_celeb_embeddings_basis(tokenizer, text_encoder, "datasets_face/good_names_man.txt")
|
| 62 |
+
elif experiment_name == "woman_GAN":
|
| 63 |
+
self.celeb_embeddings_mean, self.celeb_embeddings_std = _get_celeb_embeddings_basis(tokenizer, text_encoder, "datasets_face/good_names_woman.txt")
|
| 64 |
+
else:
|
| 65 |
+
print("Hello, please notice this ^_^")
|
| 66 |
+
assert 0
|
| 67 |
+
print("now experiment_name:", experiment_name)
|
| 68 |
+
|
| 69 |
+
self.celeb_embeddings_mean = self.celeb_embeddings_mean.to(device)
|
| 70 |
+
self.celeb_embeddings_std = self.celeb_embeddings_std.to(device)
|
| 71 |
+
|
| 72 |
+
self.name_projection_layer = StyleVectorizer(input_dim, self.token_dim * self.num_es, depth=mlp_depth, lr_mul=0.1)
|
| 73 |
+
self.embedding_discriminator = Embedding_discriminator(self.token_dim * self.num_es, dropout_rate = 0.2)
|
| 74 |
+
|
| 75 |
+
self.adain_mode = 0
|
| 76 |
+
|
| 77 |
+
def forward(
|
| 78 |
+
self,
|
| 79 |
+
tokenized_text,
|
| 80 |
+
embedded_text,
|
| 81 |
+
name_batch,
|
| 82 |
+
random_embeddings = None,
|
| 83 |
+
timesteps = None,
|
| 84 |
+
):
|
| 85 |
+
|
| 86 |
+
if tokenized_text is not None:
|
| 87 |
+
batch_size, n, device = *tokenized_text.shape, tokenized_text.device
|
| 88 |
+
other_return_dict = {}
|
| 89 |
+
|
| 90 |
+
if random_embeddings is not None:
|
| 91 |
+
mlp_output_embedding = self.name_projection_layer(random_embeddings)
|
| 92 |
+
total_embedding = mlp_output_embedding.view(mlp_output_embedding.shape[0], 2, 1024)
|
| 93 |
+
|
| 94 |
+
if self.adain_mode == 0:
|
| 95 |
+
adained_total_embedding = total_embedding * self.celeb_embeddings_std + self.celeb_embeddings_mean
|
| 96 |
+
else:
|
| 97 |
+
adained_total_embedding = total_embedding
|
| 98 |
+
|
| 99 |
+
other_return_dict["total_embedding"] = total_embedding
|
| 100 |
+
other_return_dict["adained_total_embedding"] = adained_total_embedding
|
| 101 |
+
|
| 102 |
+
if name_batch is not None:
|
| 103 |
+
if isinstance(name_batch, list):
|
| 104 |
+
name_tokens = self.get_token_for_string(name_batch)[:, 1:3]
|
| 105 |
+
name_embeddings = self.get_embedding_for_tkn(name_tokens.to(random_embeddings.device))[0]
|
| 106 |
+
|
| 107 |
+
other_return_dict["name_embeddings"] = name_embeddings
|
| 108 |
+
else:
|
| 109 |
+
assert 0
|
| 110 |
+
|
| 111 |
+
if tokenized_text is not None:
|
| 112 |
+
placeholder_pos = get_rep_pos(tokenized_text,
|
| 113 |
+
[self.placeholder_token])
|
| 114 |
+
placeholder_pos = np.array(placeholder_pos)
|
| 115 |
+
if len(placeholder_pos) != 0:
|
| 116 |
+
batch_size = adained_total_embedding.shape[0]
|
| 117 |
+
end_index = min(batch_size, placeholder_pos.shape[0])
|
| 118 |
+
embedded_text[placeholder_pos[:, 0], placeholder_pos[:, 1]] = adained_total_embedding[:end_index,0,:]
|
| 119 |
+
embedded_text[placeholder_pos[:, 0], placeholder_pos[:, 1] + 1] = adained_total_embedding[:end_index,1,:]
|
| 120 |
+
|
| 121 |
+
return embedded_text, other_return_dict
|
| 122 |
+
|
| 123 |
+
|
| 124 |
+
|
| 125 |
+
def load(self, ckpt_path):
|
| 126 |
+
ckpt = torch.load(ckpt_path, map_location='cuda')
|
| 127 |
+
if ckpt.get("name_projection_layer") is not None:
|
| 128 |
+
self.name_projection_layer = ckpt.get("name_projection_layer").float()
|
| 129 |
+
|
| 130 |
+
print('[Embedding Manager] weights loaded.')
|
| 131 |
+
|
| 132 |
+
|
| 133 |
+
|
| 134 |
+
def save(self, ckpt_path):
|
| 135 |
+
save_dict = {}
|
| 136 |
+
save_dict["name_projection_layer"] = self.name_projection_layer
|
| 137 |
+
|
| 138 |
+
torch.save(save_dict, ckpt_path)
|
| 139 |
+
|
| 140 |
+
|
| 141 |
+
def trainable_projection_parameters(self):
|
| 142 |
+
trainable_list = []
|
| 143 |
+
trainable_list.extend(list(self.name_projection_layer.parameters()))
|
| 144 |
+
|
| 145 |
+
return trainable_list
|
| 146 |
+
|
| 147 |
+
|
| 148 |
+
|
| 149 |
+
class Embedding_discriminator(nn.Module):
|
| 150 |
+
def __init__(self, input_size, dropout_rate):
|
| 151 |
+
super(Embedding_discriminator, self).__init__()
|
| 152 |
+
self.input_size = input_size
|
| 153 |
+
|
| 154 |
+
self.fc1 = nn.Linear(input_size, 512)
|
| 155 |
+
self.fc2 = nn.Linear(512, 256)
|
| 156 |
+
self.fc3 = nn.Linear(256, 1)
|
| 157 |
+
|
| 158 |
+
self.LayerNorm1 = nn.LayerNorm(512)
|
| 159 |
+
self.LayerNorm2 = nn.LayerNorm(256)
|
| 160 |
+
|
| 161 |
+
self.leaky_relu = nn.LeakyReLU(0.2)
|
| 162 |
+
|
| 163 |
+
self.dropout_rate = dropout_rate
|
| 164 |
+
if self.dropout_rate > 0:
|
| 165 |
+
self.dropout1 = nn.Dropout(dropout_rate)
|
| 166 |
+
self.dropout2 = nn.Dropout(dropout_rate)
|
| 167 |
+
|
| 168 |
+
def forward(self, input):
|
| 169 |
+
x = input.view(-1, self.input_size)
|
| 170 |
+
|
| 171 |
+
if self.dropout_rate > 0:
|
| 172 |
+
x = self.leaky_relu(self.dropout1(self.fc1(x)))
|
| 173 |
+
else:
|
| 174 |
+
x = self.leaky_relu(self.fc1(x))
|
| 175 |
+
|
| 176 |
+
if self.dropout_rate > 0:
|
| 177 |
+
x = self.leaky_relu(self.dropout2(self.fc2(x)))
|
| 178 |
+
else:
|
| 179 |
+
x = self.leaky_relu(self.fc2(x))
|
| 180 |
+
|
| 181 |
+
x = self.fc3(x)
|
| 182 |
+
|
| 183 |
+
return x
|
| 184 |
+
|
| 185 |
+
|
| 186 |
+
def save(self, ckpt_path):
|
| 187 |
+
save_dict = {}
|
| 188 |
+
|
| 189 |
+
save_dict["fc1"] = self.fc1
|
| 190 |
+
save_dict["fc2"] = self.fc2
|
| 191 |
+
save_dict["fc3"] = self.fc3
|
| 192 |
+
save_dict["LayerNorm1"] = self.LayerNorm1
|
| 193 |
+
save_dict["LayerNorm2"] = self.LayerNorm2
|
| 194 |
+
save_dict["leaky_relu"] = self.leaky_relu
|
| 195 |
+
save_dict["dropout1"] = self.dropout1
|
| 196 |
+
save_dict["dropout2"] = self.dropout2
|
| 197 |
+
|
| 198 |
+
torch.save(save_dict, ckpt_path)
|
| 199 |
+
|
| 200 |
+
def load(self, ckpt_path):
|
| 201 |
+
ckpt = torch.load(ckpt_path, map_location='cuda')
|
| 202 |
+
|
| 203 |
+
if ckpt.get("first_name_proj_layer") is not None:
|
| 204 |
+
self.fc1 = ckpt.get("fc1").float()
|
| 205 |
+
self.fc2 = ckpt.get("fc2").float()
|
| 206 |
+
self.fc3 = ckpt.get("fc3").float()
|
| 207 |
+
self.LayerNorm1 = ckpt.get("LayerNorm1").float()
|
| 208 |
+
self.LayerNorm2 = ckpt.get("LayerNorm2").float()
|
| 209 |
+
self.leaky_relu = ckpt.get("leaky_relu").float()
|
| 210 |
+
self.dropout1 = ckpt.get("dropout1").float()
|
| 211 |
+
self.dropout2 = ckpt.get("dropout2").float()
|
| 212 |
+
|
| 213 |
+
print('[Embedding D] weights loaded.')
|
| 214 |
+
|
| 215 |
+
|
| 216 |
+
|
| 217 |
+
|
models/id_embedding/__init__.py
ADDED
|
File without changes
|
models/id_embedding/helpers.py
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# -*-coding:utf-8-*-
|
| 2 |
+
import torch
|
| 3 |
+
import numpy as np
|
| 4 |
+
from typing import List
|
| 5 |
+
|
| 6 |
+
|
| 7 |
+
def get_rep_pos(tokenized: torch.Tensor, rep_tokens: list):
|
| 8 |
+
pos_list = []
|
| 9 |
+
for token in rep_tokens:
|
| 10 |
+
pos_list = torch.stack(torch.where(tokenized == token)).T.tolist()
|
| 11 |
+
return pos_list
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
def shift_tensor_dim0(ori: torch.Tensor, r_pos: List[np.ndarray], reps: int):
|
| 15 |
+
assert reps >= 1
|
| 16 |
+
device = ori.device
|
| 17 |
+
d = ori.shape[0]
|
| 18 |
+
offset = np.zeros(d, dtype=np.int64)
|
| 19 |
+
r_pos_cat = np.concatenate(r_pos)
|
| 20 |
+
for p in r_pos_cat:
|
| 21 |
+
offset[p + 1:] += (reps - 1)
|
| 22 |
+
|
| 23 |
+
r_cnt = r_pos_cat.shape[0]
|
| 24 |
+
target_pos = (np.arange(d) + offset)[:d - r_cnt * (reps - 1)]
|
| 25 |
+
ori[target_pos] = ori[np.arange(target_pos.shape[0])]
|
| 26 |
+
|
| 27 |
+
rep_final_pos: np.ndarray = target_pos[r_pos_cat].repeat(reps) + np.tile(np.arange(reps), r_cnt)
|
| 28 |
+
ori[rep_final_pos] = ori[target_pos[r_pos_cat].repeat(reps)]
|
| 29 |
+
|
| 30 |
+
rep_final_pos_list = []
|
| 31 |
+
lo = 0
|
| 32 |
+
for i in range(len(r_pos)):
|
| 33 |
+
r_one_times = r_pos[i].shape[0]
|
| 34 |
+
r_one_nums = r_one_times * reps
|
| 35 |
+
rep_final_pos_list.append(rep_final_pos[lo: lo + r_one_nums].reshape(r_one_times, reps))
|
| 36 |
+
lo += r_one_nums
|
| 37 |
+
return ori, rep_final_pos_list
|
| 38 |
+
|
| 39 |
+
|
| 40 |
+
def _test_get_rep_pos():
|
| 41 |
+
tokenized = torch.LongTensor([0, 1, 2, 2, 3, 4, 5, 6, 7, 99] + [99] * 20)
|
| 42 |
+
print('[from]:', tokenized)
|
| 43 |
+
rep_tokens = [2, 6]
|
| 44 |
+
rep_times = 2
|
| 45 |
+
|
| 46 |
+
rep_pos = get_rep_pos(tokenized, rep_tokens)
|
| 47 |
+
print('[rep_pos]:', rep_pos)
|
| 48 |
+
res, rep_pos_final = shift_tensor_dim0(tokenized, rep_pos, rep_times)
|
| 49 |
+
print('[to]:', res)
|
| 50 |
+
print('[final pos]:', rep_pos_final)
|
| 51 |
+
|
| 52 |
+
|
| 53 |
+
def _test_shift_tensor_dim0():
|
| 54 |
+
embedded = torch.arange(20)
|
| 55 |
+
print(embedded)
|
| 56 |
+
pos = np.array([3, 6, 8])
|
| 57 |
+
times = 1
|
| 58 |
+
output = shift_tensor_dim0(embedded, pos, times)
|
| 59 |
+
print(output)
|
| 60 |
+
|
| 61 |
+
|
| 62 |
+
if __name__ == "__main__":
|
| 63 |
+
_test_get_rep_pos()
|
models/id_embedding/meta_net.py
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import torch
|
| 2 |
+
import torch.nn as nn
|
| 3 |
+
import torch.nn.functional as F
|
| 4 |
+
import kornia
|
| 5 |
+
from einops import rearrange
|
| 6 |
+
import torch.nn.init as init
|
| 7 |
+
|
| 8 |
+
def leaky_relu(p=0.2):
|
| 9 |
+
return nn.LeakyReLU(p, inplace=True)
|
| 10 |
+
|
| 11 |
+
class Residual(nn.Module):
|
| 12 |
+
def __init__(self,
|
| 13 |
+
fn):
|
| 14 |
+
super().__init__()
|
| 15 |
+
self.fn = fn
|
| 16 |
+
|
| 17 |
+
def forward(self, x, **kwargs):
|
| 18 |
+
return x + self.fn(x, **kwargs)
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
class EqualLinear(nn.Module):
|
| 22 |
+
def __init__(self, in_dim, out_dim, lr_mul=1, bias=True, pre_norm=False, activate = False):
|
| 23 |
+
super().__init__()
|
| 24 |
+
self.weight = nn.Parameter(torch.randn(out_dim, in_dim))
|
| 25 |
+
if bias:
|
| 26 |
+
self.bias = nn.Parameter(torch.zeros(out_dim))
|
| 27 |
+
|
| 28 |
+
self.lr_mul = lr_mul
|
| 29 |
+
|
| 30 |
+
self.pre_norm = pre_norm
|
| 31 |
+
if pre_norm:
|
| 32 |
+
self.norm = nn.LayerNorm(in_dim, eps=1e-5)
|
| 33 |
+
self.activate = activate
|
| 34 |
+
if self.activate == True:
|
| 35 |
+
self.non_linear = leaky_relu()
|
| 36 |
+
|
| 37 |
+
def forward(self, input):
|
| 38 |
+
if hasattr(self, 'pre_norm') and self.pre_norm:
|
| 39 |
+
out = self.norm(input)
|
| 40 |
+
out = F.linear(out, self.weight * self.lr_mul, bias=self.bias * self.lr_mul)
|
| 41 |
+
else:
|
| 42 |
+
out = F.linear(input, self.weight * self.lr_mul, bias=self.bias * self.lr_mul)
|
| 43 |
+
|
| 44 |
+
if self.activate == True:
|
| 45 |
+
out = self.non_linear(out)
|
| 46 |
+
return out
|
| 47 |
+
|
| 48 |
+
|
| 49 |
+
class StyleVectorizer(nn.Module):
|
| 50 |
+
def __init__(self, dim_in, dim_out, depth, lr_mul = 0.1):
|
| 51 |
+
super().__init__()
|
| 52 |
+
|
| 53 |
+
layers = []
|
| 54 |
+
for i in range(depth):
|
| 55 |
+
if i == 0:
|
| 56 |
+
layers.extend([EqualLinear(dim_in, dim_out, lr_mul, pre_norm=False, activate = True)])
|
| 57 |
+
elif i == depth - 1:
|
| 58 |
+
layers.extend([EqualLinear(dim_out, dim_out, lr_mul, pre_norm=True, activate = False)])
|
| 59 |
+
else:
|
| 60 |
+
layers.extend([Residual(EqualLinear(dim_out, dim_out, lr_mul, pre_norm=True, activate = True))])
|
| 61 |
+
|
| 62 |
+
self.net = nn.Sequential(*layers)
|
| 63 |
+
self.norm = nn.LayerNorm(dim_out, eps=1e-5)
|
| 64 |
+
|
| 65 |
+
def forward(self, x):
|
| 66 |
+
return self.norm(self.net(x))
|
| 67 |
+
|
requirements.txt
CHANGED
|
@@ -1,6 +1,15 @@
|
|
| 1 |
-
|
| 2 |
-
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
torch==2.0.1
|
| 2 |
+
torchvision==0.15.2
|
| 3 |
+
diffusers==0.23.0
|
| 4 |
+
transformers==4.33.2
|
| 5 |
+
xformers==0.0.20
|
| 6 |
+
accelerate==0.23.0
|
| 7 |
+
omegaconf
|
| 8 |
+
clip==0.2.0
|
| 9 |
+
einops
|
| 10 |
+
kornia==0.6.12
|
| 11 |
+
opencv-python
|
| 12 |
+
opencv-contrib-python
|
| 13 |
+
gradio
|
| 14 |
+
huggingface_hub==0.22.2
|
| 15 |
+
IPython
|
test.ipynb
ADDED
|
@@ -0,0 +1,243 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": null,
|
| 6 |
+
"metadata": {},
|
| 7 |
+
"outputs": [],
|
| 8 |
+
"source": [
|
| 9 |
+
"import torch\n",
|
| 10 |
+
"import os\n",
|
| 11 |
+
"from transformers import ViTModel, ViTImageProcessor\n",
|
| 12 |
+
"from utils import text_encoder_forward\n",
|
| 13 |
+
"from diffusers import StableDiffusionPipeline, DPMSolverMultistepScheduler\n",
|
| 14 |
+
"from utils import latents_to_images, downsampling, merge_and_save_images\n",
|
| 15 |
+
"from omegaconf import OmegaConf\n",
|
| 16 |
+
"from accelerate.utils import set_seed\n",
|
| 17 |
+
"from tqdm import tqdm\n",
|
| 18 |
+
"from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion import StableDiffusionPipelineOutput\n",
|
| 19 |
+
"from PIL import Image\n",
|
| 20 |
+
"from models.celeb_embeddings import embedding_forward\n",
|
| 21 |
+
"import models.embedding_manager\n",
|
| 22 |
+
"import importlib\n",
|
| 23 |
+
"\n",
|
| 24 |
+
"# seed = 42\n",
|
| 25 |
+
"# set_seed(seed) \n",
|
| 26 |
+
"# torch.cuda.set_device(0)\n",
|
| 27 |
+
"\n",
|
| 28 |
+
"# set your sd2.1 path\n",
|
| 29 |
+
"model_path = \"/home/user/.cache/huggingface/hub/models--stabilityai--stable-diffusion-2-1/snapshots/5cae40e6a2745ae2b01ad92ae5043f95f23644d6\"\n",
|
| 30 |
+
"pipe = StableDiffusionPipeline.from_pretrained(model_path) \n",
|
| 31 |
+
"pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)\n",
|
| 32 |
+
"pipe = pipe.to(\"cuda\")\n",
|
| 33 |
+
"\n",
|
| 34 |
+
"device = torch.device(\"cuda\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
|
| 35 |
+
"\n",
|
| 36 |
+
"vae = pipe.vae\n",
|
| 37 |
+
"unet = pipe.unet\n",
|
| 38 |
+
"text_encoder = pipe.text_encoder\n",
|
| 39 |
+
"tokenizer = pipe.tokenizer\n",
|
| 40 |
+
"scheduler = pipe.scheduler\n",
|
| 41 |
+
"\n",
|
| 42 |
+
"input_dim = 64\n",
|
| 43 |
+
"\n",
|
| 44 |
+
"experiment_name = \"normal_GAN\" # \"normal_GAN\", \"man_GAN\", \"woman_GAN\" , \n",
|
| 45 |
+
"if experiment_name == \"normal_GAN\":\n",
|
| 46 |
+
" steps = 10000\n",
|
| 47 |
+
"elif experiment_name == \"man_GAN\":\n",
|
| 48 |
+
" steps = 7000\n",
|
| 49 |
+
"elif experiment_name == \"woman_GAN\":\n",
|
| 50 |
+
" steps = 6000\n",
|
| 51 |
+
"else:\n",
|
| 52 |
+
" print(\"Hello, please notice this ^_^\")\n",
|
| 53 |
+
" assert 0\n",
|
| 54 |
+
"\n",
|
| 55 |
+
"\n",
|
| 56 |
+
"original_forward = text_encoder.text_model.embeddings.forward\n",
|
| 57 |
+
"text_encoder.text_model.embeddings.forward = embedding_forward.__get__(text_encoder.text_model.embeddings)\n",
|
| 58 |
+
"embedding_manager_config = OmegaConf.load(\"datasets_face/identity_space.yaml\")\n",
|
| 59 |
+
"Embedding_Manager = models.embedding_manager.EmbeddingManagerId_adain( \n",
|
| 60 |
+
" tokenizer,\n",
|
| 61 |
+
" text_encoder,\n",
|
| 62 |
+
" device = device,\n",
|
| 63 |
+
" training = True,\n",
|
| 64 |
+
" experiment_name = experiment_name, \n",
|
| 65 |
+
" num_embeds_per_token = embedding_manager_config.model.personalization_config.params.num_embeds_per_token, \n",
|
| 66 |
+
" token_dim = embedding_manager_config.model.personalization_config.params.token_dim,\n",
|
| 67 |
+
" mlp_depth = embedding_manager_config.model.personalization_config.params.mlp_depth,\n",
|
| 68 |
+
" loss_type = embedding_manager_config.model.personalization_config.params.loss_type,\n",
|
| 69 |
+
" vit_out_dim = input_dim,\n",
|
| 70 |
+
")\n",
|
| 71 |
+
"embedding_path = os.path.join(\"training_weight\", experiment_name, \"embeddings_manager-{}.pt\".format(str(steps)))\n",
|
| 72 |
+
"Embedding_Manager.load(embedding_path)\n",
|
| 73 |
+
"text_encoder.text_model.embeddings.forward = original_forward\n",
|
| 74 |
+
"\n",
|
| 75 |
+
"print(\"finish init\")"
|
| 76 |
+
]
|
| 77 |
+
},
|
| 78 |
+
{
|
| 79 |
+
"cell_type": "markdown",
|
| 80 |
+
"metadata": {},
|
| 81 |
+
"source": [
|
| 82 |
+
"1. create a new character and test with prompts"
|
| 83 |
+
]
|
| 84 |
+
},
|
| 85 |
+
{
|
| 86 |
+
"cell_type": "code",
|
| 87 |
+
"execution_count": null,
|
| 88 |
+
"metadata": {},
|
| 89 |
+
"outputs": [],
|
| 90 |
+
"source": [
|
| 91 |
+
"# sample a z\n",
|
| 92 |
+
"random_embedding = torch.randn(1, 1, input_dim).to(device)\n",
|
| 93 |
+
"\n",
|
| 94 |
+
"# map z to pseudo identity embeddings\n",
|
| 95 |
+
"_, emb_dict = Embedding_Manager(tokenized_text=None, embedded_text=None, name_batch=None, random_embeddings = random_embedding, timesteps = None,)\n",
|
| 96 |
+
"\n",
|
| 97 |
+
"test_emb = emb_dict[\"adained_total_embedding\"].to(device)\n",
|
| 98 |
+
"\n",
|
| 99 |
+
"v1_emb = test_emb[:, 0]\n",
|
| 100 |
+
"v2_emb = test_emb[:, 1]\n",
|
| 101 |
+
"embeddings = [v1_emb, v2_emb]\n",
|
| 102 |
+
"\n",
|
| 103 |
+
"index = \"0000\"\n",
|
| 104 |
+
"save_dir = os.path.join(\"test_results/\" + experiment_name, index)\n",
|
| 105 |
+
"os.makedirs(save_dir, exist_ok=True)\n",
|
| 106 |
+
"test_emb_path = os.path.join(save_dir, \"id_embeddings.pt\")\n",
|
| 107 |
+
"torch.save(test_emb, test_emb_path)\n",
|
| 108 |
+
"\n",
|
| 109 |
+
"'''insert into tokenizer & embedding layer'''\n",
|
| 110 |
+
"tokens = [\"v1*\", \"v2*\"]\n",
|
| 111 |
+
"embeddings = [v1_emb, v2_emb]\n",
|
| 112 |
+
"# add tokens and get ids\n",
|
| 113 |
+
"tokenizer.add_tokens(tokens)\n",
|
| 114 |
+
"token_ids = tokenizer.convert_tokens_to_ids(tokens)\n",
|
| 115 |
+
"\n",
|
| 116 |
+
"# resize token embeddings and set new embeddings\n",
|
| 117 |
+
"text_encoder.resize_token_embeddings(len(tokenizer), pad_to_multiple_of = 8)\n",
|
| 118 |
+
"for token_id, embedding in zip(token_ids, embeddings):\n",
|
| 119 |
+
" text_encoder.get_input_embeddings().weight.data[token_id] = embedding\n",
|
| 120 |
+
"\n",
|
| 121 |
+
"prompts_list = [\"a photo of v1* v2*, facing to camera, best quality, ultra high res\",\n",
|
| 122 |
+
" \"v1* v2* wearing a Superman outfit, facing to camera, best quality, ultra high res\",\n",
|
| 123 |
+
" \"v1* v2* wearing a spacesuit, facing to camera, best quality, ultra high res\",\n",
|
| 124 |
+
" \"v1* v2* wearing a red sweater, facing to camera, best quality, ultra high res\",\n",
|
| 125 |
+
" \"v1* v2* wearing a blue hoodie, facing to camera, best quality, ultra high res\",\n",
|
| 126 |
+
"]\n",
|
| 127 |
+
"\n",
|
| 128 |
+
"for prompt in prompts_list:\n",
|
| 129 |
+
" image = pipe(prompt, guidance_scale = 8.5).images[0]\n",
|
| 130 |
+
" save_img_path = os.path.join(save_dir, prompt.replace(\"v1* v2*\", \"a person\") + '.png')\n",
|
| 131 |
+
" image.save(save_img_path)\n",
|
| 132 |
+
" print(save_img_path)\n"
|
| 133 |
+
]
|
| 134 |
+
},
|
| 135 |
+
{
|
| 136 |
+
"cell_type": "markdown",
|
| 137 |
+
"metadata": {},
|
| 138 |
+
"source": [
|
| 139 |
+
"2. directly use a chosen generated pseudo identity embeddings"
|
| 140 |
+
]
|
| 141 |
+
},
|
| 142 |
+
{
|
| 143 |
+
"cell_type": "code",
|
| 144 |
+
"execution_count": null,
|
| 145 |
+
"metadata": {},
|
| 146 |
+
"outputs": [],
|
| 147 |
+
"source": [
|
| 148 |
+
"# the path of your generated embeddings\n",
|
| 149 |
+
"test_emb_path = \"demo_embeddings/856.pt\" # \"test_results/normal_GAN/0000/id_embeddings.pt\"\n",
|
| 150 |
+
"test_emb = torch.load(test_emb_path).cuda()\n",
|
| 151 |
+
"v1_emb = test_emb[:, 0]\n",
|
| 152 |
+
"v2_emb = test_emb[:, 1]\n",
|
| 153 |
+
"\n",
|
| 154 |
+
"\n",
|
| 155 |
+
"index = \"chosen_index\"\n",
|
| 156 |
+
"save_dir = os.path.join(\"test_results/\" + experiment_name, index)\n",
|
| 157 |
+
"os.makedirs(save_dir, exist_ok=True)\n",
|
| 158 |
+
"\n",
|
| 159 |
+
"\n",
|
| 160 |
+
"'''insert into tokenizer & embedding layer'''\n",
|
| 161 |
+
"tokens = [\"v1*\", \"v2*\"]\n",
|
| 162 |
+
"embeddings = [v1_emb, v2_emb]\n",
|
| 163 |
+
"# add tokens and get ids\n",
|
| 164 |
+
"tokenizer.add_tokens(tokens)\n",
|
| 165 |
+
"token_ids = tokenizer.convert_tokens_to_ids(tokens)\n",
|
| 166 |
+
"\n",
|
| 167 |
+
"# resize token embeddings and set new embeddings\n",
|
| 168 |
+
"text_encoder.resize_token_embeddings(len(tokenizer), pad_to_multiple_of = 8)\n",
|
| 169 |
+
"for token_id, embedding in zip(token_ids, embeddings):\n",
|
| 170 |
+
" text_encoder.get_input_embeddings().weight.data[token_id] = embedding\n",
|
| 171 |
+
"\n",
|
| 172 |
+
"prompts_list = [\"a photo of v1* v2*, facing to camera, best quality, ultra high res\",\n",
|
| 173 |
+
" \"v1* v2* wearing a Superman outfit, facing to camera, best quality, ultra high res\",\n",
|
| 174 |
+
" \"v1* v2* wearing a spacesuit, facing to camera, best quality, ultra high res\",\n",
|
| 175 |
+
" \"v1* v2* wearing a red sweater, facing to camera, best quality, ultra high res\",\n",
|
| 176 |
+
" \"v1* v2* wearing a purple wizard outfit, facing to camera, best quality, ultra high res\",\n",
|
| 177 |
+
" \"v1* v2* wearing a blue hoodie, facing to camera, best quality, ultra high res\",\n",
|
| 178 |
+
" \"v1* v2* wearing headphones, facing to camera, best quality, ultra high res\",\n",
|
| 179 |
+
" \"v1* v2* with red hair, facing to camera, best quality, ultra high res\",\n",
|
| 180 |
+
" \"v1* v2* wearing headphones with red hair, facing to camera, best quality, ultra high res\",\n",
|
| 181 |
+
" \"v1* v2* wearing a Christmas hat, facing to camera, best quality, ultra high res\",\n",
|
| 182 |
+
" \"v1* v2* wearing sunglasses, facing to camera, best quality, ultra high res\",\n",
|
| 183 |
+
" \"v1* v2* wearing sunglasses and necklace, facing to camera, best quality, ultra high res\",\n",
|
| 184 |
+
" \"v1* v2* wearing a blue cap, facing to camera, best quality, ultra high res\",\n",
|
| 185 |
+
" \"v1* v2* wearing a doctoral cap, facing to camera, best quality, ultra high res\",\n",
|
| 186 |
+
" \"v1* v2* with white hair, wearing glasses, facing to camera, best quality, ultra high res\",\n",
|
| 187 |
+
" \"v1* v2* in a helmet and vest riding a motorcycle, facing to camera, best quality, ultra high res\",\n",
|
| 188 |
+
" \"v1* v2* holding a bottle of red wine, facing to camera, best quality, ultra high res\",\n",
|
| 189 |
+
" \"v1* v2* driving a bus in the desert, facing to camera, best quality, ultra high res\",\n",
|
| 190 |
+
" \"v1* v2* playing basketball, facing to camera, best quality, ultra high res\",\n",
|
| 191 |
+
" \"v1* v2* playing the violin, facing to camera, best quality, ultra high res\",\n",
|
| 192 |
+
" \"v1* v2* piloting a spaceship, facing to camera, best quality, ultra high res\",\n",
|
| 193 |
+
" \"v1* v2* riding a horse, facing to camera, best quality, ultra high res\",\n",
|
| 194 |
+
" \"v1* v2* coding in front of a computer, facing to camera, best quality, ultra high res\",\n",
|
| 195 |
+
" \"v1* v2* laughing on the lawn, facing to camera, best quality, ultra high res\",\n",
|
| 196 |
+
" \"v1* v2* frowning at the camera, facing to camera, best quality, ultra high res\",\n",
|
| 197 |
+
" \"v1* v2* happily smiling, looking at the camera, facing to camera, best quality, ultra high res\",\n",
|
| 198 |
+
" \"v1* v2* crying disappointedly, with tears flowing, facing to camera, best quality, ultra high res\",\n",
|
| 199 |
+
" \"v1* v2* wearing sunglasses, facing to camera, best quality, ultra high res\",\n",
|
| 200 |
+
" \"v1* v2* playing the guitar in the view of left side, facing to camera, best quality, ultra high res\",\n",
|
| 201 |
+
" \"v1* v2* holding a bottle of red wine, upper body, facing to camera, best quality, ultra high res\",\n",
|
| 202 |
+
" \"v1* v2* wearing sunglasses and necklace, close-up, in the view of right side, facing to camera, best quality, ultra high res\",\n",
|
| 203 |
+
" \"v1* v2* riding a horse, in the view of the top, facing to camera, best quality, ultra high res\",\n",
|
| 204 |
+
" \"v1* v2* wearing a doctoral cap, upper body, with the left side of the face facing the camera, best quality, ultra high res\",\n",
|
| 205 |
+
" \"v1* v2* crying disappointedly, with tears flowing, with left side of the face facing the camera, best quality, ultra high res\",\n",
|
| 206 |
+
" \"v1* v2* sitting in front of the camera, with a beautiful purple sunset at the beach in the background, best quality, ultra high res\",\n",
|
| 207 |
+
" \"v1* v2* swimming in the pool, facing to camera, best quality, ultra high res\",\n",
|
| 208 |
+
" \"v1* v2* climbing a mountain, facing to camera, best quality, ultra high res\",\n",
|
| 209 |
+
" \"v1* v2* skiing on the snowy mountain, facing to camera, best quality, ultra high res\",\n",
|
| 210 |
+
" \"v1* v2* in the snow, facing to camera, best quality, ultra high res\",\n",
|
| 211 |
+
" \"v1* v2* in space wearing a spacesuit, facing to camera, best quality, ultra high res\",\n",
|
| 212 |
+
"]\n",
|
| 213 |
+
"\n",
|
| 214 |
+
"for prompt in prompts_list:\n",
|
| 215 |
+
" image = pipe(prompt, guidance_scale = 8.5).images[0]\n",
|
| 216 |
+
" save_img_path = os.path.join(save_dir, prompt.replace(\"v1* v2*\", \"a person\") + '.png')\n",
|
| 217 |
+
" image.save(save_img_path)\n",
|
| 218 |
+
" print(save_img_path)"
|
| 219 |
+
]
|
| 220 |
+
}
|
| 221 |
+
],
|
| 222 |
+
"metadata": {
|
| 223 |
+
"kernelspec": {
|
| 224 |
+
"display_name": "lbl",
|
| 225 |
+
"language": "python",
|
| 226 |
+
"name": "python3"
|
| 227 |
+
},
|
| 228 |
+
"language_info": {
|
| 229 |
+
"codemirror_mode": {
|
| 230 |
+
"name": "ipython",
|
| 231 |
+
"version": 3
|
| 232 |
+
},
|
| 233 |
+
"file_extension": ".py",
|
| 234 |
+
"mimetype": "text/x-python",
|
| 235 |
+
"name": "python",
|
| 236 |
+
"nbconvert_exporter": "python",
|
| 237 |
+
"pygments_lexer": "ipython3",
|
| 238 |
+
"version": "3.8.5"
|
| 239 |
+
}
|
| 240 |
+
},
|
| 241 |
+
"nbformat": 4,
|
| 242 |
+
"nbformat_minor": 2
|
| 243 |
+
}
|
test_create_many_characters.ipynb
ADDED
|
@@ -0,0 +1,255 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": null,
|
| 6 |
+
"metadata": {},
|
| 7 |
+
"outputs": [],
|
| 8 |
+
"source": [
|
| 9 |
+
"import torch\n",
|
| 10 |
+
"import os\n",
|
| 11 |
+
"from transformers import ViTModel, ViTImageProcessor\n",
|
| 12 |
+
"from utils import text_encoder_forward\n",
|
| 13 |
+
"from diffusers import StableDiffusionPipeline, DPMSolverMultistepScheduler\n",
|
| 14 |
+
"from utils import latents_to_images, downsampling, merge_and_save_images\n",
|
| 15 |
+
"from omegaconf import OmegaConf\n",
|
| 16 |
+
"from accelerate.utils import set_seed\n",
|
| 17 |
+
"from tqdm import tqdm\n",
|
| 18 |
+
"from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion import StableDiffusionPipelineOutput\n",
|
| 19 |
+
"from PIL import Image\n",
|
| 20 |
+
"from models.celeb_embeddings import embedding_forward\n",
|
| 21 |
+
"import models.embedding_manager\n",
|
| 22 |
+
"import importlib\n",
|
| 23 |
+
"\n",
|
| 24 |
+
"# seed = 42\n",
|
| 25 |
+
"# set_seed(seed) \n",
|
| 26 |
+
"# torch.cuda.set_device(0)\n",
|
| 27 |
+
"\n",
|
| 28 |
+
"# set your sd2.1 path\n",
|
| 29 |
+
"model_path = \"/home/user/.cache/huggingface/hub/models--stabilityai--stable-diffusion-2-1/snapshots/5cae40e6a2745ae2b01ad92ae5043f95f23644d6\"\n",
|
| 30 |
+
"pipe = StableDiffusionPipeline.from_pretrained(model_path) \n",
|
| 31 |
+
"pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)\n",
|
| 32 |
+
"pipe = pipe.to(\"cuda\")\n",
|
| 33 |
+
"\n",
|
| 34 |
+
"device = torch.device(\"cuda\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
|
| 35 |
+
"\n",
|
| 36 |
+
"vae = pipe.vae\n",
|
| 37 |
+
"unet = pipe.unet\n",
|
| 38 |
+
"text_encoder = pipe.text_encoder\n",
|
| 39 |
+
"tokenizer = pipe.tokenizer\n",
|
| 40 |
+
"scheduler = pipe.scheduler\n",
|
| 41 |
+
"\n",
|
| 42 |
+
"input_dim = 64\n",
|
| 43 |
+
"\n",
|
| 44 |
+
"experiment_name = \"normal_GAN\" # \"normal_GAN\", \"man_GAN\", \"woman_GAN\" , \n",
|
| 45 |
+
"if experiment_name == \"normal_GAN\":\n",
|
| 46 |
+
" steps = 10000\n",
|
| 47 |
+
"elif experiment_name == \"man_GAN\":\n",
|
| 48 |
+
" steps = 7000\n",
|
| 49 |
+
"elif experiment_name == \"woman_GAN\":\n",
|
| 50 |
+
" steps = 6000\n",
|
| 51 |
+
"else:\n",
|
| 52 |
+
" print(\"Hello, please notice this ^_^\")\n",
|
| 53 |
+
" assert 0\n",
|
| 54 |
+
"\n",
|
| 55 |
+
"\n",
|
| 56 |
+
"original_forward = text_encoder.text_model.embeddings.forward\n",
|
| 57 |
+
"text_encoder.text_model.embeddings.forward = embedding_forward.__get__(text_encoder.text_model.embeddings)\n",
|
| 58 |
+
"embedding_manager_config = OmegaConf.load(\"datasets_face/identity_space.yaml\")\n",
|
| 59 |
+
"Embedding_Manager = models.embedding_manager.EmbeddingManagerId_adain( \n",
|
| 60 |
+
" tokenizer,\n",
|
| 61 |
+
" text_encoder,\n",
|
| 62 |
+
" device = device,\n",
|
| 63 |
+
" training = True,\n",
|
| 64 |
+
" experiment_name = experiment_name, \n",
|
| 65 |
+
" num_embeds_per_token = embedding_manager_config.model.personalization_config.params.num_embeds_per_token, \n",
|
| 66 |
+
" token_dim = embedding_manager_config.model.personalization_config.params.token_dim,\n",
|
| 67 |
+
" mlp_depth = embedding_manager_config.model.personalization_config.params.mlp_depth,\n",
|
| 68 |
+
" loss_type = embedding_manager_config.model.personalization_config.params.loss_type,\n",
|
| 69 |
+
" vit_out_dim = input_dim,\n",
|
| 70 |
+
")\n",
|
| 71 |
+
"\n",
|
| 72 |
+
"\n",
|
| 73 |
+
"embedding_path = os.path.join(\"training_weight\", experiment_name, \"embeddings_manager-{}.pt\".format(str(steps)))\n",
|
| 74 |
+
"Embedding_Manager.load(embedding_path)\n",
|
| 75 |
+
"text_encoder.text_model.embeddings.forward = original_forward\n",
|
| 76 |
+
"\n",
|
| 77 |
+
"print(\"finish init\")"
|
| 78 |
+
]
|
| 79 |
+
},
|
| 80 |
+
{
|
| 81 |
+
"cell_type": "markdown",
|
| 82 |
+
"metadata": {},
|
| 83 |
+
"source": [
|
| 84 |
+
"1. create a new character and test with prompts"
|
| 85 |
+
]
|
| 86 |
+
},
|
| 87 |
+
{
|
| 88 |
+
"cell_type": "code",
|
| 89 |
+
"execution_count": null,
|
| 90 |
+
"metadata": {},
|
| 91 |
+
"outputs": [],
|
| 92 |
+
"source": [
|
| 93 |
+
"# sample a z\n",
|
| 94 |
+
"for index in range(100):\n",
|
| 95 |
+
"\n",
|
| 96 |
+
" random_embedding = torch.randn(1, 1, input_dim).to(device)\n",
|
| 97 |
+
"\n",
|
| 98 |
+
" # map z to pseudo identity embeddings\n",
|
| 99 |
+
" _, emb_dict = Embedding_Manager(tokenized_text=None, embedded_text=None, name_batch=None, random_embeddings = random_embedding, timesteps = None,)\n",
|
| 100 |
+
"\n",
|
| 101 |
+
" test_emb = emb_dict[\"adained_total_embedding\"].to(device)\n",
|
| 102 |
+
"\n",
|
| 103 |
+
" v1_emb = test_emb[:, 0]\n",
|
| 104 |
+
" v2_emb = test_emb[:, 1]\n",
|
| 105 |
+
" embeddings = [v1_emb, v2_emb]\n",
|
| 106 |
+
"\n",
|
| 107 |
+
" save_dir = os.path.join(\"test_results/\" + experiment_name, str(index))\n",
|
| 108 |
+
" os.makedirs(save_dir, exist_ok=True) \n",
|
| 109 |
+
" test_emb_path = os.path.join(save_dir, \"id_embeddings.pt\")\n",
|
| 110 |
+
" torch.save(test_emb, test_emb_path)\n",
|
| 111 |
+
"\n",
|
| 112 |
+
"\n",
|
| 113 |
+
"\n",
|
| 114 |
+
" '''insert into tokenizer & embedding layer'''\n",
|
| 115 |
+
" tokens = [\"v1*\", \"v2*\"]\n",
|
| 116 |
+
" embeddings = [v1_emb, v2_emb]\n",
|
| 117 |
+
" # add tokens and get ids\n",
|
| 118 |
+
" tokenizer.add_tokens(tokens)\n",
|
| 119 |
+
" token_ids = tokenizer.convert_tokens_to_ids(tokens)\n",
|
| 120 |
+
"\n",
|
| 121 |
+
" # resize token embeddings and set new embeddings\n",
|
| 122 |
+
" text_encoder.resize_token_embeddings(len(tokenizer), pad_to_multiple_of = 8)\n",
|
| 123 |
+
" for token_id, embedding in zip(token_ids, embeddings):\n",
|
| 124 |
+
" text_encoder.get_input_embeddings().weight.data[token_id] = embedding\n",
|
| 125 |
+
"\n",
|
| 126 |
+
" prompts_list = [\"a photo of v1* v2*, facing to camera, best quality, ultra high res\",\n",
|
| 127 |
+
" \"v1* v2* wearing a Superman outfit, facing to camera, best quality, ultra high res\",\n",
|
| 128 |
+
" \"v1* v2* wearing a spacesuit, facing to camera, best quality, ultra high res\",\n",
|
| 129 |
+
" \"v1* v2* wearing a red sweater, facing to camera, best quality, ultra high res\",\n",
|
| 130 |
+
" \"v1* v2* wearing a blue hoodie, facing to camera, best quality, ultra high res\",\n",
|
| 131 |
+
" ]\n",
|
| 132 |
+
"\n",
|
| 133 |
+
" for prompt in prompts_list:\n",
|
| 134 |
+
" image = pipe(prompt, guidance_scale = 8.5).images[0]\n",
|
| 135 |
+
" save_img_path = os.path.join(save_dir, prompt.replace(\"v1* v2*\", \"a person\") + '.png')\n",
|
| 136 |
+
" image.save(save_img_path)\n",
|
| 137 |
+
" print(save_img_path)\n"
|
| 138 |
+
]
|
| 139 |
+
},
|
| 140 |
+
{
|
| 141 |
+
"cell_type": "markdown",
|
| 142 |
+
"metadata": {},
|
| 143 |
+
"source": [
|
| 144 |
+
"2. directly use a chosen generated pseudo identity embeddings"
|
| 145 |
+
]
|
| 146 |
+
},
|
| 147 |
+
{
|
| 148 |
+
"cell_type": "code",
|
| 149 |
+
"execution_count": null,
|
| 150 |
+
"metadata": {},
|
| 151 |
+
"outputs": [],
|
| 152 |
+
"source": [
|
| 153 |
+
"# the path of your generated embeddings\n",
|
| 154 |
+
"test_emb_path = \"test_results/normal_GAN/0000/id_embeddings.pt\"\n",
|
| 155 |
+
"test_emb = torch.load(test_emb_path).cuda()\n",
|
| 156 |
+
"v1_emb = test_emb[:, 0]\n",
|
| 157 |
+
"v2_emb = test_emb[:, 1]\n",
|
| 158 |
+
"\n",
|
| 159 |
+
"\n",
|
| 160 |
+
"index = \"chosen_index\"\n",
|
| 161 |
+
"save_dir = os.path.join(\"test_results/\" + experiment_name, index)\n",
|
| 162 |
+
"os.makedirs(save_dir, exist_ok=True)\n",
|
| 163 |
+
"\n",
|
| 164 |
+
"\n",
|
| 165 |
+
"'''insert into tokenizer & embedding layer'''\n",
|
| 166 |
+
"tokens = [\"v1*\", \"v2*\"]\n",
|
| 167 |
+
"embeddings = [v1_emb, v2_emb]\n",
|
| 168 |
+
"# add tokens and get ids\n",
|
| 169 |
+
"tokenizer.add_tokens(tokens)\n",
|
| 170 |
+
"token_ids = tokenizer.convert_tokens_to_ids(tokens)\n",
|
| 171 |
+
"\n",
|
| 172 |
+
"# resize token embeddings and set new embeddings\n",
|
| 173 |
+
"text_encoder.resize_token_embeddings(len(tokenizer), pad_to_multiple_of = 8)\n",
|
| 174 |
+
"for token_id, embedding in zip(token_ids, embeddings):\n",
|
| 175 |
+
" text_encoder.get_input_embeddings().weight.data[token_id] = embedding\n",
|
| 176 |
+
"\n",
|
| 177 |
+
"prompts_list = [\"a photo of v1* v2*, facing to camera, best quality, ultra high res\",\n",
|
| 178 |
+
" \"v1* v2* wearing a Superman outfit, facing to camera, best quality, ultra high res\",\n",
|
| 179 |
+
" \"v1* v2* wearing a spacesuit, facing to camera, best quality, ultra high res\",\n",
|
| 180 |
+
" \"v1* v2* wearing a red sweater, facing to camera, best quality, ultra high res\",\n",
|
| 181 |
+
" \"v1* v2* wearing a purple wizard outfit, facing to camera, best quality, ultra high res\",\n",
|
| 182 |
+
" \"v1* v2* wearing a blue hoodie, facing to camera, best quality, ultra high res\",\n",
|
| 183 |
+
" \"v1* v2* wearing headphones, facing to camera, best quality, ultra high res\",\n",
|
| 184 |
+
" \"v1* v2* with red hair, facing to camera, best quality, ultra high res\",\n",
|
| 185 |
+
" \"v1* v2* wearing headphones with red hair, facing to camera, best quality, ultra high res\",\n",
|
| 186 |
+
" \"v1* v2* wearing a Christmas hat, facing to camera, best quality, ultra high res\",\n",
|
| 187 |
+
" \"v1* v2* wearing sunglasses, facing to camera, best quality, ultra high res\",\n",
|
| 188 |
+
" \"v1* v2* wearing sunglasses and necklace, facing to camera, best quality, ultra high res\",\n",
|
| 189 |
+
" \"v1* v2* wearing a blue cap, facing to camera, best quality, ultra high res\",\n",
|
| 190 |
+
" \"v1* v2* wearing a doctoral cap, facing to camera, best quality, ultra high res\",\n",
|
| 191 |
+
" \"v1* v2* with white hair, wearing glasses, facing to camera, best quality, ultra high res\",\n",
|
| 192 |
+
" \"v1* v2* in a helmet and vest riding a motorcycle, facing to camera, best quality, ultra high res\",\n",
|
| 193 |
+
" \"v1* v2* holding a bottle of red wine, facing to camera, best quality, ultra high res\",\n",
|
| 194 |
+
" \"v1* v2* driving a bus in the desert, facing to camera, best quality, ultra high res\",\n",
|
| 195 |
+
" \"v1* v2* playing basketball, facing to camera, best quality, ultra high res\",\n",
|
| 196 |
+
" \"v1* v2* playing the violin, facing to camera, best quality, ultra high res\",\n",
|
| 197 |
+
" \"v1* v2* piloting a spaceship, facing to camera, best quality, ultra high res\",\n",
|
| 198 |
+
" \"v1* v2* riding a horse, facing to camera, best quality, ultra high res\",\n",
|
| 199 |
+
" \"v1* v2* coding in front of a computer, facing to camera, best quality, ultra high res\",\n",
|
| 200 |
+
" \"v1* v2* laughing on the lawn, facing to camera, best quality, ultra high res\",\n",
|
| 201 |
+
" \"v1* v2* frowning at the camera, facing to camera, best quality, ultra high res\",\n",
|
| 202 |
+
" \"v1* v2* happily smiling, looking at the camera, facing to camera, best quality, ultra high res\",\n",
|
| 203 |
+
" \"v1* v2* crying disappointedly, with tears flowing, facing to camera, best quality, ultra high res\",\n",
|
| 204 |
+
" \"v1* v2* wearing sunglasses, facing to camera, best quality, ultra high res\",\n",
|
| 205 |
+
" \"v1* v2* playing the guitar in the view of left side, facing to camera, best quality, ultra high res\",\n",
|
| 206 |
+
" \"v1* v2* holding a bottle of red wine, upper body, facing to camera, best quality, ultra high res\",\n",
|
| 207 |
+
" \"v1* v2* wearing sunglasses and necklace, close-up, in the view of right side, facing to camera, best quality, ultra high res\",\n",
|
| 208 |
+
" \"v1* v2* riding a horse, in the view of the top, facing to camera, best quality, ultra high res\",\n",
|
| 209 |
+
" \"v1* v2* wearing a doctoral cap, upper body, with the left side of the face facing the camera, best quality, ultra high res\",\n",
|
| 210 |
+
" \"v1* v2* crying disappointedly, with tears flowing, with left side of the face facing the camera, best quality, ultra high res\",\n",
|
| 211 |
+
" \"v1* v2* sitting in front of the camera, with a beautiful purple sunset at the beach in the background, best quality, ultra high res\",\n",
|
| 212 |
+
" \"v1* v2* swimming in the pool, facing to camera, best quality, ultra high res\",\n",
|
| 213 |
+
" \"v1* v2* climbing a mountain, facing to camera, best quality, ultra high res\",\n",
|
| 214 |
+
" \"v1* v2* skiing on the snowy mountain, facing to camera, best quality, ultra high res\",\n",
|
| 215 |
+
" \"v1* v2* in the snow, facing to camera, best quality, ultra high res\",\n",
|
| 216 |
+
" \"v1* v2* in space wearing a spacesuit, facing to camera, best quality, ultra high res\",\n",
|
| 217 |
+
"]\n",
|
| 218 |
+
"\n",
|
| 219 |
+
"for prompt in prompts_list:\n",
|
| 220 |
+
" image = pipe(prompt, guidance_scale = 8.5).images[0]\n",
|
| 221 |
+
" save_img_path = os.path.join(save_dir, prompt.replace(\"v1* v2*\", \"a person\") + '.png')\n",
|
| 222 |
+
" image.save(save_img_path)\n",
|
| 223 |
+
" print(save_img_path)"
|
| 224 |
+
]
|
| 225 |
+
},
|
| 226 |
+
{
|
| 227 |
+
"cell_type": "code",
|
| 228 |
+
"execution_count": null,
|
| 229 |
+
"metadata": {},
|
| 230 |
+
"outputs": [],
|
| 231 |
+
"source": []
|
| 232 |
+
}
|
| 233 |
+
],
|
| 234 |
+
"metadata": {
|
| 235 |
+
"kernelspec": {
|
| 236 |
+
"display_name": "lbl",
|
| 237 |
+
"language": "python",
|
| 238 |
+
"name": "python3"
|
| 239 |
+
},
|
| 240 |
+
"language_info": {
|
| 241 |
+
"codemirror_mode": {
|
| 242 |
+
"name": "ipython",
|
| 243 |
+
"version": 3
|
| 244 |
+
},
|
| 245 |
+
"file_extension": ".py",
|
| 246 |
+
"mimetype": "text/x-python",
|
| 247 |
+
"name": "python",
|
| 248 |
+
"nbconvert_exporter": "python",
|
| 249 |
+
"pygments_lexer": "ipython3",
|
| 250 |
+
"version": "3.8.5"
|
| 251 |
+
}
|
| 252 |
+
},
|
| 253 |
+
"nbformat": 4,
|
| 254 |
+
"nbformat_minor": 2
|
| 255 |
+
}
|
train.py
ADDED
|
@@ -0,0 +1,767 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import argparse
|
| 2 |
+
import itertools
|
| 3 |
+
import logging
|
| 4 |
+
import math
|
| 5 |
+
import os
|
| 6 |
+
from pathlib import Path
|
| 7 |
+
import accelerate
|
| 8 |
+
import torch
|
| 9 |
+
import torch.nn.functional as F
|
| 10 |
+
import torch.utils.checkpoint
|
| 11 |
+
import transformers
|
| 12 |
+
from accelerate import Accelerator
|
| 13 |
+
from accelerate.logging import get_logger
|
| 14 |
+
from accelerate.utils import ProjectConfiguration, set_seed
|
| 15 |
+
from packaging import version
|
| 16 |
+
from PIL import Image
|
| 17 |
+
from torch.utils.data import Dataset
|
| 18 |
+
from torchvision import transforms
|
| 19 |
+
from tqdm.auto import tqdm
|
| 20 |
+
from transformers import AutoTokenizer, PretrainedConfig
|
| 21 |
+
import diffusers
|
| 22 |
+
from diffusers import (
|
| 23 |
+
AutoencoderKL,
|
| 24 |
+
DDPMScheduler,
|
| 25 |
+
DiffusionPipeline,
|
| 26 |
+
UNet2DConditionModel,
|
| 27 |
+
StableDiffusionPipeline,
|
| 28 |
+
DPMSolverMultistepScheduler,
|
| 29 |
+
)
|
| 30 |
+
from diffusers.optimization import get_scheduler
|
| 31 |
+
from diffusers.utils.import_utils import is_xformers_available
|
| 32 |
+
import numpy as np
|
| 33 |
+
from omegaconf import OmegaConf
|
| 34 |
+
import random
|
| 35 |
+
from transformers import ViTModel, ViTImageProcessor
|
| 36 |
+
from models.celeb_embeddings import embedding_forward
|
| 37 |
+
from models.embedding_manager import EmbeddingManagerId_adain, Embedding_discriminator
|
| 38 |
+
from datasets_face.face_id import FaceIdDataset
|
| 39 |
+
from utils import text_encoder_forward, set_requires_grad, add_noise_return_paras, latents_to_images, discriminator_r1_loss, discriminator_r1_loss_accelerator, downsampling, GANLoss
|
| 40 |
+
import types
|
| 41 |
+
import torch.nn as nn
|
| 42 |
+
from tqdm import tqdm
|
| 43 |
+
from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion import StableDiffusionPipelineOutput
|
| 44 |
+
import importlib
|
| 45 |
+
|
| 46 |
+
logger = get_logger(__name__)
|
| 47 |
+
|
| 48 |
+
def import_model_class_from_model_name_or_path(pretrained_model_name_or_path: str, revision: str):
|
| 49 |
+
text_encoder_config = PretrainedConfig.from_pretrained(
|
| 50 |
+
pretrained_model_name_or_path,
|
| 51 |
+
subfolder="text_encoder",
|
| 52 |
+
revision=revision,
|
| 53 |
+
)
|
| 54 |
+
model_class = text_encoder_config.architectures[0]
|
| 55 |
+
|
| 56 |
+
if model_class == "CLIPTextModel":
|
| 57 |
+
from transformers import CLIPTextModel
|
| 58 |
+
|
| 59 |
+
return CLIPTextModel
|
| 60 |
+
elif model_class == "RobertaSeriesModelWithTransformation":
|
| 61 |
+
from diffusers.pipelines.alt_diffusion.modeling_roberta_series import RobertaSeriesModelWithTransformation
|
| 62 |
+
|
| 63 |
+
return RobertaSeriesModelWithTransformation
|
| 64 |
+
elif model_class == "T5EncoderModel":
|
| 65 |
+
from transformers import T5EncoderModel
|
| 66 |
+
|
| 67 |
+
return T5EncoderModel
|
| 68 |
+
else:
|
| 69 |
+
raise ValueError(f"{model_class} is not supported.")
|
| 70 |
+
|
| 71 |
+
def parse_args(input_args=None):
|
| 72 |
+
parser = argparse.ArgumentParser(description="Simple example of a script for training Cones 2.")
|
| 73 |
+
parser.add_argument(
|
| 74 |
+
"--embedding_manager_config",
|
| 75 |
+
type=str,
|
| 76 |
+
default="datasets_face/identity_space.yaml",
|
| 77 |
+
help=('config to load the train model and dataset'),
|
| 78 |
+
)
|
| 79 |
+
parser.add_argument(
|
| 80 |
+
"--d_reg_every",
|
| 81 |
+
type=int,
|
| 82 |
+
default=16,
|
| 83 |
+
help="interval for applying r1 regularization"
|
| 84 |
+
)
|
| 85 |
+
parser.add_argument(
|
| 86 |
+
"--r1",
|
| 87 |
+
type=float,
|
| 88 |
+
default=1,
|
| 89 |
+
help="weight of the r1 regularization"
|
| 90 |
+
)
|
| 91 |
+
parser.add_argument(
|
| 92 |
+
"--l_gan_lambda",
|
| 93 |
+
type=float,
|
| 94 |
+
default=1,
|
| 95 |
+
help="Initial learning rate (after the potential warmup period) to use.",
|
| 96 |
+
)
|
| 97 |
+
parser.add_argument(
|
| 98 |
+
"--l_consis_lambda",
|
| 99 |
+
type=float,
|
| 100 |
+
default=8,
|
| 101 |
+
help="Initial learning rate (after the potential warmup period) to use.",
|
| 102 |
+
)
|
| 103 |
+
parser.add_argument(
|
| 104 |
+
"--pretrained_model_name_or_path",
|
| 105 |
+
type=str,
|
| 106 |
+
default="/home/user/.cache/huggingface/hub/models--stabilityai--stable-diffusion-2-1/snapshots/5cae40e6a2745ae2b01ad92ae5043f95f23644d6",
|
| 107 |
+
help="Path to pretrained model or model identifier from huggingface.co/models.",
|
| 108 |
+
)
|
| 109 |
+
parser.add_argument(
|
| 110 |
+
"--pretrained_embedding_manager_path",
|
| 111 |
+
type=str,
|
| 112 |
+
default=None,
|
| 113 |
+
help="pretrained_embedding_manager_path",
|
| 114 |
+
)
|
| 115 |
+
parser.add_argument(
|
| 116 |
+
"--pretrained_embedding_manager_epoch",
|
| 117 |
+
type=str,
|
| 118 |
+
default=800,
|
| 119 |
+
help="pretrained_embedding_manager_epoch",
|
| 120 |
+
)
|
| 121 |
+
parser.add_argument(
|
| 122 |
+
"--revision",
|
| 123 |
+
type=str,
|
| 124 |
+
default=None,
|
| 125 |
+
required=False,
|
| 126 |
+
help=(
|
| 127 |
+
"Revision of pretrained model identifier from huggingface.co/models. Trainable model components should be"
|
| 128 |
+
" float32 precision."
|
| 129 |
+
),
|
| 130 |
+
)
|
| 131 |
+
parser.add_argument(
|
| 132 |
+
"--tokenizer_name",
|
| 133 |
+
type=str,
|
| 134 |
+
default=None,
|
| 135 |
+
help="Pretrained tokenizer name or path if not the same as model_name",
|
| 136 |
+
)
|
| 137 |
+
parser.add_argument(
|
| 138 |
+
"--output_dir",
|
| 139 |
+
type=str,
|
| 140 |
+
default="training_weight/normal_GAN", # training_weight/woman_GAN training_weight/man_GAN
|
| 141 |
+
help="The output directory where the model predictions and checkpoints will be written.",
|
| 142 |
+
)
|
| 143 |
+
parser.add_argument("--seed", type=int, default= None, help="A seed for reproducible training.")
|
| 144 |
+
parser.add_argument(
|
| 145 |
+
"--resolution",
|
| 146 |
+
type=int,
|
| 147 |
+
default=512,
|
| 148 |
+
help=(
|
| 149 |
+
"The resolution for input images, all the images in the train/validation dataset will be resized to this"
|
| 150 |
+
" resolution"
|
| 151 |
+
),
|
| 152 |
+
)
|
| 153 |
+
parser.add_argument(
|
| 154 |
+
"--center_crop",
|
| 155 |
+
default=False,
|
| 156 |
+
action="store_true",
|
| 157 |
+
help=(
|
| 158 |
+
"Whether to center crop the input images to the resolution. If not set, the images will be randomly"
|
| 159 |
+
" cropped. The images will be resized to the resolution first before cropping."
|
| 160 |
+
),
|
| 161 |
+
)
|
| 162 |
+
parser.add_argument(
|
| 163 |
+
"--train_batch_size",
|
| 164 |
+
type=int, default=8,
|
| 165 |
+
help="Batch size (per device) for the training dataloader."
|
| 166 |
+
)
|
| 167 |
+
parser.add_argument(
|
| 168 |
+
"--num_train_epochs",
|
| 169 |
+
type=int,
|
| 170 |
+
default=None
|
| 171 |
+
)
|
| 172 |
+
parser.add_argument(
|
| 173 |
+
"--max_train_steps",
|
| 174 |
+
type=int,
|
| 175 |
+
# default=None,
|
| 176 |
+
default=10001,
|
| 177 |
+
help="Total number of training steps to perform. If provided, overrides num_train_epochs.",
|
| 178 |
+
)
|
| 179 |
+
parser.add_argument(
|
| 180 |
+
"--checkpointing_steps",
|
| 181 |
+
type=int,
|
| 182 |
+
default=1000,
|
| 183 |
+
help=(
|
| 184 |
+
"Save a checkpoint of the training state every X updates. Checkpoints can be used for resuming training via"
|
| 185 |
+
" `--resume_from_checkpoint`. In the case that the checkpoint is better than the final trained model, the"
|
| 186 |
+
" checkpoint can also be used for inference. Using a checkpoint for inference requires separate loading of"
|
| 187 |
+
" the original pipeline and the individual checkpointed model components."
|
| 188 |
+
),
|
| 189 |
+
)
|
| 190 |
+
parser.add_argument(
|
| 191 |
+
"--resume_from_checkpoint",
|
| 192 |
+
type=str,
|
| 193 |
+
default=None,
|
| 194 |
+
help=(
|
| 195 |
+
"Whether training should be resumed from a previous checkpoint. Use a path saved by"
|
| 196 |
+
' `--checkpointing_steps`, or `"latest"` to automatically select the last available checkpoint.'
|
| 197 |
+
),
|
| 198 |
+
)
|
| 199 |
+
parser.add_argument(
|
| 200 |
+
"--gradient_accumulation_steps",
|
| 201 |
+
type=int,
|
| 202 |
+
default=1,
|
| 203 |
+
help="Number of updates steps to accumulate before performing a backward/update pass.",
|
| 204 |
+
)
|
| 205 |
+
parser.add_argument(
|
| 206 |
+
"--gradient_checkpointing",
|
| 207 |
+
action="store_true",
|
| 208 |
+
help="Whether or not to use gradient checkpointing to save memory at the expense of slower backward pass.",
|
| 209 |
+
)
|
| 210 |
+
parser.add_argument(
|
| 211 |
+
"--learning_rate",
|
| 212 |
+
type=float,
|
| 213 |
+
default=5e-5,
|
| 214 |
+
help="Initial learning rate (after the potential warmup period) to use.",
|
| 215 |
+
)
|
| 216 |
+
parser.add_argument(
|
| 217 |
+
"--scale_lr",
|
| 218 |
+
action="store_true",
|
| 219 |
+
default=False,
|
| 220 |
+
help="Scale the learning rate by the number of GPUs, gradient accumulation steps, and batch size.",
|
| 221 |
+
)
|
| 222 |
+
parser.add_argument(
|
| 223 |
+
"--lr_scheduler",
|
| 224 |
+
type=str,
|
| 225 |
+
default="constant",
|
| 226 |
+
help=(
|
| 227 |
+
'The scheduler type to use. Choose between ["linear", "cosine", "cosine_with_restarts", "polynomial",'
|
| 228 |
+
' "constant", "constant_with_warmup"]'
|
| 229 |
+
),
|
| 230 |
+
)
|
| 231 |
+
parser.add_argument(
|
| 232 |
+
"--lr_warmup_steps", type=int, default=0, help="Number of steps for the warmup in the lr scheduler."
|
| 233 |
+
)
|
| 234 |
+
parser.add_argument(
|
| 235 |
+
"--lr_num_cycles",
|
| 236 |
+
type=int,
|
| 237 |
+
default=1,
|
| 238 |
+
help="Number of hard resets of the lr in cosine_with_restarts scheduler.",
|
| 239 |
+
)
|
| 240 |
+
parser.add_argument("--lr_power", type=float, default=1.0, help="Power factor of the polynomial scheduler.")
|
| 241 |
+
parser.add_argument(
|
| 242 |
+
"--use_8bit_adam", action="store_true", help="Whether or not to use 8-bit Adam from bitsandbytes."
|
| 243 |
+
)
|
| 244 |
+
parser.add_argument(
|
| 245 |
+
"--dataloader_num_workers",
|
| 246 |
+
type=int,
|
| 247 |
+
default=2,
|
| 248 |
+
help=(
|
| 249 |
+
"Number of subprocesses to use for data loading. 0 means that the data will be loaded in the main process."
|
| 250 |
+
),
|
| 251 |
+
)
|
| 252 |
+
parser.add_argument("--adam_beta1", type=float, default=0.9, help="The beta1 parameter for the Adam optimizer.")
|
| 253 |
+
parser.add_argument("--adam_beta2", type=float, default=0.999, help="The beta2 parameter for the Adam optimizer.")
|
| 254 |
+
parser.add_argument("--adam_weight_decay", type=float, default=1e-2, help="Weight decay to use.")
|
| 255 |
+
parser.add_argument("--adam_epsilon", type=float, default=1e-08, help="Epsilon value for the Adam optimizer")
|
| 256 |
+
parser.add_argument("--max_grad_norm", default=1.0, type=float, help="Max gradient norm.")
|
| 257 |
+
parser.add_argument(
|
| 258 |
+
"--logging_dir",
|
| 259 |
+
type=str,
|
| 260 |
+
default="logs",
|
| 261 |
+
help=(
|
| 262 |
+
"[TensorBoard](https://www.tensorflow.org/tensorboard) log directory. Will default to"
|
| 263 |
+
" *output_dir/runs/**CURRENT_DATETIME_HOSTNAME***."
|
| 264 |
+
),
|
| 265 |
+
)
|
| 266 |
+
parser.add_argument(
|
| 267 |
+
"--allow_tf32",
|
| 268 |
+
action="store_true",
|
| 269 |
+
help=(
|
| 270 |
+
"Whether or not to allow TF32 on Ampere GPUs. Can be used to speed up training. For more information, see"
|
| 271 |
+
" https://pytorch.org/docs/stable/notes/cuda.html#tensorfloat-32-tf32-on-ampere-devices"
|
| 272 |
+
),
|
| 273 |
+
)
|
| 274 |
+
parser.add_argument(
|
| 275 |
+
"--report_to",
|
| 276 |
+
type=str,
|
| 277 |
+
default="tensorboard",
|
| 278 |
+
help=(
|
| 279 |
+
'The integration to report the results and logs to. Supported platforms are `"tensorboard"`'
|
| 280 |
+
' (default), `"wandb"` and `"comet_ml"`. Use `"all"` to report to all integrations.'
|
| 281 |
+
),
|
| 282 |
+
)
|
| 283 |
+
parser.add_argument(
|
| 284 |
+
"--mixed_precision",
|
| 285 |
+
type=str,
|
| 286 |
+
default=None,
|
| 287 |
+
choices=["no", "fp16", "bf16"],
|
| 288 |
+
help=(
|
| 289 |
+
"Whether to use mixed precision. Choose between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >="
|
| 290 |
+
" 1.10.and an Nvidia Ampere GPU. Default to the value of accelerate config of the current system or the"
|
| 291 |
+
" flag passed with the `accelerate.launch` command. Use this argument to override the accelerate config."
|
| 292 |
+
),
|
| 293 |
+
)
|
| 294 |
+
parser.add_argument("--local_rank", type=int, default=-1, help="For distributed training: local_rank")
|
| 295 |
+
parser.add_argument(
|
| 296 |
+
"--enable_xformers_memory_efficient_attention", action="store_true", help="Whether or not to use xformers."
|
| 297 |
+
)
|
| 298 |
+
parser.add_argument(
|
| 299 |
+
"--set_grads_to_none",
|
| 300 |
+
action="store_true",
|
| 301 |
+
help=(
|
| 302 |
+
"Save more memory by using setting grads to None instead of zero. Be aware, that this changes certain"
|
| 303 |
+
" behaviors, so disable this argument if it causes any problems. More info:"
|
| 304 |
+
" https://pytorch.org/docs/stable/generated/torch.optim.Optimizer.zero_grad.html"
|
| 305 |
+
),
|
| 306 |
+
)
|
| 307 |
+
parser.add_argument(
|
| 308 |
+
"--input_dim",
|
| 309 |
+
type=int,
|
| 310 |
+
default=64,
|
| 311 |
+
help="randomly sampled vectors and dimensions of MLP input"
|
| 312 |
+
)
|
| 313 |
+
parser.add_argument(
|
| 314 |
+
"--experiment_name",
|
| 315 |
+
type=str,
|
| 316 |
+
default="normal_GAN", # "man_GAN" "woman_GAN"
|
| 317 |
+
help="randomly sampled vectors and dimensions of MLP input"
|
| 318 |
+
)
|
| 319 |
+
|
| 320 |
+
|
| 321 |
+
if input_args is not None:
|
| 322 |
+
args = parser.parse_args(input_args)
|
| 323 |
+
else:
|
| 324 |
+
args = parser.parse_args()
|
| 325 |
+
|
| 326 |
+
env_local_rank = int(os.environ.get("LOCAL_RANK", -1))
|
| 327 |
+
if env_local_rank != -1 and env_local_rank != args.local_rank:
|
| 328 |
+
args.local_rank = env_local_rank
|
| 329 |
+
|
| 330 |
+
return args
|
| 331 |
+
|
| 332 |
+
def encode_prompt(prompt_batch, name_batch, text_encoder, tokenizer, embedding_manager, is_train=True,
|
| 333 |
+
random_embeddings = None, timesteps = None):
|
| 334 |
+
captions = []
|
| 335 |
+
proportion_empty_prompts = 0
|
| 336 |
+
|
| 337 |
+
for caption in prompt_batch:
|
| 338 |
+
if random.random() < proportion_empty_prompts:
|
| 339 |
+
captions.append("")
|
| 340 |
+
elif isinstance(caption, str):
|
| 341 |
+
captions.append(caption)
|
| 342 |
+
elif isinstance(caption, (list, np.ndarray)):
|
| 343 |
+
captions.append(random.choice(caption) if is_train else caption[0])
|
| 344 |
+
|
| 345 |
+
text_inputs = tokenizer(
|
| 346 |
+
captions,
|
| 347 |
+
padding="max_length",
|
| 348 |
+
max_length=tokenizer.model_max_length,
|
| 349 |
+
truncation=True,
|
| 350 |
+
return_tensors="pt",
|
| 351 |
+
)
|
| 352 |
+
text_input_ids = text_inputs.input_ids.to(text_encoder.device)
|
| 353 |
+
|
| 354 |
+
positions_list = []
|
| 355 |
+
for prompt_ids in text_input_ids:
|
| 356 |
+
position = int(torch.where(prompt_ids == 265)[0][0])
|
| 357 |
+
positions_list.append(position)
|
| 358 |
+
|
| 359 |
+
prompt_embeds, other_return_dict = text_encoder_forward(
|
| 360 |
+
text_encoder = text_encoder,
|
| 361 |
+
input_ids = text_input_ids,
|
| 362 |
+
name_batch = name_batch,
|
| 363 |
+
output_hidden_states=True,
|
| 364 |
+
embedding_manager = embedding_manager,
|
| 365 |
+
random_embeddings = random_embeddings,
|
| 366 |
+
timesteps = timesteps)
|
| 367 |
+
|
| 368 |
+
return prompt_embeds, other_return_dict, positions_list
|
| 369 |
+
|
| 370 |
+
|
| 371 |
+
def weights_init_normal(m):
|
| 372 |
+
classname = m.__class__.__name__
|
| 373 |
+
if classname.find("Linear") != -1:
|
| 374 |
+
torch.nn.init.normal_(m.weight.data, 0.0, 0.02)
|
| 375 |
+
torch.nn.init.constant_(m.bias.data, 0.0)
|
| 376 |
+
|
| 377 |
+
|
| 378 |
+
def main(args):
|
| 379 |
+
args.output_dir = os.path.join(args.output_dir, args.experiment_name)
|
| 380 |
+
print("output_dir", args.output_dir)
|
| 381 |
+
logging_dir = Path(args.output_dir, args.logging_dir)
|
| 382 |
+
accelerator_project_config = ProjectConfiguration(project_dir=args.output_dir, logging_dir=logging_dir)
|
| 383 |
+
accelerator = Accelerator(
|
| 384 |
+
gradient_accumulation_steps=args.gradient_accumulation_steps,
|
| 385 |
+
mixed_precision=args.mixed_precision,
|
| 386 |
+
log_with=args.report_to,
|
| 387 |
+
project_config=accelerator_project_config,
|
| 388 |
+
)
|
| 389 |
+
|
| 390 |
+
# Currently, it's not possible to do gradient accumulation when training two models with accelerate.accumulate
|
| 391 |
+
# This will be enabled soon in accelerate. For now, we don't allow gradient accumulation when training two models.
|
| 392 |
+
if args.gradient_accumulation_steps > 1 and accelerator.num_processes > 1:
|
| 393 |
+
raise ValueError(
|
| 394 |
+
"Gradient accumulation is not supported when training the text encoder in distributed training. "
|
| 395 |
+
"Please set gradient_accumulation_steps to 1. This feature will be supported in the future."
|
| 396 |
+
)
|
| 397 |
+
|
| 398 |
+
# Make one log on every process with the configuration for debugging.
|
| 399 |
+
logging.basicConfig(
|
| 400 |
+
format="%(asctime)s - %(levelname)s - %(name)s - %(message)s",
|
| 401 |
+
datefmt="%m/%d/%Y %H:%M:%S",
|
| 402 |
+
level=logging.INFO,
|
| 403 |
+
)
|
| 404 |
+
logger.info(accelerator.state, main_process_only=False)
|
| 405 |
+
if accelerator.is_local_main_process:
|
| 406 |
+
transformers.utils.logging.set_verbosity_warning()
|
| 407 |
+
diffusers.utils.logging.set_verbosity_info()
|
| 408 |
+
else:
|
| 409 |
+
transformers.utils.logging.set_verbosity_error()
|
| 410 |
+
diffusers.utils.logging.set_verbosity_error()
|
| 411 |
+
|
| 412 |
+
if args.seed is not None:
|
| 413 |
+
set_seed(args.seed)
|
| 414 |
+
|
| 415 |
+
if accelerator.is_main_process:
|
| 416 |
+
if args.output_dir is not None:
|
| 417 |
+
os.makedirs(args.output_dir, exist_ok=True)
|
| 418 |
+
|
| 419 |
+
# Load the tokenizer
|
| 420 |
+
if args.tokenizer_name:
|
| 421 |
+
tokenizer = AutoTokenizer.from_pretrained(args.tokenizer_name, revision=args.revision, use_fast=False)
|
| 422 |
+
elif args.pretrained_model_name_or_path:
|
| 423 |
+
tokenizer = AutoTokenizer.from_pretrained(
|
| 424 |
+
args.pretrained_model_name_or_path,
|
| 425 |
+
subfolder="tokenizer",
|
| 426 |
+
revision=args.revision,
|
| 427 |
+
use_fast=False,
|
| 428 |
+
)
|
| 429 |
+
# import correct text encoder class
|
| 430 |
+
text_encoder_cls = import_model_class_from_model_name_or_path(args.pretrained_model_name_or_path, args.revision)
|
| 431 |
+
|
| 432 |
+
# Load scheduler and models
|
| 433 |
+
noise_scheduler = DDPMScheduler.from_pretrained(args.pretrained_model_name_or_path, subfolder="scheduler")
|
| 434 |
+
noise_scheduler.add_noise = types.MethodType(add_noise_return_paras, noise_scheduler)
|
| 435 |
+
|
| 436 |
+
text_encoder = text_encoder_cls.from_pretrained(
|
| 437 |
+
args.pretrained_model_name_or_path, subfolder="text_encoder", revision=args.revision
|
| 438 |
+
)
|
| 439 |
+
|
| 440 |
+
text_encoder.text_model.embeddings.forward = embedding_forward.__get__(text_encoder.text_model.embeddings)
|
| 441 |
+
|
| 442 |
+
|
| 443 |
+
embedding_manager_config = OmegaConf.load(args.embedding_manager_config)
|
| 444 |
+
experiment_name = args.experiment_name
|
| 445 |
+
|
| 446 |
+
Embedding_Manager = EmbeddingManagerId_adain(
|
| 447 |
+
tokenizer,
|
| 448 |
+
text_encoder,
|
| 449 |
+
device = accelerator.device,
|
| 450 |
+
training = True,
|
| 451 |
+
num_embeds_per_token = embedding_manager_config.model.personalization_config.params.num_embeds_per_token,
|
| 452 |
+
token_dim = embedding_manager_config.model.personalization_config.params.token_dim,
|
| 453 |
+
mlp_depth = embedding_manager_config.model.personalization_config.params.mlp_depth,
|
| 454 |
+
loss_type = embedding_manager_config.model.personalization_config.params.loss_type,
|
| 455 |
+
input_dim = embedding_manager_config.model.personalization_config.params.input_dim,
|
| 456 |
+
experiment_name = experiment_name,
|
| 457 |
+
)
|
| 458 |
+
|
| 459 |
+
Embedding_Manager.name_projection_layer.apply(weights_init_normal)
|
| 460 |
+
|
| 461 |
+
Embedding_D = Embedding_discriminator(embedding_manager_config.model.personalization_config.params.token_dim * 2, dropout_rate = 0.2)
|
| 462 |
+
Embedding_D.apply(weights_init_normal)
|
| 463 |
+
|
| 464 |
+
if args.pretrained_embedding_manager_path is not None:
|
| 465 |
+
epoch = args.pretrained_embedding_manager_epoch
|
| 466 |
+
embedding_manager_path = os.path.join(args.pretrained_embedding_manager_path, "embeddings_manager-{}.pt".format(epoch))
|
| 467 |
+
Embedding_Manager.load(embedding_manager_path)
|
| 468 |
+
embedding_D_path = os.path.join(args.pretrained_embedding_manager_path, "embedding_D-{}.pt".format(epoch))
|
| 469 |
+
Embedding_D = torch.load(embedding_D_path)
|
| 470 |
+
|
| 471 |
+
for param in Embedding_Manager.trainable_projection_parameters():
|
| 472 |
+
param.requires_grad = True
|
| 473 |
+
Embedding_D.requires_grad = True
|
| 474 |
+
|
| 475 |
+
text_encoder.requires_grad_(False)
|
| 476 |
+
|
| 477 |
+
|
| 478 |
+
# Check that all trainable models are in full precision
|
| 479 |
+
low_precision_error_string = (
|
| 480 |
+
"Please make sure to always have all model weights in full float32 precision when starting training - even if"
|
| 481 |
+
" doing mixed precision training. copy of the weights should still be float32."
|
| 482 |
+
)
|
| 483 |
+
|
| 484 |
+
if accelerator.unwrap_model(text_encoder).dtype != torch.float32:
|
| 485 |
+
raise ValueError(
|
| 486 |
+
f"Text encoder loaded as datatype {accelerator.unwrap_model(text_encoder).dtype}."
|
| 487 |
+
f" {low_precision_error_string}"
|
| 488 |
+
)
|
| 489 |
+
|
| 490 |
+
# Enable TF32 for faster training on Ampere GPUs,
|
| 491 |
+
# cf https://pytorch.org/docs/stable/notes/cuda.html#tensorfloat-32-tf32-on-ampere-devices
|
| 492 |
+
if args.allow_tf32:
|
| 493 |
+
torch.backends.cuda.matmul.allow_tf32 = True
|
| 494 |
+
|
| 495 |
+
if args.scale_lr:
|
| 496 |
+
args.learning_rate = (
|
| 497 |
+
args.learning_rate * args.gradient_accumulation_steps * args.train_batch_size * accelerator.num_processes
|
| 498 |
+
)
|
| 499 |
+
|
| 500 |
+
# Use 8-bit Adam for lower memory usage or to fine-tune the model in 16GB GPUs
|
| 501 |
+
if args.use_8bit_adam:
|
| 502 |
+
try:
|
| 503 |
+
import bitsandbytes as bnb
|
| 504 |
+
except ImportError:
|
| 505 |
+
raise ImportError(
|
| 506 |
+
"To use 8-bit Adam, please install the bitsandbytes library: `pip install bitsandbytes`."
|
| 507 |
+
)
|
| 508 |
+
|
| 509 |
+
optimizer_class = bnb.optim.AdamW8bit
|
| 510 |
+
else:
|
| 511 |
+
optimizer_class = torch.optim.AdamW
|
| 512 |
+
|
| 513 |
+
|
| 514 |
+
projection_params_to_optimize = Embedding_Manager.trainable_projection_parameters()
|
| 515 |
+
optimizer_projection = optimizer_class(
|
| 516 |
+
projection_params_to_optimize,
|
| 517 |
+
lr=args.learning_rate,
|
| 518 |
+
betas=(args.adam_beta1, args.adam_beta2),
|
| 519 |
+
weight_decay=args.adam_weight_decay,
|
| 520 |
+
eps=args.adam_epsilon,
|
| 521 |
+
)
|
| 522 |
+
|
| 523 |
+
discriminator_params_to_optimize = list(Embedding_D.parameters())
|
| 524 |
+
optimizer_discriminator = optimizer_class(
|
| 525 |
+
discriminator_params_to_optimize,
|
| 526 |
+
lr=args.learning_rate,
|
| 527 |
+
betas=(args.adam_beta1, args.adam_beta2),
|
| 528 |
+
weight_decay=args.adam_weight_decay,
|
| 529 |
+
eps=args.adam_epsilon,
|
| 530 |
+
)
|
| 531 |
+
|
| 532 |
+
|
| 533 |
+
train_dataset = FaceIdDataset(
|
| 534 |
+
experiment_name = experiment_name
|
| 535 |
+
)
|
| 536 |
+
|
| 537 |
+
print("dataset_length", train_dataset._length)
|
| 538 |
+
train_dataloader = torch.utils.data.DataLoader(
|
| 539 |
+
train_dataset,
|
| 540 |
+
batch_size=args.train_batch_size,
|
| 541 |
+
shuffle=True,
|
| 542 |
+
num_workers=accelerator.num_processes,
|
| 543 |
+
)
|
| 544 |
+
|
| 545 |
+
# Scheduler and math around the number of training steps.
|
| 546 |
+
overrode_max_train_steps = False
|
| 547 |
+
num_update_steps_per_epoch = math.ceil(len(train_dataloader) / args.gradient_accumulation_steps)
|
| 548 |
+
if args.max_train_steps is None:
|
| 549 |
+
args.max_train_steps = args.num_train_epochs * num_update_steps_per_epoch
|
| 550 |
+
overrode_max_train_steps = True
|
| 551 |
+
|
| 552 |
+
lr_scheduler_proj = get_scheduler(
|
| 553 |
+
args.lr_scheduler,
|
| 554 |
+
optimizer=optimizer_projection,
|
| 555 |
+
num_warmup_steps=args.lr_warmup_steps * args.gradient_accumulation_steps,
|
| 556 |
+
num_training_steps=args.max_train_steps * args.gradient_accumulation_steps,
|
| 557 |
+
num_cycles=args.lr_num_cycles,
|
| 558 |
+
power=args.lr_power,
|
| 559 |
+
)
|
| 560 |
+
|
| 561 |
+
lr_scheduler_disc = get_scheduler(
|
| 562 |
+
args.lr_scheduler,
|
| 563 |
+
optimizer=optimizer_discriminator,
|
| 564 |
+
num_warmup_steps=args.lr_warmup_steps * args.gradient_accumulation_steps,
|
| 565 |
+
num_training_steps=args.max_train_steps * args.gradient_accumulation_steps,
|
| 566 |
+
num_cycles=args.lr_num_cycles,
|
| 567 |
+
power=args.lr_power,
|
| 568 |
+
)
|
| 569 |
+
|
| 570 |
+
Embedding_Manager, optimizer_projection, optimizer_discriminator, train_dataloader, lr_scheduler_proj, lr_scheduler_disc = accelerator.prepare(
|
| 571 |
+
Embedding_Manager, optimizer_projection, optimizer_discriminator, train_dataloader, lr_scheduler_proj, lr_scheduler_disc
|
| 572 |
+
)
|
| 573 |
+
|
| 574 |
+
|
| 575 |
+
# For mixed precision training we cast the text_encoder and vae weights to half-precision
|
| 576 |
+
# as these models are only used for inference, keeping weights in full precision is not required.
|
| 577 |
+
weight_dtype = torch.float32
|
| 578 |
+
if accelerator.mixed_precision == "fp16":
|
| 579 |
+
weight_dtype = torch.float16
|
| 580 |
+
elif accelerator.mixed_precision == "bf16":
|
| 581 |
+
weight_dtype = torch.bfloat16
|
| 582 |
+
|
| 583 |
+
# Move vae and unet to device and cast to weight_dtype
|
| 584 |
+
text_encoder.to(accelerator.device, dtype=weight_dtype)
|
| 585 |
+
Embedding_Manager.to(accelerator.device, dtype=weight_dtype)
|
| 586 |
+
Embedding_D.to(accelerator.device, dtype=weight_dtype)
|
| 587 |
+
|
| 588 |
+
# We need to recalculate our total training steps as the size of the training dataloader may have changed.
|
| 589 |
+
num_update_steps_per_epoch = math.ceil(len(train_dataloader) / args.gradient_accumulation_steps)
|
| 590 |
+
if overrode_max_train_steps:
|
| 591 |
+
args.max_train_steps = args.num_train_epochs * num_update_steps_per_epoch
|
| 592 |
+
|
| 593 |
+
# Afterwards we recalculate our number of training epochs
|
| 594 |
+
args.num_train_epochs = math.ceil(args.max_train_steps / num_update_steps_per_epoch)
|
| 595 |
+
|
| 596 |
+
# We need to initialize the trackers we use, and also store our configuration.
|
| 597 |
+
# The trackers initializes automatically on the main process.
|
| 598 |
+
if accelerator.is_main_process:
|
| 599 |
+
accelerator.init_trackers("identity_space", config=vars(args))
|
| 600 |
+
|
| 601 |
+
|
| 602 |
+
# Train!
|
| 603 |
+
total_batch_size = args.train_batch_size * accelerator.num_processes * args.gradient_accumulation_steps
|
| 604 |
+
|
| 605 |
+
logger.info("***** Running training *****")
|
| 606 |
+
logger.info(f" Num examples = {len(train_dataset)}")
|
| 607 |
+
logger.info(f" Num batches each epoch = {len(train_dataloader)}")
|
| 608 |
+
logger.info(f" Num Epochs = {args.num_train_epochs}")
|
| 609 |
+
logger.info(f" Instantaneous batch size per device = {args.train_batch_size}")
|
| 610 |
+
logger.info(f" Total train batch size (w. parallel, distributed & accumulation) = {total_batch_size}")
|
| 611 |
+
logger.info(f" Gradient Accumulation steps = {args.gradient_accumulation_steps}")
|
| 612 |
+
logger.info(f" Total optimization steps = {args.max_train_steps}")
|
| 613 |
+
global_step = 0
|
| 614 |
+
first_epoch = 0
|
| 615 |
+
|
| 616 |
+
# Potentially load in the weights and states from a previous save
|
| 617 |
+
if args.resume_from_checkpoint:
|
| 618 |
+
if args.resume_from_checkpoint != "latest":
|
| 619 |
+
path = os.path.basename(args.resume_from_checkpoint)
|
| 620 |
+
else:
|
| 621 |
+
# Get the mos recent checkpoint
|
| 622 |
+
dirs = os.listdir(args.output_dir)
|
| 623 |
+
dirs = [d for d in dirs if d.startswith("checkpoint")]
|
| 624 |
+
dirs = sorted(dirs, key=lambda x: int(x.split("-")[1]))
|
| 625 |
+
path = dirs[-1] if len(dirs) > 0 else None
|
| 626 |
+
|
| 627 |
+
if path is None:
|
| 628 |
+
accelerator.print(
|
| 629 |
+
f"Checkpoint '{args.resume_from_checkpoint}' does not exist. Starting a new training run."
|
| 630 |
+
)
|
| 631 |
+
args.resume_from_checkpoint = None
|
| 632 |
+
else:
|
| 633 |
+
accelerator.print(f"Resuming from checkpoint {path}")
|
| 634 |
+
accelerator.load_state(os.path.join(args.output_dir, path))
|
| 635 |
+
global_step = int(path.split("-")[1])
|
| 636 |
+
|
| 637 |
+
resume_global_step = global_step * args.gradient_accumulation_steps
|
| 638 |
+
first_epoch = global_step // num_update_steps_per_epoch
|
| 639 |
+
resume_step = resume_global_step % (num_update_steps_per_epoch * args.gradient_accumulation_steps)
|
| 640 |
+
|
| 641 |
+
# Only show the progress bar once on each machine.
|
| 642 |
+
progress_bar = tqdm(range(global_step, args.max_train_steps), disable=not accelerator.is_local_main_process)
|
| 643 |
+
progress_bar.set_description("Steps")
|
| 644 |
+
|
| 645 |
+
num_iter = 0
|
| 646 |
+
# trained_images_num = 0
|
| 647 |
+
for epoch in range(first_epoch, args.num_train_epochs):
|
| 648 |
+
print("=====================================")
|
| 649 |
+
print("epoch:", epoch)
|
| 650 |
+
print("=====================================")
|
| 651 |
+
Embedding_Manager.train()
|
| 652 |
+
for step, batch in enumerate(train_dataloader):
|
| 653 |
+
|
| 654 |
+
# Skip steps until we reach the resumed step
|
| 655 |
+
if args.resume_from_checkpoint and epoch == first_epoch and step < resume_step:
|
| 656 |
+
if step % args.gradient_accumulation_steps == 0:
|
| 657 |
+
progress_bar.update(1)
|
| 658 |
+
continue
|
| 659 |
+
|
| 660 |
+
random_embeddings = torch.randn(1, 1, args.input_dim).to(accelerator.device)
|
| 661 |
+
random_embeddings = random_embeddings.repeat(args.train_batch_size, 1, 1)
|
| 662 |
+
|
| 663 |
+
encoder_hidden_states, other_return_dict, positions_list = encode_prompt(batch["caption"],
|
| 664 |
+
batch["name"],
|
| 665 |
+
text_encoder, tokenizer,
|
| 666 |
+
Embedding_Manager,
|
| 667 |
+
is_train=True,
|
| 668 |
+
random_embeddings = random_embeddings,
|
| 669 |
+
timesteps = 0)
|
| 670 |
+
|
| 671 |
+
name_embeddings = other_return_dict["name_embeddings"]
|
| 672 |
+
adained_total_embedding = other_return_dict["adained_total_embedding"]
|
| 673 |
+
fake_emb = adained_total_embedding
|
| 674 |
+
|
| 675 |
+
criterionGAN = GANLoss().to(accelerator.device)
|
| 676 |
+
|
| 677 |
+
set_requires_grad(Embedding_D, True)
|
| 678 |
+
optimizer_discriminator.zero_grad(set_to_none=args.set_grads_to_none)
|
| 679 |
+
# fake
|
| 680 |
+
pred_fake = Embedding_D(fake_emb.detach())
|
| 681 |
+
loss_D_fake = criterionGAN(pred_fake[0], False)
|
| 682 |
+
|
| 683 |
+
# Real
|
| 684 |
+
random_noise = torch.rand_like(name_embeddings) * 0.005
|
| 685 |
+
real_name_embeddings = random_noise + name_embeddings
|
| 686 |
+
pred_real = Embedding_D(real_name_embeddings)
|
| 687 |
+
loss_D_real = criterionGAN(pred_real[0], True)
|
| 688 |
+
|
| 689 |
+
loss_D = (loss_D_fake + loss_D_real) * 0.5
|
| 690 |
+
accelerator.backward(loss_D)
|
| 691 |
+
if accelerator.sync_gradients:
|
| 692 |
+
accelerator.clip_grad_norm_(discriminator_params_to_optimize, args.max_grad_norm)
|
| 693 |
+
optimizer_discriminator.step()
|
| 694 |
+
|
| 695 |
+
set_requires_grad(Embedding_D, False)
|
| 696 |
+
optimizer_projection.zero_grad(set_to_none=args.set_grads_to_none)
|
| 697 |
+
pred_fake = Embedding_D(fake_emb)
|
| 698 |
+
|
| 699 |
+
loss_G_GAN = criterionGAN(pred_fake[0], True)
|
| 700 |
+
|
| 701 |
+
num_embeddings = encoder_hidden_states.size(0)
|
| 702 |
+
loss_consistency = 0.0
|
| 703 |
+
for i in range(num_embeddings):
|
| 704 |
+
position1 = positions_list[i]
|
| 705 |
+
name_embedding1 = torch.cat([encoder_hidden_states[i][position1], encoder_hidden_states[i][position1 + 1]], dim=0)
|
| 706 |
+
for j in range(i + 1, num_embeddings):
|
| 707 |
+
position2 = positions_list[j]
|
| 708 |
+
name_embedding2 = torch.cat([encoder_hidden_states[j][position2], encoder_hidden_states[j][position2 + 1]], dim=0)
|
| 709 |
+
loss_consistency += F.mse_loss(name_embedding1, name_embedding2)
|
| 710 |
+
|
| 711 |
+
loss_consistency /= (num_embeddings * (num_embeddings - 1)) / 2
|
| 712 |
+
|
| 713 |
+
loss = loss_G_GAN * args.l_gan_lambda + loss_consistency * args.l_consis_lambda
|
| 714 |
+
|
| 715 |
+
accelerator.backward(loss)
|
| 716 |
+
|
| 717 |
+
if accelerator.sync_gradients:
|
| 718 |
+
accelerator.clip_grad_norm_(projection_params_to_optimize, args.max_grad_norm)
|
| 719 |
+
optimizer_projection.step()
|
| 720 |
+
lr_scheduler_proj.step()
|
| 721 |
+
lr_scheduler_disc.step()
|
| 722 |
+
|
| 723 |
+
num_iter += 1
|
| 724 |
+
|
| 725 |
+
# Checks if the accelerator has performed an optimization step behind the scenes
|
| 726 |
+
if accelerator.sync_gradients:
|
| 727 |
+
progress_bar.update(1)
|
| 728 |
+
if global_step % args.checkpointing_steps == 0:
|
| 729 |
+
if accelerator.is_main_process:
|
| 730 |
+
save_path = os.path.join(args.output_dir, f"embeddings_manager-{global_step}.pt")
|
| 731 |
+
# accelerator.save_state(save_path)
|
| 732 |
+
try:
|
| 733 |
+
Embedding_Manager.save(save_path)
|
| 734 |
+
except:
|
| 735 |
+
Embedding_Manager.module.save(save_path)
|
| 736 |
+
|
| 737 |
+
save_path_d = os.path.join(args.output_dir, f"embedding_D-{global_step}.pt")
|
| 738 |
+
Embedding_D.save(save_path_d)
|
| 739 |
+
|
| 740 |
+
logger.info(f"Saved state to {save_path}")
|
| 741 |
+
|
| 742 |
+
global_step += 1
|
| 743 |
+
|
| 744 |
+
adained_total_embeddings_max_min = (round(adained_total_embedding.max().detach().item(), 4),
|
| 745 |
+
round(adained_total_embedding.min().detach().item(), 4))
|
| 746 |
+
|
| 747 |
+
logs = {"m1": adained_total_embeddings_max_min,
|
| 748 |
+
"l_G_GAN": loss_G_GAN.detach().item(),
|
| 749 |
+
"l_consistency": loss_consistency.detach().item(),
|
| 750 |
+
"l_D_real": loss_D_real.detach().item(),
|
| 751 |
+
"l_D_fake": loss_D_fake.detach().item(),
|
| 752 |
+
"loss": loss.detach().item(),
|
| 753 |
+
}
|
| 754 |
+
progress_bar.set_postfix(**logs)
|
| 755 |
+
accelerator.log(logs, step=global_step)
|
| 756 |
+
|
| 757 |
+
if global_step >= args.max_train_steps:
|
| 758 |
+
break
|
| 759 |
+
|
| 760 |
+
# Create the pipeline using the trained modules and save it.
|
| 761 |
+
accelerator.wait_for_everyone()
|
| 762 |
+
accelerator.end_training()
|
| 763 |
+
|
| 764 |
+
|
| 765 |
+
if __name__ == "__main__":
|
| 766 |
+
args = parse_args()
|
| 767 |
+
main(args)
|
training_weight/man_GAN/embeddings_manager-7000.pt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:23ad2b0e562fac58f51b6deb1fb129b1317b76aa98bdf5b70e870c7a5ed38862
|
| 3 |
+
size 17356032
|
training_weight/normal_GAN/embeddings_manager-10000.pt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:2c0051eccaa1435d0ec678dc8d8e7130d09849b48aa7b67f51aee9aa4bad71cb
|
| 3 |
+
size 17356044
|
training_weight/woman_GAN/embeddings_manager-6000.pt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:23fc0dc612520375801ec596354479c194baee2f090a50f7ae7cc9e41479eb3f
|
| 3 |
+
size 17356032
|
utils.py
ADDED
|
@@ -0,0 +1,237 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from PIL import Image
|
| 2 |
+
|
| 3 |
+
import torch
|
| 4 |
+
import torch.nn.functional as F
|
| 5 |
+
|
| 6 |
+
from transformers.modeling_outputs import BaseModelOutputWithPooling
|
| 7 |
+
from transformers.models.clip.modeling_clip import _make_causal_mask, _expand_mask
|
| 8 |
+
from torch import autograd
|
| 9 |
+
import accelerate
|
| 10 |
+
import torch.nn as nn
|
| 11 |
+
|
| 12 |
+
from PIL import Image
|
| 13 |
+
import numpy as np
|
| 14 |
+
|
| 15 |
+
def set_requires_grad(nets, requires_grad=False):
|
| 16 |
+
"""Set requies_grad=Fasle for all the networks to avoid unnecessary computations
|
| 17 |
+
Parameters:
|
| 18 |
+
nets (network list) -- a list of networks
|
| 19 |
+
requires_grad (bool) -- whether the networks require gradients or not
|
| 20 |
+
"""
|
| 21 |
+
if not isinstance(nets, list):
|
| 22 |
+
nets = [nets]
|
| 23 |
+
for net in nets:
|
| 24 |
+
if net is not None:
|
| 25 |
+
for param in net.parameters():
|
| 26 |
+
param.requires_grad = requires_grad
|
| 27 |
+
|
| 28 |
+
def discriminator_r1_loss_accelerator(accelerator, real_pred, real_w):
|
| 29 |
+
grad_real, = accelerate.gradient(
|
| 30 |
+
outputs=real_pred.sum(), inputs=real_w, create_graph=True #, only_inputs=True
|
| 31 |
+
)
|
| 32 |
+
grad_penalty = grad_real.pow(2).reshape(grad_real.shape[0], -1).sum(1).mean()
|
| 33 |
+
|
| 34 |
+
return grad_penalty
|
| 35 |
+
|
| 36 |
+
class GANLoss(nn.Module):
|
| 37 |
+
def __init__(self, use_lsgan=True, target_real_label=1.0, target_fake_label=0.0):
|
| 38 |
+
super(GANLoss, self).__init__()
|
| 39 |
+
self.register_buffer('real_label', torch.tensor(target_real_label))
|
| 40 |
+
self.register_buffer('fake_label', torch.tensor(target_fake_label))
|
| 41 |
+
if use_lsgan:
|
| 42 |
+
self.loss = nn.MSELoss()
|
| 43 |
+
else:
|
| 44 |
+
self.loss = nn.BCEWithLogitsLoss()
|
| 45 |
+
|
| 46 |
+
def get_target_tensor(self, input, target_is_real):
|
| 47 |
+
if target_is_real:
|
| 48 |
+
target_tensor = self.real_label
|
| 49 |
+
else:
|
| 50 |
+
target_tensor = self.fake_label
|
| 51 |
+
return target_tensor.expand_as(input)
|
| 52 |
+
|
| 53 |
+
def __call__(self, input, target_is_real):
|
| 54 |
+
target_tensor = self.get_target_tensor(input, target_is_real)
|
| 55 |
+
return self.loss(input, target_tensor)
|
| 56 |
+
|
| 57 |
+
|
| 58 |
+
|
| 59 |
+
def discriminator_r1_loss(real_pred, real_w):
|
| 60 |
+
grad_real, = autograd.grad(
|
| 61 |
+
outputs=real_pred.sum(), inputs=real_w, create_graph=True #, only_inputs=True
|
| 62 |
+
)
|
| 63 |
+
grad_penalty = grad_real.pow(2).reshape(grad_real.shape[0], -1).sum(1).mean()
|
| 64 |
+
|
| 65 |
+
return grad_penalty
|
| 66 |
+
|
| 67 |
+
def add_noise_return_paras(
|
| 68 |
+
self,
|
| 69 |
+
original_samples: torch.FloatTensor,
|
| 70 |
+
noise: torch.FloatTensor,
|
| 71 |
+
timesteps: torch.IntTensor,
|
| 72 |
+
) -> torch.FloatTensor:
|
| 73 |
+
# Make sure alphas_cumprod and timestep have same device and dtype as original_samples
|
| 74 |
+
alphas_cumprod = self.alphas_cumprod.to(device=original_samples.device, dtype=original_samples.dtype)
|
| 75 |
+
timesteps = timesteps.to(original_samples.device)
|
| 76 |
+
|
| 77 |
+
sqrt_alpha_prod = alphas_cumprod[timesteps] ** 0.5
|
| 78 |
+
sqrt_alpha_prod = sqrt_alpha_prod.flatten()
|
| 79 |
+
while len(sqrt_alpha_prod.shape) < len(original_samples.shape):
|
| 80 |
+
sqrt_alpha_prod = sqrt_alpha_prod.unsqueeze(-1)
|
| 81 |
+
|
| 82 |
+
sqrt_one_minus_alpha_prod = (1 - alphas_cumprod[timesteps]) ** 0.5
|
| 83 |
+
sqrt_one_minus_alpha_prod = sqrt_one_minus_alpha_prod.flatten()
|
| 84 |
+
while len(sqrt_one_minus_alpha_prod.shape) < len(original_samples.shape):
|
| 85 |
+
sqrt_one_minus_alpha_prod = sqrt_one_minus_alpha_prod.unsqueeze(-1)
|
| 86 |
+
|
| 87 |
+
noisy_samples = sqrt_alpha_prod * original_samples + sqrt_one_minus_alpha_prod * noise
|
| 88 |
+
return noisy_samples, sqrt_alpha_prod, sqrt_one_minus_alpha_prod
|
| 89 |
+
|
| 90 |
+
|
| 91 |
+
def text_encoder_forward(
|
| 92 |
+
text_encoder = None,
|
| 93 |
+
input_ids = None,
|
| 94 |
+
name_batch = None,
|
| 95 |
+
attention_mask = None,
|
| 96 |
+
position_ids = None,
|
| 97 |
+
output_attentions = None,
|
| 98 |
+
output_hidden_states = None,
|
| 99 |
+
return_dict = None,
|
| 100 |
+
embedding_manager = None,
|
| 101 |
+
only_embedding=False,
|
| 102 |
+
random_embeddings = None,
|
| 103 |
+
timesteps = None,
|
| 104 |
+
):
|
| 105 |
+
output_attentions = output_attentions if output_attentions is not None else text_encoder.config.output_attentions
|
| 106 |
+
output_hidden_states = (
|
| 107 |
+
output_hidden_states if output_hidden_states is not None else text_encoder.config.output_hidden_states
|
| 108 |
+
)
|
| 109 |
+
return_dict = return_dict if return_dict is not None else text_encoder.config.use_return_dict
|
| 110 |
+
|
| 111 |
+
if input_ids is None:
|
| 112 |
+
raise ValueError("You have to specify either input_ids")
|
| 113 |
+
|
| 114 |
+
input_shape = input_ids.size()
|
| 115 |
+
input_ids = input_ids.view(-1, input_shape[-1])
|
| 116 |
+
|
| 117 |
+
hidden_states, other_return_dict = text_encoder.text_model.embeddings(input_ids=input_ids,
|
| 118 |
+
position_ids=position_ids,
|
| 119 |
+
name_batch = name_batch,
|
| 120 |
+
embedding_manager=embedding_manager,
|
| 121 |
+
only_embedding=only_embedding,
|
| 122 |
+
random_embeddings = random_embeddings,
|
| 123 |
+
timesteps = timesteps,
|
| 124 |
+
)
|
| 125 |
+
if only_embedding:
|
| 126 |
+
return hidden_states
|
| 127 |
+
|
| 128 |
+
|
| 129 |
+
causal_attention_mask = _make_causal_mask(input_shape, hidden_states.dtype, device=hidden_states.device)
|
| 130 |
+
if attention_mask is not None:
|
| 131 |
+
attention_mask = _expand_mask(attention_mask, hidden_states.dtype)
|
| 132 |
+
|
| 133 |
+
encoder_outputs = text_encoder.text_model.encoder(
|
| 134 |
+
inputs_embeds=hidden_states,
|
| 135 |
+
attention_mask=attention_mask,
|
| 136 |
+
causal_attention_mask=causal_attention_mask,
|
| 137 |
+
output_attentions=output_attentions,
|
| 138 |
+
output_hidden_states=output_hidden_states,
|
| 139 |
+
return_dict=return_dict,
|
| 140 |
+
)
|
| 141 |
+
|
| 142 |
+
last_hidden_state = encoder_outputs[0]
|
| 143 |
+
last_hidden_state = text_encoder.text_model.final_layer_norm(last_hidden_state)
|
| 144 |
+
|
| 145 |
+
if text_encoder.text_model.eos_token_id == 2:
|
| 146 |
+
pooled_output = last_hidden_state[
|
| 147 |
+
torch.arange(last_hidden_state.shape[0], device=last_hidden_state.device),
|
| 148 |
+
input_ids.to(dtype=torch.int, device=last_hidden_state.device).argmax(dim=-1),
|
| 149 |
+
]
|
| 150 |
+
else:
|
| 151 |
+
pooled_output = last_hidden_state[
|
| 152 |
+
torch.arange(last_hidden_state.shape[0], device=last_hidden_state.device),
|
| 153 |
+
(input_ids.to(dtype=torch.int, device=last_hidden_state.device) == text_encoder.text_model.eos_token_id)
|
| 154 |
+
.int()
|
| 155 |
+
.argmax(dim=-1),
|
| 156 |
+
]
|
| 157 |
+
|
| 158 |
+
if not return_dict:
|
| 159 |
+
return (last_hidden_state, pooled_output) + encoder_outputs[1:]
|
| 160 |
+
|
| 161 |
+
return BaseModelOutputWithPooling(
|
| 162 |
+
last_hidden_state=last_hidden_state,
|
| 163 |
+
pooler_output=pooled_output,
|
| 164 |
+
hidden_states=encoder_outputs.hidden_states,
|
| 165 |
+
attentions=encoder_outputs.attentions,
|
| 166 |
+
)[0], other_return_dict
|
| 167 |
+
|
| 168 |
+
|
| 169 |
+
def downsampling(img: torch.tensor, w: int, h: int) -> torch.tensor:
|
| 170 |
+
return F.interpolate(
|
| 171 |
+
img.unsqueeze(0).unsqueeze(1),
|
| 172 |
+
size=(w, h),
|
| 173 |
+
mode="bilinear",
|
| 174 |
+
align_corners=True,
|
| 175 |
+
).squeeze()
|
| 176 |
+
|
| 177 |
+
|
| 178 |
+
def image_grid(images, rows=2, cols=2):
|
| 179 |
+
w, h = images[0].size
|
| 180 |
+
grid = Image.new('RGB', size=(cols * w, rows * h))
|
| 181 |
+
|
| 182 |
+
for i, img in enumerate(images):
|
| 183 |
+
grid.paste(img, box=(i % cols * w, i // cols * h))
|
| 184 |
+
return grid
|
| 185 |
+
|
| 186 |
+
|
| 187 |
+
def latents_to_images(vae, latents, scale_factor=0.18215):
|
| 188 |
+
"""
|
| 189 |
+
Decode latents to PIL images.
|
| 190 |
+
"""
|
| 191 |
+
scaled_latents = 1.0 / scale_factor * latents.clone()
|
| 192 |
+
images = vae.decode(scaled_latents).sample
|
| 193 |
+
images = (images / 2 + 0.5).clamp(0, 1)
|
| 194 |
+
images = images.detach().cpu().permute(0, 2, 3, 1).numpy()
|
| 195 |
+
|
| 196 |
+
if images.ndim == 3:
|
| 197 |
+
images = images[None, ...]
|
| 198 |
+
images = (images * 255).round().astype("uint8")
|
| 199 |
+
pil_images = [Image.fromarray(image) for image in images]
|
| 200 |
+
|
| 201 |
+
return pil_images
|
| 202 |
+
|
| 203 |
+
|
| 204 |
+
def merge_and_save_images(output_images):
|
| 205 |
+
image_size = output_images[0].size
|
| 206 |
+
|
| 207 |
+
merged_width = len(output_images) * image_size[0]
|
| 208 |
+
merged_height = image_size[1]
|
| 209 |
+
|
| 210 |
+
merged_image = Image.new('RGB', (merged_width, merged_height), (255, 255, 255))
|
| 211 |
+
|
| 212 |
+
for i, image in enumerate(output_images):
|
| 213 |
+
merged_image.paste(image, (i * image_size[0], 0))
|
| 214 |
+
|
| 215 |
+
return merged_image
|
| 216 |
+
|
| 217 |
+
class GANLoss(nn.Module):
|
| 218 |
+
def __init__(self, use_lsgan=True, target_real_label=1.0, target_fake_label=0.0):
|
| 219 |
+
super(GANLoss, self).__init__()
|
| 220 |
+
self.register_buffer('real_label', torch.tensor(target_real_label))
|
| 221 |
+
self.register_buffer('fake_label', torch.tensor(target_fake_label))
|
| 222 |
+
|
| 223 |
+
if use_lsgan:
|
| 224 |
+
self.loss = nn.MSELoss()
|
| 225 |
+
else:
|
| 226 |
+
self.loss = nn.BCELoss()
|
| 227 |
+
|
| 228 |
+
def get_target_tensor(self, input, target_is_real):
|
| 229 |
+
if target_is_real:
|
| 230 |
+
target_tensor = self.real_label
|
| 231 |
+
else:
|
| 232 |
+
target_tensor = self.fake_label
|
| 233 |
+
return target_tensor.expand_as(input)
|
| 234 |
+
|
| 235 |
+
def __call__(self, input, target_is_real):
|
| 236 |
+
target_tensor = self.get_target_tensor(input, target_is_real)
|
| 237 |
+
return self.loss(input, target_tensor)
|