File size: 7,440 Bytes
1613a0b
 
 
 
 
 
 
 
 
e0be361
 
a180d62
 
 
 
 
 
 
e12ff12
 
 
 
0e40187
e12ff12
 
 
 
1613a0b
 
 
 
a180d62
1613a0b
 
e12ff12
e6e96bd
a180d62
1613a0b
a180d62
1613a0b
a180d62
1613a0b
 
0572160
1613a0b
 
a180d62
 
 
 
 
 
 
 
 
 
 
 
 
1613a0b
 
036e80f
 
 
 
 
 
 
 
 
 
 
 
a180d62
 
 
 
 
 
 
 
 
 
 
 
036e80f
 
d823d92
a180d62
d823d92
a180d62
d823d92
 
 
 
 
 
 
 
 
 
 
 
e0be361
 
 
 
 
b18c329
 
e0be361
 
 
 
 
 
a180d62
 
 
aa8daaf
a180d62
 
 
1613a0b
729764a
a180d62
 
 
0572160
e90a7b8
d3acf98
036e80f
0572160
bce7d5c
d823d92
1096f1d
e0be361
 
 
 
 
729764a
 
5a8ffe3
e2a066d
bce7d5c
e2a066d
a180d62
 
 
e0be361
e2a066d
729764a
bc0be02
e0be361
d823d92
 
 
 
 
09f7897
9cdd0fe
d823d92
9092f95
 
d823d92
 
 
 
 
 
 
bc0be02
d823d92
1613a0b
a180d62
 
 
 
d823d92
a180d62
 
1613a0b
 
 
d823d92
1613a0b
d823d92
 
 
 
 
a180d62
e0be361
 
 
1096f1d
8a10301
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
import gradio as gr
from Lex import *
'''
lex = Lexica(query="man woman fire snow").images()
'''
from PIL import Image
import imagehash
import requests

from zipfile import ZipFile

from time import sleep
sleep_time = 0.5

hash_func_name = list(filter(lambda x: x.endswith("hash") and
"hex" not in x ,dir(imagehash)))
hash_func_name = ['average_hash', 'colorhash', 'dhash', 'phash', 'whash', 'crop_resistant_hash',]

def min_dim_to_size(img, size = 512):
    h, w = img.size
    ratio = size / max(h, w)
    h, w = map(lambda x: int(x * ratio), [h, w])
    return ( ratio ,img.resize((h, w)) )

#ratio_size = 512
#ratio, img_rs = min_dim_to_size(img, ratio_size)

def image_click(images, evt: gr.SelectData):
    img_selected = images[evt.index]
    return images[evt.index]['name']

def swap_gallery(im, images, func_name):
    #### name data is_file
    #print(images[0].keys())
    if im is None:
        return list(map(lambda x: x["name"], images))
    hash_func = getattr(imagehash, func_name)

    im_hash = hash_func(Image.fromarray(im))
    t2_list = sorted(images, key = lambda imm:
    hash_func(Image.open(imm["name"])) - im_hash, reverse = False)
    return list(map(lambda x: x["name"], t2_list))

def lexica(prompt, limit_size = 128, ratio_size = 256 + 128):
    lex = Lexica(query=prompt).images()
    lex = lex[:limit_size]
    lex = list(map(lambda x: x.replace("full_jpg", "sm2"), lex))
    lex_ = []
    for ele in lex:
        try:
            im = Image.open(
                            requests.get(ele, stream = True).raw
                            )
            lex_.append(im)
        except:
            print("err")
        sleep(sleep_time)
    assert lex_
    lex = list(map(lambda x: min_dim_to_size(x, ratio_size)[1], lex_))
    return lex

def enterpix(prompt, limit_size = 100, ratio_size = 256 + 128, use_key = "bigThumbnailUrl"):
    resp = requests.post(
    url = "https://www.enterpix.app/enterpix/v1/image/prompt-search",
    data= {
        "length": limit_size,
        "platform": "stable-diffusion,midjourney",
        "prompt": prompt,
        "start": 0
        }
    )
    resp = resp.json()
    resp = list(map(lambda x: x[use_key], resp["images"]))
    lex_ = []
    for ele in resp:
        try:
            im = Image.open(
                            requests.get(ele, stream = True).raw
                            )
            lex_.append(im)
        except:
            print("err")
        sleep(sleep_time)
    assert lex_
    resp = list(map(lambda x: min_dim_to_size(x, ratio_size)[1], lex_))
    return resp

def search(prompt, search_name, im, func_name):
    if search_name == "lexica":
        im_l = lexica(prompt)
    else:
        im_l = enterpix(prompt)
    if im is None:
        return im_l

    hash_func = getattr(imagehash, func_name)

    im_hash = hash_func(Image.fromarray(im))
    t2_list = sorted(im_l, key = lambda imm:
    hash_func(imm) - im_hash, reverse = False)
    return t2_list
    #return list(map(lambda x: x["name"], t2_list))

def zip_ims(g):
    from uuid import uuid1
    if g is None:
        return None
    l = list(map(lambda x: x["name"], g))
    if not l:
        return None
    zip_file_name ="tmp.zip"
    with ZipFile(zip_file_name ,"w") as zipObj:
        for ele in l:
            zipObj.write(ele, "{}.png".format(uuid1()))
        #zipObj.write(file2.name, "file2")
    return zip_file_name

with gr.Blocks(css="custom.css") as demo:
    title = gr.HTML(
            """<h1><img src="https://i.imgur.com/52VJ8vS.png" alt="SD"> StableDiffusion Search by Prompt order by Image Hash</h1>""",
            elem_id="title",
    )

    with gr.Row():
        with gr.Column():
            with gr.Row():
                search_func_name = gr.Radio(choices=["lexica", "enterpix"],
                    value="lexica", label="Search by", elem_id="search_radio")
            with gr.Row():
                #inputs = gr.Textbox(label = 'Enter prompt to search Lexica.art')
                inputs = gr.Textbox(label="Prompt", show_label=False, lines=1, max_lines=20, min_width = 256,
                placeholder="Enter prompt to search", elem_id="prompt")
                #gr.Slider(label='Number of images ', minimum = 4, maximum = 20, step = 1, value = 4)]
                text_button = gr.Button("Retrieve Images", elem_id="run_button")
            i = gr.Image(elem_id="result-image", label = "Image upload or selected", height = 768 - 256 - 32)

            with gr.Row():
                with gr.Tab(label = "Download"):
                    zip_button = gr.Button("Zip Images to Download", elem_id="zip_button")
                    downloads = gr.File(label = "Image zipped", elem_id = "zip_file")

        with gr.Column():
            title = gr.Markdown(
                    value="### Click on a Image in the gallery to select it, and the grid order will change",
                    visible=True,
                    elem_id="selected_model",
                )
            order_func_name = gr.Radio(choices=hash_func_name,
            value=hash_func_name[0], label="Order by", elem_id="order_radio")

            outputs = gr.Gallery(lable='Output gallery', elem_id="gallery",).style(grid=5,height=768 + 64 + 32,
                    allow_preview=False, label = "retrieve Images")
            #gr.Dataframe(label='prompts for corresponding images')]


    with gr.Row():
        gr.Examples(
            [
            ["chinese zodiac signs", "lexica", "images/chinese_zodiac_signs.png", "average_hash"],
            ["trending digital art", "lexica", "images/trending_digital_art.png", "colorhash"],
            ["masterpiece, best quality, 1girl, solo, crop top, denim shorts, choker, (graffiti:1.5), paint splatter, arms behind back, against wall, looking at viewer, armband, thigh strap, paint on body, head tilt, bored, multicolored hair, aqua eyes, headset,", "lexica", "images/yuzu_girl0.png", "average_hash"],
            ["beautiful home", "enterpix", "images/beautiful_home.png", "whash"],
            ["interior design of living room", "enterpix", "images/interior_design_of_living_room.png", "whash"],
            ["1girl, aqua eyes, baseball cap, blonde hair, closed mouth, earrings, green background, hat, hoop earrings, jewelry, looking at viewer, shirt, short hair, simple background, solo, upper body, yellow shirt",
             "enterpix", "images/waifu_girl0.png", "phash"],
            ],
            inputs = [inputs, search_func_name, i, order_func_name],
            label = "Examples"
        )

    #outputs.select(image_click, outputs, i, _js="(x) => x.splice(0,x.length)")
    outputs.select(image_click, outputs, i,)

    i.change(
                fn=swap_gallery,
                inputs=[i, outputs, order_func_name],
                outputs=outputs,
                queue=False
                )
    order_func_name.change(
                fn=swap_gallery,
                inputs=[i, outputs, order_func_name],
                outputs=outputs,
                queue=False
                )
    #### gr.Textbox().submit().success()

    ### lexica
    #text_button.click(lexica, inputs=inputs, outputs=outputs)
    ### enterpix
    #text_button.click(enterpix, inputs=inputs, outputs=outputs)
    text_button.click(search, inputs=[inputs, search_func_name, i, order_func_name], outputs=outputs)

    zip_button.click(
        zip_ims, inputs = outputs, outputs=downloads
    )

demo.launch("0.0.0.0")