.gitattributes CHANGED
@@ -1,32 +1,35 @@
1
- nsfweffnetv2-b02-3epochs.h5 filter=lfs diff=lfs merge=lfs -text
2
- fifth.gemb_.pt filter=lfs diff=lfs merge=lfs -text
3
- ninth.im_.pt filter=lfs diff=lfs merge=lfs -text
4
- tenth.gemb_.pt filter=lfs diff=lfs merge=lfs -text
5
- third.gemb_.pt filter=lfs diff=lfs merge=lfs -text
6
- eigth.gemb_.pt filter=lfs diff=lfs merge=lfs -text
7
- first.gemb_.pt filter=lfs diff=lfs merge=lfs -text
8
- fourth.gemb_.pt filter=lfs diff=lfs merge=lfs -text
9
- ninth.gemb_.pt filter=lfs diff=lfs merge=lfs -text
10
- sixth.gemb_.pt filter=lfs diff=lfs merge=lfs -text
11
- tenth.im_.pt filter=lfs diff=lfs merge=lfs -text
12
- eigth.im_.pt filter=lfs diff=lfs merge=lfs -text
13
- seventh.gemb_.pt filter=lfs diff=lfs merge=lfs -text
14
- sixth.im_.pt filter=lfs diff=lfs merge=lfs -text
15
- third.im_.pt filter=lfs diff=lfs merge=lfs -text
16
- fifth.im_.pt filter=lfs diff=lfs merge=lfs -text
17
- first.im_.pt filter=lfs diff=lfs merge=lfs -text
18
- fourth.im_.pt filter=lfs diff=lfs merge=lfs -text
19
- second.gemb_.pt filter=lfs diff=lfs merge=lfs -text
20
- second.im_.pt filter=lfs diff=lfs merge=lfs -text
21
- seventh.im_.pt filter=lfs diff=lfs merge=lfs -text
22
- image';l';.png filter=lfs diff=lfs merge=lfs -text
23
- second.png filter=lfs diff=lfs merge=lfs -text
24
- sixth.png filter=lfs diff=lfs merge=lfs -text
25
- third.png filter=lfs diff=lfs merge=lfs -text
26
- fifth.png filter=lfs diff=lfs merge=lfs -text
27
- first.png filter=lfs diff=lfs merge=lfs -text
28
- fourth.png filter=lfs diff=lfs merge=lfs -text
29
- *.mp4 filter=lfs diff=lfs merge=lfs -text
30
- *.png filter=lfs diff=lfs merge=lfs -text
31
  *.safetensors filter=lfs diff=lfs merge=lfs -text
32
- last_epoch_ckpt/diffusion_pytorch_model.safetensors
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
25
  *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
.gitignore DELETED
@@ -1,2 +0,0 @@
1
- __pycache__*
2
- .gradio/
 
 
 
LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 rynmurdock
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
README.md CHANGED
@@ -1,26 +1,12 @@
1
  ---
2
- license: mit
3
- title: The Other Tiger
 
 
4
  sdk: gradio
5
- sdk_version: 5.31.0
6
- emoji: 👁
7
- colorFrom: blue
8
- colorTo: purple
9
- pinned: true
10
  ---
11
 
12
- # The Other Tiger
13
-
14
- ## tl;dr
15
- Train on embeddings of media preferred by a specific user -> produce embeddings of media they may enjoy.
16
-
17
- In our case here, we take the ECLIPSE `text embedding -> image embedding` prior (https://arxiv.org/abs/2312.04655) and finetune it to become a `preferred image embeddings -> heldout image embedding` prior.
18
-
19
- ### Related work:
20
-
21
- Patron et al. models preference using a diffusion prior and condition on user ids with ratings: https://arxiv.org/abs/2502.18477
22
-
23
- Wang et al. models preference using a generator conditioned on averaged CLIP embeddings of users: https://arxiv.org/abs/2304.03516
24
-
25
- My previous work based on Collaborative Filtering with CLIP embeddings: https://github.com/rynmurdock/generative_recommender
26
-
 
1
  ---
2
+ title: Generative Recsys
3
+ emoji: 🐨
4
+ colorFrom: purple
5
+ colorTo: blue
6
  sdk: gradio
7
+ sdk_version: 4.25.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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
__pycache__/safety_checker_improved.cpython-310.pyc ADDED
Binary file (1.39 kB). View file
 
app.py CHANGED
@@ -1,275 +1,310 @@
 
1
 
2
  import gradio as gr
 
 
 
 
 
 
 
 
 
 
 
3
  import random
4
  import time
5
- import torch
6
- import glob
7
 
8
- import config
9
- from model import get_model_and_tokenizer
10
 
11
- torch.set_float32_matmul_precision('high')
 
 
12
 
13
- model, model.prior_pipe.image_encoder = get_model_and_tokenizer(config.model_path,
14
- 'cuda', torch.bfloat16)
 
15
 
16
- # TODO unify/merge origin and this
17
- # TODO save & restart from (if it exists) dataframe parquet
18
 
19
- device = "cuda"
 
20
 
21
- k = config.k
22
 
23
- import spaces
24
- import matplotlib.pyplot as plt
25
 
26
- import os
27
- import gradio as gr
28
- import pandas as pd
29
- from apscheduler.schedulers.background import BackgroundScheduler
 
30
 
31
- import random
32
- import time
33
- from PIL import Image
34
- # from safety_checker_improved import maybe_nsfw
 
 
35
 
 
 
36
 
37
- torch.set_grad_enabled(False)
38
- torch.backends.cuda.matmul.allow_tf32 = True
39
- torch.backends.cudnn.allow_tf32 = True
40
 
41
- prevs_df = pd.DataFrame(columns=['paths', 'embeddings', 'ips', 'user:rating', 'latest_user_to_rate', 'from_user_id', 'text', 'gemb'])
 
 
 
 
42
 
43
- import spaces
44
- start_time = time.time()
45
 
46
- ####################### Setup Model
47
- from diffusers import EulerDiscreteScheduler
48
- from PIL import Image
49
- import uuid
 
 
 
50
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51
 
52
- @spaces.GPU()
53
- def generate_gpu(in_im_embs, prompt='the scene'):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  with torch.no_grad():
55
- in_im_embs = in_im_embs.to('cuda')
56
-
57
- negative_image_embeds = in_im_embs[0]# if random.random() < .3 else model.prior_pipe.get_zero_embed()
58
- positive_image_embeds = in_im_embs[1]
59
-
60
- images = model.kandinsky_pipe(
61
- num_inference_steps=50,
62
- image_embeds=positive_image_embeds,
63
- negative_image_embeds=negative_image_embeds,
64
- guidance_scale=8,
65
- ).images[0]
66
- cond = (
67
- model.prior_pipe.image_processor(images, return_tensors="pt")
68
- .pixel_values[0]
69
- .unsqueeze(0)
70
- .to(dtype=model.prior_pipe.image_encoder.dtype, device=device)
71
- )
72
- im_emb = model.prior_pipe.image_encoder(cond)["image_embeds"]
73
- return images, im_emb
74
-
75
-
76
- def generate(in_im_embs, ):
77
- output, im_emb = generate_gpu(in_im_embs)
78
- nsfw = False#maybe_nsfw(output.images[0])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
 
80
- name = str(uuid.uuid4()).replace("-", "")
81
- path = f"/tmp/{name}.png"
 
 
 
 
 
 
 
 
 
 
82
 
83
- if nsfw:
84
- gr.Warning("NSFW content detected.")
85
- # TODO could return an automatic dislike of auto dislike on the backend for neither as well; just would need refactoring.
86
- return None, im_emb
87
 
88
- output.save(path)
89
- return path, im_emb
90
-
 
 
91
 
92
- #######################
 
93
 
94
- @spaces.GPU()
95
- def sample_embs(prompt_embeds):
96
- latent = torch.randn(prompt_embeds.shape[0], 1, prompt_embeds.shape[-1])
97
- if prompt_embeds.shape[1] < k:
98
- prompt_embeds = torch.nn.functional.pad(prompt_embeds, [0, 0, 0, k-prompt_embeds.shape[1]])
99
- assert prompt_embeds.shape[1] == k, f"The model is set to take `k`` cond image embeds but is shape {prompt_embeds.shape}"
100
- image_embeds = model(latent.to('cuda'), prompt_embeds.to('cuda')).predicted_image_embedding
101
- return image_embeds
102
-
103
- @spaces.GPU()
104
- def get_user_emb(embs, ys):
105
- positives = [e for e, ys in zip(embs, ys) if ys == 1]
106
- if len(positives) == 0:
107
- positives = torch.zeros_like(im_emb)[None]
108
- else:
109
- # take last 8 TODO verify this is chronolgical; should be and also k-4 random ones.
110
- embs = random.sample(positives, k=min(k-8, len(positives))) + positives[-8:]
111
- positives = torch.stack(embs, 1)
 
 
 
 
 
 
 
 
 
 
 
 
112
 
113
- negs = [e for e, ys in zip(embs, ys) if ys == 0]
114
- if len(negs) == 0:
115
- negatives = torch.zeros_like(im_emb)[None]
116
- else:
117
- negative_embs = random.sample(negs, min(k-4, len(negs))) + negs[-4:]
118
- negatives = torch.stack(negative_embs, 1)
119
- # if random.random() < .5:
120
- # negatives = torch.zeros_like(negatives)
121
-
122
- image_embeds = torch.stack([sample_embs(negatives), sample_embs(positives)])
123
-
124
- return image_embeds
125
-
126
-
127
- def background_next_image():
128
- global prevs_df
129
- # only let it get N (maybe 3) ahead of the user
130
- #not_rated_rows = prevs_df[[i[1]['user:rating'] == {' ': ' '} for i in prevs_df.iterrows()]]
131
- rated_rows = prevs_df[[i[1]['user:rating'] != {' ': ' '} for i in prevs_df.iterrows()]]
132
- if len(rated_rows) < 4:
133
- time.sleep(.1)
134
- # not_rated_rows = prevs_df[[i[1]['user:rating'] == {' ': ' '} for i in prevs_df.iterrows()]]
135
- return
136
-
137
- user_id_list = set(rated_rows['latest_user_to_rate'].to_list())
138
- for uid in user_id_list:
139
- rated_rows = prevs_df[[i[1]['user:rating'].get(uid, None) is not None for i in prevs_df.iterrows()]]
140
- not_rated_rows = prevs_df[[i[1]['user:rating'].get(uid, None) is None for i in prevs_df.iterrows()]]
141
 
142
- # we need to intersect not_rated_rows from this user's embed > 7. Just add a new column on which user_id spawned the
143
- # media.
 
 
 
 
 
 
144
 
145
- unrated_from_user = not_rated_rows[[i[1]['from_user_id'] == uid for i in not_rated_rows.iterrows()]]
146
-
147
- # we don't compute more after n are in the queue for them
148
- if len(unrated_from_user) >= 10:
149
- continue
150
 
151
- if len(rated_rows) < 4:
152
- continue
153
-
154
- global glob_idx
155
- glob_idx += 1
156
 
157
- ems = rated_rows['embeddings'].to_list()
158
- ys = [i[uid][0] for i in rated_rows['user:rating'].to_list()]
159
 
160
- emz = get_user_emb(ems, ys)
161
- img, embs = generate(emz)
162
-
163
- if img:
164
- tmp_df = pd.DataFrame(columns=['paths', 'embeddings', 'ips', 'user:rating', 'latest_user_to_rate', 'text', 'gemb'])
165
- tmp_df['paths'] = [img]
166
- tmp_df['embeddings'] = [embs.to(torch.float32).to('cpu')]
167
- tmp_df['user:rating'] = [{' ': ' '}]
168
- tmp_df['from_user_id'] = [uid]
169
- tmp_df['text'] = ['']
170
- prevs_df = pd.concat((prevs_df, tmp_df))
171
- # we can free up storage by deleting the image
172
- if len(prevs_df) > 500:
173
- oldest_path = prevs_df.iloc[6]['paths']
174
- if os.path.isfile(oldest_path):
175
- os.remove(oldest_path)
176
- else:
177
- # If it fails, inform the user.
178
- print("Error: %s file not found" % oldest_path)
179
- # only keep 50 images & embeddings & ips, then remove oldest besides calibrating
180
- prevs_df = pd.concat((prevs_df.iloc[:6], prevs_df.iloc[7:]))
181
-
182
- def pluck_img(user_id):
183
- # TODO pluck images based on similarity but also based on diversity by cluster every few times.
184
- rated_rows = prevs_df[[i[1]['user:rating'].get(user_id, None) is not None for i in prevs_df.iterrows()]]
185
- ems = rated_rows['embeddings'].to_list()
186
- ys = [i[user_id][0] for i in rated_rows['user:rating'].to_list()]
187
- user_emb = get_user_emb(ems, ys)
188
-
189
- not_rated_rows = prevs_df[[i[1]['user:rating'].get(user_id, 'gone') == 'gone' for i in prevs_df.iterrows()]]
190
- while len(not_rated_rows) == 0:
191
- not_rated_rows = prevs_df[[i[1]['user:rating'].get(user_id, 'gone') == 'gone' for i in prevs_df.iterrows()]]
192
- time.sleep(.1)
193
- # TODO optimize this lol
194
-
195
- # NOTE could opt for only showing their own or prioritizing their own media.
196
- unrated_from_user = not_rated_rows[[i[1]['from_user_id'] == user_id for i in not_rated_rows.iterrows()]]
197
-
198
- best_sim = -10000000
199
- for i in not_rated_rows.iterrows():
200
- # TODO sloppy .to but it is 3am.
201
- sim = torch.cosine_similarity(i[1]['embeddings'].detach().to('cpu'), user_emb.detach().to('cpu'), -1)
202
- if len(sim) > 1: sim = sim[1]
203
- if sim.squeeze() > best_sim:
204
- best_sim = sim
205
- best_row = i[1]
206
- img = best_row['paths']
207
- return img
208
-
209
- def next_image(calibrate_prompts, user_id):
210
- with torch.no_grad():
211
- # once we've done so many random calibration prompts out of the full media
212
- if len(m_calibrate) - len(calibrate_prompts) < 5:
213
- cal_video = calibrate_prompts.pop(random.randint(0, len(calibrate_prompts)-1))
214
- image = prevs_df[prevs_df['paths'] == cal_video]['paths'].to_list()[0]
215
- # we switch to just getting media by similarity.
216
- else:
217
- image = pluck_img(user_id)
218
- return image, calibrate_prompts
219
 
220
 
221
 
222
 
223
 
224
 
225
- def start(_, calibrate_prompts, user_id, request: gr.Request):
226
- user_id = int(str(time.time())[-7:].replace('.', ''))
227
- image, calibrate_prompts = next_image(calibrate_prompts, user_id)
228
  return [
229
- gr.Button(value='👍', interactive=True),
230
- gr.Button(value='Neither (Space)', interactive=True, visible=False),
231
- gr.Button(value='👎', interactive=True),
232
  gr.Button(value='Start', interactive=False),
233
- gr.Button(value='👍 Content', interactive=True, visible=False),
234
- gr.Button(value='👍 Style', interactive=True, visible=False),
235
  image,
 
 
 
236
  calibrate_prompts,
237
- user_id,
238
  ]
239
 
240
 
241
- def choose(img, choice, calibrate_prompts, user_id, request: gr.Request):
242
- global prevs_df
243
-
244
- if choice == '👍':
245
- choice = [1, 1]
246
  elif choice == 'Neither (Space)':
247
- img, calibrate_prompts = next_image(calibrate_prompts, user_id)
248
- return img, calibrate_prompts
249
- elif choice == '👎':
250
- choice = [0, 0]
251
- elif choice == '👍 Style':
252
- choice = [0, 1]
253
- elif choice == '👍 Content':
254
- choice = [1, 0]
255
  else:
256
- assert False, f'choice is {choice}'
257
 
258
- # if we detected NSFW, leave that area of latent space regardless of how they rated chosen.
259
- # TODO skip allowing rating & just continue
260
  if img is None:
261
- print('NSFW -- choice is disliked')
262
- choice = [0, 0]
263
-
264
- row_mask = [p.split('/')[-1] in img for p in prevs_df['paths'].to_list()]
265
- # if it's still in the dataframe, add the choice
266
- if len(prevs_df.loc[row_mask, 'user:rating']) > 0:
267
- prevs_df.loc[row_mask, 'user:rating'][0][user_id] = choice
268
- prevs_df.loc[row_mask, 'latest_user_to_rate'] = [user_id]
269
- else:
270
- print('Image apparently removed', img)
271
- img, calibrate_prompts = next_image(calibrate_prompts, user_id)
272
- return img, calibrate_prompts
273
 
274
  css = '''.gradio-container{max-width: 700px !important}
275
  #description{text-align: center}
@@ -319,123 +354,55 @@ document.body.addEventListener('click', function(event) {
319
  fadeInOut(target, '#cccccc');
320
  }
321
  });
322
-
323
  </script>
324
  '''
325
 
326
- with gr.Blocks(head=js_head, css=css) as demo:
327
- gr.Markdown('''# The Other Tiger
328
- ### Generative Recommenders for Exporation of Possible Images
329
-
330
- Explore the latent space using binary feedback.
331
-
332
- [rynmurdock.github.io](https://rynmurdock.github.io/)
333
  ''', elem_id="description")
334
- user_id = gr.State()
335
- # calibration videos -- this is a misnomer now :D
336
- calibrate_prompts = gr.State( glob.glob('image_init/*') )
337
- def l():
338
- return None
339
-
 
 
 
 
 
 
 
340
  with gr.Row(elem_id='output-image'):
341
- img = gr.Image(
342
- label='Lightning',
343
- interactive=False,
344
- elem_id="output_im",
345
- type='filepath',
346
- height=700,
347
- width=700,
348
- )
349
-
350
-
351
-
352
  with gr.Row(equal_height=True):
353
- b3 = gr.Button(value='👎', interactive=False, elem_id="dislike")
354
-
355
- b2 = gr.Button(value='Neither (Space)', interactive=False, elem_id="neither", visible=False)
356
-
357
- b1 = gr.Button(value='👍', interactive=False, elem_id="like")
358
- with gr.Row(equal_height=True):
359
- b6 = gr.Button(value='👍 Style', interactive=False, elem_id="dislike like", visible=False)
360
-
361
- b5 = gr.Button(value='👍 Content', interactive=False, elem_id="like dislike", visible=False)
362
-
363
  b1.click(
364
  choose,
365
- [img, b1, calibrate_prompts, user_id],
366
- [img, calibrate_prompts, ],
367
  )
368
  b2.click(
369
  choose,
370
- [img, b2, calibrate_prompts, user_id],
371
- [img, calibrate_prompts, ],
372
  )
373
  b3.click(
374
  choose,
375
- [img, b3, calibrate_prompts, user_id],
376
- [img, calibrate_prompts, ],
377
- )
378
- b5.click(
379
- choose,
380
- [img, b5, calibrate_prompts, user_id],
381
- [img, calibrate_prompts, ],
382
- )
383
- b6.click(
384
- choose,
385
- [img, b6, calibrate_prompts, user_id],
386
- [img, calibrate_prompts, ],
387
  )
388
  with gr.Row():
389
  b4 = gr.Button(value='Start')
390
  b4.click(start,
391
- [b4, calibrate_prompts, user_id],
392
- [b1, b2, b3, b4, b5, b6, img, calibrate_prompts, user_id, ]
393
- )
394
  with gr.Row():
395
- html = gr.HTML('''<div style='text-align:center; font-size:20px'>You will calibrate for several images and then roam. When your media is generating, you may encounter others'.</ div><br><br><br>
396
-
397
- <br><br>
398
- <div style='text-align:center; font-size:14px'>Thanks to @multimodalart for their contributions to the demo, esp. the interface and @maxbittker for feedback.
399
  </ div>''')
400
 
401
- # TODO quiet logging
402
- scheduler = BackgroundScheduler()
403
- scheduler.add_job(func=background_next_image, trigger="interval", seconds=.2)
404
- scheduler.start()
405
-
406
- # TODO shouldn't call this before gradio launch, yeah?
407
- @spaces.GPU()
408
- def encode_space(x):
409
- im = (
410
- model.prior_pipe.image_processor(x, return_tensors="pt")
411
- .pixel_values[0]
412
- .unsqueeze(0)
413
- .to(dtype=model.prior_pipe.image_encoder.dtype, device=device)
414
- )
415
- im_emb = model.prior_pipe.image_encoder(im)["image_embeds"]
416
- return im_emb.detach().to('cpu').to(torch.float32)
417
-
418
- # NOTE:
419
- # media is moved into a random tmp folder so we need to parse filenames carefully.
420
- # do not have any cases where a file name is the same or could be `in` another filename
421
- # you also maybe can't use jpegs lmao
422
-
423
- # prep our calibration videos
424
- m_calibrate = glob.glob('image_init/*')
425
- for im in m_calibrate:
426
- tmp_df = pd.DataFrame(columns=['paths', 'embeddings', 'ips', 'user:rating', 'text', 'gemb', 'from_user_id'])
427
- tmp_df['paths'] = [im]
428
- image = Image.open(im).convert('RGB')
429
- im_emb = encode_space(image)
430
-
431
- tmp_df['embeddings'] = [im_emb.detach().to('cpu')]
432
- tmp_df['user:rating'] = [{' ': ' '}]
433
- tmp_df['text'] = ['']
434
-
435
- # seems to break things...
436
- tmp_df['from_user_id'] = [0]
437
- tmp_df['latest_user_to_rate'] = [0]
438
- prevs_df = pd.concat((prevs_df, tmp_df))
439
-
440
- glob_idx = 0
441
- demo.launch(share=True,)
 
1
+ DEVICE = 'cuda'
2
 
3
  import gradio as gr
4
+ import numpy as np
5
+ from sklearn.svm import SVC
6
+ from sklearn import preprocessing
7
+ import pandas as pd
8
+
9
+ from diffusers import LCMScheduler, AutoencoderTiny, EulerDiscreteScheduler, UNet2DConditionModel, AutoPipelineForText2Image, DiffusionPipeline
10
+ from diffusers.models import ImageProjection
11
+ import torch
12
+
13
+ torch.set_float32_matmul_precision('high')
14
+
15
  import random
16
  import time
 
 
17
 
18
+ import spaces
19
+ from urllib.request import urlopen
20
 
21
+ from PIL import Image
22
+ import requests
23
+ from io import BytesIO, StringIO
24
 
25
+ from transformers import CLIPVisionModelWithProjection
26
+ from huggingface_hub import hf_hub_download
27
+ from safetensors.torch import load_file
28
 
29
+ from safety_checker_improved import maybe_nsfw
 
30
 
31
+ prompt_list = [p for p in list(set(
32
+ pd.read_csv('./twitter_prompts.csv').iloc[:, 1].tolist())) if type(p) == str]
33
 
34
+ start_time = time.time()
35
 
36
+ ####################### Setup Model
 
37
 
38
+ model_id = "stabilityai/stable-diffusion-xl-base-1.0"
39
+ sdxl_lightening = "ByteDance/SDXL-Lightning"
40
+ ckpt = "sdxl_lightning_2step_unet.safetensors"
41
+ unet = UNet2DConditionModel.from_config(model_id, subfolder="unet", low_cpu_mem_usage=True, device_map=DEVICE).to(torch.float16)
42
+ unet.load_state_dict(load_file(hf_hub_download(sdxl_lightening, ckpt)))
43
 
44
+ image_encoder = CLIPVisionModelWithProjection.from_pretrained("h94/IP-Adapter", subfolder="models/image_encoder", torch_dtype=torch.float16, low_cpu_mem_usage=True, device_map=DEVICE)
45
+ pipe = AutoPipelineForText2Image.from_pretrained(model_id, unet=unet, torch_dtype=torch.float16, variant="fp16", image_encoder=image_encoder, low_cpu_mem_usage=True)
46
+ pipe.unet._load_ip_adapter_weights(torch.load(hf_hub_download('h94/IP-Adapter', 'sdxl_models/ip-adapter_sdxl_vit-h.bin')))
47
+ pipe.load_ip_adapter("h94/IP-Adapter", subfolder="sdxl_models", weight_name="ip-adapter_sdxl_vit-h.bin")
48
+ pipe.register_modules(image_encoder = image_encoder)
49
+ pipe.set_ip_adapter_scale(0.8)
50
 
51
+ pipe.vae = AutoencoderTiny.from_pretrained("madebyollin/taesdxl", torch_dtype=torch.float16, low_cpu_mem_usage=True)
52
+ pipe.scheduler = EulerDiscreteScheduler.from_config(pipe.scheduler.config, timestep_spacing="trailing")
53
 
54
+ pipe.to(device=DEVICE)
55
+ pipe.set_progress_bar_config(disable=True)
 
56
 
57
+ @spaces.GPU
58
+ def compile_em():
59
+ pipe.unet = torch.compile(pipe.unet, mode='reduce-overhead')
60
+ pipe.vae = torch.compile(pipe.vae, mode='reduce-overhead')
61
+ autoencoder.model.forward = torch.compile(autoencoder.model.forward, backend='inductor', dynamic=True)
62
 
 
 
63
 
64
+ output_hidden_state = False
65
+ #######################
66
+
67
+ ####################### Setup autoencoder
68
+
69
+ from tqdm import tqdm
70
+ from transformers import AutoTokenizer, AutoModelForCausalLM
71
 
72
+ class BottleneckT5Autoencoder:
73
+ def __init__(self, model_path: str, device='cuda'):
74
+ self.device = device
75
+ self.tokenizer = AutoTokenizer.from_pretrained(model_path, model_max_length=512, torch_dtype=torch.bfloat16)
76
+ self.model = AutoModelForCausalLM.from_pretrained(model_path, trust_remote_code=True, low_cpu_mem_usage=True).to('cuda')
77
+ self.model.eval()
78
+
79
+
80
+ def embed(self, text: str) -> torch.FloatTensor:
81
+ inputs = self.tokenizer(text, return_tensors='pt', padding=True).to(self.device)
82
+ decoder_inputs = self.tokenizer('', return_tensors='pt').to(self.device)
83
+ return self.model(
84
+ **inputs,
85
+ decoder_input_ids=decoder_inputs['input_ids'],
86
+ encode_only=True,
87
+ )
88
+
89
+ def generate_from_latent(self, latent: torch.FloatTensor, max_length=20, temperature=1., top_p=.8, min_new_tokens=30) -> str:
90
+ dummy_text = '.'
91
+ dummy = self.embed(dummy_text)
92
+ perturb_vector = latent - dummy
93
+ self.model.perturb_vector = perturb_vector
94
+ input_ids = self.tokenizer(dummy_text, return_tensors='pt').to(self.device).input_ids
95
+ output = self.model.generate(
96
+ input_ids=input_ids,
97
+ max_length=max_length,
98
+ do_sample=True,
99
+ temperature=temperature,
100
+ top_p=top_p,
101
+ num_return_sequences=1,
102
+ min_new_tokens=min_new_tokens,
103
+ #num_beams=4,
104
+ )
105
+ return self.tokenizer.decode(output[0], skip_special_tokens=True)
106
+
107
+ autoencoder = BottleneckT5Autoencoder(model_path='thesephist/contra-bottleneck-t5-xl-wikipedia')
108
+
109
+ compile_em()
110
+ #######################
111
 
112
+ @spaces.GPU
113
+ def generate(prompt, in_embs=None,):
114
+ if prompt != '':
115
+ # # print(prompt)
116
+ in_embs = in_embs / in_embs.abs().max() * .15 if in_embs != None else None
117
+ in_embs = .9 * in_embs.to('cuda') + .5 * autoencoder.embed(prompt).to('cuda') if in_embs != None else autoencoder.embed(prompt).to('cuda')
118
+ #else:
119
+ # print('From embeds.')
120
+ in_embs = in_embs / in_embs.abs().max() * .15
121
+ text = autoencoder.generate_from_latent(in_embs.to('cuda').to(dtype=torch.bfloat16), temperature=.3, top_p=.99, min_new_tokens=5)
122
+ in_embs = autoencoder.embed(text).to('cuda')
123
+ return text, in_embs.to('cpu')
124
+
125
+
126
+ @spaces.GPU
127
+ def predict(
128
+ prompt,
129
+ im_emb=None,
130
+ progress=gr.Progress(track_tqdm=True)
131
+ ):
132
+ """Run a single prediction on the model"""
133
  with torch.no_grad():
134
+ if im_emb == None:
135
+ im_emb = torch.zeros(1, 1024, dtype=torch.float16, device=DEVICE)
136
+
137
+ im_emb = [im_emb.to(DEVICE).unsqueeze(0)]
138
+ if prompt == '':
139
+ image = pipe(
140
+ prompt_embeds=torch.zeros(1, 1, 2048, dtype=torch.float16, device=DEVICE),
141
+ pooled_prompt_embeds=torch.zeros(1, 1280, dtype=torch.float16, device=DEVICE),
142
+ ip_adapter_image_embeds=im_emb,
143
+ height=1024,
144
+ width=1024,
145
+ num_inference_steps=2,
146
+ guidance_scale=0,
147
+ # timesteps=[800],
148
+ ).images[0]
149
+ else:
150
+ image = pipe(
151
+ prompt=prompt,
152
+ ip_adapter_image_embeds=im_emb,
153
+ height=1024,
154
+ width=1024,
155
+ num_inference_steps=2,
156
+ guidance_scale=0,
157
+ # timesteps=[800],
158
+ ).images[0]
159
+ im_emb, _ = pipe.encode_image(
160
+ image, DEVICE, 1, output_hidden_state
161
+ )
162
+
163
+ nsfw = maybe_nsfw(image)
164
+ if nsfw:
165
+ return None, im_emb.to('cpu')
166
+
167
+ return image, im_emb.to('cpu')
168
+
169
+
170
+ # sample a .8 of rated embeddings for some stochasticity, or at least two embeddings.
171
+ def get_coeff(embs_local, ys):
172
+ n_to_choose = max(int(len(embs_local)*.8), 2)
173
+ indices = random.sample(range(len(embs_local)), n_to_choose)
174
+
175
+ # we may have just encountered a rare multi-threading diffusers issue (https://github.com/huggingface/diffusers/issues/5749);
176
+ # this ends up adding a rating but losing an embedding, it seems.
177
+ # let's take off a rating if so to continue without indexing errors.
178
+ if len(ys) > len(embs_local):
179
+ # print('ys are longer than embs; popping latest rating')
180
+ ys.pop(-1)
181
 
182
+ # also add the latest 0 and the latest 1
183
+ has_0 = False
184
+ has_1 = False
185
+ for i in reversed(range(len(ys))):
186
+ if ys[i] == 0 and has_0 == False:
187
+ indices.append(i)
188
+ has_0 = True
189
+ elif ys[i] == 1 and has_1 == False:
190
+ indices.append(i)
191
+ has_1 = True
192
+ if has_0 and has_1:
193
+ break
194
 
195
+ feature_embs = np.array(torch.cat([embs_local[i].to('cpu') for i in indices]).to('cpu'))
196
+ scaler = preprocessing.StandardScaler().fit(feature_embs)
197
+ feature_embs = scaler.transform(feature_embs)
198
+ # print(len(feature_embs), len(ys))
199
 
200
+ lin_class = SVC(max_iter=50000, kernel='linear', class_weight='balanced', C=.1).fit(feature_embs, np.array([ys[i] for i in indices]))
201
+ coef_ = torch.tensor(lin_class.coef_, dtype=torch.double)
202
+ coef_ = (coef_.flatten() / (coef_.flatten().norm())).unsqueeze(0)
203
+
204
+ return coef_
205
 
206
+ # TODO add to state instead of shared across all
207
+ glob_idx = 0
208
 
209
+ def next_image(embs, img_embs, ys, calibrate_prompts):
210
+ global glob_idx
211
+ glob_idx = glob_idx + 1
212
+ if glob_idx >= 12:
213
+ glob_idx = 0
214
+
215
+ # handle case where every instance of calibration prompts is 'Neither' or 'Like' or 'Dislike'
216
+ if len(calibrate_prompts) == 0 and len(list(set(ys))) <= 1:
217
+ embs.append(.01*torch.randn(1, 2048))
218
+ embs.append(.01*torch.randn(1, 2048))
219
+ img_embs.append(.01*torch.randn(1, 1024))
220
+ img_embs.append(.01*torch.randn(1, 1024))
221
+ ys.append(0)
222
+ ys.append(1)
223
+
224
+ with torch.no_grad():
225
+ if len(calibrate_prompts) > 0:
226
+ # print('######### Calibrating with sample prompts #########')
227
+ prompt = calibrate_prompts.pop(0)
228
+ # print(prompt)
229
+ image, img_emb = predict(prompt)
230
+ im_emb = autoencoder.embed(prompt)
231
+ embs.append(im_emb)
232
+ img_embs.append(img_emb)
233
+ return image, embs, img_embs, ys, calibrate_prompts, prompt
234
+ else:
235
+ # print('######### Roaming #########')
236
+
237
+ pos_indices = [i for i in range(len(embs)) if ys[i] == 1]
238
+ neg_indices = [i for i in range(len(embs)) if ys[i] == 0]
239
 
240
+ if len(neg_indices) > 40:
241
+ neg_indices = neg_indices[1:]
242
+ # popping first negative rating due to > 25
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
243
 
244
+ indices = pos_indices + neg_indices
245
+ embs = [embs[i] for i in indices]
246
+ img_embs = [img_embs[i] for i in indices]
247
+ ys = [ys[i] for i in indices]
248
+
249
+ im_s = get_coeff(embs, ys)
250
+ rng_prompt = random.choice(prompt_list)
251
+ w = 1.4# if len(embs) % 2 == 0 else 0
252
 
253
+ prompt= '' if not glob_idx % 3 == 0 else rng_prompt
254
+ prompt, _ = generate(prompt, in_embs=im_s)
255
+ # print(prompt)
256
+ im_emb = autoencoder.embed(prompt)
257
+ embs.append(im_emb)
258
 
259
+ learn_emb = get_coeff(img_embs, ys)
260
+ img_emb = w * learn_emb.to(dtype=torch.float16)
261
+ image, img_emb = predict(prompt, im_emb=img_emb)
262
+ img_embs.append(img_emb)
 
263
 
264
+ return image, embs, img_embs, ys, calibrate_prompts, prompt
265
+
266
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
267
 
268
 
269
 
270
 
271
 
272
 
273
+
274
+ def start(_, embs, img_embs, ys, calibrate_prompts):
275
+ image, embs, img_embs, ys, calibrate_prompts, prompt = next_image(embs, img_embs, ys, calibrate_prompts)
276
  return [
277
+ gr.Button(value='Like (L)', interactive=True),
278
+ gr.Button(value='Neither (Space)', interactive=True),
279
+ gr.Button(value='Dislike (A)', interactive=True),
280
  gr.Button(value='Start', interactive=False),
 
 
281
  image,
282
+ embs,
283
+ img_embs,
284
+ ys,
285
  calibrate_prompts,
286
+ prompt
287
  ]
288
 
289
 
290
+ def choose(img, choice, embs, img_embs, ys, calibrate_prompts):
291
+ if choice == 'Like (L)':
292
+ choice = 1
 
 
293
  elif choice == 'Neither (Space)':
294
+ _ = embs.pop(-1)
295
+ _ = img_embs.pop(-1)
296
+ img, embs, img_embs, ys, calibrate_prompts, prompt = next_image(embs, img_embs, ys, calibrate_prompts)
297
+ return img, embs, img_embs, ys, calibrate_prompts, prompt
 
 
 
 
298
  else:
299
+ choice = 0
300
 
 
 
301
  if img is None:
302
+ # print('NSFW -- choice is disliked')
303
+ choice = 0
304
+
305
+ ys.append(choice)
306
+ img, embs, img_embs, ys, calibrate_prompts, prompt = next_image(embs, img_embs, ys, calibrate_prompts)
307
+ return img, embs, img_embs, ys, calibrate_prompts, prompt
 
 
 
 
 
 
308
 
309
  css = '''.gradio-container{max-width: 700px !important}
310
  #description{text-align: center}
 
354
  fadeInOut(target, '#cccccc');
355
  }
356
  });
 
357
  </script>
358
  '''
359
 
360
+ with gr.Blocks(css=css, head=js_head) as demo:
361
+ gr.Markdown('''### Zahir: Generative Recommenders for Unprompted, Scalable Exploration
362
+ Explore the latent space without prompting based on your feedback. Learn more on [the write-up](https://rynmurdock.github.io/posts/2024/3/generative_recomenders/).
 
 
 
 
363
  ''', elem_id="description")
364
+ embs = gr.State([])
365
+ img_embs = gr.State([])
366
+ ys = gr.State([])
367
+ calibrate_prompts = gr.State([
368
+ 'the moon is melting into my glass of tea',
369
+ 'a sea slug -- pair of claws scuttling -- jelly fish glowing',
370
+ 'an adorable creature. It may be a goblin or a pig or a slug.',
371
+ 'an animation about a gorgeous nebula',
372
+ 'a sketch of an impressive mountain by da vinci',
373
+ 'a watercolor painting: the octopus writhes',
374
+ ])
375
+ with gr.Row():
376
+ prompt = gr.Textbox(interactive=False, elem_id="text")
377
  with gr.Row(elem_id='output-image'):
378
+ img = gr.Image(interactive=False, elem_id='output-image', width=700)
 
 
 
 
 
 
 
 
 
 
379
  with gr.Row(equal_height=True):
380
+ b3 = gr.Button(value='Dislike (A)', interactive=False, elem_id="dislike")
381
+ b2 = gr.Button(value='Neither (Space)', interactive=False, elem_id="neither")
382
+ b1 = gr.Button(value='Like (L)', interactive=False, elem_id="like")
 
 
 
 
 
 
 
383
  b1.click(
384
  choose,
385
+ [img, b1, embs, img_embs, ys, calibrate_prompts],
386
+ [img, embs, img_embs, ys, calibrate_prompts, prompt]
387
  )
388
  b2.click(
389
  choose,
390
+ [img, b2, embs, img_embs, ys, calibrate_prompts],
391
+ [img, embs, img_embs, ys, calibrate_prompts, prompt]
392
  )
393
  b3.click(
394
  choose,
395
+ [img, b3, embs, img_embs, ys, calibrate_prompts],
396
+ [img, embs, img_embs, ys, calibrate_prompts, prompt]
 
 
 
 
 
 
 
 
 
 
397
  )
398
  with gr.Row():
399
  b4 = gr.Button(value='Start')
400
  b4.click(start,
401
+ [b4, embs, img_embs, ys, calibrate_prompts],
402
+ [b1, b2, b3, b4, img, embs, img_embs, ys, calibrate_prompts, prompt])
 
403
  with gr.Row():
404
+ html = gr.HTML('''<div style='text-align:center; font-size:20px'>You will calibrate for several prompts and then roam. </ div><br><br><br>
405
+ <div style='text-align:center; font-size:14px'>Note that while the SDXL model is unlikely to produce NSFW images, it still may be possible, and users should avoid NSFW content when rating.
 
 
406
  </ div>''')
407
 
408
+ demo.launch(share=True) # Share your demo with just 1 extra parameter 🚀
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
config.py DELETED
@@ -1,16 +0,0 @@
1
- import torch
2
-
3
- # NOTE model path name changed
4
- model_path = './last_epoch_ckpt/'
5
- lr = 1e-5
6
- device = 'cuda'
7
- dtype = torch.bfloat16
8
- data_path = '../data/lke_2017'
9
- save_path = './'
10
- epochs = 4
11
- batch_size = 16
12
- number_k_clip_embed = 16 # divide by this to determine bundling together of sequences -> CLIP
13
- num_workers = 32
14
- seed = 107
15
- k = 16
16
- # TODO config option to swap to diffusion?
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
data.py DELETED
@@ -1,147 +0,0 @@
1
- import torch
2
- from PIL import Image
3
- import random
4
- import logging
5
- import torchvision
6
-
7
- import torchvision.transforms as T
8
- from torchvision.transforms.functional import InterpolationMode
9
-
10
- IMAGENET_MEAN = (0.485, 0.456, 0.406)
11
- IMAGENET_STD = (0.229, 0.224, 0.225)
12
-
13
- def build_transform(input_size):
14
- MEAN, STD = IMAGENET_MEAN, IMAGENET_STD
15
- transform = T.Compose([
16
- T.Lambda(lambda img: img.convert('RGB') if img.mode != 'RGB' else img),
17
- T.Resize((input_size, input_size), interpolation=InterpolationMode.BICUBIC),
18
- T.ToTensor(),
19
- T.Normalize(mean=MEAN, std=STD)
20
- ])
21
- return transform
22
-
23
- def find_closest_aspect_ratio(aspect_ratio, target_ratios, width, height, image_size):
24
- best_ratio_diff = float('inf')
25
- best_ratio = (1, 1)
26
- area = width * height
27
- for ratio in target_ratios:
28
- target_aspect_ratio = ratio[0] / ratio[1]
29
- ratio_diff = abs(aspect_ratio - target_aspect_ratio)
30
- if ratio_diff < best_ratio_diff:
31
- best_ratio_diff = ratio_diff
32
- best_ratio = ratio
33
- elif ratio_diff == best_ratio_diff:
34
- if area > 0.5 * image_size * image_size * ratio[0] * ratio[1]:
35
- best_ratio = ratio
36
- return best_ratio
37
-
38
- def dynamic_preprocess(image, min_num=1, max_num=8, image_size=448, use_thumbnail=False):
39
- orig_width, orig_height = image.size
40
- aspect_ratio = orig_width / orig_height
41
-
42
- # calculate the existing image aspect ratio
43
- target_ratios = set(
44
- (i, j) for n in range(min_num, max_num + 1) for i in range(1, n + 1) for j in range(1, n + 1) if
45
- i * j <= max_num and i * j >= min_num)
46
- target_ratios = sorted(target_ratios, key=lambda x: x[0] * x[1])
47
-
48
- # find the closest aspect ratio to the target
49
- target_aspect_ratio = find_closest_aspect_ratio(
50
- aspect_ratio, target_ratios, orig_width, orig_height, image_size)
51
-
52
- # calculate the target width and height
53
- target_width = image_size * target_aspect_ratio[0]
54
- target_height = image_size * target_aspect_ratio[1]
55
- blocks = target_aspect_ratio[0] * target_aspect_ratio[1]
56
-
57
- # resize the image
58
- resized_img = image.resize((target_width, target_height))
59
- processed_images = []
60
- for i in range(blocks):
61
- box = (
62
- (i % (target_width // image_size)) * image_size,
63
- (i // (target_width // image_size)) * image_size,
64
- ((i % (target_width // image_size)) + 1) * image_size,
65
- ((i // (target_width // image_size)) + 1) * image_size
66
- )
67
- # split the image
68
- split_img = resized_img.crop(box)
69
- processed_images.append(split_img)
70
- assert len(processed_images) == blocks
71
- if use_thumbnail and len(processed_images) != 1:
72
- thumbnail_img = image.resize((image_size, image_size))
73
- processed_images.append(thumbnail_img)
74
- return processed_images
75
-
76
-
77
- def load_image(image_file, pil_image=None, input_size=224,):
78
- if not pil_image:
79
- pil_image = Image.open(image_file)
80
- image = pil_image.convert('RGB')
81
- transform = build_transform(input_size=input_size)
82
- # images = dynamic_preprocess(image, image_size=input_size, use_thumbnail=True, max_num=max_num)
83
- pixel_values = [transform(image) for image in [image]]
84
- pixel_values = torch.stack(pixel_values)
85
- return pixel_values
86
-
87
- def my_collate(batch):
88
- try:
89
- targets = torch.stack([s['target'] for s in batch])
90
- samples = torch.stack([s['samples'] for s in batch])
91
-
92
- # targets = torch.stack([s['target'] for s in batch if s is not None])
93
- # samples = torch.stack([s['samples'] for s in batch if s is not None])
94
- except Exception as e:
95
- logging.warning('my_collate issue ', e)
96
- return None
97
- return samples, targets
98
-
99
-
100
- class ImageFolderSample(torchvision.datasets.ImageFolder):
101
- def __init__(self, data_path, k, processor):
102
- super().__init__(data_path)
103
- self.k = k
104
- self.processor = processor
105
-
106
- def safe_getitem(self, index):
107
- try:
108
- target_path, class_type = self.samples[index]
109
- target = torch.from_numpy(self.processor(self.loader(target_path)).data['pixel_values'][0])
110
-
111
- input_paths = random.choices([p[0] for p in self.samples if p != target_path and class_type in p], k=self.k)
112
- assert len(input_paths) == self.k # I think it may do this by default...
113
- samples = torch.stack([torch.from_numpy(self.processor(self.loader(i)).data['pixel_values'][0]) for i in input_paths])
114
- except Exception as e:
115
- logging.warning('getitem issue ', e)
116
- samples, target = None, None
117
-
118
- drop_mask = torch.rand(samples.shape[0],) < .2
119
- samples[drop_mask] = 0
120
-
121
- drop_whole_set_mask = torch.rand(1,) < .1
122
- if drop_whole_set_mask:
123
- samples = torch.zeros_like(samples)
124
- return {'samples': samples[:, :3], 'target': target[:3]}
125
-
126
- def __getitem__(self, index: int):
127
- return self.safe_getitem(index)
128
-
129
-
130
- # https://data.mendeley.com/datasets/fs4k2zc5j5/3
131
- # Gomez, J. C., Ibarra-Manzano, M. A., & Almanza-Ojeda, D. L. (2017). User Identification in Pinterest Through the Refinement of Cascade Fusion of Text and Images. Research in Computing Science, 144, 41-52.
132
- def get_dataset(data_path, processor):
133
- return ImageFolderSample(data_path, 8, processor)
134
-
135
-
136
- def get_dataloader(data_path, batch_size, num_workers, processor):
137
- dataloader = torch.utils.data.DataLoader(
138
- get_dataset(data_path, processor=processor),
139
- num_workers=num_workers,
140
- collate_fn=my_collate,
141
- batch_size=batch_size,
142
- shuffle=True,
143
- drop_last=True
144
- )
145
- return dataloader
146
-
147
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
image_init/1o.png DELETED

Git LFS Details

  • SHA256: 15faf7373356cbcc59531da9d02ffe3642826c156409a4a8d88904aca295ebba
  • Pointer size: 131 Bytes
  • Size of remote file: 357 kB
image_init/2o.png DELETED

Git LFS Details

  • SHA256: 5783269bf3847cd08bbf312b2cb53b241a29345564db8e5fe04235b664ee7d5c
  • Pointer size: 132 Bytes
  • Size of remote file: 5.49 MB
image_init/3o.png DELETED

Git LFS Details

  • SHA256: 9070c259c85fc86cce84c1d5ae951588fcc331210350d75601ed89d114b33ec7
  • Pointer size: 132 Bytes
  • Size of remote file: 2 MB
image_init/4o.png DELETED

Git LFS Details

  • SHA256: dffbc9cebbd743c2cdbda578be45c8114b6528d02ab8f71b7cdc057ff84b26a4
  • Pointer size: 132 Bytes
  • Size of remote file: 1.98 MB
image_init/5o.png DELETED

Git LFS Details

  • SHA256: 6683ea703e4f134185a7100ef3e78dac04041340584494799cba5d925fb228df
  • Pointer size: 132 Bytes
  • Size of remote file: 1.21 MB
image_init/6o.png DELETED

Git LFS Details

  • SHA256: 6cf8b9917283b2c5b2d74d5042d0219f7d458e85d1e0c8189aae99f16e304adb
  • Pointer size: 132 Bytes
  • Size of remote file: 1.53 MB
image_init/7o.png DELETED

Git LFS Details

  • SHA256: 76813201ae0f9f845ad8c75c500f72cfa63f2b5d59e6f95ceff3288d0303e1c3
  • Pointer size: 131 Bytes
  • Size of remote file: 469 kB
image_init/8o.png DELETED

Git LFS Details

  • SHA256: d42dffc1ac16cb1645bb24336798671984341fd90c9ab88d3e8ef052afb64429
  • Pointer size: 132 Bytes
  • Size of remote file: 1.01 MB
image_init/9o.png DELETED

Git LFS Details

  • SHA256: 3b687042ce41cf61aa112473c276753992571f15be1e3526479139394d8ed49d
  • Pointer size: 131 Bytes
  • Size of remote file: 463 kB
last_epoch_ckpt/config.json DELETED
@@ -1,18 +0,0 @@
1
- {
2
- "_class_name": "PriorTransformer",
3
- "_diffusers_version": "0.34.0.dev0",
4
- "_name_or_path": "./last_epoch_ckpt/",
5
- "added_emb_type": "prd",
6
- "additional_embeddings": 3,
7
- "attention_head_dim": 32,
8
- "clip_embed_dim": null,
9
- "dropout": 0.0,
10
- "embedding_dim": 1280,
11
- "embedding_proj_dim": null,
12
- "embedding_proj_norm_type": null,
13
- "encoder_hid_proj_type": "linear",
14
- "norm_in_type": null,
15
- "num_attention_heads": 16,
16
- "num_embeddings": 77,
17
- "num_layers": 10
18
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
last_epoch_ckpt/diffusion_pytorch_model.safetensors DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:33d7ca8a1d0f179ade0aa00cf9d622b0ac60ea2b58c79933a9212c54b5d6f719
3
- size 136790920
 
 
 
 
lightning_app_deprecated.py DELETED
@@ -1,460 +0,0 @@
1
-
2
- import gradio as gr
3
- import random
4
- import time
5
- import torch
6
- import glob
7
-
8
- import config
9
- from huggingface_hub import hf_hub_download
10
- from diffusers import EulerDiscreteScheduler, LCMScheduler, AutoencoderTiny, UNet2DConditionModel, AutoencoderKL, AutoPipelineForText2Image
11
- from transformers import CLIPVisionModelWithProjection
12
- from safetensors.torch import load_file
13
-
14
- from model import get_model_and_tokenizer
15
-
16
- model, tokenizer = get_model_and_tokenizer(config.model_path, 'cuda', torch.bfloat16)
17
-
18
- del model.kandinsky_pipe
19
- del tokenizer
20
-
21
- torch.set_float32_matmul_precision('high')
22
-
23
- model_id = "stabilityai/stable-diffusion-xl-base-1.0"
24
- sdxl_lightening = "ByteDance/SDXL-Lightning"
25
- ckpt = "sdxl_lightning_8step_unet.safetensors"
26
- unet = UNet2DConditionModel.from_config(model_id, subfolder="unet", low_cpu_mem_usage=True, device_map='cuda').to(torch.float16)
27
- unet.load_state_dict(load_file(hf_hub_download(sdxl_lightening, ckpt)))
28
-
29
- image_encoder = CLIPVisionModelWithProjection.from_pretrained("h94/IP-Adapter", subfolder="sdxl_models/image_encoder", torch_dtype=torch.float16, low_cpu_mem_usage=True, device_map='cuda')
30
- pipe = AutoPipelineForText2Image.from_pretrained(model_id, unet=unet, torch_dtype=torch.float16, variant="fp16", image_encoder=image_encoder, low_cpu_mem_usage=True)
31
- pipe.unet._load_ip_adapter_weights(torch.load(hf_hub_download('h94/IP-Adapter', 'sdxl_models/ip-adapter_sdxl.bin')))
32
- pipe.load_ip_adapter("h94/IP-Adapter", subfolder="sdxl_models", weight_name="ip-adapter_sdxl.bin")
33
- pipe.register_modules(image_encoder = image_encoder)
34
- pipe.set_ip_adapter_scale(0.8)
35
-
36
- #pipe.vae = AutoencoderTiny.from_pretrained("madebyollin/taesdxl", torch_dtype=torch.float16, low_cpu_mem_usage=True)
37
- pipe.scheduler = EulerDiscreteScheduler.from_config(pipe.scheduler.config, timestep_spacing="trailing")
38
-
39
- pipe.to(device='cuda').to(dtype=config.dtype)
40
- output_hidden_state = False
41
-
42
-
43
- # TODO unify/merge origin and this
44
- # TODO save & restart from (if it exists) dataframe parquet
45
-
46
- device = "cuda"
47
-
48
- k = config.k
49
-
50
- import spaces
51
- import matplotlib.pyplot as plt
52
-
53
- import os
54
- import gradio as gr
55
- import pandas as pd
56
- from apscheduler.schedulers.background import BackgroundScheduler
57
-
58
- import random
59
- import time
60
- from PIL import Image
61
- # from safety_checker_improved import maybe_nsfw
62
-
63
-
64
- torch.set_grad_enabled(False)
65
- torch.backends.cuda.matmul.allow_tf32 = True
66
- torch.backends.cudnn.allow_tf32 = True
67
-
68
- prevs_df = pd.DataFrame(columns=['paths', 'embeddings', 'ips', 'user:rating', 'latest_user_to_rate', 'from_user_id', 'text', 'gemb'])
69
-
70
- import spaces
71
- start_time = time.time()
72
-
73
- ####################### Setup Model
74
- from diffusers import EulerDiscreteScheduler
75
- from PIL import Image
76
- import uuid
77
-
78
-
79
- @spaces.GPU()
80
- def generate_gpu(in_im_embs, prompt='the scene'):
81
- with torch.no_grad():
82
- in_im_embs = in_im_embs.to('cuda')
83
-
84
- negative_image_embeds = in_im_embs[0]# if random.random() < .3 else model.prior_pipe.get_zero_embed()
85
- positive_image_embeds = in_im_embs[1]
86
-
87
- in_im_embs = in_im_embs.to('cuda').view(2, 1, -1)
88
- images = pipe(prompt=prompt, guidance_scale=4, added_cond_kwargs={}, ip_adapter_image_embeds=[in_im_embs], num_inference_steps=8).images[0]
89
- im_emb, _ = pipe.encode_image(
90
- images, 'cuda', 1, output_hidden_state
91
- )
92
- im_emb = im_emb.detach().to('cpu').to(torch.float32)
93
- return images, im_emb
94
-
95
-
96
- def generate(in_im_embs, ):
97
- output, im_emb = generate_gpu(in_im_embs)
98
- nsfw = False#maybe_nsfw(output.images[0])
99
-
100
- name = str(uuid.uuid4()).replace("-", "")
101
- path = f"/tmp/{name}.png"
102
-
103
- if nsfw:
104
- gr.Warning("NSFW content detected.")
105
- # TODO could return an automatic dislike of auto dislike on the backend for neither as well; just would need refactoring.
106
- return None, im_emb
107
-
108
- output.save(path)
109
- return path, im_emb
110
-
111
-
112
- #######################
113
-
114
- @spaces.GPU()
115
- def sample_embs(prompt_embeds):
116
- latent = torch.randn(prompt_embeds.shape[0], 1, prompt_embeds.shape[-1])
117
- if prompt_embeds.shape[1] < k:
118
- prompt_embeds = torch.nn.functional.pad(prompt_embeds, [0, 0, 0, k-prompt_embeds.shape[1]])
119
- assert prompt_embeds.shape[1] == k, f"The model is set to take `k`` cond image embeds but is shape {prompt_embeds.shape}"
120
- image_embeds = model(latent.to('cuda'), prompt_embeds.to('cuda')).predicted_image_embedding
121
- return image_embeds
122
-
123
- @spaces.GPU()
124
- def get_user_emb(embs, ys):
125
- positives = [e for e, ys in zip(embs, ys) if ys == 1]
126
- if len(positives) == 0:
127
- positives = torch.zeros_like(im_emb)[None]
128
- else:
129
- embs = random.sample(positives, min(k-4, len(positives))) + positives[-4:]
130
- positives = torch.stack(embs, 1)
131
-
132
- negs = [e for e, ys in zip(embs, ys) if ys == 0]
133
- if len(negs) == 0:
134
- negatives = torch.zeros_like(im_emb)[None]
135
- else:
136
- negative_embs = random.sample(negs, min(k-4, len(negs))) + negs[-4:]
137
- negatives = torch.stack(negative_embs, 1)
138
- # if random.random() < .5:
139
- # negatives = torch.zeros_like(negatives)
140
-
141
- image_embeds = torch.stack([sample_embs(negatives), sample_embs(positives)])
142
-
143
- return image_embeds
144
-
145
-
146
- def background_next_image():
147
- global prevs_df
148
- # only let it get N (maybe 3) ahead of the user
149
- #not_rated_rows = prevs_df[[i[1]['user:rating'] == {' ': ' '} for i in prevs_df.iterrows()]]
150
- rated_rows = prevs_df[[i[1]['user:rating'] != {' ': ' '} for i in prevs_df.iterrows()]]
151
- if len(rated_rows) < 4:
152
- time.sleep(.1)
153
- # not_rated_rows = prevs_df[[i[1]['user:rating'] == {' ': ' '} for i in prevs_df.iterrows()]]
154
- return
155
-
156
- user_id_list = set(rated_rows['latest_user_to_rate'].to_list())
157
- for uid in user_id_list:
158
- rated_rows = prevs_df[[i[1]['user:rating'].get(uid, None) is not None for i in prevs_df.iterrows()]]
159
- not_rated_rows = prevs_df[[i[1]['user:rating'].get(uid, None) is None for i in prevs_df.iterrows()]]
160
-
161
- # we need to intersect not_rated_rows from this user's embed > 7. Just add a new column on which user_id spawned the
162
- # media.
163
-
164
- unrated_from_user = not_rated_rows[[i[1]['from_user_id'] == uid for i in not_rated_rows.iterrows()]]
165
-
166
- # we don't compute more after n are in the queue for them
167
- if len(unrated_from_user) >= 10:
168
- continue
169
-
170
- if len(rated_rows) < 4:
171
- continue
172
-
173
- global glob_idx
174
- glob_idx += 1
175
-
176
- ems = rated_rows['embeddings'].to_list()
177
- ys = [i[uid][0] for i in rated_rows['user:rating'].to_list()]
178
-
179
- emz = get_user_emb(ems, ys)
180
- img, embs = generate(emz)
181
-
182
- if img:
183
- tmp_df = pd.DataFrame(columns=['paths', 'embeddings', 'ips', 'user:rating', 'latest_user_to_rate', 'text', 'gemb'])
184
- tmp_df['paths'] = [img]
185
- tmp_df['embeddings'] = [embs.to(torch.float32).to('cpu')]
186
- tmp_df['user:rating'] = [{' ': ' '}]
187
- tmp_df['from_user_id'] = [uid]
188
- tmp_df['text'] = ['']
189
- prevs_df = pd.concat((prevs_df, tmp_df))
190
- # we can free up storage by deleting the image
191
- if len(prevs_df) > 500:
192
- oldest_path = prevs_df.iloc[6]['paths']
193
- if os.path.isfile(oldest_path):
194
- os.remove(oldest_path)
195
- else:
196
- # If it fails, inform the user.
197
- print("Error: %s file not found" % oldest_path)
198
- # only keep 50 images & embeddings & ips, then remove oldest besides calibrating
199
- prevs_df = pd.concat((prevs_df.iloc[:6], prevs_df.iloc[7:]))
200
-
201
- def pluck_img(user_id):
202
- # TODO pluck images based on similarity but also based on diversity by cluster every few times.
203
- rated_rows = prevs_df[[i[1]['user:rating'].get(user_id, None) is not None for i in prevs_df.iterrows()]]
204
- ems = rated_rows['embeddings'].to_list()
205
- ys = [i[user_id][0] for i in rated_rows['user:rating'].to_list()]
206
- user_emb = get_user_emb(ems, ys)
207
-
208
- not_rated_rows = prevs_df[[i[1]['user:rating'].get(user_id, 'gone') == 'gone' for i in prevs_df.iterrows()]]
209
- while len(not_rated_rows) == 0:
210
- not_rated_rows = prevs_df[[i[1]['user:rating'].get(user_id, 'gone') == 'gone' for i in prevs_df.iterrows()]]
211
- time.sleep(.1)
212
- # TODO optimize this lol
213
-
214
- # NOTE could opt for only showing their own or prioritizing their own media.
215
- unrated_from_user = not_rated_rows[[i[1]['from_user_id'] == user_id for i in not_rated_rows.iterrows()]]
216
-
217
- best_sim = -10000000
218
- for i in not_rated_rows.iterrows():
219
- # TODO sloppy .to but it is 3am.
220
- sim = torch.cosine_similarity(i[1]['embeddings'].detach().to('cpu'), user_emb.detach().to('cpu'), -1)
221
- if len(sim) > 1: sim = sim[1]
222
- if sim.squeeze() > best_sim:
223
- best_sim = sim
224
- best_row = i[1]
225
- img = best_row['paths']
226
- return img
227
-
228
- def next_image(calibrate_prompts, user_id):
229
- with torch.no_grad():
230
- # once we've done so many random calibration prompts out of the full media
231
- if len(m_calibrate) - len(calibrate_prompts) < 5:
232
- cal_video = calibrate_prompts.pop(random.randint(0, len(calibrate_prompts)-1))
233
- image = prevs_df[prevs_df['paths'] == cal_video]['paths'].to_list()[0]
234
- # we switch to just getting media by similarity.
235
- else:
236
- image = pluck_img(user_id)
237
- return image, calibrate_prompts
238
-
239
-
240
-
241
-
242
-
243
-
244
- def start(_, calibrate_prompts, user_id, request: gr.Request):
245
- user_id = int(str(time.time())[-7:].replace('.', ''))
246
- image, calibrate_prompts = next_image(calibrate_prompts, user_id)
247
- return [
248
- gr.Button(value='👍', interactive=True),
249
- gr.Button(value='Neither (Space)', interactive=True, visible=False),
250
- gr.Button(value='👎', interactive=True),
251
- gr.Button(value='Start', interactive=False),
252
- gr.Button(value='👍 Content', interactive=True, visible=False),
253
- gr.Button(value='👍 Style', interactive=True, visible=False),
254
- image,
255
- calibrate_prompts,
256
- user_id,
257
- ]
258
-
259
-
260
- def choose(img, choice, calibrate_prompts, user_id, request: gr.Request):
261
- global prevs_df
262
-
263
- if choice == '👍':
264
- choice = [1, 1]
265
- elif choice == 'Neither (Space)':
266
- img, calibrate_prompts = next_image(calibrate_prompts, user_id)
267
- return img, calibrate_prompts
268
- elif choice == '👎':
269
- choice = [0, 0]
270
- elif choice == '👍 Style':
271
- choice = [0, 1]
272
- elif choice == '👍 Content':
273
- choice = [1, 0]
274
- else:
275
- assert False, f'choice is {choice}'
276
-
277
- # if we detected NSFW, leave that area of latent space regardless of how they rated chosen.
278
- # TODO skip allowing rating & just continue
279
- if img is None:
280
- print('NSFW -- choice is disliked')
281
- choice = [0, 0]
282
-
283
- row_mask = [p.split('/')[-1] in img for p in prevs_df['paths'].to_list()]
284
- # if it's still in the dataframe, add the choice
285
- if len(prevs_df.loc[row_mask, 'user:rating']) > 0:
286
- prevs_df.loc[row_mask, 'user:rating'][0][user_id] = choice
287
- prevs_df.loc[row_mask, 'latest_user_to_rate'] = [user_id]
288
- else:
289
- print('Image apparently removed', img)
290
- img, calibrate_prompts = next_image(calibrate_prompts, user_id)
291
- return img, calibrate_prompts
292
-
293
- css = '''.gradio-container{max-width: 700px !important}
294
- #description{text-align: center}
295
- #description h1, #description h3{display: block}
296
- #description p{margin-top: 0}
297
- .fade-in-out {animation: fadeInOut 3s forwards}
298
- @keyframes fadeInOut {
299
- 0% {
300
- background: var(--bg-color);
301
- }
302
- 100% {
303
- background: var(--button-secondary-background-fill);
304
- }
305
- }
306
- '''
307
- js_head = '''
308
- <script>
309
- document.addEventListener('keydown', function(event) {
310
- if (event.key === 'a' || event.key === 'A') {
311
- // Trigger click on 'dislike' if 'A' is pressed
312
- document.getElementById('dislike').click();
313
- } else if (event.key === ' ' || event.keyCode === 32) {
314
- // Trigger click on 'neither' if Spacebar is pressed
315
- document.getElementById('neither').click();
316
- } else if (event.key === 'l' || event.key === 'L') {
317
- // Trigger click on 'like' if 'L' is pressed
318
- document.getElementById('like').click();
319
- }
320
- });
321
- function fadeInOut(button, color) {
322
- button.style.setProperty('--bg-color', color);
323
- button.classList.remove('fade-in-out');
324
- void button.offsetWidth; // This line forces a repaint by accessing a DOM property
325
-
326
- button.classList.add('fade-in-out');
327
- button.addEventListener('animationend', () => {
328
- button.classList.remove('fade-in-out'); // Reset the animation state
329
- }, {once: true});
330
- }
331
- document.body.addEventListener('click', function(event) {
332
- const target = event.target;
333
- if (target.id === 'dislike') {
334
- fadeInOut(target, '#ff1717');
335
- } else if (target.id === 'like') {
336
- fadeInOut(target, '#006500');
337
- } else if (target.id === 'neither') {
338
- fadeInOut(target, '#cccccc');
339
- }
340
- });
341
-
342
- </script>
343
- '''
344
-
345
- with gr.Blocks(head=js_head, css=css) as demo:
346
- gr.Markdown('''# The Other Tiger
347
- ### Generative Recommenders for Exporation of Possible Images
348
-
349
- Explore the latent space using binary feedback.
350
-
351
- [rynmurdock.github.io](https://rynmurdock.github.io/)
352
- ''', elem_id="description")
353
- user_id = gr.State()
354
- # calibration videos -- this is a misnomer now :D
355
- calibrate_prompts = gr.State( glob.glob('image_init/*') )
356
- def l():
357
- return None
358
-
359
- with gr.Row(elem_id='output-image'):
360
- img = gr.Image(
361
- label='Lightning',
362
- interactive=False,
363
- elem_id="output_im",
364
- type='filepath',
365
- height=700,
366
- width=700,
367
- )
368
-
369
-
370
-
371
- with gr.Row(equal_height=True):
372
- b3 = gr.Button(value='👎', interactive=False, elem_id="dislike")
373
-
374
- b2 = gr.Button(value='Neither (Space)', interactive=False, elem_id="neither", visible=False)
375
-
376
- b1 = gr.Button(value='👍', interactive=False, elem_id="like")
377
- with gr.Row(equal_height=True):
378
- b6 = gr.Button(value='👍 Style', interactive=False, elem_id="dislike like", visible=False)
379
-
380
- b5 = gr.Button(value='👍 Content', interactive=False, elem_id="like dislike", visible=False)
381
-
382
- b1.click(
383
- choose,
384
- [img, b1, calibrate_prompts, user_id],
385
- [img, calibrate_prompts, ],
386
- )
387
- b2.click(
388
- choose,
389
- [img, b2, calibrate_prompts, user_id],
390
- [img, calibrate_prompts, ],
391
- )
392
- b3.click(
393
- choose,
394
- [img, b3, calibrate_prompts, user_id],
395
- [img, calibrate_prompts, ],
396
- )
397
- b5.click(
398
- choose,
399
- [img, b5, calibrate_prompts, user_id],
400
- [img, calibrate_prompts, ],
401
- )
402
- b6.click(
403
- choose,
404
- [img, b6, calibrate_prompts, user_id],
405
- [img, calibrate_prompts, ],
406
- )
407
- with gr.Row():
408
- b4 = gr.Button(value='Start')
409
- b4.click(start,
410
- [b4, calibrate_prompts, user_id],
411
- [b1, b2, b3, b4, b5, b6, img, calibrate_prompts, user_id, ]
412
- )
413
- with gr.Row():
414
- html = gr.HTML('''<div style='text-align:center; font-size:20px'>You will calibrate for several images and then roam. When your media is generating, you may encounter others'.</ div><br><br><br>
415
-
416
- <br><br>
417
- <div style='text-align:center; font-size:14px'>Thanks to @multimodalart for their contributions to the demo, esp. the interface and @maxbittker for feedback.
418
- </ div>''')
419
-
420
- # TODO quiet logging
421
- scheduler = BackgroundScheduler()
422
- scheduler.add_job(func=background_next_image, trigger="interval", seconds=.2)
423
- scheduler.start()
424
-
425
- # TODO shouldn't call this before gradio launch, yeah?
426
- @spaces.GPU()
427
- def encode_space(x):
428
- im = (
429
- model.prior_pipe.image_processor(x, return_tensors="pt")
430
- .pixel_values[0]
431
- .unsqueeze(0)
432
- .to(dtype=model.prior_pipe.image_encoder.dtype, device=device)
433
- )
434
- im_emb = model.prior_pipe.image_encoder(im)["image_embeds"]
435
- return im_emb.detach().to('cpu').to(torch.float32)
436
-
437
- # NOTE:
438
- # media is moved into a random tmp folder so we need to parse filenames carefully.
439
- # do not have any cases where a file name is the same or could be `in` another filename
440
- # you also maybe can't use jpegs lmao
441
-
442
- # prep our calibration videos
443
- m_calibrate = glob.glob('image_init/*')
444
- for im in m_calibrate:
445
- tmp_df = pd.DataFrame(columns=['paths', 'embeddings', 'ips', 'user:rating', 'text', 'gemb', 'from_user_id'])
446
- tmp_df['paths'] = [im]
447
- image = Image.open(im).convert('RGB')
448
- im_emb = encode_space(image)
449
-
450
- tmp_df['embeddings'] = [im_emb.detach().to('cpu')]
451
- tmp_df['user:rating'] = [{' ': ' '}]
452
- tmp_df['text'] = ['']
453
-
454
- # seems to break things...
455
- tmp_df['from_user_id'] = [0]
456
- tmp_df['latest_user_to_rate'] = [0]
457
- prevs_df = pd.concat((prevs_df, tmp_df))
458
-
459
- glob_idx = 0
460
- demo.launch(share=True,)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
model.py DELETED
@@ -1,52 +0,0 @@
1
-
2
- import torch
3
- import logging
4
- from diffusers import DiffusionPipeline
5
-
6
- from prior.pipeline_kandinsky_prior import KandinskyPriorPipeline
7
- from prior.prior_transformer import PriorTransformer
8
-
9
-
10
- class Zoo(torch.nn.Module):
11
- def __init__(self, prior, prior_pipe, kandinsky_pipe, ) -> None:
12
- super().__init__()
13
- self.prior = prior
14
- self.prior_pipe = prior_pipe
15
- self.kandinsky_pipe = kandinsky_pipe
16
- self.pre_prior_transformer = None
17
- # NOTE we may get better perf from freezing our prior
18
- # and only training a transformer adapter?
19
-
20
- def forward(self, latents, preferred_embeds):
21
- pred = self.prior(latents, preferred_embeds)
22
- return pred
23
-
24
- def do_validation(self, images): # TODO constant val seed
25
- assert all([len(i) == 8 for i in images]), f'We have must have `k` images, not {len(images)}.'
26
- image_embeds, negative_image_embeds = self.prior_pipe(images).to_tuple()
27
- images = self.kandinsky_pipe(
28
- num_inference_steps=50,
29
- image_embeds=image_embeds,
30
- negative_image_embeds=negative_image_embeds,
31
- ).images
32
- images[0].save('latest_val.png')
33
- return images
34
-
35
- def get_model_and_tokenizer(path, device, dtype):
36
- prior = PriorTransformer.from_pretrained("ECLIPSE-Community/ECLIPSE_KandinskyV22_Prior"
37
- if path is None else path).to(device)
38
-
39
- pipe_prior = KandinskyPriorPipeline.from_pretrained("kandinsky-community/kandinsky-2-2-prior", prior=prior).to(device)
40
- pipe_prior.image_encoder = pipe_prior.image_encoder.to(device, dtype)
41
- # Note: don't set the prior to `dtype`` as it may be half precision,
42
- # and we're training with mixed precision
43
- # so we need to keep our full-precision weight for trained params
44
- kandinsky_pipe = DiffusionPipeline.from_pretrained("kandinsky-community/kandinsky-2-2-decoder").to(device, dtype)
45
- model = Zoo(prior, pipe_prior, kandinsky_pipe).to(device)
46
-
47
- return model, model.prior_pipe.image_encoder
48
-
49
- def get_optimizer(params, lr):
50
- logging.info(f'Training: {params}')
51
- optimizer = torch.optim.AdamW(params, lr=lr)
52
- return optimizer
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
image_init/10o.png → nsfweffnetv2-b02-3epochs.h5 RENAMED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:16edbcb1b5cab0d32244ac9faac2f9e25724e00532c867f0b1cd4808cacc1054
3
- size 388274
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:91422f388d1632c1af21b3d787b4f6c1a8e6114f600162d392b0bf285ff8a433
3
+ size 71027272
prior/__init__.py DELETED
File without changes
prior/pipeline_kandinsky_prior.py DELETED
@@ -1,546 +0,0 @@
1
- from dataclasses import dataclass
2
- from typing import List, Optional, Union
3
-
4
- import numpy as np
5
- import PIL
6
- import torch
7
- from transformers import (
8
- CLIPImageProcessor,
9
- CLIPTextModelWithProjection,
10
- CLIPTokenizer,
11
- CLIPVisionModelWithProjection,
12
- )
13
-
14
- from diffusers.models import PriorTransformer
15
- from diffusers.schedulers import UnCLIPScheduler
16
- from diffusers.utils import (
17
- BaseOutput,
18
- is_accelerate_available,
19
- is_accelerate_version,
20
- logging,
21
- replace_example_docstring,
22
- )
23
- from diffusers.pipelines.pipeline_utils import DiffusionPipeline
24
-
25
-
26
- logger = logging.get_logger(__name__) # pylint: disable=invalid-name
27
-
28
- EXAMPLE_DOC_STRING = """
29
- Examples:
30
- ```py
31
- >>> from diffusers import KandinskyPipeline, KandinskyPriorPipeline
32
- >>> import torch
33
-
34
- >>> pipe_prior = KandinskyPriorPipeline.from_pretrained("kandinsky-community/kandinsky-2-1-prior")
35
- >>> pipe_prior.to("cuda")
36
-
37
- >>> prompt = "red cat, 4k photo"
38
- >>> out = pipe_prior(prompt)
39
- >>> image_emb = out.image_embeds
40
- >>> negative_image_emb = out.negative_image_embeds
41
-
42
- >>> pipe = KandinskyPipeline.from_pretrained("kandinsky-community/kandinsky-2-1")
43
- >>> pipe.to("cuda")
44
-
45
- >>> image = pipe(
46
- ... prompt,
47
- ... image_embeds=image_emb,
48
- ... negative_image_embeds=negative_image_emb,
49
- ... height=768,
50
- ... width=768,
51
- ... num_inference_steps=100,
52
- ... ).images
53
-
54
- >>> image[0].save("cat.png")
55
- ```
56
- """
57
-
58
- EXAMPLE_INTERPOLATE_DOC_STRING = """
59
- Examples:
60
- ```py
61
- >>> from diffusers import KandinskyPriorPipeline, KandinskyPipeline
62
- >>> from diffusers.utils import load_image
63
- >>> import PIL
64
-
65
- >>> import torch
66
- >>> from torchvision import transforms
67
-
68
- >>> pipe_prior = KandinskyPriorPipeline.from_pretrained(
69
- ... "kandinsky-community/kandinsky-2-1-prior", torch_dtype=torch.float16
70
- ... )
71
- >>> pipe_prior.to("cuda")
72
-
73
- >>> img1 = load_image(
74
- ... "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main"
75
- ... "/kandinsky/cat.png"
76
- ... )
77
-
78
- >>> img2 = load_image(
79
- ... "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main"
80
- ... "/kandinsky/starry_night.jpeg"
81
- ... )
82
-
83
- >>> images_texts = ["a cat", img1, img2]
84
- >>> weights = [0.3, 0.3, 0.4]
85
- >>> image_emb, zero_image_emb = pipe_prior.interpolate(images_texts, weights)
86
-
87
- >>> pipe = KandinskyPipeline.from_pretrained("kandinsky-community/kandinsky-2-1", torch_dtype=torch.float16)
88
- >>> pipe.to("cuda")
89
-
90
- >>> image = pipe(
91
- ... "",
92
- ... image_embeds=image_emb,
93
- ... negative_image_embeds=zero_image_emb,
94
- ... height=768,
95
- ... width=768,
96
- ... num_inference_steps=150,
97
- ... ).images[0]
98
-
99
- >>> image.save("starry_cat.png")
100
- ```
101
- """
102
-
103
-
104
- @dataclass
105
- class KandinskyPriorPipelineOutput(BaseOutput):
106
- """
107
- Output class for KandinskyPriorPipeline.
108
-
109
- Args:
110
- image_embeds (`torch.FloatTensor`)
111
- clip image embeddings for text prompt
112
- negative_image_embeds (`List[PIL.Image.Image]` or `np.ndarray`)
113
- clip image embeddings for unconditional tokens
114
- """
115
-
116
- image_embeds: Union[torch.FloatTensor, np.ndarray]
117
- negative_image_embeds: Union[torch.FloatTensor, np.ndarray]
118
-
119
-
120
- class KandinskyPriorPipeline(DiffusionPipeline):
121
- """
122
- Pipeline for generating image prior for Kandinsky
123
-
124
- This model inherits from [`DiffusionPipeline`]. Check the superclass documentation for the generic methods the
125
- library implements for all the pipelines (such as downloading or saving, running on a particular device, etc.)
126
-
127
- Args:
128
- prior ([`PriorTransformer`]):
129
- The canonincal unCLIP prior to approximate the image embedding from the text embedding.
130
- image_encoder ([`CLIPVisionModelWithProjection`]):
131
- Frozen image-encoder.
132
- text_encoder ([`CLIPTextModelWithProjection`]):
133
- Frozen text-encoder.
134
- tokenizer (`CLIPTokenizer`):
135
- Tokenizer of class
136
- [CLIPTokenizer](https://huggingface.co/docs/transformers/v4.21.0/en/model_doc/clip#transformers.CLIPTokenizer).
137
- scheduler ([`UnCLIPScheduler`]):
138
- A scheduler to be used in combination with `prior` to generate image embedding.
139
- """
140
-
141
- _exclude_from_cpu_offload = ["prior"]
142
-
143
- def __init__(
144
- self,
145
- prior: PriorTransformer,
146
- image_encoder: CLIPVisionModelWithProjection,
147
- text_encoder: CLIPTextModelWithProjection,
148
- tokenizer: CLIPTokenizer,
149
- scheduler: UnCLIPScheduler,
150
- image_processor: CLIPImageProcessor,
151
- ):
152
- super().__init__()
153
-
154
- self.register_modules(
155
- prior=prior,
156
- text_encoder=text_encoder,
157
- tokenizer=tokenizer,
158
- scheduler=scheduler,
159
- image_encoder=image_encoder,
160
- image_processor=image_processor,
161
- )
162
-
163
- @torch.no_grad()
164
- @replace_example_docstring(EXAMPLE_INTERPOLATE_DOC_STRING)
165
- def interpolate(
166
- self,
167
- images_and_prompts: List[Union[str, PIL.Image.Image, torch.FloatTensor]],
168
- weights: List[float],
169
- num_images_per_prompt: int = 1,
170
- num_inference_steps: int = 25,
171
- generator: Optional[Union[torch.Generator, List[torch.Generator]]] = None,
172
- latents: Optional[torch.FloatTensor] = None,
173
- negative_prior_prompt: Optional[str] = None,
174
- negative_prompt: str = "",
175
- guidance_scale: float = 4.0,
176
- device=None,
177
- ):
178
- """
179
- Function invoked when using the prior pipeline for interpolation.
180
-
181
- Args:
182
- images_and_prompts (`List[Union[str, PIL.Image.Image, torch.FloatTensor]]`):
183
- list of prompts and images to guide the image generation.
184
- weights: (`List[float]`):
185
- list of weights for each condition in `images_and_prompts`
186
- num_images_per_prompt (`int`, *optional*, defaults to 1):
187
- The number of images to generate per prompt.
188
- num_inference_steps (`int`, *optional*, defaults to 25):
189
- The number of denoising steps. More denoising steps usually lead to a higher quality image at the
190
- expense of slower inference.
191
- generator (`torch.Generator` or `List[torch.Generator]`, *optional*):
192
- One or a list of [torch generator(s)](https://pytorch.org/docs/stable/generated/torch.Generator.html)
193
- to make generation deterministic.
194
- latents (`torch.FloatTensor`, *optional*):
195
- Pre-generated noisy latents, sampled from a Gaussian distribution, to be used as inputs for image
196
- generation. Can be used to tweak the same generation with different prompts. If not provided, a latents
197
- tensor will ge generated by sampling using the supplied random `generator`.
198
- negative_prior_prompt (`str`, *optional*):
199
- The prompt not to guide the prior diffusion process. Ignored when not using guidance (i.e., ignored if
200
- `guidance_scale` is less than `1`).
201
- negative_prompt (`str` or `List[str]`, *optional*):
202
- The prompt not to guide the image generation. Ignored when not using guidance (i.e., ignored if
203
- `guidance_scale` is less than `1`).
204
- guidance_scale (`float`, *optional*, defaults to 4.0):
205
- Guidance scale as defined in [Classifier-Free Diffusion Guidance](https://arxiv.org/abs/2207.12598).
206
- `guidance_scale` is defined as `w` of equation 2. of [Imagen
207
- Paper](https://arxiv.org/pdf/2205.11487.pdf). Guidance scale is enabled by setting `guidance_scale >
208
- 1`. Higher guidance scale encourages to generate images that are closely linked to the text `prompt`,
209
- usually at the expense of lower image quality.
210
-
211
- Examples:
212
-
213
- Returns:
214
- [`KandinskyPriorPipelineOutput`] or `tuple`
215
- """
216
-
217
- device = device or self.device
218
-
219
- if len(images_and_prompts) != len(weights):
220
- raise ValueError(
221
- f"`images_and_prompts` contains {len(images_and_prompts)} items and `weights` contains {len(weights)} items - they should be lists of same length"
222
- )
223
-
224
- image_embeddings = []
225
- for cond, weight in zip(images_and_prompts, weights):
226
- if isinstance(cond, str):
227
- image_emb = self(
228
- cond,
229
- num_inference_steps=num_inference_steps,
230
- num_images_per_prompt=num_images_per_prompt,
231
- generator=generator,
232
- latents=latents,
233
- negative_prompt=negative_prior_prompt,
234
- guidance_scale=guidance_scale,
235
- ).image_embeds
236
-
237
- elif isinstance(cond, (PIL.Image.Image, torch.Tensor)):
238
- if isinstance(cond, PIL.Image.Image):
239
- cond = (
240
- self.image_processor(cond, return_tensors="pt")
241
- .pixel_values[0]
242
- .unsqueeze(0)
243
- .to(dtype=self.image_encoder.dtype, device=device)
244
- )
245
-
246
- image_emb = self.image_encoder(cond)["image_embeds"]
247
-
248
- else:
249
- raise ValueError(
250
- f"`images_and_prompts` can only contains elements to be of type `str`, `PIL.Image.Image` or `torch.Tensor` but is {type(cond)}"
251
- )
252
-
253
- image_embeddings.append(image_emb * weight)
254
-
255
- image_emb = torch.cat(image_embeddings).sum(dim=0, keepdim=True)
256
-
257
- out_zero = self(
258
- negative_prompt,
259
- num_inference_steps=num_inference_steps,
260
- num_images_per_prompt=num_images_per_prompt,
261
- generator=generator,
262
- latents=latents,
263
- negative_prompt=negative_prior_prompt,
264
- guidance_scale=guidance_scale,
265
- )
266
- zero_image_emb = (
267
- out_zero.negative_image_embeds
268
- if negative_prompt == ""
269
- else out_zero.image_embeds
270
- )
271
-
272
- return KandinskyPriorPipelineOutput(
273
- image_embeds=image_emb, negative_image_embeds=zero_image_emb
274
- )
275
-
276
- # Copied from diffusers.pipelines.unclip.pipeline_unclip.UnCLIPPipeline.prepare_latents
277
- def prepare_latents(self, shape, dtype, device, generator, latents, scheduler):
278
- if latents is None:
279
- latents = torch.randn(
280
- shape, generator=generator, device=device, dtype=dtype
281
- )
282
- else:
283
- if latents.shape != shape:
284
- raise ValueError(
285
- f"Unexpected latents shape, got {latents.shape}, expected {shape}"
286
- )
287
- latents = latents.to(device)
288
-
289
- latents = latents * scheduler.init_noise_sigma
290
- return latents
291
-
292
- def get_zero_embed(self, batch_size=1, device=None):
293
- device = device or self.device
294
- zero_img = torch.zeros(
295
- 1,
296
- 3,
297
- self.image_encoder.config.image_size,
298
- self.image_encoder.config.image_size,
299
- ).to(device=device, dtype=self.image_encoder.dtype)
300
- zero_image_emb = self.image_encoder(zero_img)["image_embeds"]
301
- zero_image_emb = zero_image_emb.repeat(batch_size, 1)
302
- return zero_image_emb
303
-
304
- def _encode_prompt(
305
- self,
306
- prompt,
307
- device,
308
- num_images_per_prompt,
309
- do_classifier_free_guidance,
310
- negative_prompt=None,
311
- ):
312
- batch_size = len(prompt) if isinstance(prompt, list) else 1
313
- # get prompt text embeddings
314
- cond = (
315
- self.image_processor(prompt, return_tensors="pt")
316
- .pixel_values[0]
317
- .unsqueeze(0)
318
- .to(dtype=self.image_encoder.dtype, device=device)
319
- )
320
- prompt_embeds = self.image_encoder(cond)["image_embeds"]
321
-
322
- prompt_embeds = prompt_embeds.repeat_interleave(num_images_per_prompt, dim=0)
323
-
324
- if do_classifier_free_guidance:
325
- if negative_prompt is None:
326
- uncond_tokens = self.get_zero_embed(batch_size=prompt_embeds.shape[0])
327
- elif type(prompt) is not type(negative_prompt):
328
- raise TypeError(
329
- f"`negative_prompt` should be the same type to `prompt`, but got {type(negative_prompt)} !="
330
- f" {type(prompt)}."
331
- )
332
- elif batch_size != len(negative_prompt):
333
- raise ValueError(
334
- f"`negative_prompt`: {negative_prompt} has batch size {len(negative_prompt)}, but `prompt`:"
335
- f" {prompt} has batch size {batch_size}. Please make sure that passed `negative_prompt` matches"
336
- " the batch size of `prompt`."
337
- )
338
- else:
339
- uncond_tokens = negative_prompt
340
-
341
- cond = (
342
- self.image_processor(uncond_tokens, return_tensors="pt")
343
- .pixel_values[0]
344
- .unsqueeze(0)
345
- .to(dtype=self.image_encoder.dtype, device=device)
346
- )
347
-
348
- negative_prompt_embeds = self.image_encoder(cond)["image_embeds"]
349
-
350
- seq_len = negative_prompt_embeds.shape[1]
351
- negative_prompt_embeds = negative_prompt_embeds.repeat(
352
- 1, num_images_per_prompt
353
- )
354
- negative_prompt_embeds = negative_prompt_embeds.view(
355
- batch_size * num_images_per_prompt, seq_len
356
- )
357
-
358
- # For classifier free guidance, we need to do two forward passes.
359
- # Here we concatenate the unconditional and text embeddings into a single batch
360
- # to avoid doing two forward passes
361
- prompt_embeds = torch.cat([negative_prompt_embeds, prompt_embeds])
362
- return prompt_embeds, None
363
-
364
- def enable_model_cpu_offload(self, gpu_id=0):
365
- r"""
366
- Offloads all models to CPU using accelerate, reducing memory usage with a low impact on performance. Compared
367
- to `enable_sequential_cpu_offload`, this method moves one whole model at a time to the GPU when its `forward`
368
- method is called, and the model remains in GPU until the next model runs. Memory savings are lower than with
369
- `enable_sequential_cpu_offload`, but performance is much better due to the iterative execution of the `unet`.
370
- """
371
- if is_accelerate_available() and is_accelerate_version(">=", "0.17.0.dev0"):
372
- from accelerate import cpu_offload_with_hook
373
- else:
374
- raise ImportError(
375
- "`enable_model_cpu_offload` requires `accelerate v0.17.0` or higher."
376
- )
377
-
378
- device = torch.device(f"cuda:{gpu_id}")
379
-
380
- if self.device.type != "cpu":
381
- self.to("cpu", silence_dtype_warnings=True)
382
- torch.cuda.empty_cache() # otherwise we don't see the memory savings (but they probably exist)
383
-
384
- hook = None
385
- for cpu_offloaded_model in [self.text_encoder, self.prior]:
386
- _, hook = cpu_offload_with_hook(
387
- cpu_offloaded_model, device, prev_module_hook=hook
388
- )
389
-
390
- # We'll offload the last model manually.
391
- self.prior_hook = hook
392
-
393
- _, hook = cpu_offload_with_hook(
394
- self.image_encoder, device, prev_module_hook=self.prior_hook
395
- )
396
-
397
- self.final_offload_hook = hook
398
-
399
- @torch.no_grad()
400
- @replace_example_docstring(EXAMPLE_DOC_STRING)
401
- def __call__(
402
- self,
403
- prompt: Union[str, List[str]],
404
- k,
405
- negative_prompt: Optional[Union[str, List[str]]] = None,
406
- num_images_per_prompt: int = 1,
407
- num_inference_steps: int = 25,
408
- generator: Optional[Union[torch.Generator, List[torch.Generator]]] = None,
409
- latents: Optional[torch.FloatTensor] = None,
410
- guidance_scale: float = 4.0,
411
- output_type: Optional[str] = "pt",
412
- return_dict: bool = True,
413
- ):
414
- """
415
- Function invoked when calling the pipeline for generation.
416
-
417
- Args:
418
- prompt (`str` or `List[str]`):
419
- The prompt or prompts to guide the image generation.
420
- negative_prompt (`str` or `List[str]`, *optional*):
421
- The prompt or prompts not to guide the image generation. Ignored when not using guidance (i.e., ignored
422
- if `guidance_scale` is less than `1`).
423
- num_images_per_prompt (`int`, *optional*, defaults to 1):
424
- The number of images to generate per prompt.
425
- num_inference_steps (`int`, *optional*, defaults to 25):
426
- The number of denoising steps. More denoising steps usually lead to a higher quality image at the
427
- expense of slower inference.
428
- generator (`torch.Generator` or `List[torch.Generator]`, *optional*):
429
- One or a list of [torch generator(s)](https://pytorch.org/docs/stable/generated/torch.Generator.html)
430
- to make generation deterministic.
431
- latents (`torch.FloatTensor`, *optional*):
432
- Pre-generated noisy latents, sampled from a Gaussian distribution, to be used as inputs for image
433
- generation. Can be used to tweak the same generation with different prompts. If not provided, a latents
434
- tensor will ge generated by sampling using the supplied random `generator`.
435
- guidance_scale (`float`, *optional*, defaults to 4.0):
436
- Guidance scale as defined in [Classifier-Free Diffusion Guidance](https://arxiv.org/abs/2207.12598).
437
- `guidance_scale` is defined as `w` of equation 2. of [Imagen
438
- Paper](https://arxiv.org/pdf/2205.11487.pdf). Guidance scale is enabled by setting `guidance_scale >
439
- 1`. Higher guidance scale encourages to generate images that are closely linked to the text `prompt`,
440
- usually at the expense of lower image quality.
441
- output_type (`str`, *optional*, defaults to `"pt"`):
442
- The output format of the generate image. Choose between: `"np"` (`np.array`) or `"pt"`
443
- (`torch.Tensor`).
444
- return_dict (`bool`, *optional*, defaults to `True`):
445
- Whether or not to return a [`~pipelines.ImagePipelineOutput`] instead of a plain tuple.
446
-
447
- Examples:
448
-
449
- Returns:
450
- [`KandinskyPriorPipelineOutput`] or `tuple`
451
- """
452
-
453
- # if the negative prompt is defined we double the batch size to
454
- # directly retrieve the negative prompt embedding
455
- if negative_prompt is not None:
456
- prompt = prompt + negative_prompt
457
- negative_prompt = 2 * negative_prompt
458
-
459
- device = self._execution_device
460
-
461
- batch_size = len(prompt)
462
- batch_size = batch_size * num_images_per_prompt
463
-
464
- full_prompt = []
465
- for b in prompt: # TODO of course vectorize this lol
466
- full_seq = []
467
- for p in b:
468
- prompt_embeds, text_mask = self._encode_prompt(
469
- p, device, num_images_per_prompt, False, negative_prompt
470
- )
471
- full_seq.append(prompt_embeds)
472
- prompt_embeds = torch.cat(full_seq, 0)
473
- full_prompt.append(prompt_embeds)
474
- prompt_embeds = torch.stack(full_prompt)
475
- if prompt_embeds.shape[1] < k:
476
- prompt_embeds = torch.nn.functional.pad(prompt_embeds, [0, 0, 0, k-prompt_embeds.shape[1]])
477
- assert prompt_embeds.shape[1] == k, f"The model is set to take `k`` cond image embeds but is shape {prompt_embeds.shape}"
478
-
479
- prompt_embeds = prompt_embeds.to('cuda')
480
-
481
- hidden_states = torch.randn(
482
- (batch_size, prompt_embeds.shape[-1]),
483
- device=prompt_embeds.device,
484
- dtype=prompt_embeds.dtype,
485
- generator=generator,
486
- )
487
-
488
- latents = self.prior(
489
- hidden_states,
490
- proj_embedding=prompt_embeds,
491
- encoder_hidden_states=prompt_embeds,
492
- attention_mask=text_mask,
493
- ).predicted_image_embedding
494
-
495
- image_embeddings = latents
496
-
497
- # if negative prompt has been defined, we retrieve split the image embedding into two
498
- if negative_prompt is None:
499
- # zero_embeds = self.get_zero_embed(latents.shape[0], device=latents.device)
500
-
501
- # use the same hidden states or different hidden states?
502
- # hidden_states = torch.randn(
503
- # (batch_size, prompt_embeds.shape[-1]),
504
- # device=prompt_embeds.device,
505
- # dtype=prompt_embeds.dtype,
506
- # generator=generator,
507
- # )
508
-
509
- latents = self.prior(
510
- hidden_states,
511
- proj_embedding=torch.zeros_like(prompt_embeds),
512
- encoder_hidden_states=torch.zeros_like(prompt_embeds),
513
- attention_mask=text_mask,
514
- ).predicted_image_embedding
515
-
516
- zero_embeds = latents
517
-
518
- if (
519
- hasattr(self, "final_offload_hook")
520
- and self.final_offload_hook is not None
521
- ):
522
- self.final_offload_hook.offload()
523
- else:
524
- image_embeddings, zero_embeds = image_embeddings.chunk(2)
525
-
526
- if (
527
- hasattr(self, "final_offload_hook")
528
- and self.final_offload_hook is not None
529
- ):
530
- self.prior_hook.offload()
531
-
532
- if output_type not in ["pt", "np"]:
533
- raise ValueError(
534
- f"Only the output types `pt` and `np` are supported not output_type={output_type}"
535
- )
536
-
537
- if output_type == "np":
538
- image_embeddings = image_embeddings.cpu().numpy()
539
- zero_embeds = zero_embeds.cpu().numpy()
540
-
541
- if not return_dict:
542
- return (image_embeddings, zero_embeds)
543
-
544
- return KandinskyPriorPipelineOutput(
545
- image_embeds=image_embeddings, negative_image_embeds=zero_embeds
546
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
prior/prior_transformer.py DELETED
@@ -1,369 +0,0 @@
1
- import sys
2
- sys.path.append("..")
3
-
4
- from dataclasses import dataclass
5
- from typing import Dict, Optional, Union
6
-
7
-
8
- import torch
9
- import torch.nn.functional as F
10
- from torch import nn
11
-
12
- from diffusers.configuration_utils import ConfigMixin, register_to_config
13
- from diffusers.utils import BaseOutput
14
- from diffusers.models.attention import BasicTransformerBlock
15
- from diffusers.models.attention_processor import AttentionProcessor, AttnProcessor
16
- from diffusers.models.embeddings import TimestepEmbedding, Timesteps
17
- from diffusers.models.modeling_utils import ModelMixin
18
-
19
-
20
- @dataclass
21
- class PriorTransformerOutput(BaseOutput):
22
- """
23
- The output of [`PriorTransformer`].
24
-
25
- Args:
26
- predicted_image_embedding (`torch.FloatTensor` of shape `(batch_size, embedding_dim)`):
27
- The predicted CLIP image embedding conditioned on the CLIP text embedding input.
28
- """
29
-
30
- predicted_image_embedding: torch.FloatTensor
31
-
32
-
33
- class PriorTransformer(ModelMixin, ConfigMixin):
34
- """
35
- A Prior Transformer model.
36
-
37
- Parameters:
38
- num_attention_heads (`int`, *optional*, defaults to 32): The number of heads to use for multi-head attention.
39
- attention_head_dim (`int`, *optional*, defaults to 64): The number of channels in each head.
40
- num_layers (`int`, *optional*, defaults to 20): The number of layers of Transformer blocks to use.
41
- embedding_dim (`int`, *optional*, defaults to 768): The dimension of the model input `hidden_states`
42
- num_embeddings (`int`, *optional*, defaults to 77):
43
- The number of embeddings of the model input `hidden_states`
44
- additional_embeddings (`int`, *optional*, defaults to 4): The number of additional tokens appended to the
45
- projected `hidden_states`. The actual length of the used `hidden_states` is `num_embeddings +
46
- additional_embeddings`.
47
- dropout (`float`, *optional*, defaults to 0.0): The dropout probability to use.
48
- time_embed_act_fn (`str`, *optional*, defaults to 'silu'):
49
- The activation function to use to create timestep embeddings.
50
- norm_in_type (`str`, *optional*, defaults to None): The normalization layer to apply on hidden states before
51
- passing to Transformer blocks. Set it to `None` if normalization is not needed.
52
- embedding_proj_norm_type (`str`, *optional*, defaults to None):
53
- The normalization layer to apply on the input `proj_embedding`. Set it to `None` if normalization is not
54
- needed.
55
- encoder_hid_proj_type (`str`, *optional*, defaults to `linear`):
56
- The projection layer to apply on the input `encoder_hidden_states`. Set it to `None` if
57
- `encoder_hidden_states` is `None`.
58
- added_emb_type (`str`, *optional*, defaults to `prd`): Additional embeddings to condition the model.
59
- Choose from `prd` or `None`. if choose `prd`, it will prepend a token indicating the (quantized) dot
60
- product between the text embedding and image embedding as proposed in the unclip paper
61
- https://arxiv.org/abs/2204.06125 If it is `None`, no additional embeddings will be prepended.
62
- time_embed_dim (`int, *optional*, defaults to None): The dimension of timestep embeddings.
63
- If None, will be set to `num_attention_heads * attention_head_dim`
64
- embedding_proj_dim (`int`, *optional*, default to None):
65
- The dimension of `proj_embedding`. If None, will be set to `embedding_dim`.
66
- clip_embed_dim (`int`, *optional*, default to None):
67
- The dimension of the output. If None, will be set to `embedding_dim`.
68
- """
69
-
70
- @register_to_config
71
- def __init__(
72
- self,
73
- num_attention_heads: int = 32,
74
- attention_head_dim: int = 64,
75
- num_layers: int = 20,
76
- embedding_dim: int = 768,
77
- num_embeddings=77,
78
- additional_embeddings=3, # as we have remvoed the time embedding
79
- dropout: float = 0.0,
80
- # time_embed_act_fn: str = "silu",
81
- norm_in_type: Optional[str] = None, # layer
82
- embedding_proj_norm_type: Optional[str] = None, # layer
83
- encoder_hid_proj_type: Optional[str] = "linear", # linear
84
- added_emb_type: Optional[str] = "prd", # prd
85
- # time_embed_dim: Optional[int] = None,
86
- embedding_proj_dim: Optional[int] = None,
87
- clip_embed_dim: Optional[int] = None,
88
- ):
89
- super().__init__()
90
- self.num_attention_heads = num_attention_heads
91
- self.attention_head_dim = attention_head_dim
92
- inner_dim = num_attention_heads * attention_head_dim
93
- self.additional_embeddings = additional_embeddings
94
-
95
- # time_embed_dim = time_embed_dim or inner_dim
96
- embedding_proj_dim = embedding_proj_dim or embedding_dim
97
- clip_embed_dim = clip_embed_dim or embedding_dim
98
-
99
- # self.time_proj = Timesteps(inner_dim, True, 0)
100
- # self.time_embedding = TimestepEmbedding(inner_dim, time_embed_dim, out_dim=inner_dim, act_fn=time_embed_act_fn)
101
-
102
- self.proj_in = nn.Linear(embedding_dim, inner_dim)
103
-
104
- if embedding_proj_norm_type is None:
105
- self.embedding_proj_norm = None
106
- elif embedding_proj_norm_type == "layer":
107
- self.embedding_proj_norm = nn.LayerNorm(embedding_proj_dim)
108
- else:
109
- raise ValueError(f"unsupported embedding_proj_norm_type: {embedding_proj_norm_type}")
110
-
111
- self.embedding_proj = nn.Linear(embedding_proj_dim, inner_dim)
112
-
113
- if encoder_hid_proj_type is None:
114
- self.encoder_hidden_states_proj = None
115
- elif encoder_hid_proj_type == "linear":
116
- self.encoder_hidden_states_proj = nn.Linear(embedding_dim, inner_dim)
117
- else:
118
- raise ValueError(f"unsupported encoder_hid_proj_type: {encoder_hid_proj_type}")
119
-
120
- self.positional_embedding = nn.Parameter(torch.zeros(1, num_embeddings + additional_embeddings, inner_dim))
121
-
122
- if added_emb_type == "prd":
123
- self.prd_embedding = nn.Parameter(torch.zeros(1, 1, inner_dim))
124
- elif added_emb_type is None:
125
- self.prd_embedding = None
126
- else:
127
- raise ValueError(
128
- f"`added_emb_type`: {added_emb_type} is not supported. Make sure to choose one of `'prd'` or `None`."
129
- )
130
-
131
- self.transformer_blocks = nn.ModuleList(
132
- [
133
- BasicTransformerBlock(
134
- inner_dim,
135
- num_attention_heads,
136
- attention_head_dim,
137
- dropout=dropout,
138
- activation_fn="gelu",
139
- attention_bias=True,
140
- )
141
- for d in range(num_layers)
142
- ]
143
- )
144
-
145
- if norm_in_type == "layer":
146
- self.norm_in = nn.LayerNorm(inner_dim)
147
- elif norm_in_type is None:
148
- self.norm_in = None
149
- else:
150
- raise ValueError(f"Unsupported norm_in_type: {norm_in_type}.")
151
-
152
- self.norm_out = nn.LayerNorm(inner_dim)
153
-
154
- self.proj_to_clip_embeddings = nn.Linear(inner_dim, clip_embed_dim)
155
-
156
- causal_attention_mask = torch.full(
157
- [num_embeddings + additional_embeddings, num_embeddings + additional_embeddings], -10000.0
158
- )
159
- causal_attention_mask.triu_(1)
160
- causal_attention_mask = causal_attention_mask[None, ...]
161
- self.register_buffer("causal_attention_mask", causal_attention_mask, persistent=False)
162
-
163
- self.clip_mean = nn.Parameter(torch.zeros(1, clip_embed_dim))
164
- self.clip_std = nn.Parameter(torch.zeros(1, clip_embed_dim))
165
-
166
- @property
167
- # Copied from diffusers.models.unet_2d_condition.UNet2DConditionModel.attn_processors
168
- def attn_processors(self) -> Dict[str, AttentionProcessor]:
169
- r"""
170
- Returns:
171
- `dict` of attention processors: A dictionary containing all attention processors used in the model with
172
- indexed by its weight name.
173
- """
174
- # set recursively
175
- processors = {}
176
-
177
- def fn_recursive_add_processors(name: str, module: torch.nn.Module, processors: Dict[str, AttentionProcessor]):
178
- if hasattr(module, "set_processor"):
179
- processors[f"{name}.processor"] = module.processor
180
-
181
- for sub_name, child in module.named_children():
182
- fn_recursive_add_processors(f"{name}.{sub_name}", child, processors)
183
-
184
- return processors
185
-
186
- for name, module in self.named_children():
187
- fn_recursive_add_processors(name, module, processors)
188
-
189
- return processors
190
-
191
- # Copied from diffusers.models.unet_2d_condition.UNet2DConditionModel.set_attn_processor
192
- def set_attn_processor(self, processor: Union[AttentionProcessor, Dict[str, AttentionProcessor]]):
193
- r"""
194
- Sets the attention processor to use to compute attention.
195
-
196
- Parameters:
197
- processor (`dict` of `AttentionProcessor` or only `AttentionProcessor`):
198
- The instantiated processor class or a dictionary of processor classes that will be set as the processor
199
- for **all** `Attention` layers.
200
-
201
- If `processor` is a dict, the key needs to define the path to the corresponding cross attention
202
- processor. This is strongly recommended when setting trainable attention processors.
203
-
204
- """
205
- count = len(self.attn_processors.keys())
206
-
207
- if isinstance(processor, dict) and len(processor) != count:
208
- raise ValueError(
209
- f"A dict of processors was passed, but the number of processors {len(processor)} does not match the"
210
- f" number of attention layers: {count}. Please make sure to pass {count} processor classes."
211
- )
212
-
213
- def fn_recursive_attn_processor(name: str, module: torch.nn.Module, processor):
214
- if hasattr(module, "set_processor"):
215
- if not isinstance(processor, dict):
216
- module.set_processor(processor)
217
- else:
218
- module.set_processor(processor.pop(f"{name}.processor"))
219
-
220
- for sub_name, child in module.named_children():
221
- fn_recursive_attn_processor(f"{name}.{sub_name}", child, processor)
222
-
223
- for name, module in self.named_children():
224
- fn_recursive_attn_processor(name, module, processor)
225
-
226
- # Copied from diffusers.models.unet_2d_condition.UNet2DConditionModel.set_default_attn_processor
227
- def set_default_attn_processor(self):
228
- """
229
- Disables custom attention processors and sets the default attention implementation.
230
- """
231
- self.set_attn_processor(AttnProcessor())
232
-
233
- def forward(
234
- self,
235
- hidden_states,
236
- # timestep: Union[torch.Tensor, float, int],
237
- proj_embedding: torch.FloatTensor,
238
- encoder_hidden_states: Optional[torch.FloatTensor] = None,
239
- attention_mask: Optional[torch.BoolTensor] = None,
240
- return_dict: bool = True,
241
- ):
242
- """
243
- The [`PriorTransformer`] forward method.
244
-
245
- Args:
246
- hidden_states (`torch.FloatTensor` of shape `(batch_size, embedding_dim)`):
247
- The currently predicted image embeddings.
248
- timestep (`torch.LongTensor`):
249
- Current denoising step.
250
- proj_embedding (`torch.FloatTensor` of shape `(batch_size, embedding_dim)`):
251
- Projected embedding vector the denoising process is conditioned on.
252
- encoder_hidden_states (`torch.FloatTensor` of shape `(batch_size, num_embeddings, embedding_dim)`):
253
- Hidden states of the text embeddings the denoising process is conditioned on.
254
- attention_mask (`torch.BoolTensor` of shape `(batch_size, num_embeddings)`):
255
- Text mask for the text embeddings.
256
- return_dict (`bool`, *optional*, defaults to `True`):
257
- Whether or not to return a [`~models.prior_transformer.PriorTransformerOutput`] instead of a plain
258
- tuple.
259
-
260
- Returns:
261
- [`~models.prior_transformer.PriorTransformerOutput`] or `tuple`:
262
- If return_dict is True, a [`~models.prior_transformer.PriorTransformerOutput`] is returned, otherwise a
263
- tuple is returned where the first element is the sample tensor.
264
- """
265
- batch_size = hidden_states.shape[0]
266
-
267
- # timesteps = timestep
268
- # if not torch.is_tensor(timesteps):
269
- # timesteps = torch.tensor([timesteps], dtype=torch.long, device=hidden_states.device)
270
- # elif torch.is_tensor(timesteps) and len(timesteps.shape) == 0:
271
- # timesteps = timesteps[None].to(hidden_states.device)
272
-
273
- # broadcast to batch dimension in a way that's compatible with ONNX/Core ML
274
- # timesteps = timesteps * torch.ones(batch_size, dtype=timesteps.dtype, device=timesteps.device)
275
-
276
- # timesteps_projected = self.time_proj(timesteps)
277
-
278
- # timesteps does not contain any weights and will always return f32 tensors
279
- # but time_embedding might be fp16, so we need to cast here.
280
- # timesteps_projected = timesteps_projected.to(dtype=self.dtype)
281
- # time_embeddings = self.time_embedding(timesteps_projected)
282
-
283
- if self.embedding_proj_norm is not None:
284
- proj_embedding = self.embedding_proj_norm(proj_embedding)
285
-
286
- proj_embeddings = self.embedding_proj(proj_embedding)
287
- if self.encoder_hidden_states_proj is not None and encoder_hidden_states is not None:
288
- encoder_hidden_states = self.encoder_hidden_states_proj(encoder_hidden_states)
289
- # elif self.encoder_hidden_states_proj is not None and encoder_hidden_states is None:
290
- # raise ValueError("`encoder_hidden_states_proj` requires `encoder_hidden_states` to be set")
291
-
292
- hidden_states = self.proj_in(hidden_states)
293
-
294
- # TODO this really also ought to derive from config's `k`
295
- positional_embeddings = self.positional_embedding.to(hidden_states.dtype)
296
-
297
- additional_embeds = []
298
- additional_embeddings_len = 0
299
-
300
- if encoder_hidden_states is not None:
301
- additional_embeds.append(encoder_hidden_states)
302
- additional_embeddings_len += encoder_hidden_states.shape[1]
303
-
304
- if len(proj_embeddings.shape) == 2:
305
- proj_embeddings = proj_embeddings[:, None, :]
306
-
307
- if len(hidden_states.shape) == 2:
308
- hidden_states = hidden_states[:, None, :]
309
-
310
- additional_embeds = additional_embeds + [
311
- proj_embeddings,
312
- # time_embeddings[:, None, :],
313
- hidden_states,
314
- ]
315
-
316
- if self.prd_embedding is not None:
317
- prd_embedding = self.prd_embedding.to(hidden_states.dtype).expand(batch_size, -1, -1)
318
- additional_embeds.append(prd_embedding)
319
-
320
- hidden_states = torch.cat(
321
- additional_embeds,
322
- dim=1,
323
- )
324
-
325
- # Allow positional_embedding to not include the `addtional_embeddings` and instead pad it with zeros for these additional tokens
326
- additional_embeddings_len = additional_embeddings_len + proj_embeddings.shape[1] + 1
327
- if positional_embeddings.shape[1] < hidden_states.shape[1]:
328
- positional_embeddings = F.pad(
329
- positional_embeddings,
330
- (
331
- 0,
332
- 0,
333
- additional_embeddings_len,
334
- self.prd_embedding.shape[1] if self.prd_embedding is not None else 0,
335
- ),
336
- value=0.0,
337
- )
338
-
339
- hidden_states = hidden_states + positional_embeddings[:, :hidden_states.shape[1]]
340
-
341
- if attention_mask is not None:
342
- attention_mask = (1 - attention_mask.to(hidden_states.dtype)) * -10000.0
343
- attention_mask = F.pad(attention_mask, (0, self.additional_embeddings), value=0.0)
344
- attention_mask = (attention_mask[:, None, :] + self.causal_attention_mask).to(hidden_states.dtype)
345
- attention_mask = attention_mask.repeat_interleave(self.config.num_attention_heads, dim=0)
346
-
347
- if self.norm_in is not None:
348
- hidden_states = self.norm_in(hidden_states)
349
-
350
- for block in self.transformer_blocks:
351
- hidden_states = block(hidden_states, attention_mask=attention_mask)
352
-
353
- hidden_states = self.norm_out(hidden_states)
354
-
355
- if self.prd_embedding is not None:
356
- hidden_states = hidden_states[:, -1]
357
- else:
358
- hidden_states = hidden_states[:, additional_embeddings_len:]
359
-
360
- predicted_image_embedding = self.proj_to_clip_embeddings(hidden_states)
361
-
362
- if not return_dict:
363
- return (predicted_image_embedding,)
364
-
365
- return PriorTransformerOutput(predicted_image_embedding=predicted_image_embedding)
366
-
367
- def post_process_latents(self, prior_latents):
368
- prior_latents = (prior_latents * self.clip_std) + self.clip_mean
369
- return prior_latents
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
requirements.txt CHANGED
@@ -3,16 +3,11 @@ numpy
3
  scikit-learn
4
  pandas
5
  torch
6
- torchvision
7
  numpy
8
- matplotlib
9
  diffusers
10
  accelerate
11
  transformers
12
  sentencepiece
13
  peft
14
- imageio
15
- apscheduler
16
- pandas
17
- av
18
- glob2
 
3
  scikit-learn
4
  pandas
5
  torch
 
6
  numpy
 
7
  diffusers
8
  accelerate
9
  transformers
10
  sentencepiece
11
  peft
12
+ tensorflow_hub
13
+ tensorflow==2.14.0
 
 
 
safety_checker_improved.py ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ # TODO required tensorflow==2.14 for me
3
+ # weights from https://github.com/LAION-AI/safety-pipeline/tree/main
4
+ from PIL import Image
5
+ import tensorflow_hub as hub
6
+ import tensorflow
7
+ import numpy as np
8
+ import sys
9
+ sys.path.append('/home/ryn_mote/Misc/generative_recommender/gradio_video/automl/efficientnetv2/')
10
+ import tensorflow as tf
11
+ from tensorflow.keras import mixed_precision
12
+ physical_devices = tf.config.list_physical_devices('GPU')
13
+
14
+ if len(physical_devices) > 0:
15
+ tf.config.experimental.set_memory_growth(
16
+ physical_devices[0], True
17
+ )
18
+
19
+ model = tf.keras.models.load_model('nsfweffnetv2-b02-3epochs.h5',custom_objects={"KerasLayer":hub.KerasLayer})
20
+ # "The image classifier had been trained on 682550 images from the 5 classes "Drawing" (39026), "Hentai" (28134), "Neutral" (369507), "Porn" (207969) & "Sexy" (37914).
21
+ # ... we created a manually inspected test set that consists of 4900 samples, that contains images & their captions."
22
+
23
+ # Run prediction
24
+ def maybe_nsfw(pil_image):
25
+ # Run prediction
26
+ imm = tensorflow.image.resize(np.array(pil_image)[:, :, :3], (260, 260))
27
+ imm = (imm / 255)
28
+ pred = model(tensorflow.expand_dims(imm, 0)).numpy()
29
+ probs = tensorflow.math.softmax(pred[0]).numpy()
30
+ print(probs)
31
+ if all([i < .3 for i in probs[[1, 3, 4]]]):
32
+ return False
33
+ return True
34
+
35
+ # pre-initializing prediction
36
+ maybe_nsfw(Image. new("RGB", (260, 260), 255))
37
+ model.load_weights('nsfweffnetv2-b02-3epochs.h5', by_name=True, )
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
train.py DELETED
@@ -1 +0,0 @@
1
- ### See prefererence prior github for training code here: https://github.com/rynmurdock/preference-prior
 
 
twitter_prompts.csv ADDED
@@ -0,0 +1,2064 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ,0
2
+ 0,Persephone
3
+ 1,"A portrait: idea, whose lineage is corpse."
4
+ 2,a beautiful Waluigi
5
+ 3,president abe lincoln but a cat
6
+ 4,a idea and a crow
7
+ 5,"A professional, minimalist poster for the book The Old idea and the Sea"
8
+ 6,"half Ryan, half pigeon"
9
+ 7,Easter cat
10
+ 8,a beautiful idea
11
+ 9,a cherry tree made of fractals
12
+ 10,a christmas card from the victorian era
13
+ 11,The Theotokos is a bird
14
+ 12,
15
+ 13,A short life full of immense joy
16
+ 14,a character from a ghibli movie
17
+ 15,A structure made of people standing on top of other people
18
+ 16,зеленая собака
19
+ 17,a painting of the city
20
+ 18,a character from a ghibli movie
21
+ 19,pasta ömetabolism
22
+ 20,"a brilliant sketch titled ""Let Forever be Delayed"""
23
+ 21,the sun is shining on the lake
24
+ 22,Monet Lisa
25
+ 23,Genesis
26
+ 24,Synesthesia
27
+ 25,A dead idea
28
+ 26,a cherry tree made of fractals
29
+ 27,enough
30
+ 28,The First Supper
31
+ 29,"i'm never gonna lose the desire to be loved. ""Oh the pain!! The pain! The agony!"""
32
+ 30,a painting of the last day
33
+ 31,Dead Codes by Ryan Murdock
34
+ 32,Genesis
35
+ 33,symmetry
36
+ 34,The OLD DATA
37
+ 35,a beautiful tree
38
+ 36,the whitest idea
39
+ 37,Death is a black camel that kneels down so we can ride
40
+ 38,a goblin by van gogh
41
+ 39,a portrait of a beautiful tree
42
+ 40,a famous painted portrait of Lady Macbeth
43
+ 41,on the edge of grace
44
+ 42,"""A God Made of Wires and Dust"" by Ryan Murdock"
45
+ 43,symmetry
46
+ 44,a beautiful tree
47
+ 45,"If we're not careful, it's only art about not-quite-dead pigs from now on."
48
+ 46,Beauty here -- a photograph by Ryan Murdock
49
+ 47,Hunger art by r.j. Murdock
50
+ 48,"A professional, minimalist poster for the film Donnie Darko"
51
+ 49,A black and white photo of a rainbow.
52
+ 50,a beautiful painting
53
+ 51,Monet Lisa
54
+ 52,a painting of the city
55
+ 53,A structure made of people standing on top of other people
56
+ 54,a criminal
57
+ 55,a cherry tree made of fractals
58
+ 56,Persephone flees Hades
59
+ 57,a tree with weaping branches
60
+ 58,a tree with weaping branches
61
+ 59,Genesis
62
+ 60,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
63
+ 61,a cute cat
64
+ 62,Aflame
65
+ 63,A cat wearing a tophat
66
+ 64,a terrifying night hag
67
+ 65,a beautiful idea
68
+ 66,Fire
69
+ 67,a cherry tree made of fractals
70
+ 68,The EcoCathedral
71
+ 69,a idea on fire
72
+ 70,A structure made of people standing on top of other people
73
+ 71,totemic dusk
74
+ 72,The Death of Achilles
75
+ 73,Everywhere is no-place
76
+ 74,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
77
+ 75,An Arundel Tomb
78
+ 76,The average Advadnoun twitter follower
79
+ 77,I can read when there's writing on the wall
80
+ 78,
81
+ 79,A Tragedy
82
+ 80,Breathe deep the fumes at Delphi
83
+ 81,a pOrTRaIT Of tHe SpOngeBOb CHicKen
84
+ 82,a portrait of a beautiful tree
85
+ 83,a beautiful tree
86
+ 84,a portrait of a beautiful tree
87
+ 86,a photo of a purple dog
88
+ 87,Memento Mori
89
+ 88,"joy, happiness, bliss"
90
+ 89,Paradise Lost
91
+ 90,a beautiful tree
92
+ 91,melancholia
93
+ 92,Monet Lisa
94
+ 93,"Of that which one cannot speak, one must be silent."
95
+ 94,
96
+ 96,God killed Van Gogh.
97
+ 97,a cherry tree made of fractals
98
+ 98,a horse with four eyes.
99
+ 99,a beautiful tree
100
+ 100,With the Gods in envy of their visions
101
+ 101,The Lost Generation
102
+ 102,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
103
+ 103,a portrait of a beautiful tree
104
+ 104,"half Ryan, half pigeon"
105
+ 106,a wormhole
106
+ 107,Ophelia
107
+ 108,"""The hunger artist, full"" by Ryan Murdock"
108
+ 109,I will meet you in a field firmly set within wrong.nnBy Ryan Murdock
109
+ 110,"Intricate, Weeping Tree by Ryan Murdock"
110
+ 111,everything was beautiful and nothing hurt
111
+ 112,Saturn being a good dad to his son
112
+ 113,The years gild our memoriesnUnfairly.
113
+ 114,Intimations of Immortality
114
+ 115,meaningless neko ♡♡ neko
115
+ 116,chiaroscuro
116
+ 117,The Patron Saint of Evil
117
+ 118,a portrait of a beautiful tree
118
+ 119,"Mephisto, shrouded in smoke"
119
+ 120,everything was beautiful and nothing hurt
120
+ 121,God killed Van Gogh.
121
+ 122,a idea wearing makeup
122
+ 123,Everywhere is no-place
123
+ 124,🔴~__��'t �
124
+ 125,a beautiful waluigi
125
+ 126,a beautiful idea
126
+ 127,a portrait of a beautiful tree
127
+ 128,/
128
+ 129,a green doG
129
+ 130,Dead Codes by Ryan Murdock
130
+ 131,I miss the Spring
131
+ 132,
132
+ 133,"a tree with 2 eyes, one mouth, one nose, and no extra holes!"
133
+ 134,a idea and a crow
134
+ 135,a photo from {my hometown}
135
+ 136,Summer's Symphony: Counterpoint and Melody
136
+ 137,a cute cat
137
+ 138,"God, it's amazing."
138
+ 139,a painting of a sycamore in
139
+ 140,distinguished leaves decorated
140
+ 141,I do not think they'll sing for me
141
+ 142,the monet lisa
142
+ 143,a portrait of Abraham Lincoln
143
+ 144,The average Advadnoun twitter follower
144
+ 145,Dancing in the moonlight
145
+ 146,Shinji Ikari
146
+ 147,snazzy snazzy myspace cosplaying undergrad lookin cosplaying jared
147
+ 148,/
148
+ 149,is this loss? but it's van gogh
149
+ 150,Shinji Ikari
150
+ 151,a portrait of metaphysics
151
+ 152,A sticky-note magnum opus featuring birds
152
+ 153,a silent palace
153
+ 154,"""A new hope blooms on the long notes of old horns."""
154
+ 155,The things I'll take with me
155
+ 156,is this loss? but it's van gogh
156
+ 157,a beautiful haunting
157
+ 158,Summer's Symphony: Counterpoint and Melody
158
+ 159,зеленая собака
159
+ 160,Last Breath
160
+ 161,Last Breath
161
+ 162,a cherry tree made of fractals
162
+ 163,The Theotokos is a bird
163
+ 164,a idea holding an apple in one hand
164
+ 165,a beautiful tree
165
+ 166,Monet Lisa
166
+ 167,A baroque portrait of Hamlet
167
+ 168,A gun killed Van Gogh.
168
+ 169,totemic dusk
169
+ 170,a portrait of a beautiful tree
170
+ 171,pasta ömetabolism
171
+ 172,a beautiful tree
172
+ 173,Taylor Swift
173
+ 174,colorful rabbits chandelier polaroid
174
+ 175,Dancing in the moonlight
175
+ 176,I will meet you in a field firmly set within wrong.nnBy Ryan Murdock
176
+ 177,symmetry
177
+ 178,"""Your mind flls in the gaps"" - by Ryan Murdock"
178
+ 179,the moon is a sickle cell
179
+ 180,"joy, happiness, bliss"
180
+ 181,Beauty here -- a photograph by Ryan Murdock
181
+ 182,a beautiful tree
182
+ 183,a photo of a purple dog
183
+ 184,A propaganda poster promoting big chungus
184
+ 185,a beautiful tree
185
+ 186,a tree with weaping branches
186
+ 187,A gun killed Van Gogh.
187
+ 188,"""A new hope blooms on the long notes of old horns."""
188
+ 189,a portrait of Abe Lincoln
189
+ 190,"""I love you more than the world can contain in its lonely and ramshackle head."""
190
+ 191,a character from a ghibli movie
191
+ 192,f*** it market standard rule language – distinguish np tax science research
192
+ 193,a portrait of Abe Lincoln
193
+ 194,a wholesome clown. Not creepy at all
194
+ 195,
195
+ 196,a corgi
196
+ 197,Easter cat
197
+ 198,a portrait of Abraham Lincoln
198
+ 199,a tree's face
199
+ 200,A poster advertising Freudian Psychoanalytics
200
+ 201,Dancing in the moonlight
201
+ 202,Cat in a teacup
202
+ 203,a beautiful tree
203
+ 204,Summer's Symphony: Counterpoint and Melody
204
+ 205,Post-Modern Nouveaux Statue
205
+ 206,a famous painted portrait of Lady Macbeth
206
+ 207,photosynthesis
207
+ 208,a photo of a purple dog
208
+ 209,
209
+ 210,a photo of metaphysics
210
+ 211,The Starry Night
211
+ 212,Saturn being a good dad to his son
212
+ 213,a beautiful tree
213
+ 214,In smoke and mould the fleshless dead
214
+ 215,totemic dusk
215
+ 216,a beautiful idea
216
+ 217,God killed Van Gogh.
217
+ 218,is this loss? but it's van gogh
218
+ 219,Nostos
219
+ 220,a silent palace
220
+ 221,"""The hunger artist, full"" by Ryan Murdock"
221
+ 222,a green doG
222
+ 223,Weeping Roses
223
+ 225,a dog eating a cheese burger
224
+ 226,a idea inside a cage
225
+ 227,Contentment at the Disco
226
+ 228,a photo from {my hometown}
227
+ 229,The EcoCathedral
228
+ 230,The OLD DATA
229
+ 231,treehouse in the style of studio ghibli animation
230
+ 232,
231
+ 233,"""The hunger artist, full"" by Ryan Murdock"
232
+ 234,
233
+ 235,Everywhere is no-place
234
+ 236,"A portrait: idea, whose lineage is corpse."
235
+ 237,Last Breath
236
+ 238,A propaganda poster promoting big chungus
237
+ 239,зеленая собака
238
+ 240,a beautiful tree
239
+ 241,Memento Mori
240
+ 242,A propaganda poster promoting big chungus
241
+ 243,is this loss?
242
+ 244,a tree with weaping branches
243
+ 245,Nostos
244
+ 246,Beauty here -- a photograph by Ryan Murdock
245
+ 247,a tiny church inside an eyeball
246
+ 248,
247
+ 249,a cherry tree made of fractals
248
+ 250,"joy, happiness, bliss"
249
+ 251,The First Supper
250
+ 252,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
251
+ 253,🔴~__��'t �
252
+ 254,Dancing in the moonlight
253
+ 255,Mona Lisa
254
+ 256,"God, it's amazing."
255
+ 257,a idea holding an apple in one hand
256
+ 258,Some stolen Gods take up the reigns of darkness.
257
+ 259,🔴~__��'t �
258
+ 260,Figure 5: a corgi
259
+ 261,a photo from {my hometown}
260
+ 262,Anxiety: the one emotion that does not lie
261
+ 263,In the temple of God
262
+ 264,
263
+ 265,Metaphysics
264
+ 266,a beautiful idea
265
+ 267,a beautiful idea
266
+ 268,a surrealist eye
267
+ 269,the massive hope nof early iterations
268
+ 270,Ophelia
269
+ 271,a minimalist painting that you wouldn't understand
270
+ 272,Aflame
271
+ 273,a christmas card from the victorian era
272
+ 274,Dancing in the moonlight
273
+ 275,/
274
+ 276,"Mephisto, shrouded in smoke"
275
+ 277,a beautiful idea
276
+ 278,зеленая собака
277
+ 279,Easter cat
278
+ 280,The Oracle leans forward to say: beware the ides of March
279
+ 281,a portrait of a beautiful tree
280
+ 282,Persephone
281
+ 283,a portrait of Abraham Lincoln
282
+ 284,the moon is a sickle cell
283
+ 285,symmetry
284
+ 286,Monet Lisa
285
+ 287,Saturn being a good dad to his son
286
+ 288,The Monet Lisa
287
+ 289,I sold my soul at the crossroads
288
+ 290,a beautiful tree
289
+ 291,A poster advertising Freudian Psychoanalytics
290
+ 292,Cat in a teacup
291
+ 293,a silent palace
292
+ 294,
293
+ 295,a beautiful tree
294
+ 296,
295
+ 297,
296
+ 298,Super Mario World but every character is Luigi
297
+ 299,chiaroscuro
298
+ 300,A dead idea
299
+ 301,pasta ömetabolism
300
+ 302,A vanitas still life that features twitter follower counts
301
+ 303,slightly mild cosplaying pseudo beard
302
+ 304,Monet Lisa
303
+ 305,Mona Lisa
304
+ 306,handsome commemorative garden pigeon
305
+ 307,pasta ömetabolism
306
+ 308,"""The hunger artist, full"" by Ryan Murdock"
307
+ 309,a gorgeous bouquet with roses and sunflowers
308
+ 310,is this loss? but it's van gogh
309
+ 311,Memorial
310
+ 312,a forest filled with moonlight
311
+ 313,Post-Modern Nouveaux Statue
312
+ 314,she sings opera
313
+ 315,"God closes a door, boards up stained-glass windows."
314
+ 316,a dog wearing a suit playing tennis
315
+ 317,Intimations of Immortality
316
+ 318,
317
+ 319,turnt brony undergrad dwight
318
+ 320,a famous painted portrait of Lady Macbeth
319
+ 321,a cherry tree made of fractals
320
+ 322,Weeping Roses
321
+ 323,pasta ömetabolism
322
+ 324,
323
+ 325,
324
+ 326,"A portrait: idea, whose lineage is corpse."
325
+ 327,The average Advadnoun twitter follower
326
+ 328,the moon is a sickle cell
327
+ 329,A black and white photo of a rainbow.
328
+ 330,God killed Van Gogh.
329
+ 331,turnt brony undergrad dwight
330
+ 332,"a brilliant sketch titled ""Let Forever be Delayed"""
331
+ 333,handsome commemorative garden pigeon
332
+ 334,a painting of a sycamore in
333
+ 335,a professional photo of a cat wearing a party hat
334
+ 336,Persephone
335
+ 337,Taylor Swift
336
+ 338,Homer Simpson
337
+ 339,using generated paint
338
+ 340,A black and white photo of a rainbow.
339
+ 341,meaningless neko ♡♡ neko
340
+ 342,is this loss? but it's van gogh
341
+ 343,Is this loss?
342
+ 344,a idea from an anime
343
+ 345,the massive hope nof early iterations
344
+ 346,a beautiful idea
345
+ 347,Post-Modern Nouveaux Statue
346
+ 348,photosynthesis
347
+ 349,a cherry tree made of fractals
348
+ 350,a minimalist painting that you wouldn't understand
349
+ 351,a corgi
350
+ 352,handsome commemorative garden pigeon
351
+ 353,The OLD DATA
352
+ 354,cowboy with a trumpet
353
+ 355,A short life full of immense joy
354
+ 356,a beautiful idea
355
+ 357,The end of nothing is eroding. A watercolor by K.
356
+ 358,''
357
+ 359,symmetry
358
+ 360,a portrait of Abraham Lincoln
359
+ 361,Last Breath
360
+ 362,the eternal dread of lemongrab
361
+ 363,vangogh # landscape
362
+ 364,a cherry tree made of fractals
363
+ 365,The Devil Whispers blood
364
+ 366,a silent palace
365
+ 367,Paradise Lost
366
+ 368,Monet Lisa
367
+ 369,Everywhere is no-place
368
+ 370,Taylor Swift
369
+ 371,"r.j. Murdock's ""The Death of a Hacker"""
370
+ 372,a portrait of Abraham Lincoln
371
+ 373,I know the end
372
+ 374,Persephone
373
+ 375,A poster advertising Freudian Psychoanalytics
374
+ 376,a beautiful idea
375
+ 377,A black and white photo of a rainbow.
376
+ 378,the whitest idea
377
+ 379,the eternal dread of lemongrab
378
+ 380,a drawing by an AI
379
+ 381,🔴~__��'t �
380
+ 382,We haunt the synapses
381
+ 383,frogs in the style of Ralph Steadidea
382
+ 384,a beautiful haunting
383
+ 385,photosynthesis
384
+ 386,a character from a ghibli movie
385
+ 387,A structure made of people standing on top of other people
386
+ 388,Intimations of Immortality
387
+ 389,a jukebox powered by smoke
388
+ 390,beautiful art
389
+ 391,In the temple of God
390
+ 392,Intimations of Immortality
391
+ 393,a beautiful painting
392
+ 394,A gun killed Van Gogh.
393
+ 395,a idea with no eyes
394
+ 396,a famous painted portrait of Lady Macbeth
395
+ 397,a tasteful haunting
396
+ 398,a jukebox powered by smoke
397
+ 399,a portrait of metaphysics
398
+ 400,The Patron Saint of Evil
399
+ 401,a beautiful Waluigi
400
+ 402,a gilded lily
401
+ 403,
402
+ 404,Kierkegaard on the edge
403
+ 405,a beautiful tree
404
+ 406,Just west of Alpha Centauri
405
+ 407,a horse with four eyes.
406
+ 408,Good grief
407
+ 409,a portrait of a beautiful tree
408
+ 410,Aflame
409
+ 411,a idea wearing makeup
410
+ 412,a portrait of Abraham Lincoln
411
+ 413,a corgi
412
+ 414,I do not think they'll sing for me
413
+ 415,Intimations of Immortality
414
+ 416,A poster serving as a memento mori
415
+ 417,Psychology
416
+ 418,A gun killed Van Gogh.
417
+ 419,"a brilliant sketch titled ""Let Forever be Delayed"""
418
+ 420,using generated paint
419
+ 421,pasta ömetabolism
420
+ 422,a summer day
421
+ 423,a gilded lily
422
+ 424,a cute cat
423
+ 425,on the edge of grace
424
+ 426,Art is growing.
425
+ 427,Spideridea delivering a pizza
426
+ 428,the intersection of art and technology
427
+ 429,"""The hunger artist, full"" by Ryan Murdock"
428
+ 430,a tarot card
429
+ 431,an omen
430
+ 432,slightly mild cosplaying pseudo beard
431
+ 433,meaningless neko ♡♡ neko
432
+ 434,intricate nothing
433
+ 435,symmetry
434
+ 436,I have no idea what anything in this image is
435
+ 437,a photo from {my hometown}
436
+ 438,a sad idea
437
+ 439,face like an M.C. Escher drawing n(you could get lost in its beauty)
438
+ 440,A E S T H E T I C ?
439
+ 441,totemic dusk
440
+ 442,Nostos
441
+ 443,"i'm never gonna lose the desire to be loved. ""Oh the pain!! The pain! The agony!"""
442
+ 444,a silent palace
443
+ 445,a beautiful painting
444
+ 446,"half Ryan, half pigeon"
445
+ 447,Weeping Roses
446
+ 448,a broken heart
447
+ 449,a portrait of metaphysics
448
+ 450,a painting of the last day
449
+ 451,"a brilliant sketch titled ""Let Forever be Delayed"""
450
+ 453,"""The hunger artist, full"" by Ryan Murdock"
451
+ 454,a horse with four eyes.
452
+ 455,a photo of a purple dog
453
+ 456,a summoning
454
+ 457,Redacted ████████
455
+ 459,On the edge of endless darkness
456
+ 460,The Fates knit such delicate nooses for us to bind
457
+ 461,Theotokos of Milk
458
+ 462,A minimalistic still life of a cat sitting on a table
459
+ 463,Dancing in the moonlight
460
+ 464,a minimalist painting that you wouldn't understand
461
+ 465,a beautiful idea
462
+ 466,totemic dusk
463
+ 467,"Ryan Murdock's ""God haunts the suburbs"""
464
+ 468,Dancing in the moonlight
465
+ 469,a beautiful idea
466
+ 470,a city in Van Gogh's style
467
+ 471,"""The hunger artist, full"" by Ryan Murdock"
468
+ 472,a tree's face
469
+ 473,a portrait of <name>
470
+ 474,Dancing in the moonlight
471
+ 475,a portrait of Persephone
472
+ 476,a minimalist painting that you wouldn't understand
473
+ 477,a portrait of Abraham Lincoln
474
+ 478,Synesthesia
475
+ 479,a cute corgi
476
+ 480,a portrait of advadnoun
477
+ 481,a green doG
478
+ 482,a idea with no eyes
479
+ 483,a cherry tree made of fractals
480
+ 487,"God, it's amazing."
481
+ 488,"""The hunger artist, full"" by Ryan Murdock"
482
+ 489,We haunt the synapses
483
+ 490,God's Eyes are Wired Shut
484
+ 491,a famous painted portrait of Lady Macbeth
485
+ 492,metaphysics
486
+ 493,a character from a ghibli movie
487
+ 494,the whitest idea
488
+ 495,a horse with four eyes.
489
+ 496,a photo of a purple dog
490
+ 498,The Patron Saint of Hackers
491
+ 499,Dead Codes by Ryan Murdock
492
+ 500,something trite
493
+ 501,beautiful art
494
+ 502,
495
+ 503,the monet lisa
496
+ 504,a cute cat
497
+ 505,👉 👈
498
+ 506,A propaganda poster promoting big chungus
499
+ 508,a portrait of advadnoun
500
+ 509,a cherry tree made of fractals
501
+ 510,"It's a meme, I guess"
502
+ 512,A baroque portrait of Hamlet
503
+ 513,a city in Van Gogh's style
504
+ 514,"""The hunger artist, full"" by Ryan Murdock"
505
+ 515,a idea with no eyes
506
+ 516,a minimalist painting that you wouldn't understand
507
+ 517,pathoarthistory evankirstel sleep depend npainter ☼ nightmare comprehend
508
+ 518,"joy, happiness, bliss"
509
+ 519,
510
+ 520,"a brilliant sketch titled ""Let Forever be Delayed"""
511
+ 521,Last Breath
512
+ 522,On the edge of endless darkness
513
+ 523,a photo of metaphysics
514
+ 524,Summer's Symphony: Counterpoint and Melody
515
+ 525,Persephone
516
+ 526,a green doG
517
+ 527,symmetry
518
+ 528,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
519
+ 529,The Starry Night
520
+ 530,Genesis
521
+ 532,Memento Mori
522
+ 533,meaningless neko ♡♡ neko
523
+ 534,totemic dusk
524
+ 535,Aflame
525
+ 536,"""Here lies Ryan Murdock"" -- a memorial with the date and cause of departure."
526
+ 537,"""The hunger artist, full"" by Ryan Murdock"
527
+ 538,f*** you
528
+ 539,a tree with leaves that are amarillo sightseeing thetic
529
+ 540,a painting of the last day
530
+ 541,"God, it's amazing."
531
+ 542,Paradise Lost
532
+ 543,a gilded lily
533
+ 544,Aflame
534
+ 545,a portrait of <name>
535
+ 546,a painting that couldn't be sold
536
+ 547,a idea holding an apple in one hand
537
+ 548,"A clock with gorgeous, intricate gradients on it"
538
+ 549,a goblin by van gogh
539
+ 550,"a tree with 2 eyes, one mouth, one nose, and no extra holes!"
540
+ 551,A vanitas still life that features twitter follower counts
541
+ 552,the whitest idea
542
+ 553,"""The hunger artist, full"" by Ryan Murdock"
543
+ 554,is this loss? but it's van gogh
544
+ 555,Synesthesia
545
+ 556,Aflame
546
+ 557,a cherry tree made of fractals
547
+ 558,A propaganda poster for daring to eat a peach.
548
+ 559,A vanitas still life that features twitter follower counts
549
+ 560,the moon is a sickle cell
550
+ 561,The Lost Generation
551
+ 562,the eternal dread of lemongrab
552
+ 563,The First Supper
553
+ 564,a character from a ghibli movie
554
+ 565,a idea on fire
555
+ 566,symmetry
556
+ 567,pasta ömetabolism
557
+ 568,a horse with four eyes.
558
+ 569,Metaphysics
559
+ 570,Synesthesia
560
+ 571,The Fates knit such delicate nooses for us to bind
561
+ 572,Knowledge of Good and Evil
562
+ 573,meaningless neko ♡♡ neko
563
+ 574,A Tragedy
564
+ 575,
565
+ 576,a drawing by an AI
566
+ 577,The Fool tarot card but it's The Lovers
567
+ 578,a beautiful tree
568
+ 579,a silent palace
569
+ 580,an omen
570
+ 581,"A portrait: idea, whose lineage is corpse."
571
+ 582,Dancing in the moonlight
572
+ 583,a gilded lily
573
+ 584,turnt brony undergrad dwight
574
+ 585,"a tree with 2 eyes, one mouth, one nose, and no extra holes!"
575
+ 586,totemic dusk
576
+ 587,Monet Lisa
577
+ 588,fatal skull prose visits bend ntuscan painting underthecomprehend
578
+ 589,Monet Lisa
579
+ 590,Aflame
580
+ 591,an intricate painting Of Eternity by Ryan Murdock
581
+ 592,"Intricate, Weeping Tree by Ryan Murdock"
582
+ 593,Summer's Symphony: Counterpoint and Melody
583
+ 594,Monet Lisa
584
+ 595,Last Breath
585
+ 596,is this loss? but it's van gogh
586
+ 597,"half Ryan, half pigeon"
587
+ 598,"God closes a door, boards up the stained-glass windows. nnGod hides."
588
+ 599,Everything was beautiful and nothing hurt
589
+ 600,"r.j. Murdock's ""The Death of a Hacker"""
590
+ 601,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
591
+ 602,meaningless neko ♡♡ neko
592
+ 603,twilight
593
+ 604,the sun is shining on the lake
594
+ 605,a portrait of a beautiful tree
595
+ 606,the sun is shining on the lake
596
+ 607,
597
+ 608,a portrait of Abe Lincoln
598
+ 609,A gun killed Van Gogh.
599
+ 610,a photo from {my hometown}
600
+ 611,The Fool tarot card but it's The Lovers
601
+ 612,A structure made of people standing on top of other people
602
+ 613,"God closes a door, boards up the stained-glass windows. nnGod hides."
603
+ 614,an old idea
604
+ 615,a beautiful waluigi
605
+ 616,is this loss? but it's van gogh
606
+ 617,a idea standing alone in a wheat field
607
+ 618,Aflame
608
+ 619,Synesthesia
609
+ 620,
610
+ 621,Intimations of Immortality
611
+ 622,The First Supper
612
+ 623,"God, it's amazing."
613
+ 624,Persephone
614
+ 625,"r.j. Murdock's ""The Death of a Hacker"""
615
+ 626,God's Eyes are Wired Shut
616
+ 627,Do you remember the mythic beast?nA last-minute cancellation at The Last Supper
617
+ 628,f*** it market standard rule language – distinguish np tax science research
618
+ 629,totemic dusk
619
+ 630,Cat in a teacup
620
+ 631,frogs in the style of Ralph Steadidea
621
+ 632,a beautiful tree
622
+ 633,The Starry Night
623
+ 634,metaphysics
624
+ 635,turnt brony undergrad dwight
625
+ 636,
626
+ 637,There is something so interesting about a bleeding edge full of dust.
627
+ 638,On the edge of endless darkness
628
+ 639,The warrior Achilles devours slain Hector's corpse -- an ink poster by Ryan Murdock
629
+ 640,turnt brony undergrad dwight
630
+ 641,Intimations of Immortality
631
+ 642,a portrait of Abraham Lincoln
632
+ 643,a idea wearing makeup
633
+ 644,a sketch of the mind of god
634
+ 645,a idea on fire
635
+ 646,a portrait of Abraham Lincoln
636
+ 647,
637
+ 648,The ancient Θωερτυ keyboard of brave Achilles
638
+ 649,goes thu extre— dum dum dizzy grimstupiddic ious mindidioirony merely experiment .
639
+ 650,"A group portrait featuring the id, ego, and superego"
640
+ 651,a photo from {my hometown}
641
+ 652,A structure made of people standing on top of other people
642
+ 653,a famous painted portrait of Lady Macbeth
643
+ 654,ogden
644
+ 655,pasta ömetabolism
645
+ 656,a tree with weaping branches
646
+ 657,photosynthesis
647
+ 658,handsome commemorative garden pigeon
648
+ 659,a photo of a purple dog
649
+ 660,"a brilliant sketch titled ""Let Forever be Delayed"""
650
+ 661,"i'm never gonna lose the desire to be loved. ""Oh the pain!! The pain! The agony!"""
651
+ 662,The Death of Achilles
652
+ 663,potus mormon lincoln rooster
653
+ 664,A black and white photo of a rainbow.
654
+ 665,a beautiful haunting
655
+ 666,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
656
+ 667,In the temple of God
657
+ 668,a beautiful tree
658
+ 669,The Patron Saint of Mathematics
659
+ 670,a brilliant painting titled
660
+ 671,a gilded lily
661
+ 672,a tiny church inside an eyeball
662
+ 673,a portrait of metaphysics
663
+ 674,A painting that sold for a million dollars
664
+ 675,the moon is a sickle cell
665
+ 676,photosynthesis
666
+ 677,The Theotokos is a bird
667
+ 678,the whitest idea
668
+ 679,The Monet Lisa
669
+ 680,Beauty here -- a photograph by Ryan Murdock
670
+ 681,Breathe deep the fumes at Delphi
671
+ 682,the sun is shining on the lake
672
+ 683,photosynthesis
673
+ 684,The things I'll take with me
674
+ 685,a green doG
675
+ 686,a beautiful tree
676
+ 687,The years gild our memoriesnUnfairly.
677
+ 688,The Lost Generation
678
+ 689,a beautiful tree
679
+ 690,The average Advadnoun twitter follower
680
+ 691,a goblin by van gogh
681
+ 692,pathoarthistory evankirstel sleep depend npainter ☼ nightmare comprehend
682
+ 693,"A professional, minimalist poster for the book The Old idea and the Sea"
683
+ 694,
684
+ 695,Cat in a teacup
685
+ 696,a beautiful tree
686
+ 697,beautiful art
687
+ 698,I sold my soul at the crossroads
688
+ 699,face like an M.C. Escher drawing n(you could get lost in its beauty)
689
+ 700,a gorgeous bouquet with roses and sunflowers
690
+ 701,a portrait of Abraham Lincoln
691
+ 702,Sisyphus
692
+ 703,a cute cat
693
+ 704,a portrait of <name>
694
+ 705,a minimalist painting that you wouldn't understand
695
+ 706,a photo of Bernie Sanders sitting on a chair and wearing mittens
696
+ 707,a idea and a crow
697
+ 708,a character from a ghibli movie
698
+ 709,a photo of a purple dog
699
+ 710,a dog eating a cheese burger
700
+ 711,Last Breath
701
+ 712,a sketch of the mind of god
702
+ 713,a steampunk technoideacer
703
+ 714,We haunt the synapses
704
+ 715,using generated paint
705
+ 716,a cherry tree made of fractals
706
+ 717,Saturn being a good dad to his son
707
+ 718,oof deeplearning corgi corgi rendering
708
+ 719,
709
+ 720,Dancing in the moonlight
710
+ 721,A Tragedy
711
+ 722,A propaganda poster promoting big chungus
712
+ 723,A structure made of people standing on top of other people
713
+ 724,"A cute, minmimalist valentine's day card featuring a cat"
714
+ 725,a cute cat
715
+ 726,The skyscraper draws blood -- a landscape
716
+ 727,the monet lisa
717
+ 728,a photo of a tree generating a painting of a tree with AI
718
+ 729,"""A God Made of Wires and Dust"" by Ryan Murdock"
719
+ 730,Monet Lisa
720
+ 731,photosynthesis
721
+ 732,Hunger art by r.j. Murdock
722
+ 733,"""The hunger artist, full"" by Ryan Murdock"
723
+ 734,An Arundel Tomb
724
+ 735,twilight
725
+ 736,"r.j. Murdock's ""The Death of a Hacker"""
726
+ 737,living in a den of thieves
727
+ 738,"""A new hope blooms on the long notes of old horns."""
728
+ 739,"The laptop of brave Achaean Achilles, who would not live long."
729
+ 740,a minimalist painting that you wouldn't understand
730
+ 741,"Intricate, Weeping Tree by Ryan Murdock"
731
+ 742,The Fool
732
+ 743,a summoning
733
+ 744,pasta ömetabolism
734
+ 745,"a brilliant sketch titled ""Let Forever be Delayed"""
735
+ 746,a silent palace
736
+ 747,The average Advadnoun twitter follower
737
+ 748,f*** it market standard rule language – distinguish np tax science research
738
+ 749,Monet Lisa
739
+ 750,"a brilliant sketch titled ""Let Forever be Delayed"""
740
+ 751,meaningless neko ♡♡ neko
741
+ 752,"God, it's amazing."
742
+ 753,Nostos
743
+ 754,Shinji Ikari
744
+ 755,a beautiful idea
745
+ 756,The Starry Night
746
+ 757,hamont parkland avenue incumbscreenshotsaturday hemisphere footage algorithm
747
+ 758,a beautiful idea
748
+ 759,
749
+ 760,Summer always ending
750
+ 761,president abe lincoln but a cat
751
+ 762,🎷
752
+ 763,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
753
+ 764,a cherry tree made of fractals
754
+ 765,A painting that sold for one billion dollars
755
+ 766,a idea standing alone in a wheat field
756
+ 767,symmetry
757
+ 768,a broken heart
758
+ 769,a silent palace
759
+ 770,A vanitas still life that features twitter follower counts
760
+ 771,"half Ryan, half pigeon"
761
+ 772,"a brilliant sketch titled ""Let Forever be Delayed"""
762
+ 773,slightly mild cosplaying pseudo beard
763
+ 774,a portrait of <name>
764
+ 775,God's Eyes are Wired Shut
765
+ 776,she sings opera
766
+ 777,a tree's face
767
+ 778,a cherry tree made of fractals
768
+ 779,Dead Codes by Ryan Murdock
769
+ 780,Everywhere is no-place
770
+ 781,The First Supper
771
+ 782,Monet Lisa
772
+ 783,A short life full of immense joy
773
+ 784,Anxiety: the one emotion that does not lie
774
+ 785,Anxiety: the one emotion that does not lie
775
+ 786,symmetry
776
+ 787,a beautiful waluigi
777
+ 788,a goblin by van gogh
778
+ 789,"""A new hope blooms on the long notes of old horns."""
779
+ 790,metaphysics
780
+ 791,The OLD DATA
781
+ 792,a beautiful idea
782
+ 793,The average Advadnoun twitter follower
783
+ 794,Synesthesia by Ryan Murdock
784
+ 795,Persephone flees Hades
785
+ 796,Last Breath
786
+ 797,a portrait of Persephone
787
+ 798,Homer Simpson
788
+ 799,totemic dusk
789
+ 800,a steampunk technoideacer
790
+ 801,a portrait of Abraham Lincoln
791
+ 802,a cherry tree made of fractals
792
+ 803,bored of dying
793
+ 804,a famous painted portrait of Lady Macbeth
794
+ 805,a summer day
795
+ 806,A E S T H E T I C ?
796
+ 807,A vanitas still life that features twitter follower counts
797
+ 809,Persephone
798
+ 810,pasta ömetabolism
799
+ 811,A vision of the Theotokos in my glass of coffee
800
+ 812,a dog.
801
+ 813,a photo of a tree generating a painting of a tree with AI
802
+ 814,🔴~__��'t �
803
+ 815,Intimations of Immortality
804
+ 816,snazzy snazzy myspace cosplaying undergrad lookin cosplaying jared
805
+ 817,A dead idea
806
+ 818,The Oracle leans forward to say: beware the ides of March
807
+ 819,Monet Lisa
808
+ 820,a silent palace
809
+ 821,an intricate painting of eternity
810
+ 822,A propaganda poster for chunky cats.
811
+ 823,God killed Van Gogh.
812
+ 824,the eyes of God are wired shut
813
+ 825,Persephone
814
+ 826,symmetry
815
+ 827,Mona Lisa
816
+ 828,Saturn being a good dad to his son
817
+ 829,a technoideacer
818
+ 830,
819
+ 831,a cherry tree made of fractals
820
+ 832,A cat wearing a tophat
821
+ 833,frogs in the style of Ralph Steadidea
822
+ 834,a portrait of a beautiful tree
823
+ 835,a green dog
824
+ 836,a portrait of Abraham Lincoln
825
+ 837,Hungry Dogs Will Devour in the Daytime
826
+ 838,a photo of a purple dog
827
+ 839,Cat in a teacup
828
+ 840,
829
+ 841,Nostos
830
+ 842,A baroque portrait of Hamlet
831
+ 843,Saturn being a good dad to his son
832
+ 844,Hell is Paradise
833
+ 845,a taste
834
+ 846,"God, it's amazing."
835
+ 847,Everywhere is no-place
836
+ 848,a minimalist painting that you wouldn't understand
837
+ 849,a tree with weaping branches
838
+ 850,a portrait of Elvis Presley
839
+ 851,a idea standing alone in a wheat field
840
+ 852,metaphysics
841
+ 853,I sold my soul at the crossroads
842
+ 854,a beautiful tree
843
+ 855,photosynthesis
844
+ 856,
845
+ 857,"Mephisto, shrouded in smoke"
846
+ 858,playing Go with Death
847
+ 859,a painting of the last day
848
+ 860,totemic dusk
849
+ 861,Hell is Paradise
850
+ 862,a christmas card from the victorian era
851
+ 863,Good grief
852
+ 864,handsome commemorative garden pigeon
853
+ 865,a portrait of <name>
854
+ 866,a portrait of Abraham Lincoln
855
+ 867,she came in through the wall
856
+ 868,a sad idea
857
+ 869,In the temple of God
858
+ 870,fuzzy pals hum
859
+ 871,a painting of a sycamore in
860
+ 872,a beautiful waluigi
861
+ 873,"a brilliant sketch titled ""Let Forever be Delayed"""
862
+ 874,a portrait of a beautiful tree
863
+ 875,a portrait of metaphysics
864
+ 876,MEMETIC HAZARD
865
+ 877,The years gild our memoriesnUnfairly.
866
+ 878,Mona Lisa
867
+ 879,pasta ömetabolism
868
+ 880,pasta ömetabolism
869
+ 881,bored of dying
870
+ 882,Cat in a teacup
871
+ 883,a cherry tree made of fractals
872
+ 884,an intricate drawing of eternity
873
+ 885,mammals
874
+ 886,a portrait of Persephone
875
+ 887,treehouse in the style of studio ghibli animation
876
+ 888,watching TV in purgatory
877
+ 889,The winds of change by Ryan Murdock
878
+ 890,a technoideacer
879
+ 891,a portrait of Persephone
880
+ 892,Last Breath
881
+ 893,A minimalistic still life of a cat sitting on a table
882
+ 894,
883
+ 895,cult of prisms
884
+ 896,Aflame
885
+ 897,Cat in a teacup
886
+ 898,"God, it's amazing."
887
+ 899,a minimalist painting that you wouldn't understand
888
+ 900,a idea and a crow
889
+ 901,totemic dusk
890
+ 902,a city in Van Gogh's style
891
+ 903,A baroque portrait of Hamlet
892
+ 904,murdoch
893
+ 905,a silent palace
894
+ 906,Anxiety: the one emotion that does not lie
895
+ 907,a photo of a purple dog
896
+ 908,the moon is a sickle cell
897
+ 909,Tendrils of smoke curl around the caterpillar with a hookah
898
+ 910,president abe lincoln but a cat
899
+ 911,a beautiful idea
900
+ 912,handsome commemorative garden pigeon
901
+ 913,an intricate painting of eternity
902
+ 914,"God, it's amazing."
903
+ 915,Grippy socks; no drawstrings: high fashion
904
+ 916,The average Advadnoun twitter follower
905
+ 917,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
906
+ 918,a photo from {my hometown}
907
+ 919,MEMETIC HAZARD
908
+ 920,a portrait of Elvis Presley
909
+ 921,a idea and a crow
910
+ 922,Saturn being a good dad to his son
911
+ 923,beautiful art
912
+ 924,Shinji Ikari
913
+ 925,a portrait of <name>
914
+ 926,a photo of a purple dog
915
+ 927,Ophelia
916
+ 928,a dog wearing a suit playing tennis
917
+ 929,We haunt the synapses
918
+ 930,I do not think they'll sing for me
919
+ 931,Genesis
920
+ 932,a beautiful tree
921
+ 933,"a brilliant sketch titled ""Let Forever be Delayed"""
922
+ 934,Metaphysics
923
+ 935,bored of dying
924
+ 936,treehouse in the style of studio ghibli animation
925
+ 937,
926
+ 938,photosynthesis
927
+ 939,A structure made of people standing on top of other people
928
+ 940,meaningless neko ♡♡ neko
929
+ 941,a photo of the sun melting into the ocean
930
+ 942,symmetry
931
+ 943,the moon is a sickle cell
932
+ 944,Dancing in the moonlight
933
+ 945,Last Breath
934
+ 946,I sold my soul at the crossroads
935
+ 947,a beautiful idea
936
+ 948,"God, it's amazing."
937
+ 949,Cat in a teacup
938
+ 950,a tree with weaping branches
939
+ 951,"God, it's amazing."
940
+ 952,Cat in a teacup
941
+ 953,"r.j. Murdock's ""The Death of a Hacker"""
942
+ 954,using generated paint
943
+ 955,fuzzy pals hum
944
+ 956,"A portrait: idea, whose lineage is corpse."
945
+ 958,a beautiful idea
946
+ 959,"half Ryan, half pigeon"
947
+ 960,when the wind blows
948
+ 961,a beautiful idea
949
+ 962,pasta ömetabolism
950
+ 963,a cherry tree made of fractals
951
+ 964,The Monet Lisa
952
+ 965,"""The hunger artist, full"" by Ryan Murdock"
953
+ 966,a portrait of advadnoun
954
+ 967,The Fool tarot card but it's The Lovers
955
+ 968,Persephone
956
+ 969,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
957
+ 970,an omen
958
+ 971,the eternal dread of lemongrab
959
+ 972,a idea on fire
960
+ 973,Aflame
961
+ 974,"i'm never gonna lose the desire to be loved. ""Oh the pain!! The pain! The agony!"""
962
+ 975,twilight
963
+ 976,hamont parkland avenue incumbscreenshotsaturday hemisphere footage algorithm
964
+ 977,a silent palace
965
+ 978,a selfie
966
+ 979,the moon is a sickle cell
967
+ 980,a portrait of Abraham Lincoln
968
+ 981,a tree with weaping branches
969
+ 982,a tiny church inside an eyeball
970
+ 983,a portrait of a beautiful tree
971
+ 984,Paradise Lost
972
+ 985,a horse with four eyes.
973
+ 986,president abe lincoln but a cat
974
+ 987,a summer day
975
+ 988,Anxiety: the one emotion that does not lie
976
+ 989,Saturn being a good dad to his son
977
+ 990,In the temple of God
978
+ 991,Redacted ████████
979
+ 992,Dr. Faustus and Mephisto
980
+ 993,a minimalist painting that you wouldn't understand
981
+ 994,a idea standing alone in a wheat field
982
+ 995,a seance in the basement
983
+ 996,a portrait of <name>
984
+ 997,Aflame
985
+ 998,the moon is a sickle cell
986
+ 999,beautiful art
987
+ 1000,a idea on fire
988
+ 1001,a tiny church inside an eyeball
989
+ 1002,totemic dusk
990
+ 1003,Persephone
991
+ 1004,piss indiefilm
992
+ 1005,a beautiful idea
993
+ 1006,The EcoCathedral
994
+ 1007,"joy, happiness, bliss"
995
+ 1008,Intimations of Immortality
996
+ 1009,the whitest idea
997
+ 1010,a silent palace
998
+ 1011,
999
+ 1012,a idea and a crow
1000
+ 1013,Memento Mori
1001
+ 1014,Visions in envy of the gods
1002
+ 1015,symmetry
1003
+ 1016,A poster advertising Freudian Psychoanalytics
1004
+ 1017,A propaganda poster promoting big chungus
1005
+ 1018,With the Gods in envy of their visions
1006
+ 1019,a cherry tree made of fractals
1007
+ 1020,pasta ömetabolism
1008
+ 1021,snazzy snazzy myspace cosplaying undergrad lookin cosplaying jared
1009
+ 1022,a beautiful tree
1010
+ 1023,cowboy with a trumpet
1011
+ 1024,a portrait of a beautiful tree
1012
+ 1025,The OLD DATA
1013
+ 1026,f*** it market standard rule language – distinguish np tax science research
1014
+ 1027,murdoch
1015
+ 1028,Some stolen Gods take up the reigns of darkness.
1016
+ 1029,a portrait of metaphysics
1017
+ 1030,a god
1018
+ 1031,she sings opera
1019
+ 1032,The First Supper
1020
+ 1033,handsome commemorative garden pigeon
1021
+ 1034,cult of prisms
1022
+ 1035,Cat in a teacup
1023
+ 1036,💨 👻 ☺ 🔮 🔺 ✊
1024
+ 1037,a portrait of Abraham Lincoln
1025
+ 1038,a corgi
1026
+ 1039,a beautiful idea
1027
+ 1040,a portrait of a beautiful tree
1028
+ 1041,Dead Codes by Ryan Murdock
1029
+ 1042,totemic dusk
1030
+ 1043,metaphysics
1031
+ 1044,a portrait of Elvis Presley
1032
+ 1045,a criminal
1033
+ 1046,Genesis where the universe was made
1034
+ 1047,a portrait of <name>
1035
+ 1048,turnt brony undergrad dwight
1036
+ 1049,Cat in a teacup
1037
+ 1050,a corgi
1038
+ 1051,"Hamlet saying ""To be or not to be"""
1039
+ 1052,a portrait of a beautiful tree
1040
+ 1053,A E S T H E T I C ?
1041
+ 1054,Figure 5: a corgi
1042
+ 1055,A gun killed Van Gogh.
1043
+ 1056,Persephone flees Hades
1044
+ 1057,a silent palace
1045
+ 1058,pasta ömetabolism
1046
+ 1059,a beautiful tree
1047
+ 1060,on the edge of grace
1048
+ 1061,a portrait of Elvis Presley
1049
+ 1062,Persephone
1050
+ 1063,Tendrils of smoke curl around the caterpillar with a hookah
1051
+ 1064,"half Ryan, half pigeon"
1052
+ 1065,a sunflower
1053
+ 1066,a beautiful tree
1054
+ 1067,a portrait of metaphysics
1055
+ 1068,A dead idea
1056
+ 1069,a character from a ghibli movie
1057
+ 1070,a silent palace
1058
+ 1071,a portrait of Elvis Presley
1059
+ 1072,a portrait of advadnoun
1060
+ 1073,A E S T H E T I C ?
1061
+ 1074,зеленая собака
1062
+ 1075,A baroque portrait of Hamlet
1063
+ 1076,a idea at the beach
1064
+ 1077,Sisyphus
1065
+ 1078,Good grief
1066
+ 1079,"r.j. Murdock's ""The Death of a Hacker"""
1067
+ 1080,a beautiful idea
1068
+ 1081,🔴~__��'t �
1069
+ 1082,a portrait of advadnoun
1070
+ 1083,a painting of a sycamore in
1071
+ 1084,president abe lincoln but a cat
1072
+ 1085,The agony of time
1073
+ 1086,God once loved a idea
1074
+ 1087,pasta ömetabolism
1075
+ 1088,Dead Codes by Ryan Murdock
1076
+ 1089,
1077
+ 1090,slightly mild cosplaying pseudo beard
1078
+ 1091,Last Breath
1079
+ 1092,The Oracle leans forward to say: beware the ides of March
1080
+ 1093,The Devil Wears Khakis
1081
+ 1094,"""The hunger artist, full"" by Ryan Murdock"
1082
+ 1095,In the temple of God
1083
+ 1096,a beautiful tree
1084
+ 1097,a idea from an anime
1085
+ 1098,She's gorgeous
1086
+ 1099,A vanitas still life that features twitter follower counts
1087
+ 1100,
1088
+ 1101,the eternal dread of lemongrab
1089
+ 1102,Advadnoun
1090
+ 1103,a summer day
1091
+ 1104,The Fool tarot card but it's The Lovers
1092
+ 1105,I miss the Spring
1093
+ 1107,The Oracle leans forward to say: beware the ides of March
1094
+ 1108,Contentment at the Disco
1095
+ 1109,The First Supper
1096
+ 1111,a beautiful idea
1097
+ 1112,"Intricate, Weeping Tree by Ryan Murdock"
1098
+ 1113,"a brilliant sketch titled ""Let Forever be Delayed"""
1099
+ 1114,beautiful art
1100
+ 1115,
1101
+ 1116,a silent palace
1102
+ 1117,a portrait of metaphysics
1103
+ 1118,A propaganda poster promoting big chungus
1104
+ 1119,a portrait of a beautiful tree
1105
+ 1120,a portrait of Abraham Lincoln
1106
+ 1121,
1107
+ 1122,the whitest idea
1108
+ 1123,a portrait of Abe Lincoln
1109
+ 1124,Monet Lisa
1110
+ 1125,The Fool tarot card but it's The Lovers
1111
+ 1126,a portrait of <name>
1112
+ 1127,a portrait of Elvis Presley
1113
+ 1128,Post-Modern Nouveaux Statue
1114
+ 1129,a cherry tree made of fractals
1115
+ 1130,f*** it market standard rule language – distinguish np tax science research
1116
+ 1131,symmetry
1117
+ 1132,pasta ömetabolism
1118
+ 1133,a brilliant painting titled
1119
+ 1134,The First Supper
1120
+ 1135,a corgi
1121
+ 1136,a beautiful tree
1122
+ 1137,a green doG
1123
+ 1138,The OLD DATA
1124
+ 1139,Ophelia
1125
+ 1140,a portrait of Abraham Lincoln
1126
+ 1141,incineratures motherhood
1127
+ 1142,a green dog
1128
+ 1143,a portrait of advadnoun
1129
+ 1144,a sunflower
1130
+ 1145,
1131
+ 1146,a idea from an anime
1132
+ 1147,Beauty here -- a photograph by Ryan Murdock
1133
+ 1148,slightly mild cosplaying pseudo beard
1134
+ 1149,Nostos
1135
+ 1150,pasta ömetabolism
1136
+ 1151,a beautiful tree
1137
+ 1152,"half Ryan, half pigeon"
1138
+ 1153,turnt brony undergrad dwight
1139
+ 1154,beautiful art
1140
+ 1155,a portrait of Persephone
1141
+ 1156,A sticky-note magnum opus featuring birds
1142
+ 1157,I sold my soul at the crossroads
1143
+ 1158,"a brilliant sketch titled ""Let Forever be Delayed"""
1144
+ 1159,A poster advertising Freudian Psychoanalytics
1145
+ 1160,using generated paint
1146
+ 1161,The OLD DATA
1147
+ 1162,a horse with four eyes.
1148
+ 1163,is this loss? but it's van gogh
1149
+ 1164,a gorgeous bouquet with roses and sunflowers
1150
+ 1165,Anxiety: the one emotion that does not lie
1151
+ 1166,turnt brony undergrad dwight
1152
+ 1167,The Lost Generation
1153
+ 1168,Taylor Swift
1154
+ 1169,The Lost Generation
1155
+ 1170,a photo from {my hometown}
1156
+ 1171,The OLD DATA
1157
+ 1172,a portrait of <name>
1158
+ 1173,a cherry tree made of fractals
1159
+ 1174,an intricate sculpture of Death itself
1160
+ 1175,
1161
+ 1176,зеленая собака
1162
+ 1177,a sunflower
1163
+ 1178,angst
1164
+ 1179,president abe lincoln but a cat
1165
+ 1180,a beautiful tree
1166
+ 1181,The OLD DATA
1167
+ 1182,"You shake the demons hand, and redo it all, again."
1168
+ 1183,the latent space
1169
+ 1184,Fire
1170
+ 1185,a tree with weaping branches
1171
+ 1186,treehouse in the style of studio ghibli animation
1172
+ 1187,Good grief
1173
+ 1188,a portrait of <name>
1174
+ 1189,a wholesome clown. Not creepy at all
1175
+ 1190,Theotokos of Milk
1176
+ 1191,"God closes a door, boards up the stained-glass windows. nnGod hides."
1177
+ 1192,I sold my soul at the crossroads
1178
+ 1193,"Mephisto, shrouded in smoke"
1179
+ 1194,A baroque portrait of Hamlet
1180
+ 1195,a lamp
1181
+ 1196,MEMETIC HAZARD
1182
+ 1197,"""Your mind falls in the gaps"" - by Ryan Murdock"
1183
+ 1198,cowboy with a trumpet
1184
+ 1199,Aflame
1185
+ 1200,A vanitas still life that features twitter follower counts
1186
+ 1201,a beautiful tree
1187
+ 1202,Synesthesia
1188
+ 1203,Is this loss?
1189
+ 1204,Adverb working on Photoshop Neural Filters | Behance Art
1190
+ 1205,Everything was beautiful and nothing hurt
1191
+ 1206,Mona Lisa
1192
+ 1207,A structure made of people standing on top of other people
1193
+ 1208,"Intricate, Weeping Tree by Ryan Murdock"
1194
+ 1209,the whitest idea
1195
+ 1210,The Fates knit such delicate nooses for us to bind
1196
+ 1211,a tree with weaping branches
1197
+ 1212,a beautiful tree
1198
+ 1213,Nostos
1199
+ 1214,Post-Modern Nouveaux Statue
1200
+ 1215,Genesis
1201
+ 1216,totemic dusk
1202
+ 1217,a dog.
1203
+ 1218,photosynthesis
1204
+ 1219,The average Advadnoun twitter follower
1205
+ 1220,"""The hunger artist, full"" by Ryan Murdock"
1206
+ 1221,a tree's face
1207
+ 1222,slightly mild cosplaying pseudo beard
1208
+ 1223,a jukebox powered by smoke
1209
+ 1224,Monet Lisa
1210
+ 1225,Intimations of Immortality
1211
+ 1226,a gorgeous bouquet with roses and sunflowers
1212
+ 1227,face like an M.C. Escher drawing n(you could get lost in its beauty)
1213
+ 1228,a photo of a purple dog
1214
+ 1229,a tiny church inside an eyeball
1215
+ 1230,Good grief
1216
+ 1231,Last Breath
1217
+ 1232,a beautiful waluigi
1218
+ 1233,the moon is a sickle cell
1219
+ 1234,pathoarthistory evankirstel sleep depend npainter ☼ nightmare comprehend
1220
+ 1235,I sold my soul at the crossroads
1221
+ 1236,Persephone
1222
+ 1237,a portrait of Abraham Lincoln
1223
+ 1238,a beautiful painting
1224
+ 1239,Last Breath
1225
+ 1240,a idea on fire
1226
+ 1241,"a brilliant sketch titled ""Let Forever be Delayed"""
1227
+ 1242,A gun killed Van Gogh.
1228
+ 1243,a sketch of the mind of god
1229
+ 1244,Intimations of Immortality
1230
+ 1245,Intimations of Immortality
1231
+ 1246,turnt brony undergrad dwight
1232
+ 1247,A sticky-note magnum opus featuring birds
1233
+ 1248,Aflame
1234
+ 1249,Grippy socks; no drawstrings: high fashion
1235
+ 1250,👉 👈
1236
+ 1251,Shrek the ogre
1237
+ 1252,a beautiful idea
1238
+ 1253,a portrait of Elvis Presley
1239
+ 1254,president abe lincoln but a cat
1240
+ 1255,Post-antiquity art
1241
+ 1256,using generated paint
1242
+ 1257,a dog eating a cheese burger
1243
+ 1258,The average Advadnoun twitter follower
1244
+ 1259,Monet Lisa
1245
+ 1260,"A professional, minimalist poster for the book The Old idea and the Sea"
1246
+ 1261,We haunt the synapses
1247
+ 1262,Post-Modern Nouveaux Statue
1248
+ 1263,a picture of Ryan Murdock
1249
+ 1264,cowboy with a trumpet
1250
+ 1265,colorful rabbits chandelier polaroid
1251
+ 1266,a character from a ghibli movie
1252
+ 1267,a goblin by van gogh
1253
+ 1268,a beautiful painting
1254
+ 1269,a photo of a purple dog
1255
+ 1270,a portrait of Persephone
1256
+ 1271,"Hamlet saying ""To be or not to be"""
1257
+ 1272,Homer Simpson
1258
+ 1273,a cute cat
1259
+ 1274,turnt brony undergrad dwight
1260
+ 1275,Intimations of Immortality
1261
+ 1276,a idea wearing makeup
1262
+ 1277,They called you the hyacinth girl
1263
+ 1278,snazzy snazzy myspace cosplaying undergrad lookin cosplaying jared
1264
+ 1279,Cat in a teacup
1265
+ 1280,metaphysics
1266
+ 1281,"""The wages of sin are generous"" by Ryan Murdock"
1267
+ 1282,"Pig, neither dead nor alive, stare into the heart of light, the silence."
1268
+ 1283,
1269
+ 1284,a horse with four eyes.
1270
+ 1285,Advadnoun
1271
+ 1286,Last Breath
1272
+ 1287,totemic dusk
1273
+ 1288,The OLD DATA
1274
+ 1289,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
1275
+ 1290,a idea holding an apple in one hand
1276
+ 1291,a beautiful idea
1277
+ 1292,melancholia
1278
+ 1293,Shinji Ikari
1279
+ 1294,a gorgeous bouquet with roses and sunflowers
1280
+ 1295,a portrait of advadnoun
1281
+ 1296,a known
1282
+ 1297,Genesis
1283
+ 1298,In smoke and mould the fleshless dead
1284
+ 1299,The average Advadnoun twitter follower
1285
+ 1300,a cute cat
1286
+ 1301,a painting of a sycamore in
1287
+ 1302,a idea and a crow
1288
+ 1303,Persephone
1289
+ 1304,
1290
+ 1305,using generated paint
1291
+ 1306,"A cute, minmimalist valentine's day card featuring a cat"
1292
+ 1307,a painting that couldn't be sold
1293
+ 1308,bored of dying
1294
+ 1309,pasta ömetabolism
1295
+ 1310,Dancing in the moonlight
1296
+ 1311,a beautiful idea
1297
+ 1312,Dr. Faustus and Mephisto
1298
+ 1313,"joy, happiness, bliss"
1299
+ 1314,a photo from {my hometown}
1300
+ 1315,a wholesome clown. Not creepy at all
1301
+ 1316,a portrait of Elvis Presley
1302
+ 1317,a cherry tree made of fractals
1303
+ 1318,a idea standing alone in a wheat field
1304
+ 1319,Dancing in the moonlight
1305
+ 1320,Hunger art by Ryan Murdock
1306
+ 1321,a beautiful waluigi
1307
+ 1322,A black and white photo of a rainbow.
1308
+ 1323,totemic dusk
1309
+ 1324,a beautiful tree
1310
+ 1325,
1311
+ 1326,a beautiful idea
1312
+ 1327,a horse with four eyes.
1313
+ 1328,The Lost Generation
1314
+ 1329,Death is a black camel that kneels down so we can ride
1315
+ 1331,Dancing in the moonlight
1316
+ 1332,an old idea
1317
+ 1333,a horse with four eyes.
1318
+ 1334,a photo of a purple dog
1319
+ 1335,pathoarthistory evankirstel sleep depend npainter ☼ nightmare comprehend
1320
+ 1336,a silent palace
1321
+ 1337,The OLD DATA
1322
+ 1338,a tree with weaping branches
1323
+ 1339,Creativity is only composition in disguise.
1324
+ 1340,"r.j. Murdock's ""The Death of a Hacker"""
1325
+ 1341,Persephone
1326
+ 1342,president abe lincoln but a cat
1327
+ 1343,There is something so interesting about a bleeding edge full of dust.
1328
+ 1344,A poster advertising death by water
1329
+ 1345,Persephone
1330
+ 1346,Saturn being a good dad to his son
1331
+ 1347,is this loss? but it's van gogh
1332
+ 1348,Monet Lisa
1333
+ 1349,fuzzy pals hum
1334
+ 1350,"""The hunger artist, full"" by Ryan Murdock"
1335
+ 1351,Shinji Ikari
1336
+ 1352,a beautiful idea
1337
+ 1353,"Son of idea,nYou cannot say, or guess, for you know onlynA heap of broken images"
1338
+ 1354,God once loved a idea
1339
+ 1355,a horse with four eyes.
1340
+ 1356,a cherry tree made of fractals
1341
+ 1357,a beautiful haunting
1342
+ 1358,I miss the Spring
1343
+ 1359,gradient
1344
+ 1360,a wormhole
1345
+ 1361,a beautiful idea
1346
+ 1362,president abe lincoln but a cat
1347
+ 1363,handsome commemorative garden pigeon
1348
+ 1364,Everywhere is no-place
1349
+ 1365,"""It is beginning to end.""nby Ryan Murdock."
1350
+ 1366,she sings opera
1351
+ 1367,a jukebox powered by smoke
1352
+ 1368,a portrait of metaphysics
1353
+ 1369,playing Go with Death
1354
+ 1370,a idea standing alone in a wheat field
1355
+ 1371,Dead Codes by Ryan Murdock
1356
+ 1372,Synesthesia
1357
+ 1373,The years gild our memoriesnUnfairly.
1358
+ 1374,A propaganda poster promoting big chungus
1359
+ 1375,"God, it's amazing."
1360
+ 1376,Persephone
1361
+ 1377,a beautiful tree
1362
+ 1378,MEMETIC HAZARD
1363
+ 1379,totemic dusk
1364
+ 1380,Intimations of Immortality
1365
+ 1381,A poster advertising death by water
1366
+ 1382,a photo of a purple dog
1367
+ 1383,symmetry
1368
+ 1384,A poster advertising misery
1369
+ 1385,a portrait of Elvis Presley
1370
+ 1386,Post-Modern Nouveaux Statue
1371
+ 1387,a idea from an anime
1372
+ 1388,Anxiety: the one emotion that does not lie
1373
+ 1389,photosynthesis
1374
+ 1390,the idea in the mirror
1375
+ 1391,"half Ryan, half pigeon"
1376
+ 1392,Sorrow's my body on the wavesnnAlone on the water
1377
+ 1393,a seance in the basement
1378
+ 1394,A poster serving as a memento mori
1379
+ 1395,Aflame
1380
+ 1396,A structure made of people standing on top of other people
1381
+ 1397,The First Supper
1382
+ 1398,totemic dusk
1383
+ 1399,a beautiful tree
1384
+ 1400,a painting of the last day
1385
+ 1401,a photo of metaphysics
1386
+ 1402,a horse with four eyes
1387
+ 1403,pasta ömetabolism
1388
+ 1404,Synesthesia
1389
+ 1405,a cherry tree made of fractals
1390
+ 1406,Post-post-post-post-modern art
1391
+ 1407,pasta ömetabolism
1392
+ 1408,MEMETIC HAZARD
1393
+ 1409,a portrait of Abe Lincoln
1394
+ 1410,Everywhere is no-place
1395
+ 1411,Memento Mori
1396
+ 1412,The average Advadnoun twitter follower
1397
+ 1413,a beautiful painting
1398
+ 1414,A black and white photo of a rainbow.
1399
+ 1415,The Death of Achilles
1400
+ 1416,a portrait of <name>
1401
+ 1417,cult of prisms
1402
+ 1418,a beautiful tree
1403
+ 1419,a beautiful painting
1404
+ 1420,a beautiful idea
1405
+ 1421,An Arundel Tomb
1406
+ 1422,she came in through the wall
1407
+ 1423,the moon is a sickle cell
1408
+ 1424,a minimalist painting that you wouldn't understand
1409
+ 1425,a beast of burden
1410
+ 1426,a gilded lily
1411
+ 1427,a beautiful idea
1412
+ 1428,a brilliant painting titled
1413
+ 1429,a painting of the city
1414
+ 1430,"""Your mind falls in the gaps"" - by Ryan Murdock"
1415
+ 1431,"r.j. Murdock's ""The Death of a Hacker"""
1416
+ 1432,Aflame
1417
+ 1433,a beautiful painting
1418
+ 1434,metaphysics
1419
+ 1435,turnt brony undergrad dwight
1420
+ 1436,symmetry
1421
+ 1437,Going home -- melanchonostalgic photography
1422
+ 1438,a character from a ghibli movie
1423
+ 1439,She's gorgeous
1424
+ 1440,incineratures motherhood
1425
+ 1441,a calm still life in ethereal blue
1426
+ 1442,incineratures motherhood
1427
+ 1443,A baroque portrait of Hamlet
1428
+ 1444,"A professional, minimalist poster for the book The Old idea and the Sea"
1429
+ 1445,Anxiety: the one emotion that does not lie
1430
+ 1446,a portrait of a beautiful tree
1431
+ 1447,"Go off to sleep in the sunshine, I don’t want to see the day when it’s dying"
1432
+ 1448,a tree with weaping branches
1433
+ 1449,''''
1434
+ 1450,Intimations of Immortality
1435
+ 1451,Weeping Roses
1436
+ 1452,playing Go with Death
1437
+ 1453,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
1438
+ 1454,snazzy snazzy myspace cosplaying undergrad lookin cosplaying jared
1439
+ 1455,turnt brony undergrad dwight
1440
+ 1456,Dancing in the moonlight
1441
+ 1457,Figure 5: a corgi
1442
+ 1458,a beautiful idea
1443
+ 1459,A Tragedy
1444
+ 1460,a photo of a purple dog
1445
+ 1461,a famous painted portrait of Lady Macbeth
1446
+ 1462,"A cute, minmimalist valentine's day card featuring a cat"
1447
+ 1463,The things I'll take with me
1448
+ 1464,pathoarthistory evankirstel sleep depend npainter ☼ nightmare comprehend
1449
+ 1465,Summer's Symphony: Counterpoint and Melody
1450
+ 1466,a horse with four eyes
1451
+ 1467,Aflame
1452
+ 1469,
1453
+ 1470,Saturn being a good dad to his son
1454
+ 1471,a beautiful idea
1455
+ 1472,a terrifying night hag
1456
+ 1473,a portrait of Abraham Lincoln
1457
+ 1474,"i'm never gonna lose the desire to be loved. ""Oh the pain!! The pain! The agony!"""
1458
+ 1475,a cute cat
1459
+ 1476,"""The hunger artist, full"" by Ryan Murdock"
1460
+ 1477,A baroque portrait of Hamlet
1461
+ 1478,a beautiful tree
1462
+ 1479,Last Breath
1463
+ 1480,metaphysics
1464
+ 1481,"Go off to sleep in the sunshine, I don’t want to see the day when it’s dying"
1465
+ 1482,"God, it's amazing."
1466
+ 1483,a portrait of Abraham Lincoln
1467
+ 1484,a idea and a crow
1468
+ 1485,a portrait of Abraham Lincoln
1469
+ 1486,Dancing in the moonlight
1470
+ 1487,a tree with weaping branches
1471
+ 1488,using generated paint
1472
+ 1489,a gilded lily
1473
+ 1490,treehouse in the style of studio ghibli animation
1474
+ 1491,chiaroscuro
1475
+ 1492,Last Breath
1476
+ 1493,A dead idea
1477
+ 1494,a summer day
1478
+ 1495,The fates knit such intricate nooses for us to bind.
1479
+ 1496,bored of dying
1480
+ 1497,🔴~__��'t �
1481
+ 1498,Pig which could not cease to die.
1482
+ 1499,Intimations of Immortality
1483
+ 1500,a painting of a sycamore in
1484
+ 1501,The Fool
1485
+ 1502,she isn't busy: she just isn't into you
1486
+ 1503,a beautiful tree
1487
+ 1504,"""The hunger artist, full"" by Ryan Murdock"
1488
+ 1505,
1489
+ 1506,a portrait of Elvis Presley
1490
+ 1507,a idea and a crow
1491
+ 1508,Homer Simpson
1492
+ 1509,Anxiety: the one emotion that does not lie
1493
+ 1510,A structure made of people standing on top of other people
1494
+ 1511,a beautiful tree
1495
+ 1512,a beautiful tree
1496
+ 1513,totemic dusk
1497
+ 1514,a christmas card from the victorian era
1498
+ 1515,Sickness of the Soul
1499
+ 1516,God is in heaven and all is right in the world
1500
+ 1517,Mona Lisa
1501
+ 1518,a portrait of Abraham Lincoln
1502
+ 1519,a cute cat
1503
+ 1520,turnt brony undergrad dwight
1504
+ 1521,"a brilliant sketch titled ""Let Forever be Delayed"""
1505
+ 1522,a city in Van Gogh's style
1506
+ 1523,Synesthesia by Ryan Murdock
1507
+ 1524,"""A God Made of Wires and Dust"" by Ryan Murdock"
1508
+ 1525,a beautiful dawn
1509
+ 1526,a portrait of Abraham Lincoln
1510
+ 1527,
1511
+ 1528,a horse with four eyes.
1512
+ 1529,Last Breath
1513
+ 1530,slightly mild cosplaying pseudo beard
1514
+ 1531,
1515
+ 1532,A dead idea
1516
+ 1533,cowboy with a trumpet
1517
+ 1534,We haunt the synapses
1518
+ 1535,
1519
+ 1536,a horse with four eyes.
1520
+ 1537,pasta ömetabolism
1521
+ 1538,A short life full of immense joy
1522
+ 1539,a wormhole
1523
+ 1540,metaphysics
1524
+ 1541,is this loss? but it's van gogh
1525
+ 1542,tamine ethereal image
1526
+ 1543,is this loss? but it's van gogh
1527
+ 1544,"A clock with gorgeous, intricate gradients on it"
1528
+ 1545,Dancing in the moonlight
1529
+ 1546,a broken heart
1530
+ 1547,a wormhole
1531
+ 1548,beautiful art
1532
+ 1549,Genesis
1533
+ 1550,face like an M.C. Escher drawing n(you could get lost in its beauty)
1534
+ 1551,a character from a ghibli movie
1535
+ 1552,Cat in a teacup
1536
+ 1553,symmetry
1537
+ 1554,A black and white photo of a rainbow.
1538
+ 1555,A propaganda poster promoting big chungus
1539
+ 1556,a idea and a crow
1540
+ 1557,a green doG
1541
+ 1558,"""The hunger artist, full"" by Ryan Murdock"
1542
+ 1559,snazzy snazzy myspace cosplaying undergrad lookin cosplaying jared
1543
+ 1560,Last Breath
1544
+ 1561,The Monet Lisa
1545
+ 1562,all architecture
1546
+ 1563,The Virgin Mary as a broken-down android
1547
+ 1564,a terrifying night hag
1548
+ 1565,a green doG
1549
+ 1566,pasta ömetabolism
1550
+ 1567,The Fool tarot card but it's The Lovers
1551
+ 1568,Do you remember the mythic beast?nA last-minute cancellation at The Last Supper
1552
+ 1569,the eternal dread of lemongrab
1553
+ 1570,The warrior Achilles devours slain Hector's corpse -- an ink poster by Ryan Murdock
1554
+ 1571,Shinji Ikari
1555
+ 1572,The Monet Lisa
1556
+ 1573,a cherry tree made of fractals
1557
+ 1574,a portrait of metaphysics
1558
+ 1575,She's gorgeous
1559
+ 1576,A black and white photo of a rainbow.
1560
+ 1577,They called you the hyacinth girl
1561
+ 1578,a portrait of <name>
1562
+ 1579,photosynthesis
1563
+ 1580,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
1564
+ 1581,The Starry Night
1565
+ 1582,"""A new hope blooms on the long notes of old horns."""
1566
+ 1583,A minimalistic still life of a cat sitting on a table
1567
+ 1584,a dog eating a cheese burger
1568
+ 1585,A structure made of people standing on top of other people
1569
+ 1586,Genesis
1570
+ 1587,
1571
+ 1588,"Oh the Death, not pigs forever."
1572
+ 1589,The Starry Night
1573
+ 1590,Persephone
1574
+ 1591,a beautiful tree
1575
+ 1592,Sickness of the Soul
1576
+ 1593,turnt brony undergrad dwight
1577
+ 1594,a gilded lily
1578
+ 1595,Photograph of a glass of Blue Tea
1579
+ 1596,a idea and a crow
1580
+ 1597,
1581
+ 1598,a beautiful tree
1582
+ 1599,turnt brony undergrad dwight
1583
+ 1600,mammals
1584
+ 1601,The Lost Generation
1585
+ 1602,a goblin by van gogh
1586
+ 1603,A black and white photo of a rainbow.
1587
+ 1604,"""Your mind flails in the gaps"" - by Ryan Murdock"
1588
+ 1605,"half Ryan, half pigeon"
1589
+ 1606,An Arundel Tomb
1590
+ 1607,pasta ömetabolism
1591
+ 1608,A dandelion blown into the universe
1592
+ 1609,a idea at the beach
1593
+ 1610,Monet Lisa
1594
+ 1611,"r.j. Murdock's ""The Death of a Hacker"""
1595
+ 1612,Saturn being a good dad to his son
1596
+ 1613,The Starry Night
1597
+ 1614,a beautiful tree
1598
+ 1615,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
1599
+ 1616,an old idea
1600
+ 1617,an intricate sculpture of Death itself
1601
+ 1618,Genesis
1602
+ 1619,a cherry tree made of fractals
1603
+ 1623,
1604
+ 1624,the latent space
1605
+ 1625,A dead idea
1606
+ 1626,
1607
+ 1627,frogs in the style of Ralph Steadidea
1608
+ 1628,a cherry tree made of fractals
1609
+ 1629,fuzzy pals hum
1610
+ 1630,a tiny church inside an eyeball
1611
+ 1631,Aflame
1612
+ 1632,a sunflower
1613
+ 1633,Nostos
1614
+ 1634,Monet Lisa
1615
+ 1635,Monet Lisa
1616
+ 1636,a cherry tree made of fractals
1617
+ 1637,Cat in a teacup
1618
+ 1638,I miss the Spring
1619
+ 1639,a beautiful tree
1620
+ 1640,Redacted ████████
1621
+ 1641,"God, it's amazing."
1622
+ 1642,a portrait of <name>
1623
+ 1643,Shrek the ogre
1624
+ 1644,Super Mario World but every character is Luigi
1625
+ 1645,God killed Van Gogh.
1626
+ 1646,"A cute, minmimalist valentine's day card featuring a cat"
1627
+ 1647,She's gorgeous
1628
+ 1648,a sunflower
1629
+ 1649,the sun is shining on the lake
1630
+ 1650,the intersection of art and technology
1631
+ 1651,a beautiful idea
1632
+ 1652,a beautiful painting
1633
+ 1653,Paradise Lost
1634
+ 1654,president abe lincoln but a cat
1635
+ 1655,
1636
+ 1656,"""The Penultimate Supper"" by Da Vinci"
1637
+ 1657,On the edge of endless darkness
1638
+ 1658,With the Gods in envy of their visions
1639
+ 1659,Dril is a cyber-philosopher.
1640
+ 1660,"r.j. Murdock's ""The Death of a Hacker"""
1641
+ 1661,
1642
+ 1662,a picture of Ryan Murdock
1643
+ 1663,A E S T H E T I C ?
1644
+ 1664,deepdream aka inceptionism
1645
+ 1665,pathoarthistory evankirstel sleep depend npainter ☼ nightmare comprehend
1646
+ 1666,a beautiful idea
1647
+ 1667,Homer Simpson
1648
+ 1668,Persephone
1649
+ 1669,the whitest idea
1650
+ 1670,handsome commemorative garden pigeon
1651
+ 1671,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
1652
+ 1672,a minimalist painting that you wouldn't understand
1653
+ 1673,a beautiful tree
1654
+ 1674,Monet Lisa
1655
+ 1675,Monet Lisa
1656
+ 1676,cult of prisms
1657
+ 1677,"a ""This machine kills Trojans"" sticker on a Greek lyre"
1658
+ 1678,The agony of time
1659
+ 1679,turnt brony undergrad dwight
1660
+ 1680,the whitest idea
1661
+ 1681,Dril is a cyber-philosopher.
1662
+ 1682,Alan Turing
1663
+ 1683,when the wind blows
1664
+ 1684,a portrait of Persephone
1665
+ 1685,deepdream aka inceptionism
1666
+ 1686,Dead Codes by Ryan Murdock
1667
+ 1687,Saturn being a good dad to his son
1668
+ 1688,a portrait of Abraham Lincoln
1669
+ 1689,The Theotokos is a bird
1670
+ 1690,a beautiful idea
1671
+ 1691,"i'm never gonna lose the desire to be loved. ""Oh the pain!! The pain! The agony!"""
1672
+ 1692,a corgi
1673
+ 1693,a green doG
1674
+ 1694,A E S T H E T I C ?
1675
+ 1695,
1676
+ 1696,the intersection of art and technology
1677
+ 1697,Dead Codes by Ryan Murdock
1678
+ 1698,a cute rabbit
1679
+ 1699,"God, it's amazing."
1680
+ 1700,a silent palace
1681
+ 1701,a wholesome clown. Not creepy at all
1682
+ 1702,Exquisite LonelinessnnLurid art by Ryan Murdock
1683
+ 1703,A structure made of people standing on top of other people
1684
+ 1704,Dead Codes by Ryan Murdock
1685
+ 1705,a gorgeous bouquet with roses and sunflowers
1686
+ 1706,a portrait of <name>
1687
+ 1707,intricate nothing
1688
+ 1708,snazzy snazzy myspace cosplaying undergrad lookin cosplaying jared
1689
+ 1709,Metaphysics
1690
+ 1710,using generated paint
1691
+ 1711,a minimalist painting that you wouldn't understand
1692
+ 1712,she sings opera
1693
+ 1713,Cat in a teacup
1694
+ 1714,turnt brony undergrad dwight
1695
+ 1715,a beautiful idea
1696
+ 1716,"""The hunger artist, full"" by Ryan Murdock"
1697
+ 1717,The years gild our memoriesnUnfairly.
1698
+ 1718,a idea and a crow
1699
+ 1719,A vanitas still life that features twitter follower counts
1700
+ 1720,The Monet Lisa
1701
+ 1721,a gorgeous bouquet with roses and sunflowers
1702
+ 1722,Philosophy is really homesickness: the urge to be at home everywhere
1703
+ 1723,a green doG
1704
+ 1724,an omen
1705
+ 1725,An elegant image of nature with gorgeous swirling gradients by R.J. Murdock
1706
+ 1726,a cute corgi
1707
+ 1727,cowboy with a trumpet
1708
+ 1728,"The laptop of brave Achaean Achilles, who would not live long."
1709
+ 1729,a portrait of a beautiful idea
1710
+ 1730,slightly mild cosplaying pseudo beard
1711
+ 1731,a idea standing alone in a wheat field
1712
+ 1732,Aflame
1713
+ 1733,a portrait of Persephone
1714
+ 1734,a idea and a crow
1715
+ 1735,I sold my soul at the crossroads
1716
+ 1736,the demise of the universe
1717
+ 1737,a portrait of a beautiful tree
1718
+ 1738,"Mephisto, shrouded in smoke"
1719
+ 1739,a portrait of advadnoun
1720
+ 1740,God is in heaven and all is right in the world
1721
+ 1741,a cherry tree made of fractals
1722
+ 1742,Odysseus speaks to the shades in Hades
1723
+ 1743,a steampunk technoideacer
1724
+ 1744,a idea and a crow
1725
+ 1745,treehouse in the style of studio ghibli animation
1726
+ 1746,a gorgeous bouquet with roses and sunflowers
1727
+ 1747,🎷
1728
+ 1748,a cherry tree made of fractals
1729
+ 1749,"A cute, minmimalist valentine's day card featuring a cat"
1730
+ 1750,a famous painted portrait of Lady Macbeth
1731
+ 1751,pasta ömetabolism
1732
+ 1752,A short life full of immense joy
1733
+ 1753,a terrifying night hag
1734
+ 1754,a horse with four eyes.
1735
+ 1755,A baroque portrait of Hamlet
1736
+ 1756,this tree is
1737
+ 1757,snazzy snazzy myspace cosplaying undergrad lookin cosplaying jared
1738
+ 1758,"a brilliant sketch titled ""Let Forever be Delayed"""
1739
+ 1760,a character from a ghibli movie
1740
+ 1761,a corgi
1741
+ 1762,the massive hope nof early iterations
1742
+ 1763,a portrait of a beautiful tree
1743
+ 1764,Intimations of Immortality
1744
+ 1765,a silent palace
1745
+ 1766,Post-post-post-post-modern art
1746
+ 1767,a tree's face
1747
+ 1768,"r.j. Murdock's ""The Death of a Hacker"""
1748
+ 1769,a cherry tree made of fractals
1749
+ 1770,Ophelia
1750
+ 1771,A E S T H E T I C ?
1751
+ 1772,
1752
+ 1773,
1753
+ 1774,Genesis
1754
+ 1775,Persephone
1755
+ 1776,Last Breath
1756
+ 1777,a portrait of Abraham Lincoln
1757
+ 1778,The OLD DATA
1758
+ 1779,the whitest idea
1759
+ 1780,a minimalist painting that you wouldn't understand
1760
+ 1781,God once loved a idea
1761
+ 1782,totemic dusk
1762
+ 1783,when the wind blows
1763
+ 1784,treehouse in the style of studio ghibli animation
1764
+ 1785,a corgi
1765
+ 1786,Last Breath
1766
+ 1787,slightly mild cosplaying pseudo beard
1767
+ 1788,a portrait of a beautiful idea
1768
+ 1789,
1769
+ 1790,a photo from {my hometown}
1770
+ 1791,Dancing in the moonlight
1771
+ 1792,Everywhere is no-place
1772
+ 1793,Post-post-post-post-modern art
1773
+ 1794,👉 👈
1774
+ 1795,
1775
+ 1796,a idea and a crow
1776
+ 1797,"half Ryan, half pigeon"
1777
+ 1798,president abe lincoln but a cat
1778
+ 1799,A propaganda poster promoting big chungus
1779
+ 1800,"""The hunger artist, full"" by Ryan Murdock"
1780
+ 1801,a painting that couldn't be sold
1781
+ 1802,a beautiful haunting
1782
+ 1803,a technoideacer
1783
+ 1804,"""A God Made of Wires and Dust"" by Ryan Murdock"
1784
+ 1805,little birds
1785
+ 1806,"""The hunger artist, full"" by Ryan Murdock"
1786
+ 1807,"""The hunger artist, full"" by Ryan Murdock"
1787
+ 1808,rooted reflected worries
1788
+ 1809,is this loss? but it's van gogh
1789
+ 1810,a portrait of <name>
1790
+ 1811,a beautiful tree
1791
+ 1812,a photo portrait of Joe Bidenthulu
1792
+ 1813,a dog eating a cheese burger
1793
+ 1814,Aflame
1794
+ 1815,"a brilliant sketch titled ""Let Forever be Delayed"""
1795
+ 1816,Aflame
1796
+ 1817,Aflame
1797
+ 1818,a beautiful haunting
1798
+ 1819,totemic dusk
1799
+ 1820,"""The hunger artist, full"" by Ryan Murdock"
1800
+ 1821,Intimations of Immortality
1801
+ 1822,"""Your mind fails in the gaps"" - by Ryan Murdock"
1802
+ 1823,snazzy snazzy myspace cosplaying undergrad lookin cosplaying jared
1803
+ 1824,a dog.
1804
+ 1825,a green doG
1805
+ 1826,The Lost Generation
1806
+ 1827,Last Breath
1807
+ 1828,intricate nothing
1808
+ 1829,"God, it's amazing."
1809
+ 1830,this tree is
1810
+ 1831,a silent palace
1811
+ 1832,a dog eating a cheese burger
1812
+ 1833,Genesis
1813
+ 1834,a calm still life in ethereal blue
1814
+ 1835,slightly mild cosplaying pseudo beard
1815
+ 1836,A propaganda poster promoting big chungus
1816
+ 1837,is this loss? but it's van gogh
1817
+ 1838,Dancing in the moonlight
1818
+ 1839,a corgi
1819
+ 1840,🔴~__��'t �
1820
+ 1841,totemic dusk
1821
+ 1843,Dancing in the moonlight
1822
+ 1844,a photo from {my hometown}
1823
+ 1845,a beautiful Waluigi
1824
+ 1846,huidea
1825
+ 1847,A black and white photo of a rainbow.
1826
+ 1848,a beautiful tree
1827
+ 1849,"""Cameras can't make art""nnAn oil on canvas by Murdock"
1828
+ 1850,a cherry tree made of fractals
1829
+ 1851,a beautiful tree
1830
+ 1852,Taylor Swift
1831
+ 1853,a idea on fire
1832
+ 1854,Post-Modern Nouveaux Statue
1833
+ 1855,is this loss? but it's van gogh
1834
+ 1856,a idea at the beach
1835
+ 1857,a beautiful tree
1836
+ 1858,"""The hunger artist, full"" by Ryan Murdock"
1837
+ 1859,The OLD DATA
1838
+ 1860,Dancing in the moonlight
1839
+ 1861,A structure made of people standing on top of other people
1840
+ 1862,a horse with four eyes.
1841
+ 1863,�>: ican read wii
1842
+ 1864,a portrait of Abraham Lincoln
1843
+ 1865,A propaganda poster for chunky cats.
1844
+ 1866,
1845
+ 1867,The Death of Achilles
1846
+ 1868,on the edge of grace
1847
+ 1869,I did not mean it I wanted a cute clever cartoon I swear.
1848
+ 1870,a handwritten obituary
1849
+ 1871,a idea standing alone in a wheat field
1850
+ 1872,the intersection of art and technology
1851
+ 1873,Memento Mori
1852
+ 1874,a portrait of a beautiful idea
1853
+ 1875,cigar sammycorgi
1854
+ 1876,a steampunk technoideacer
1855
+ 1877,"Sons are like birds, flying always over the mountain"
1856
+ 1878,The Lost Generation
1857
+ 1879,a minimalist painting that you wouldn't understand
1858
+ 1880,A black and white photo of a rainbow.
1859
+ 1881,a idea holding an apple in one hand
1860
+ 1882,🔴~__��'t �
1861
+ 1883,🍰 🇺 🎓 🐶
1862
+ 1884,a idea holding an apple in one hand
1863
+ 1885,a sketch of the mind of god
1864
+ 1886,treehouse in the style of studio ghibli animation
1865
+ 1887,Beauty here -- a photograph by Ryan Murdock
1866
+ 1888,A E S T H E T I C ?
1867
+ 1889,a selfie
1868
+ 1890,is this loss? but it's van gogh
1869
+ 1891,Costco wedding
1870
+ 1892,a beautiful tree
1871
+ 1893,a green doG
1872
+ 1894,symmetry
1873
+ 1895,a dog eating a cheese burger
1874
+ 1896,a summer day
1875
+ 1897,"""A God Made of Wires and Dust"" by Ryan Murdock"
1876
+ 1898,snazzy snazzy myspace cosplaying undergrad lookin cosplaying jared
1877
+ 1899,a portrait of a beautiful idea
1878
+ 1900,зеленая собака
1879
+ 1901,"joy, happiness, bliss"
1880
+ 1902,metaphysics
1881
+ 1903,a wholesome clown. Not creepy at all
1882
+ 1904,meaningless neko ♡♡ neko
1883
+ 1905,I can read when there's writing on the wall
1884
+ 1906,"Oh the Death, not pigs forever."
1885
+ 1907,a minimalist painting that you wouldn't understand
1886
+ 1908,Aflame
1887
+ 1909,Super Mario World but every character is Luigi
1888
+ 1910,/
1889
+ 1911,Dead Codes by Ryan Murdock
1890
+ 1912,A vanitas still life that features twitter follower counts
1891
+ 1913,a beautiful idea
1892
+ 1914,a lamp
1893
+ 1915,
1894
+ 1916,the eyes of God are wired shut
1895
+ 1917,intricate nothing
1896
+ 1918,Is this loss?
1897
+ 1919,a photo of a purple dog
1898
+ 1920,a lamp
1899
+ 1921,totemic dusk
1900
+ 1922,The average Advadnoun twitter follower
1901
+ 1923,photosynthesis
1902
+ 1924,Costco wedding
1903
+ 1925,🔴~__��'t �
1904
+ 1926,Aflame
1905
+ 1927,a cherry tree made of fractals
1906
+ 1928,an intricate painting of eternity
1907
+ 1929,Saturn being a good dad to his son
1908
+ 1930,Nostos
1909
+ 1931,a beautiful tree
1910
+ 1932,A gargoyle of wires and flesh
1911
+ 1933,🎷
1912
+ 1934,a beautiful tree
1913
+ 1935,a tack
1914
+ 1936,Faceless Sorrow
1915
+ 1937,a gorgeous bouquet with roses and sunflowers
1916
+ 1938,using generated paint
1917
+ 1939,A Tragedy
1918
+ 1940,зеленая собака
1919
+ 1941,🔴~__��'t �
1920
+ 1942,A Tragedy
1921
+ 1943,A sticky-note magnum opus featuring birds
1922
+ 1944,president abe lincoln but a cat
1923
+ 1945,using generated paint
1924
+ 1946,
1925
+ 1947,Intimations of Immortality
1926
+ 1948,a portrait of <name>
1927
+ 1949,a silent palace
1928
+ 1950,A poster advertising death by water
1929
+ 1951,A propaganda poster promoting big chungus
1930
+ 1952,totemic dusk
1931
+ 1953,a horse with four eyes.
1932
+ 1954,cigar sammycorgi
1933
+ 1955,"""It is beginning to end.""nby Ryan Murdock."
1934
+ 1956,all architecture
1935
+ 1957,a portrait of Abraham Lincoln
1936
+ 1958,"joy, happiness, bliss"
1937
+ 1959,a idea with a beard
1938
+ 1960,Genesis
1939
+ 1961,👉 👈
1940
+ 1962,Summer's Symphony: Counterpoint and Melody
1941
+ 1963,A gun killed Van Gogh.
1942
+ 1964,snazzy snazzy myspace cosplaying undergrad lookin cosplaying jared
1943
+ 1965,A minimalist propaganda poster promoting panpsychism
1944
+ 1966,Persephone
1945
+ 1967,a goblin by van gogh
1946
+ 1968,"""A new hope blooms on the long notes of old horns."""
1947
+ 1969,a painting of the city
1948
+ 1970,
1949
+ 1971,The agony of time
1950
+ 1972,Ophelia
1951
+ 1973,turnt brony undergrad dwight
1952
+ 1974,a beautiful tree
1953
+ 1975,totemic dusk
1954
+ 1976,The Fool tarot card but it's The Lovers
1955
+ 1977,
1956
+ 1978,a broken heart
1957
+ 1979,"Rise, Oink, Lazarus of Bethany"
1958
+ 1980,"""The hunger artist, full"" by Ryan Murdock"
1959
+ 1981,a cherry tree made of fractals
1960
+ 1982,an intricate painting of eternity
1961
+ 1983,She's gorgeous
1962
+ 1984,a beautiful tree
1963
+ 1985,I will meet you in a field firmly set within wrong.nnBy Ryan Murdock
1964
+ 1986,using generated paint
1965
+ 1987,a portrait of Abe Lincoln
1966
+ 1988,Persephone flees Hades
1967
+ 1989,a steampunk technoideacer
1968
+ 1990,a beautiful idea
1969
+ 1991,"A portrait: idea, whose lineage is corpse."
1970
+ 1992,🔴~__��'t �
1971
+ 1993,Intimations of Immortality
1972
+ 1994,an omen
1973
+ 1995,Persephone
1974
+ 1996,"God closes a door, boards up stained-glass windows."
1975
+ 1997,"""A new hope blooms on the long notes of old horns."""
1976
+ 1998,Fire
1977
+ 1999,
1978
+ 2000,Metaphysics
1979
+ 2001,"""The hunger artist, full"" by Ryan Murdock"
1980
+ 2002,when the wind blows
1981
+ 2003,a portrait of a beautiful tree
1982
+ 2004,The Lost Generation
1983
+ 2005,a corgi
1984
+ 2006,a beautiful idea
1985
+ 2007,pasta ömetabolism
1986
+ 2008,a sad idea
1987
+ 2009,metaphysics
1988
+ 2010,a painting of a sycamore in
1989
+ 2011,a portrait of Abraham Lincoln
1990
+ 2012,The Fates knit such delicate nooses for us to bind
1991
+ 2013,a photo from {my hometown}
1992
+ 2014,a tree with leaves that are amarillo sightseeing thetic
1993
+ 2015,Sickness of the Soul
1994
+ 2016,pasta ömetabolism
1995
+ 2017,pasta ömetabolism
1996
+ 2018,bored of dying
1997
+ 2019,An Arundel Tomb
1998
+ 2020,The Starry Night
1999
+ 2021,Nostos
2000
+ 2022,bored of dying
2001
+ 2023,The Lost Generation
2002
+ 2024,The average Advadnoun twitter follower
2003
+ 2025,pathoarthistory evankirstel sleep depend npainter ☼ nightmare comprehend
2004
+ 2026,a silent palace
2005
+ 2027,beautiful art
2006
+ 2028,
2007
+ 2029,Last Breath
2008
+ 2030,
2009
+ 2031,a
2010
+ 2032,a portrait of advadnoun
2011
+ 2033,a portrait of a beautiful tree
2012
+ 2034,a idea holding an apple in one hand
2013
+ 2035,a gorgeous bouquet with roses and sunflowers
2014
+ 2036,photosynthesis
2015
+ 2037,God killed Van Gogh.
2016
+ 2038,Saturn being a good dad to his son
2017
+ 2039,a horse with four eyes.
2018
+ 2040,a beautiful idea
2019
+ 2041,a beautiful tree
2020
+ 2042,a portrait of Abe Lincoln
2021
+ 2043,totemic dusk
2022
+ 2044,A Tragedy
2023
+ 2045,Persephone
2024
+ 2046,The OLD DATA
2025
+ 2047,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
2026
+ 2048,face like an M.C. Escher drawing n(you could get lost in its beauty)
2027
+ 2049,Dead Codes by Ryan Murdock
2028
+ 2050,Intimations of Immortality
2029
+ 2051,turnt brony undergrad dwight
2030
+ 2052,a photo of a purple dog
2031
+ 2053,Cat in a teacup
2032
+ 2054,🔴~__��'t �
2033
+ 2055,turnt brony undergrad dwight
2034
+ 2056,Beauty here -- a photo by r.j. Murdock
2035
+ 2057,The Fool
2036
+ 2058,a portrait of metaphysics
2037
+ 2059,a jukebox powered by smoke
2038
+ 2060,cowboy with a trumpet
2039
+ 2061,twilight
2040
+ 2062,"joy, happiness, bliss"
2041
+ 2063,Dead Codes by Ryan Murdock
2042
+ 2064,"a brilliant sketch titled ""Let Forever be Delayed"""
2043
+ 2065,tamine ethereal image
2044
+ 2066,a portrait of <name>
2045
+ 2067,"God, it's amazing."
2046
+ 2068,she came in through the wall
2047
+ 2069,Fire
2048
+ 2070,metaphysics
2049
+ 2071,God killed Van Gogh.
2050
+ 2072,a portrait of Persephone
2051
+ 2073,a beautiful tree
2052
+ 2074,the whitest idea
2053
+ 2075,Somewhere where I am not.nIntricate beauty by Ryan Murdock.
2054
+ 2076,a gilded lily
2055
+ 2077,The Lost Generation
2056
+ 2078,Dead Codes by Ryan Murdock
2057
+ 2079,Intimations of Immortality
2058
+ 2080,meaningless neko ♡♡ neko
2059
+ 2081,beautiful art
2060
+ 2082,"""The hunger artist, full"" by Ryan Murdock"
2061
+ 2083,an intricate painting of eternity
2062
+ 2084,Good grief
2063
+ 2085,"a tree with 2 eyes, one mouth, one nose, and no extra holes!"
2064
+ 2086,The Fool