Spaces:
Sleeping
Sleeping
Food Desert
commited on
Commit
·
2cd64de
0
Parent(s):
Initial Space
Browse files- .gitattributes +3 -0
- app.py +85 -0
- model.py +254 -0
- requirements.txt +10 -0
- retrieval_bundle/image_ids.npy +3 -0
- retrieval_bundle/tag_ids_concat.npy +3 -0
- retrieval_bundle/tag_offsets.npy +3 -0
- retrieval_bundle/vectors.faiss +3 -0
- style_projector_and_topic_table.safetensors +3 -0
- style_topic_meta.json +11 -0
- style_vocab.json +912 -0
.gitattributes
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
| 2 |
+
*.faiss filter=lfs diff=lfs merge=lfs -text
|
| 3 |
+
*.npy filter=lfs diff=lfs merge=lfs -text
|
app.py
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
import gradio as gr
|
| 3 |
+
from PIL import Image
|
| 4 |
+
from typing import Dict, Tuple
|
| 5 |
+
|
| 6 |
+
# 🔧 Your model lives here.
|
| 7 |
+
# Implement load() and predict(image) in model.py.
|
| 8 |
+
import model # noqa: F401
|
| 9 |
+
|
| 10 |
+
# --------- Glue code (kept intentionally tiny) ---------
|
| 11 |
+
def _format_outputs(scores: Dict[str, float], neighbors: list, threshold: float):
|
| 12 |
+
# sort by score desc and apply threshold
|
| 13 |
+
filtered = {k: v for k, v in sorted(scores.items(), key=lambda kv: kv[1], reverse=True) if v >= threshold}
|
| 14 |
+
tag_string = ", ".join(filtered.keys())
|
| 15 |
+
return tag_string, filtered, "\n".join(neighbors)
|
| 16 |
+
|
| 17 |
+
def infer(image: Image.Image, threshold: float):
|
| 18 |
+
if image is None:
|
| 19 |
+
return "", {}, ""
|
| 20 |
+
|
| 21 |
+
# model.predict now returns (scores_norm, neighbors, counts_raw)
|
| 22 |
+
scores, neighbors, counts = model.predict(image)
|
| 23 |
+
|
| 24 |
+
# Sort and threshold the display dict
|
| 25 |
+
sorted_scores = sorted(scores.items(), key=lambda kv: kv[1], reverse=True)
|
| 26 |
+
filtered = {k: float(v) for k, v in sorted_scores if v >= threshold}
|
| 27 |
+
tag_text = ", ".join(filtered.keys())
|
| 28 |
+
|
| 29 |
+
# Pretty-print neighbors. Each neighbor dict has:
|
| 30 |
+
# { "filename": str, "similarity": float, "distance": float, "styles": [str, ...] }
|
| 31 |
+
lines = []
|
| 32 |
+
for i, d in enumerate(neighbors, 1):
|
| 33 |
+
styles_str = ", ".join(d.get("styles", []))
|
| 34 |
+
sim = d.get("similarity", None)
|
| 35 |
+
dist = d.get("distance", None)
|
| 36 |
+
if sim is not None and dist is not None:
|
| 37 |
+
lines.append(f"{i}. {d['filename']} sim={sim:.3f} dist={dist:.3f} styles=[{styles_str}]")
|
| 38 |
+
else:
|
| 39 |
+
# (just in case similarity/distance are not present)
|
| 40 |
+
lines.append(f"{i}. {d['filename']} styles=[{styles_str}]")
|
| 41 |
+
neighbors_text = "\n".join(lines) if lines else "(neighbors unavailable)"
|
| 42 |
+
|
| 43 |
+
# Return three outputs: tag text, scores dict, and neighbors textbox text
|
| 44 |
+
return tag_text, filtered, neighbors_text
|
| 45 |
+
|
| 46 |
+
|
| 47 |
+
def clear_outputs():
|
| 48 |
+
return "", {}, ""
|
| 49 |
+
|
| 50 |
+
|
| 51 |
+
custom_css = '''
|
| 52 |
+
#image_container-image { width: 100%; aspect-ratio: 1 / 1; max-height: 100%; }
|
| 53 |
+
#image_container img { object-fit: contain !important; }
|
| 54 |
+
'''
|
| 55 |
+
|
| 56 |
+
with gr.Blocks(css=custom_css) as demo:
|
| 57 |
+
gr.Markdown("## Style Tagger — Skeleton (local dev first)")
|
| 58 |
+
with gr.Row():
|
| 59 |
+
with gr.Column():
|
| 60 |
+
image = gr.Image(label="Drop an image here", sources=["upload", "clipboard"], type="pil", show_label=False, elem_id="image_container")
|
| 61 |
+
with gr.Column():
|
| 62 |
+
threshold = gr.Slider(0.0, 1.0, value=0.01, step=0.01, label="Confidence threshold")
|
| 63 |
+
tag_text = gr.Textbox(label="Style tags (comma-separated)")
|
| 64 |
+
tag_scores = gr.Label(label="Scores", num_top_classes=250, show_label=False)
|
| 65 |
+
neighbors_text = gr.Textbox(label="Nearest training images", lines=8, interactive=False)
|
| 66 |
+
|
| 67 |
+
image.upload(fn=infer, inputs=[image, threshold], outputs=[tag_text, tag_scores, neighbors_text], show_progress="minimal")
|
| 68 |
+
image.clear(fn=clear_outputs, inputs=[], outputs=[tag_text, tag_scores, neighbors_text])
|
| 69 |
+
threshold.input(fn=infer, inputs=[image, threshold], outputs=[tag_text, tag_scores, neighbors_text], show_progress="hidden")
|
| 70 |
+
gr.Markdown("""
|
| 71 |
+
---
|
| 72 |
+
### Instructions
|
| 73 |
+
- Drop an image in the box on the left.
|
| 74 |
+
- Tags that are stylistically similar are returned, along with some statistics about them.
|
| 75 |
+
- I tried to isolate style from topic and was only partly successful. So many reported tags might be topically rather than stylistically similar.
|
| 76 |
+
""")
|
| 77 |
+
|
| 78 |
+
|
| 79 |
+
if __name__ == "__main__":
|
| 80 |
+
# Load your model once at start-up (optional; define as no-op in model.py for now)
|
| 81 |
+
try:
|
| 82 |
+
model.load()
|
| 83 |
+
except Exception as e:
|
| 84 |
+
print("Model load() raised (ok during skeleton dev):", e)
|
| 85 |
+
demo.launch()
|
model.py
ADDED
|
@@ -0,0 +1,254 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Runtime model for the Style Tagger Space (nearest-neighbor over training set).
|
| 2 |
+
|
| 3 |
+
- Embeds query image with CLIP (use_fast=True for consistency).
|
| 4 |
+
- Projects with your trained StyleProjector.
|
| 5 |
+
- Looks up nearest neighbors in a retrieval bundle (FAISS if available).
|
| 6 |
+
- Tallies style tags from neighbors and returns {tag: score in [0,1]}.
|
| 7 |
+
|
| 8 |
+
Expected files next to app.py:
|
| 9 |
+
style_projector_and_topic_table.safetensors
|
| 10 |
+
style_topic_meta.json
|
| 11 |
+
style_vocab.json
|
| 12 |
+
retrieval_bundle/
|
| 13 |
+
├─ vectors.faiss (optional but recommended)
|
| 14 |
+
├─ tag_ids_concat.npy
|
| 15 |
+
├─ tag_offsets.npy
|
| 16 |
+
└─ image_ids.npy (optional, for debugging)
|
| 17 |
+
|
| 18 |
+
Notes:
|
| 19 |
+
- If FAISS index is missing but you also ship vectors.npy (optional), we fall back to NumPy top‑K.
|
| 20 |
+
- If neither is present, we return a stable dummy output so UI stays responsive.
|
| 21 |
+
"""
|
| 22 |
+
|
| 23 |
+
from __future__ import annotations
|
| 24 |
+
import os, json
|
| 25 |
+
from typing import Dict, List, Optional, Tuple
|
| 26 |
+
|
| 27 |
+
import numpy as np
|
| 28 |
+
from PIL import Image
|
| 29 |
+
|
| 30 |
+
import torch
|
| 31 |
+
import torch.nn as nn
|
| 32 |
+
from safetensors.torch import load_file as load_safetensors
|
| 33 |
+
from transformers import CLIPModel, CLIPProcessor
|
| 34 |
+
|
| 35 |
+
# Try FAISS (optional at runtime)
|
| 36 |
+
try:
|
| 37 |
+
import faiss # type: ignore
|
| 38 |
+
except Exception:
|
| 39 |
+
faiss = None
|
| 40 |
+
|
| 41 |
+
# -------------------
|
| 42 |
+
# Globals
|
| 43 |
+
# -------------------
|
| 44 |
+
_DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
| 45 |
+
|
| 46 |
+
_PROJECTOR: Optional[nn.Module] = None
|
| 47 |
+
_CLIP_MODEL: Optional[CLIPModel] = None
|
| 48 |
+
_CLIP_PROCESSOR: Optional[CLIPProcessor] = None
|
| 49 |
+
_VOCAB: Optional[List[str]] = None
|
| 50 |
+
|
| 51 |
+
# Retrieval bundle
|
| 52 |
+
_INDEX: Optional[object] = None # faiss index if available
|
| 53 |
+
_VEC_NP: Optional[np.ndarray] = None # fallback: raw vectors (optional file vectors.npy)
|
| 54 |
+
_TAGS_CONCAT: Optional[np.ndarray] = None
|
| 55 |
+
_TAGS_OFFSETS: Optional[np.ndarray] = None
|
| 56 |
+
_IMAGE_IDS: Optional[np.ndarray] = None # filenames aligned to index rows
|
| 57 |
+
|
| 58 |
+
_READY = False
|
| 59 |
+
|
| 60 |
+
# How many neighbors to tally by default
|
| 61 |
+
K_DEFAULT = int(os.getenv("STYLE_K", "30"))
|
| 62 |
+
|
| 63 |
+
# -------------------
|
| 64 |
+
# Model definition (matches training projector)
|
| 65 |
+
# -------------------
|
| 66 |
+
class StyleProjector(nn.Module):
|
| 67 |
+
def __init__(self, d_in: int, d_out: int, use_layer_norm: bool = True):
|
| 68 |
+
super().__init__()
|
| 69 |
+
blocks = [nn.Linear(d_in, 1024), nn.GELU()]
|
| 70 |
+
if use_layer_norm:
|
| 71 |
+
blocks.append(nn.LayerNorm(1024))
|
| 72 |
+
blocks += [nn.Dropout(0.0), nn.Linear(1024, d_out)]
|
| 73 |
+
self.net = nn.Sequential(*blocks)
|
| 74 |
+
def forward(self, x: torch.Tensor) -> torch.Tensor:
|
| 75 |
+
z = self.net(x)
|
| 76 |
+
return nn.functional.normalize(z, dim=-1)
|
| 77 |
+
|
| 78 |
+
# -------------------
|
| 79 |
+
# Helpers
|
| 80 |
+
# -------------------
|
| 81 |
+
|
| 82 |
+
def _embed_image(image: Image.Image) -> torch.Tensor:
|
| 83 |
+
"""CLIP-embed the (optionally cropped) image and L2-normalize to unit length."""
|
| 84 |
+
# Crop 1/8 top & bottom to match preprocessing, controlled via env var
|
| 85 |
+
if os.getenv("STYLE_CROP_TB", "1") not in ("0", "false", "False"):
|
| 86 |
+
w, h = image.size
|
| 87 |
+
dy = h // 8
|
| 88 |
+
if dy > 0:
|
| 89 |
+
image = image.crop((0, dy, w, h - dy))
|
| 90 |
+
inputs = _CLIP_PROCESSOR(images=[image.convert("RGB")], return_tensors="pt").to(_DEVICE)
|
| 91 |
+
with torch.no_grad():
|
| 92 |
+
feats = _CLIP_MODEL.get_image_features(**inputs)
|
| 93 |
+
feats = feats / feats.norm(dim=-1, keepdim=True)
|
| 94 |
+
return feats # [1, d_in]
|
| 95 |
+
|
| 96 |
+
|
| 97 |
+
def _load_retrieval_bundle(bundle_dir: str) -> None:
|
| 98 |
+
global _INDEX, _VEC_NP, _TAGS_CONCAT, _TAGS_OFFSETS, _IMAGE_IDS
|
| 99 |
+
# Required tag tables
|
| 100 |
+
_TAGS_CONCAT = np.load(os.path.join(bundle_dir, "tag_ids_concat.npy"))
|
| 101 |
+
_TAGS_OFFSETS = np.load(os.path.join(bundle_dir, "tag_offsets.npy"))
|
| 102 |
+
|
| 103 |
+
# Filenames (optional but recommended for diagnostics)
|
| 104 |
+
img_ids_path = os.path.join(bundle_dir, "image_ids.npy")
|
| 105 |
+
_IMAGE_IDS = np.load(img_ids_path) if os.path.exists(img_ids_path) else None
|
| 106 |
+
|
| 107 |
+
# Preferred: FAISS index
|
| 108 |
+
index_path = os.path.join(bundle_dir, "vectors.faiss")
|
| 109 |
+
if faiss is not None and os.path.exists(index_path):
|
| 110 |
+
_INDEX = faiss.read_index(index_path)
|
| 111 |
+
else:
|
| 112 |
+
_INDEX = None
|
| 113 |
+
# Optional fallback: raw vectors file if you ship it
|
| 114 |
+
vec_path = os.path.join(bundle_dir, "vectors.npy")
|
| 115 |
+
if os.path.exists(vec_path):
|
| 116 |
+
_VEC_NP = np.load(vec_path).astype(np.float32) # expected L2-normalized
|
| 117 |
+
else:
|
| 118 |
+
_VEC_NP = None
|
| 119 |
+
|
| 120 |
+
|
| 121 |
+
# -------------------
|
| 122 |
+
# Public API
|
| 123 |
+
# -------------------
|
| 124 |
+
|
| 125 |
+
def load():
|
| 126 |
+
"""Load CLIP, projector weights, vocab, and retrieval bundle if present.
|
| 127 |
+
This function is tolerant: it will not raise if files are missing; _READY will stay False.
|
| 128 |
+
"""
|
| 129 |
+
global _PROJECTOR, _CLIP_MODEL, _CLIP_PROCESSOR, _VOCAB, _READY
|
| 130 |
+
try:
|
| 131 |
+
# ---- Metadata ----
|
| 132 |
+
with open("style_topic_meta.json", "r", encoding="utf-8") as f:
|
| 133 |
+
meta = json.load(f)
|
| 134 |
+
proj_dim = int(meta["proj_dim"])
|
| 135 |
+
use_ln = bool(meta.get("use_layer_norm", True))
|
| 136 |
+
|
| 137 |
+
# ---- CLIP (use_fast=True for consistency; requires torchvision) ----
|
| 138 |
+
model_id = os.getenv("CLIP_MODEL_ID", "openai/clip-vit-base-patch32")
|
| 139 |
+
_CLIP_MODEL = CLIPModel.from_pretrained(model_id).to(_DEVICE)
|
| 140 |
+
_CLIP_PROCESSOR = CLIPProcessor.from_pretrained(model_id, use_fast=True)
|
| 141 |
+
_CLIP_MODEL.eval()
|
| 142 |
+
|
| 143 |
+
# ---- Projector ----
|
| 144 |
+
d_in = int(_CLIP_MODEL.config.projection_dim)
|
| 145 |
+
_PROJECTOR = StyleProjector(d_in, proj_dim, use_layer_norm=use_ln).to(_DEVICE)
|
| 146 |
+
tensors = load_safetensors("style_projector_and_topic_table.safetensors")
|
| 147 |
+
with torch.no_grad():
|
| 148 |
+
_PROJECTOR.net[0].weight.copy_(tensors["projector.net.0.weight"])
|
| 149 |
+
_PROJECTOR.net[0].bias.copy_(tensors["projector.net.0.bias"])
|
| 150 |
+
if use_ln:
|
| 151 |
+
_PROJECTOR.net[2].weight.copy_(tensors["projector.net.ln.weight"])
|
| 152 |
+
_PROJECTOR.net[2].bias.copy_(tensors["projector.net.ln.bias"])
|
| 153 |
+
last = _PROJECTOR.net[4]
|
| 154 |
+
else:
|
| 155 |
+
last = _PROJECTOR.net[3]
|
| 156 |
+
last.weight.copy_(tensors["projector.net.last.weight"])
|
| 157 |
+
last.bias.copy_(tensors["projector.net.last.bias"])
|
| 158 |
+
_PROJECTOR.eval()
|
| 159 |
+
|
| 160 |
+
# ---- Vocab ----
|
| 161 |
+
with open("style_vocab.json", "r", encoding="utf-8") as f:
|
| 162 |
+
_VOCAB = json.load(f)
|
| 163 |
+
|
| 164 |
+
# ---- Retrieval bundle (optional but recommended) ----
|
| 165 |
+
bundle_dir = os.getenv("RETRIEVAL_DIR", os.path.join(os.getcwd(), "retrieval_bundle"))
|
| 166 |
+
if os.path.isdir(bundle_dir):
|
| 167 |
+
_load_retrieval_bundle(bundle_dir)
|
| 168 |
+
|
| 169 |
+
_READY = True
|
| 170 |
+
except FileNotFoundError as e:
|
| 171 |
+
print("model.load(): missing file (skeleton mode)", e)
|
| 172 |
+
_READY = False
|
| 173 |
+
|
| 174 |
+
|
| 175 |
+
def predict(image: Image.Image, k: Optional[int] = None) -> Tuple[Dict[str, float], List[Dict[str, object]], Dict[str, int]]:
|
| 176 |
+
"""Return (scores_norm, neighbors_detailed, counts_raw)
|
| 177 |
+
|
| 178 |
+
- scores_norm: {style_tag: score in [0,1]} (counts normalized by max count)
|
| 179 |
+
- neighbors_detailed: [{"filename": str, "similarity": float, "distance": float, "styles": [str, ...]}, ...]
|
| 180 |
+
- counts_raw: {style_tag: int} (exact tallies used to rank)
|
| 181 |
+
"""
|
| 182 |
+
global _READY, _INDEX, _VEC_NP, _TAGS_CONCAT, _TAGS_OFFSETS, _VOCAB, _IMAGE_IDS
|
| 183 |
+
|
| 184 |
+
if not _READY or _VOCAB is None:
|
| 185 |
+
fallback = _VOCAB[:10] if _VOCAB else ["watercolor","oil painting","pixel art","sketch","digital painting"]
|
| 186 |
+
return ({tag: 0.0 for tag in fallback}, [], {tag: 0 for tag in fallback})
|
| 187 |
+
|
| 188 |
+
# 1) Embed + project query
|
| 189 |
+
with torch.no_grad():
|
| 190 |
+
q_clip = _embed_image(image) # [1, d_in]
|
| 191 |
+
q_proj = _PROJECTOR(q_clip).cpu().numpy()[0] # [d_proj], L2-normed
|
| 192 |
+
|
| 193 |
+
# 2) Nearest neighbors (and similarities)
|
| 194 |
+
K = k or K_DEFAULT
|
| 195 |
+
if _INDEX is not None and faiss is not None:
|
| 196 |
+
q = q_proj[np.newaxis, :].astype(np.float32)
|
| 197 |
+
D, I = _INDEX.search(q, K) # D: sims, I: indices
|
| 198 |
+
nbrs = I[0]
|
| 199 |
+
sims = D[0]
|
| 200 |
+
elif _VEC_NP is not None:
|
| 201 |
+
sims_all = _VEC_NP @ q_proj # cosine via dot, [N]
|
| 202 |
+
if K < sims_all.shape[0]:
|
| 203 |
+
idx = np.argpartition(-sims_all, K)[:K]
|
| 204 |
+
order = np.argsort(-sims_all[idx])
|
| 205 |
+
nbrs = idx[order]
|
| 206 |
+
sims = sims_all[nbrs]
|
| 207 |
+
else:
|
| 208 |
+
order = np.argsort(-sims_all)
|
| 209 |
+
nbrs = order[:K]
|
| 210 |
+
sims = sims_all[nbrs]
|
| 211 |
+
else:
|
| 212 |
+
# No retrieval table present
|
| 213 |
+
fallback = {tag: 0.0 for tag in _VOCAB[:10]}
|
| 214 |
+
return (fallback, [], {k: 0 for k in fallback})
|
| 215 |
+
|
| 216 |
+
# Build neighbor detail list with filenames, sims, distances, and neighbor styles
|
| 217 |
+
neighbors: List[Dict[str, object]] = []
|
| 218 |
+
for i, s in zip(nbrs, sims):
|
| 219 |
+
# neighbor styles from ragged arrays
|
| 220 |
+
start, end = int(_TAGS_OFFSETS[i]), int(_TAGS_OFFSETS[i + 1])
|
| 221 |
+
tag_ids_i = _TAGS_CONCAT[start:end]
|
| 222 |
+
styles_i = [_VOCAB[int(tid)] for tid in tag_ids_i] if len(tag_ids_i) > 0 else []
|
| 223 |
+
# filename (if available)
|
| 224 |
+
fname = str(_IMAGE_IDS[i]) if _IMAGE_IDS is not None else str(int(i))
|
| 225 |
+
neighbors.append({
|
| 226 |
+
"filename": fname,
|
| 227 |
+
"similarity": float(s),
|
| 228 |
+
"distance": float(1.0 - s), # cosine distance since vectors are L2-normalized
|
| 229 |
+
"styles": styles_i,
|
| 230 |
+
})
|
| 231 |
+
|
| 232 |
+
# 3) Tally neighbor style tags → counts_raw
|
| 233 |
+
if len(nbrs) == 0:
|
| 234 |
+
fallback = {tag: 0.0 for tag in _VOCAB[:10]}
|
| 235 |
+
return (fallback, neighbors, {k: 0 for k in fallback})
|
| 236 |
+
|
| 237 |
+
# concatenate tags across neighbors and bincount
|
| 238 |
+
tag_ids_all = np.concatenate([
|
| 239 |
+
_TAGS_CONCAT[int(_TAGS_OFFSETS[i]):int(_TAGS_OFFSETS[i + 1])] for i in nbrs
|
| 240 |
+
]) if len(nbrs) else np.array([], dtype=np.int32)
|
| 241 |
+
|
| 242 |
+
counts = np.bincount(tag_ids_all, minlength=len(_VOCAB)) if tag_ids_all.size else np.zeros(len(_VOCAB), dtype=np.int64)
|
| 243 |
+
counts_raw: Dict[str, int] = { _VOCAB[i]: int(counts[i]) for i in np.nonzero(counts)[0] }
|
| 244 |
+
|
| 245 |
+
# 4) Normalize counts → scores_norm in [0,1]
|
| 246 |
+
maxc = float(counts.max()) if counts.size else 0.0
|
| 247 |
+
if maxc <= 0:
|
| 248 |
+
return ({tag: 0.0 for tag in _VOCAB[:10]}, neighbors, counts_raw)
|
| 249 |
+
scores = counts / maxc
|
| 250 |
+
scores_norm: Dict[str, float] = { _VOCAB[i]: float(scores[i]) for i in np.nonzero(counts)[0] }
|
| 251 |
+
|
| 252 |
+
return (scores_norm, neighbors, counts_raw)
|
| 253 |
+
|
| 254 |
+
|
requirements.txt
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
--extra-index-url https://download.pytorch.org/whl/cpu
|
| 2 |
+
|
| 3 |
+
gradio>=4.44.0
|
| 4 |
+
Pillow
|
| 5 |
+
safetensors
|
| 6 |
+
transformers
|
| 7 |
+
tqdm
|
| 8 |
+
faiss-cpu
|
| 9 |
+
torch==2.8.0+cpu
|
| 10 |
+
torchvision==0.23.0+cpu
|
retrieval_bundle/image_ids.npy
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:14ad4a8ae2842bfdb0fbde83ca2bb46e277c814b294d4ed96b968a1b2715ca84
|
| 3 |
+
size 2614212
|
retrieval_bundle/tag_ids_concat.npy
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:bebe24450e788301ccf5b8d08c6d1aa79977b0e9851823e66a2eb96f09e46254
|
| 3 |
+
size 396632
|
retrieval_bundle/tag_offsets.npy
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:df6c23b7150bf4d7b20c09840f266c35f6d8c69043e3fdc61d176cf637c3eff8
|
| 3 |
+
size 237776
|
retrieval_bundle/vectors.faiss
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:dde2fcda00cf1caa715a4d2f907fc40c29e0924935d7b4fce632d2f34ca63030
|
| 3 |
+
size 121673773
|
style_projector_and_topic_table.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:8c4aff6c97beb8656800ca1c137e332ffcc92e9a399786c0fbe1e33e3916a5ba
|
| 3 |
+
size 113541752
|
style_topic_meta.json
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"proj_dim": 512,
|
| 3 |
+
"use_layer_norm": true,
|
| 4 |
+
"k_ndcg": [
|
| 5 |
+
5,
|
| 6 |
+
10
|
| 7 |
+
],
|
| 8 |
+
"lambda_start": 0.0,
|
| 9 |
+
"lambda_end": 0.12597425596299047,
|
| 10 |
+
"lambda_sched": "linear"
|
| 11 |
+
}
|
style_vocab.json
ADDED
|
@@ -0,0 +1,912 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[
|
| 2 |
+
"zackary911",
|
| 3 |
+
"r-mk",
|
| 4 |
+
"peritian",
|
| 5 |
+
"boosterpang",
|
| 6 |
+
"jollyjack",
|
| 7 |
+
"sefeiren",
|
| 8 |
+
"meandraco",
|
| 9 |
+
"sepiruth",
|
| 10 |
+
"toby_art",
|
| 11 |
+
"ancient_art",
|
| 12 |
+
"visionaryserpent",
|
| 13 |
+
"bernielover",
|
| 14 |
+
"tom_fischbach",
|
| 15 |
+
"inumatori",
|
| 16 |
+
"yaoifairy",
|
| 17 |
+
"parody",
|
| 18 |
+
"furlana",
|
| 19 |
+
"harmarist",
|
| 20 |
+
"winte",
|
| 21 |
+
"asthexiancal",
|
| 22 |
+
"smite_(artist)",
|
| 23 |
+
"nightfaux",
|
| 24 |
+
"pen_(artwork)",
|
| 25 |
+
"burgerkiss",
|
| 26 |
+
"bahnbahn",
|
| 27 |
+
"artdecade",
|
| 28 |
+
"mizzyam",
|
| 29 |
+
"araidian",
|
| 30 |
+
"anthroanim",
|
| 31 |
+
"cat-boots",
|
| 32 |
+
"plaga",
|
| 33 |
+
"selenophile",
|
| 34 |
+
"akkusky",
|
| 35 |
+
"yosshidoragon",
|
| 36 |
+
"kitfox-crimson",
|
| 37 |
+
"makarimorph",
|
| 38 |
+
"bigdad",
|
| 39 |
+
"demicoeur",
|
| 40 |
+
"commanderthings",
|
| 41 |
+
"difetra",
|
| 42 |
+
"takataka",
|
| 43 |
+
"glacierclear",
|
| 44 |
+
"yuguni",
|
| 45 |
+
"manika_nika",
|
| 46 |
+
"oystercatcher7",
|
| 47 |
+
"desertkaiju",
|
| 48 |
+
"blazethefox",
|
| 49 |
+
"carving",
|
| 50 |
+
"icon",
|
| 51 |
+
"dumdum",
|
| 52 |
+
"booponies",
|
| 53 |
+
"kame_3",
|
| 54 |
+
"reclamon",
|
| 55 |
+
"eyeofcalamity",
|
| 56 |
+
"ratcha",
|
| 57 |
+
"dangpa",
|
| 58 |
+
"munkeesgomu",
|
| 59 |
+
"reagan700",
|
| 60 |
+
"higsby",
|
| 61 |
+
"semi_(artist)",
|
| 62 |
+
"submarine_screw",
|
| 63 |
+
"shintatokoro",
|
| 64 |
+
"bravo",
|
| 65 |
+
"bleats",
|
| 66 |
+
"teathekook",
|
| 67 |
+
"glitter_trap_boy",
|
| 68 |
+
"ichduhernz",
|
| 69 |
+
"marsminer",
|
| 70 |
+
"danji-isthmus",
|
| 71 |
+
"sunibee",
|
| 72 |
+
"chimeracocks",
|
| 73 |
+
"dekomaru",
|
| 74 |
+
"torakuta",
|
| 75 |
+
"screwingwithsfm",
|
| 76 |
+
"electricsnowfox",
|
| 77 |
+
"bakuhaku",
|
| 78 |
+
"yaroul",
|
| 79 |
+
"merunyaa",
|
| 80 |
+
"sorafoxyteils",
|
| 81 |
+
"trevor-fox",
|
| 82 |
+
"trias",
|
| 83 |
+
"zaush",
|
| 84 |
+
"thecon",
|
| 85 |
+
"j5furry",
|
| 86 |
+
"bna_v5",
|
| 87 |
+
"rainbowscreen",
|
| 88 |
+
"foot_ninja15",
|
| 89 |
+
"dark_theme",
|
| 90 |
+
"gingy_k_fox",
|
| 91 |
+
"bigshow",
|
| 92 |
+
"dr.bug",
|
| 93 |
+
"tohupo",
|
| 94 |
+
"xilrayne",
|
| 95 |
+
"stargazer",
|
| 96 |
+
"ratte",
|
| 97 |
+
"bassybefuddle",
|
| 98 |
+
"white_crest_(artist)",
|
| 99 |
+
"nimzy",
|
| 100 |
+
"reysi",
|
| 101 |
+
"senimasan",
|
| 102 |
+
"robcivecat",
|
| 103 |
+
"doneru",
|
| 104 |
+
"type",
|
| 105 |
+
"aeolus06",
|
| 106 |
+
"the_weaver",
|
| 107 |
+
"daigaijin",
|
| 108 |
+
"re-sublimity-kun",
|
| 109 |
+
"wonderslug",
|
| 110 |
+
"nexcoyotlgt",
|
| 111 |
+
"kyleroo",
|
| 112 |
+
"ceehaz",
|
| 113 |
+
"hladilnik",
|
| 114 |
+
"rainbowsprinklesart",
|
| 115 |
+
"reilukah",
|
| 116 |
+
"kyotoleopard",
|
| 117 |
+
"pridark",
|
| 118 |
+
"thesecretcave",
|
| 119 |
+
"sincastermon",
|
| 120 |
+
"maldu",
|
| 121 |
+
"frenky_hw",
|
| 122 |
+
"marik_azemus34",
|
| 123 |
+
"elzzombie",
|
| 124 |
+
"crackers",
|
| 125 |
+
"lil_scooter56",
|
| 126 |
+
"e-01",
|
| 127 |
+
"zourik",
|
| 128 |
+
"bgn",
|
| 129 |
+
"tricksta",
|
| 130 |
+
"spelunker_sal",
|
| 131 |
+
"alradeck",
|
| 132 |
+
"dreiker",
|
| 133 |
+
"kacey",
|
| 134 |
+
"syuro",
|
| 135 |
+
"flat_colors",
|
| 136 |
+
"partially_colored",
|
| 137 |
+
"aaaninja",
|
| 138 |
+
"jooshy",
|
| 139 |
+
"superix",
|
| 140 |
+
"totesfleisch8",
|
| 141 |
+
"sarek_aran_desian",
|
| 142 |
+
"zerolativity",
|
| 143 |
+
"nicnak044",
|
| 144 |
+
"mastergodai",
|
| 145 |
+
"mellonsoda",
|
| 146 |
+
"sincrescent",
|
| 147 |
+
"marker_(artwork)",
|
| 148 |
+
"pandashorts",
|
| 149 |
+
"ezukapizumu",
|
| 150 |
+
"bobert",
|
| 151 |
+
"slickerwolf",
|
| 152 |
+
"96panda",
|
| 153 |
+
"wolfblade",
|
| 154 |
+
"moodyferret",
|
| 155 |
+
"pink_theme",
|
| 156 |
+
"lostgoose",
|
| 157 |
+
"eldiman",
|
| 158 |
+
"suirano",
|
| 159 |
+
"tegerio",
|
| 160 |
+
"dalwart",
|
| 161 |
+
"sicmop",
|
| 162 |
+
"quotefox",
|
| 163 |
+
"iztli",
|
| 164 |
+
"sidnithefox",
|
| 165 |
+
"yamatokuroko965",
|
| 166 |
+
"sollyz",
|
| 167 |
+
"semiitu",
|
| 168 |
+
"rinny",
|
| 169 |
+
"twistedscarlett60",
|
| 170 |
+
"jaeh",
|
| 171 |
+
"ber00",
|
| 172 |
+
"cev",
|
| 173 |
+
"jackalope_(artist)",
|
| 174 |
+
"suelix",
|
| 175 |
+
"momiji-kun",
|
| 176 |
+
"imanika",
|
| 177 |
+
"patrikthedog",
|
| 178 |
+
"outta_sync",
|
| 179 |
+
"skecchiart",
|
| 180 |
+
"slimefur",
|
| 181 |
+
"crystal-for-ever",
|
| 182 |
+
"kabula_(artist)",
|
| 183 |
+
"reign-2004",
|
| 184 |
+
"cornchip21",
|
| 185 |
+
"gnaw",
|
| 186 |
+
"abluedeer",
|
| 187 |
+
"rick_griffin",
|
| 188 |
+
"sparrow_(artist)",
|
| 189 |
+
"viskasunya",
|
| 190 |
+
"abstract",
|
| 191 |
+
"inverted_colors",
|
| 192 |
+
"cottontail",
|
| 193 |
+
"witchofavalon",
|
| 194 |
+
"detailed",
|
| 195 |
+
"angiewolf",
|
| 196 |
+
"kenket",
|
| 197 |
+
"ripli",
|
| 198 |
+
"ukent",
|
| 199 |
+
"spinal22",
|
| 200 |
+
"mintyspirit",
|
| 201 |
+
"urusee584",
|
| 202 |
+
"cobalt_snow",
|
| 203 |
+
"chowdie",
|
| 204 |
+
"grimart",
|
| 205 |
+
"thefuckingdevil",
|
| 206 |
+
"akiric",
|
| 207 |
+
"nurinaki",
|
| 208 |
+
"sssonic2",
|
| 209 |
+
"kemokin_mania",
|
| 210 |
+
"s2-freak",
|
| 211 |
+
"kammi-lu",
|
| 212 |
+
"surreal",
|
| 213 |
+
"darkluxia",
|
| 214 |
+
"rukis",
|
| 215 |
+
"lord_magicpants",
|
| 216 |
+
"rairai-no26-chu",
|
| 217 |
+
"feretta",
|
| 218 |
+
"komenuka_inaho",
|
| 219 |
+
"caribou_(artist)",
|
| 220 |
+
"mosa",
|
| 221 |
+
"elfein",
|
| 222 |
+
"plantpenetrator",
|
| 223 |
+
"quin-nsfw",
|
| 224 |
+
"cocolog",
|
| 225 |
+
"replica_(artist)",
|
| 226 |
+
"nekocrispy",
|
| 227 |
+
"vimhomeless",
|
| 228 |
+
"fuel_(artist)",
|
| 229 |
+
"truegrave9",
|
| 230 |
+
"eliana-asato",
|
| 231 |
+
"omny87",
|
| 232 |
+
"aogami",
|
| 233 |
+
"mamabliss",
|
| 234 |
+
"oselotti",
|
| 235 |
+
"toto_draw",
|
| 236 |
+
"rossciaco",
|
| 237 |
+
"hooves-art",
|
| 238 |
+
"sketch",
|
| 239 |
+
"ziggie13",
|
| 240 |
+
"lovespell",
|
| 241 |
+
"tolerain",
|
| 242 |
+
"kadath",
|
| 243 |
+
"riendonut",
|
| 244 |
+
"sculpture",
|
| 245 |
+
"missy_(artist)",
|
| 246 |
+
"redoxx",
|
| 247 |
+
"mifa",
|
| 248 |
+
"watsup",
|
| 249 |
+
"compfive",
|
| 250 |
+
"purple_yoshi_draws",
|
| 251 |
+
"manmosu_marimo",
|
| 252 |
+
"dark-moltres",
|
| 253 |
+
"eleacat",
|
| 254 |
+
"phenyanyanya",
|
| 255 |
+
"davidsanchan",
|
| 256 |
+
"negoya",
|
| 257 |
+
"youjomodoki",
|
| 258 |
+
"dream_and_nightmare",
|
| 259 |
+
"enrique849",
|
| 260 |
+
"limebreaker",
|
| 261 |
+
"korichi",
|
| 262 |
+
"simple_background",
|
| 263 |
+
"animatics",
|
| 264 |
+
"darkgem",
|
| 265 |
+
"parasitedeath",
|
| 266 |
+
"stemingbunbun",
|
| 267 |
+
"goshaag",
|
| 268 |
+
"tinygaypirate",
|
| 269 |
+
"ldr",
|
| 270 |
+
"roy_mccloud",
|
| 271 |
+
"digital_painting_(artwork)",
|
| 272 |
+
"lambent",
|
| 273 |
+
"sirjzau",
|
| 274 |
+
"longinius",
|
| 275 |
+
"f-r95",
|
| 276 |
+
"diadorin",
|
| 277 |
+
"red_theme",
|
| 278 |
+
"green_theme",
|
| 279 |
+
"misx",
|
| 280 |
+
"kihu",
|
| 281 |
+
"ajin",
|
| 282 |
+
"dimwitdog",
|
| 283 |
+
"photolol.03",
|
| 284 |
+
"tenshigarden",
|
| 285 |
+
"dagasi",
|
| 286 |
+
"nettsuu",
|
| 287 |
+
"mot",
|
| 288 |
+
"fir3born",
|
| 289 |
+
"kilinah",
|
| 290 |
+
"chalo",
|
| 291 |
+
"nana_gel",
|
| 292 |
+
"caroo",
|
| 293 |
+
"gammainks",
|
| 294 |
+
"john_joseco",
|
| 295 |
+
"hallogreen",
|
| 296 |
+
"realistic",
|
| 297 |
+
"nirvana3",
|
| 298 |
+
"wolfkidd",
|
| 299 |
+
"watercolor_(artwork)",
|
| 300 |
+
"concept_art",
|
| 301 |
+
"sqoon",
|
| 302 |
+
"pochincoff",
|
| 303 |
+
"jedayskayvoker",
|
| 304 |
+
"drxii",
|
| 305 |
+
"dbaru",
|
| 306 |
+
"azuma_minatsu",
|
| 307 |
+
"caliluminos",
|
| 308 |
+
"hyilpi",
|
| 309 |
+
"chloe-dog",
|
| 310 |
+
"line_art",
|
| 311 |
+
"nr_ac",
|
| 312 |
+
"jakethegoat",
|
| 313 |
+
"soul-silver-dragon",
|
| 314 |
+
"nikkyvix",
|
| 315 |
+
"backlash91",
|
| 316 |
+
"halcy0n",
|
| 317 |
+
"notbad621",
|
| 318 |
+
"nauth",
|
| 319 |
+
"fleurfurr",
|
| 320 |
+
"lonbluewolf",
|
| 321 |
+
"ro",
|
| 322 |
+
"azaleesh",
|
| 323 |
+
"w4g4",
|
| 324 |
+
"gillpanda",
|
| 325 |
+
"inkyfrog",
|
| 326 |
+
"silfoe",
|
| 327 |
+
"ill_dingo",
|
| 328 |
+
"dithering",
|
| 329 |
+
"lavilovi",
|
| 330 |
+
"chochi",
|
| 331 |
+
"bacn",
|
| 332 |
+
"lichfang",
|
| 333 |
+
"alacarte",
|
| 334 |
+
"goopyarts",
|
| 335 |
+
"colored_pencil_(artwork)",
|
| 336 |
+
"funkybun",
|
| 337 |
+
"james_howard",
|
| 338 |
+
"trinity-fate62",
|
| 339 |
+
"solterv",
|
| 340 |
+
"trout_(artist)",
|
| 341 |
+
"predaguy",
|
| 342 |
+
"freckles_(artist)",
|
| 343 |
+
"mcsweezy",
|
| 344 |
+
"twang",
|
| 345 |
+
"badgerben",
|
| 346 |
+
"zeiro",
|
| 347 |
+
"lollipopcon",
|
| 348 |
+
"marthedog",
|
| 349 |
+
"anti_dev",
|
| 350 |
+
"atrolux",
|
| 351 |
+
"dramamine",
|
| 352 |
+
"theblueberrycarrots",
|
| 353 |
+
"9x9",
|
| 354 |
+
"tsampikos",
|
| 355 |
+
"mustachemutt",
|
| 356 |
+
"katahane3",
|
| 357 |
+
"komdog",
|
| 358 |
+
"dragk",
|
| 359 |
+
"inuzu",
|
| 360 |
+
"inno-sjoa",
|
| 361 |
+
"felino",
|
| 362 |
+
"kitsune_youkai",
|
| 363 |
+
"spirale",
|
| 364 |
+
"vipery-07",
|
| 365 |
+
"patto",
|
| 366 |
+
"bonk",
|
| 367 |
+
"brown_theme",
|
| 368 |
+
"wolfy-nail",
|
| 369 |
+
"crovirus",
|
| 370 |
+
"lazysnout",
|
| 371 |
+
"sprockeyart",
|
| 372 |
+
"diacordst",
|
| 373 |
+
"enigi09",
|
| 374 |
+
"seth-iova",
|
| 375 |
+
"dibujosv12",
|
| 376 |
+
"berseepon09",
|
| 377 |
+
"dankodeadzone",
|
| 378 |
+
"koul",
|
| 379 |
+
"fluff-kevlar",
|
| 380 |
+
"third-party_edit",
|
| 381 |
+
"s-nina",
|
| 382 |
+
"gyrotech",
|
| 383 |
+
"jhenightfox",
|
| 384 |
+
"photography_(artwork)",
|
| 385 |
+
"jamesfoxbr",
|
| 386 |
+
"boo3",
|
| 387 |
+
"photorealism",
|
| 388 |
+
"spazman",
|
| 389 |
+
"itsunknownanon",
|
| 390 |
+
"soft_shading",
|
| 391 |
+
"geekidog",
|
| 392 |
+
"flashw",
|
| 393 |
+
"lockworkorange",
|
| 394 |
+
"cumlord",
|
| 395 |
+
"themefinland",
|
| 396 |
+
"huskii-s",
|
| 397 |
+
"os",
|
| 398 |
+
"twinkle-sez",
|
| 399 |
+
"jumperbear",
|
| 400 |
+
"wolfeed",
|
| 401 |
+
"lotusgarden",
|
| 402 |
+
"aennor",
|
| 403 |
+
"todex",
|
| 404 |
+
"fenrir_lunaris",
|
| 405 |
+
"incase",
|
| 406 |
+
"sailoranna",
|
| 407 |
+
"seven_(artist)",
|
| 408 |
+
"toony",
|
| 409 |
+
"angstrom",
|
| 410 |
+
"stunnerpony",
|
| 411 |
+
"paeonypetals",
|
| 412 |
+
"smitty_g",
|
| 413 |
+
"roly",
|
| 414 |
+
"pace-maker",
|
| 415 |
+
"bright_colors",
|
| 416 |
+
"vdisco",
|
| 417 |
+
"soulcentinel",
|
| 418 |
+
"pache_riggs",
|
| 419 |
+
"tinydevilhorns",
|
| 420 |
+
"milkytiger1145",
|
| 421 |
+
"vorusuarts",
|
| 422 |
+
"kekitopu",
|
| 423 |
+
"marjani",
|
| 424 |
+
"quanjiang",
|
| 425 |
+
"fuf",
|
| 426 |
+
"psy101",
|
| 427 |
+
"omesore",
|
| 428 |
+
"karno",
|
| 429 |
+
"yogoat",
|
| 430 |
+
"lumineko",
|
| 431 |
+
"carniscorner",
|
| 432 |
+
"senthaurekmern",
|
| 433 |
+
"paperclip_(artist)",
|
| 434 |
+
"haychel",
|
| 435 |
+
"dracojeff",
|
| 436 |
+
"hinar_miler",
|
| 437 |
+
"kaboozle",
|
| 438 |
+
"yakovlev-vad",
|
| 439 |
+
"arh",
|
| 440 |
+
"shinigamisquirrel",
|
| 441 |
+
"gllorvillain",
|
| 442 |
+
"vu06",
|
| 443 |
+
"toradoshi",
|
| 444 |
+
"peculiart",
|
| 445 |
+
"maririn",
|
| 446 |
+
"miso_souperstar",
|
| 447 |
+
"saltyxodium",
|
| 448 |
+
"dryadex",
|
| 449 |
+
"camychan",
|
| 450 |
+
"hungothenomster",
|
| 451 |
+
"kuttoyaki",
|
| 452 |
+
"falvie",
|
| 453 |
+
"cyancapsule",
|
| 454 |
+
"jcosneverexisted",
|
| 455 |
+
"kaboozey",
|
| 456 |
+
"pizademokttero",
|
| 457 |
+
"doxy",
|
| 458 |
+
"3d_(artwork)",
|
| 459 |
+
"purple_theme",
|
| 460 |
+
"mykegreywolf",
|
| 461 |
+
"sindoll",
|
| 462 |
+
"marblesoda",
|
| 463 |
+
"marlon.cores",
|
| 464 |
+
"dipingxiangtr.d",
|
| 465 |
+
"frumples",
|
| 466 |
+
"avoid_posting",
|
| 467 |
+
"amberpendant",
|
| 468 |
+
"darkmirage",
|
| 469 |
+
"screentone",
|
| 470 |
+
"marauder6272",
|
| 471 |
+
"kittydee",
|
| 472 |
+
"droll3",
|
| 473 |
+
"theboogie",
|
| 474 |
+
"inuhoshi-to-darkpen",
|
| 475 |
+
"seamen",
|
| 476 |
+
"posexe",
|
| 477 |
+
"discordthege",
|
| 478 |
+
"nobby_(artist)",
|
| 479 |
+
"rymherdier",
|
| 480 |
+
"skully",
|
| 481 |
+
"dakkawoof",
|
| 482 |
+
"wyntersun",
|
| 483 |
+
"jrvanesbroek",
|
| 484 |
+
"pia-sama",
|
| 485 |
+
"black-kitten",
|
| 486 |
+
"honovy",
|
| 487 |
+
"claweddrip",
|
| 488 |
+
"traditional_media_(artwork)",
|
| 489 |
+
"lizardlars",
|
| 490 |
+
"digitoxici",
|
| 491 |
+
"colored_line_art",
|
| 492 |
+
"warm_colors",
|
| 493 |
+
"snoiifoxxo",
|
| 494 |
+
"iskra",
|
| 495 |
+
"latiar",
|
| 496 |
+
"ozoneserpent",
|
| 497 |
+
"yawg",
|
| 498 |
+
"ravoilie",
|
| 499 |
+
"winick-lim",
|
| 500 |
+
"arania",
|
| 501 |
+
"erunroe",
|
| 502 |
+
"tailzkim",
|
| 503 |
+
"pearlyiridescence",
|
| 504 |
+
"jerro",
|
| 505 |
+
"ventkazemaru",
|
| 506 |
+
"shikaro",
|
| 507 |
+
"chrisandcompany",
|
| 508 |
+
"scappo",
|
| 509 |
+
"gimka",
|
| 510 |
+
"zp92",
|
| 511 |
+
"dacad",
|
| 512 |
+
"metal_(artist)",
|
| 513 |
+
"littlesheep",
|
| 514 |
+
"latex_(artist)",
|
| 515 |
+
"colored_sketch",
|
| 516 |
+
"kick_(artist)",
|
| 517 |
+
"oposa",
|
| 518 |
+
"inuki",
|
| 519 |
+
"lustylamb",
|
| 520 |
+
"chibi",
|
| 521 |
+
"imperatorcaesar",
|
| 522 |
+
"lysergide",
|
| 523 |
+
"rrowdybeast",
|
| 524 |
+
"keishinkae",
|
| 525 |
+
"ritts",
|
| 526 |
+
"blitzdrachin",
|
| 527 |
+
"kakuteki11029",
|
| 528 |
+
"danaume",
|
| 529 |
+
"anaugi",
|
| 530 |
+
"lunalei",
|
| 531 |
+
"sigenoya",
|
| 532 |
+
"iggi",
|
| 533 |
+
"dhx2kartz",
|
| 534 |
+
"kitchiki",
|
| 535 |
+
"solid_color",
|
| 536 |
+
"formal_art",
|
| 537 |
+
"ayaka",
|
| 538 |
+
"kanel",
|
| 539 |
+
"thewyvernsweaver",
|
| 540 |
+
"jerseydevil",
|
| 541 |
+
"zer0rebel4",
|
| 542 |
+
"dark_colors",
|
| 543 |
+
"general-irrelevant",
|
| 544 |
+
"walter_sache",
|
| 545 |
+
"detailed_background",
|
| 546 |
+
"toshi_(artist)",
|
| 547 |
+
"shane_frost",
|
| 548 |
+
"wingedwilly",
|
| 549 |
+
"kandlin",
|
| 550 |
+
"oekaki",
|
| 551 |
+
"kosian",
|
| 552 |
+
"voidlesky",
|
| 553 |
+
"furryratchet",
|
| 554 |
+
"style_wager",
|
| 555 |
+
"pururing",
|
| 556 |
+
"ota_(artist)",
|
| 557 |
+
"cotton_(artist)",
|
| 558 |
+
"chromapan",
|
| 559 |
+
"denizen1414",
|
| 560 |
+
"inspired_by_formal_art",
|
| 561 |
+
"dedoarts",
|
| 562 |
+
"tatu_wani_(artist)",
|
| 563 |
+
"animancer",
|
| 564 |
+
"skipsy",
|
| 565 |
+
"jailbird",
|
| 566 |
+
"macop",
|
| 567 |
+
"joaoppereiraus",
|
| 568 |
+
"willitfit",
|
| 569 |
+
"sundown_(artist)",
|
| 570 |
+
"lightsource",
|
| 571 |
+
"spot_color",
|
| 572 |
+
"corrsk",
|
| 573 |
+
"restricted_palette",
|
| 574 |
+
"carrot_(artist)",
|
| 575 |
+
"kiwa_flowcat",
|
| 576 |
+
"grey_theme",
|
| 577 |
+
"ymbk",
|
| 578 |
+
"creatiffy",
|
| 579 |
+
"ankk",
|
| 580 |
+
"weskers",
|
| 581 |
+
"pdxyz",
|
| 582 |
+
"eric_schwartz",
|
| 583 |
+
"araivis-edelveys",
|
| 584 |
+
"an-tonio",
|
| 585 |
+
"zzvinniezz",
|
| 586 |
+
"teckworks",
|
| 587 |
+
"tehbuttercookie",
|
| 588 |
+
"aoizuri",
|
| 589 |
+
"orange_theme",
|
| 590 |
+
"ratatooey",
|
| 591 |
+
"renthedragon",
|
| 592 |
+
"backsash",
|
| 593 |
+
"tokifuji",
|
| 594 |
+
"harnny",
|
| 595 |
+
"kemono",
|
| 596 |
+
"hioshiru",
|
| 597 |
+
"keadonger",
|
| 598 |
+
"mytigertail",
|
| 599 |
+
"magnificent-arsehole",
|
| 600 |
+
"wittless-pilgrim",
|
| 601 |
+
"neurodyne",
|
| 602 |
+
"mleonheart",
|
| 603 |
+
"anibaruthecat",
|
| 604 |
+
"asnnonaka",
|
| 605 |
+
"sylvanedadeer",
|
| 606 |
+
"revadiehard",
|
| 607 |
+
"slugbox",
|
| 608 |
+
"quillu",
|
| 609 |
+
"badlandsdrws",
|
| 610 |
+
"el-loko",
|
| 611 |
+
"kevinsano",
|
| 612 |
+
"sake_kemosalmon",
|
| 613 |
+
"gewitter",
|
| 614 |
+
"averyshadydolphin",
|
| 615 |
+
"viroveteruscy",
|
| 616 |
+
"style_parody",
|
| 617 |
+
"dirtyscoundrel",
|
| 618 |
+
"zwitterkitsune",
|
| 619 |
+
"conditional_dnp",
|
| 620 |
+
"joelasko",
|
| 621 |
+
"skeleion",
|
| 622 |
+
"malicekira",
|
| 623 |
+
"avante92",
|
| 624 |
+
"itoruna",
|
| 625 |
+
"simonaquarius",
|
| 626 |
+
"crayon_(artwork)",
|
| 627 |
+
"coffeechicken",
|
| 628 |
+
"marenlicious",
|
| 629 |
+
"conrie",
|
| 630 |
+
"iriedono",
|
| 631 |
+
"riorix",
|
| 632 |
+
"lyme-slyme",
|
| 633 |
+
"neksu",
|
| 634 |
+
"delta.dynamics",
|
| 635 |
+
"kristiana_puff",
|
| 636 |
+
"katie_hofgard",
|
| 637 |
+
"demien",
|
| 638 |
+
"dancrescentwolf",
|
| 639 |
+
"kenno_arkkan",
|
| 640 |
+
"karabiner",
|
| 641 |
+
"zooshi",
|
| 642 |
+
"kami-chan",
|
| 643 |
+
"pastel_(artwork)",
|
| 644 |
+
"nauyaco",
|
| 645 |
+
"thebigbadwolf01",
|
| 646 |
+
"matemi",
|
| 647 |
+
"badumsquish",
|
| 648 |
+
"cooliehigh",
|
| 649 |
+
"zummeng",
|
| 650 |
+
"bikupan",
|
| 651 |
+
"cheezayballz",
|
| 652 |
+
"gorsha_pendragon",
|
| 653 |
+
"prsmrti",
|
| 654 |
+
"atryl",
|
| 655 |
+
"kazuhiro",
|
| 656 |
+
"kingofacesx",
|
| 657 |
+
"domovoi_lazaroth",
|
| 658 |
+
"glopossum",
|
| 659 |
+
"slashysmiley",
|
| 660 |
+
"flynx-flink",
|
| 661 |
+
"seyrmo",
|
| 662 |
+
"superbunnygt",
|
| 663 |
+
"ifus",
|
| 664 |
+
"tattoorexy",
|
| 665 |
+
"jinti_(artist)",
|
| 666 |
+
"punkypanda",
|
| 667 |
+
"aka6",
|
| 668 |
+
"mofuaki",
|
| 669 |
+
"tai_l_rodriguez",
|
| 670 |
+
"hitsuji",
|
| 671 |
+
"synnfultiger",
|
| 672 |
+
"still_life",
|
| 673 |
+
"jinu",
|
| 674 |
+
"no_swift",
|
| 675 |
+
"neko-me",
|
| 676 |
+
"thejoyfuldragon",
|
| 677 |
+
"cel_shading",
|
| 678 |
+
"haps",
|
| 679 |
+
"aimi",
|
| 680 |
+
"skidd",
|
| 681 |
+
"unknown_artist",
|
| 682 |
+
"thekinkybear",
|
| 683 |
+
"mixed_media",
|
| 684 |
+
"greasymojo",
|
| 685 |
+
"matospectoru",
|
| 686 |
+
"kimacats",
|
| 687 |
+
"max_blackrabbit",
|
| 688 |
+
"band1tnsfw",
|
| 689 |
+
"neotheta",
|
| 690 |
+
"ultilix",
|
| 691 |
+
"unfinished",
|
| 692 |
+
"valsalia",
|
| 693 |
+
"mr-shin",
|
| 694 |
+
"aer0_zer0",
|
| 695 |
+
"blues64",
|
| 696 |
+
"cotora",
|
| 697 |
+
"t0l0k",
|
| 698 |
+
"nexus",
|
| 699 |
+
"diesel_wiesel",
|
| 700 |
+
"lineless",
|
| 701 |
+
"kredri",
|
| 702 |
+
"cownugget",
|
| 703 |
+
"starfighter",
|
| 704 |
+
"painting_(artwork)",
|
| 705 |
+
"redishdragie",
|
| 706 |
+
"melianah",
|
| 707 |
+
"pasaran",
|
| 708 |
+
"notkastar",
|
| 709 |
+
"tetsushi",
|
| 710 |
+
"domibun",
|
| 711 |
+
"frist44",
|
| 712 |
+
"high_contrast",
|
| 713 |
+
"shamziwhite",
|
| 714 |
+
"xing1",
|
| 715 |
+
"foxovh",
|
| 716 |
+
"zi0808",
|
| 717 |
+
"anonymous_artist",
|
| 718 |
+
"somescrub",
|
| 719 |
+
"rikose",
|
| 720 |
+
"smudge_proof",
|
| 721 |
+
"sculpture_(artwork)",
|
| 722 |
+
"redout",
|
| 723 |
+
"rotten_robbie",
|
| 724 |
+
"aaron_(artist)",
|
| 725 |
+
"statue",
|
| 726 |
+
"lazydez",
|
| 727 |
+
"modeseven",
|
| 728 |
+
"renegade-157",
|
| 729 |
+
"thunderouserections",
|
| 730 |
+
"letterbox",
|
| 731 |
+
"masterelrest",
|
| 732 |
+
"cynthiafeline",
|
| 733 |
+
"zeklullaby",
|
| 734 |
+
"kloudmutt",
|
| 735 |
+
"tyroo",
|
| 736 |
+
"unusual_coloring",
|
| 737 |
+
"flinters",
|
| 738 |
+
"xenoforge",
|
| 739 |
+
"zeta-haru",
|
| 740 |
+
"asbel_lhant",
|
| 741 |
+
"grinn3r",
|
| 742 |
+
"redpixie",
|
| 743 |
+
"narse",
|
| 744 |
+
"jmg",
|
| 745 |
+
"takotyutyu",
|
| 746 |
+
"heather_bruton",
|
| 747 |
+
"justmegabenewell",
|
| 748 |
+
"furball",
|
| 749 |
+
"nastycalamari",
|
| 750 |
+
"sketchybug",
|
| 751 |
+
"sirmasterdufel",
|
| 752 |
+
"wfa",
|
| 753 |
+
"oddjuice",
|
| 754 |
+
"xnirox",
|
| 755 |
+
"toughset",
|
| 756 |
+
"yoshimister",
|
| 757 |
+
"lawyerdog",
|
| 758 |
+
"javkiller",
|
| 759 |
+
"aztepyeen",
|
| 760 |
+
"guide_lines",
|
| 761 |
+
"xylas",
|
| 762 |
+
"senshion",
|
| 763 |
+
"slb",
|
| 764 |
+
"hitmore",
|
| 765 |
+
"tansau",
|
| 766 |
+
"ashraely",
|
| 767 |
+
"viola_bat",
|
| 768 |
+
"1boshi",
|
| 769 |
+
"darkflash23",
|
| 770 |
+
"yaki_atsuage",
|
| 771 |
+
"aomori",
|
| 772 |
+
"shiuk",
|
| 773 |
+
"thegreatmatsutzu",
|
| 774 |
+
"vavacung",
|
| 775 |
+
"doggomeatball",
|
| 776 |
+
"vono",
|
| 777 |
+
"tachiuo",
|
| 778 |
+
"jwinkz",
|
| 779 |
+
"lavenderpandy",
|
| 780 |
+
"jrjresq",
|
| 781 |
+
"mylafox",
|
| 782 |
+
"lewdchuu_(artist)",
|
| 783 |
+
"argento",
|
| 784 |
+
"tahlian",
|
| 785 |
+
"vrabo",
|
| 786 |
+
"fuze",
|
| 787 |
+
"mdgusty",
|
| 788 |
+
"goonie-san",
|
| 789 |
+
"grypwolf",
|
| 790 |
+
"cursedmarked",
|
| 791 |
+
"sogaroth",
|
| 792 |
+
"0r0ch1",
|
| 793 |
+
"hierophant_green_(artist)",
|
| 794 |
+
"argon_vile",
|
| 795 |
+
"hyaku_(artist)",
|
| 796 |
+
"bastionshadowpaw",
|
| 797 |
+
"siroc",
|
| 798 |
+
"digital_drawing_(artwork)",
|
| 799 |
+
"mr.pink",
|
| 800 |
+
"billynr",
|
| 801 |
+
"kyander",
|
| 802 |
+
"unknowhiter",
|
| 803 |
+
"littlerager",
|
| 804 |
+
"kuroodod",
|
| 805 |
+
"ssssnowy",
|
| 806 |
+
"plankboy",
|
| 807 |
+
"senz",
|
| 808 |
+
"roobin",
|
| 809 |
+
"sbshouseofpancakes",
|
| 810 |
+
"ewgengster_(artist)",
|
| 811 |
+
"tojo_the_thief",
|
| 812 |
+
"nakoo",
|
| 813 |
+
"famir_(artist)",
|
| 814 |
+
"wastedtimeee",
|
| 815 |
+
"1-upclock",
|
| 816 |
+
"blue_theme",
|
| 817 |
+
"ruaidri",
|
| 818 |
+
"thousandfoldfeathers",
|
| 819 |
+
"kusosensei",
|
| 820 |
+
"cool_colors",
|
| 821 |
+
"sugarlesspaints",
|
| 822 |
+
"doesnotexist",
|
| 823 |
+
"bobbydando",
|
| 824 |
+
"meesh",
|
| 825 |
+
"johnmarten",
|
| 826 |
+
"strega",
|
| 827 |
+
"kogito",
|
| 828 |
+
"polygon5",
|
| 829 |
+
"yupa",
|
| 830 |
+
"sunny_way",
|
| 831 |
+
"faint",
|
| 832 |
+
"sacrificabominat",
|
| 833 |
+
"king-cheetah",
|
| 834 |
+
"shyguy9",
|
| 835 |
+
"insomniacovrlrd",
|
| 836 |
+
"geeflakes",
|
| 837 |
+
"paper-wings",
|
| 838 |
+
"oob",
|
| 839 |
+
"smooshkin",
|
| 840 |
+
"zerofox1000",
|
| 841 |
+
"sudonym",
|
| 842 |
+
"bristol",
|
| 843 |
+
"cracker_(artist)",
|
| 844 |
+
"wherewolf",
|
| 845 |
+
"snofu",
|
| 846 |
+
"aoino",
|
| 847 |
+
"yellow_theme",
|
| 848 |
+
"bunnybits",
|
| 849 |
+
"kaion",
|
| 850 |
+
"gin-blade",
|
| 851 |
+
"jamoart",
|
| 852 |
+
"guoh",
|
| 853 |
+
"krazyelf",
|
| 854 |
+
"euyoshi89",
|
| 855 |
+
"v-tal",
|
| 856 |
+
"norithics",
|
| 857 |
+
"aycee",
|
| 858 |
+
"mr.under",
|
| 859 |
+
"official_art",
|
| 860 |
+
"kanashiipanda",
|
| 861 |
+
"rayka",
|
| 862 |
+
"martincorps",
|
| 863 |
+
"yakantuzura",
|
| 864 |
+
"art_nouveau",
|
| 865 |
+
"ipoke",
|
| 866 |
+
"ze_blackball.d",
|
| 867 |
+
"signature",
|
| 868 |
+
"karnator",
|
| 869 |
+
"gideon",
|
| 870 |
+
"isyld",
|
| 871 |
+
"loveslove",
|
| 872 |
+
"dizzymilky",
|
| 873 |
+
"sana!rpg",
|
| 874 |
+
"elpatrixf",
|
| 875 |
+
"bigdon1992",
|
| 876 |
+
"artlegionary",
|
| 877 |
+
"erobos",
|
| 878 |
+
"doomington",
|
| 879 |
+
"pencil_(artwork)",
|
| 880 |
+
"lamiaaaa",
|
| 881 |
+
"seibear",
|
| 882 |
+
"james_m_hardiman",
|
| 883 |
+
"pickles-hyena",
|
| 884 |
+
"emenius",
|
| 885 |
+
"screamoshaymin",
|
| 886 |
+
"wugi",
|
| 887 |
+
"shaded",
|
| 888 |
+
"ittybittykittytittys",
|
| 889 |
+
"pixel_(artwork)",
|
| 890 |
+
"digital_media_(artwork)",
|
| 891 |
+
"hyenaface",
|
| 892 |
+
"border",
|
| 893 |
+
"muzz",
|
| 894 |
+
"jarnqk",
|
| 895 |
+
"orlandofox",
|
| 896 |
+
"azura_inalis",
|
| 897 |
+
"captain_nikko",
|
| 898 |
+
"kabalmystic_(artist)",
|
| 899 |
+
"pata",
|
| 900 |
+
"personalami",
|
| 901 |
+
"theblackrook",
|
| 902 |
+
"grisser",
|
| 903 |
+
"uniparasite",
|
| 904 |
+
"cold-blooded-twilight",
|
| 905 |
+
"neon_colors",
|
| 906 |
+
"tsudamaku",
|
| 907 |
+
"zeekzag",
|
| 908 |
+
"foxenawolf",
|
| 909 |
+
"zyira",
|
| 910 |
+
"sexotheque"
|
| 911 |
+
]
|
| 912 |
+
|