File size: 7,823 Bytes
8d00201
 
 
 
da4f6a0
 
ca06aae
 
1cee0c5
 
 
da4f6a0
d5e8a13
8d00201
d5e8a13
8d00201
6accf0d
 
8d00201
 
 
 
1cee0c5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8d00201
ca06aae
 
 
 
8d00201
 
 
 
da4f6a0
8d00201
 
6accf0d
d5e8a13
8d00201
 
 
6accf0d
8d00201
 
 
d5e8a13
8d00201
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6accf0d
8d00201
 
 
 
 
 
 
da4f6a0
 
 
d5e8a13
 
da4f6a0
8d00201
d5e8a13
8d00201
da4f6a0
 
 
8d00201
 
 
da4f6a0
 
 
8d00201
 
ca06aae
 
 
 
 
8d00201
 
 
 
 
 
 
6accf0d
8d00201
 
 
d5e8a13
8d00201
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
da4f6a0
 
 
8d00201
 
 
 
 
 
 
 
 
6accf0d
d5e8a13
 
8d00201
d5e8a13
 
 
da4f6a0
8d00201
da4f6a0
8d00201
 
d5e8a13
 
8d00201
6accf0d
8d00201
6accf0d
8d00201
 
d5e8a13
8d00201
d5e8a13
8d00201
 
 
 
 
 
 
d5e8a13
 
8d00201
 
 
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
#!/usr/bin/env python

import gradio as gr
import os
import json
import requests
import time
from concurrent.futures import ThreadPoolExecutor
from PIL import Image
import base64
import hashlib

DESCRIPTION = '''<h2 style='text-align: center'> <a href="https://github.com/THUDM/CogVLM2"> CogVLM2 </a></h2>'''

NOTES = 'This app is adapted from <a href="https://github.com/THUDM/CogVLM">https://github.com/THUDM/CogVLM2</a> . It would be recommended to check out the repo if you want to see the detail of our model.\n\n该demo仅作为测试使用,不支持批量请求。如有大批量需求,欢迎联系[智谱AI](mailto:business@zhipuai.cn)。\n<a href="http://36.103.203.44:7861/">备用链接</a>'

MAINTENANCE_NOTICE1 = 'Hint 1: If the app report "Something went wrong, connection error out", please turn off your proxy and retry.<br>Hint 2: If you upload a large size of image like 10MB, it may take some time to upload and process. Please be patient and wait.'

default_chatbox = [("", "Hi, What do you want to know about this image?")]

URL = os.environ.get("URL")

def process_image_without_resize(image_prompt):
    image = Image.open(image_prompt)
    print(f"height:{image.height}, width:{image.width}")
    timestamp = time.time()
    file_ext = os.path.splitext(image_prompt)[1]
    filename = f"examples/{timestamp}{file_ext}"
    filename_grounding = f"examples/{timestamp}_grounding{file_ext}"
    image.save(filename)
    print(f"temporal filename {filename}")
    with open(filename, "rb") as image_file:
        bytes = base64.b64encode(image_file.read())
        encoded_img = str(bytes, encoding='utf-8')
        image_hash = hashlib.sha256(bytes).hexdigest()
        os.remove(filename)
        return image, encoded_img, image_hash, filename_grounding


def make_request(URL, headers, data):
    response = requests.request("POST", URL, headers=headers, data=data, timeout=(60, 100))
    return response.json()

def post(
        input_text,
        temperature,
        top_p,
        top_k,
        image_prompt,
        result_previous,
        hidden_image,
        is_english,  
        ):
    result_text = [(ele[0], ele[1]) for ele in result_previous]
    for i in range(len(result_text)-1, -1, -1):
        if result_text[i][0] == "" or result_text[i][0] == None:
            del result_text[i]
    print(f"history {result_text}")

    is_zh = not is_english

    if image_prompt is None:
        print("Image empty")
        if is_zh:
            result_text.append((input_text, '图片为空!请上传图片并重试。'))
        else:
            result_text.append((input_text, 'Image empty! Please upload a image and retry.'))
        return input_text, result_text, hidden_image
    elif input_text == "":
        print("Text empty")
        result_text.append((input_text, 'Text empty! Please enter text and retry.'))
        return "", result_text, hidden_image                

    headers = {
            "Content-Type": "application/json; charset=UTF-8",
            "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36",
        }
    if image_prompt:
        pil_img, encoded_img, image_hash, image_path_grounding = process_image_without_resize(image_prompt)
        print(f"image_hash:{image_hash}, hidden_image_hash:{hidden_image}")

        if hidden_image is not None and image_hash != hidden_image:
            print("image has been update")
            result_text = []        
        hidden_image = image_hash        
    else:
        encoded_img = None 

    model_use = "vlm_chat"
    if not is_english:
        model_use = "vlm_chat_zh"
    prompt = input_text

    print(f'request {model_use} model... with prompt {prompt}')
    data = json.dumps({
        'model_use': model_use,
        'text': prompt,
        'history': result_text,
        'image': encoded_img,
        'temperature': temperature,
        'top_p': top_p,
        'top_k': top_k,
        'do_sample': True,
        'max_new_tokens': 2048
    })
    try:
        with ThreadPoolExecutor(max_workers=1) as executor:
            future = executor.submit(make_request, URL, headers, data)
            # time.sleep(15)
            response = future.result()  # Blocks until the request is complete
        # response = requests.request("POST", URL, headers=headers, data=data, timeout=(60, 100)).json()
    except Exception as e:
        print("error message", e)
        if is_zh:
            result_text.append((input_text, '超时!请稍等几分钟再重试。'))
        else:
            result_text.append((input_text, 'Timeout! Please wait a few minutes and retry.'))
        return "", result_text, hidden_image
    print('request done...')
    # response = {'result':input_text}

    answer = str(response['result'])
    result_text.append((input_text, answer))
    print(result_text)
    print('finished')
    return "", result_text, hidden_image


def clear_fn(value):
    return "", default_chatbox, None

def clear_fn2(value):
    return default_chatbox


def main():
    gr.close_all()
    examples = []
    with open("./examples/example_inputs.jsonl") as f:
        for line in f:
            data = json.loads(line)
            examples.append(data)


    with gr.Blocks(css='style.css') as demo:

        gr.Markdown(DESCRIPTION)
        gr.Markdown(NOTES)

        with gr.Row():
            with gr.Column(scale=4.5):
                with gr.Group():
                    input_text = gr.Textbox(label='Input Text', placeholder='Please enter text prompt below and press ENTER.')
                    with gr.Row():
                        run_button = gr.Button('Generate')
                        clear_button = gr.Button('Clear')

                    image_prompt = gr.Image(type="filepath", label="Image Prompt", value=None)
                with gr.Row():
                    is_english = gr.Checkbox(label="Use English Model")
                    
                with gr.Row():
                    temperature = gr.Slider(maximum=1, value=0.8, minimum=0, label='Temperature')
                    top_p = gr.Slider(maximum=1, value=0.4, minimum=0, label='Top P')
                    top_k = gr.Slider(maximum=50, value=1, minimum=1, step=1, label='Top K')

            with gr.Column(scale=5.5):
                result_text = gr.components.Chatbot(label='Multi-round conversation History', value=[("", "Hi, What do you want to know about this image?")], height=550)
                hidden_image_hash = gr.Textbox(visible=False)

        gr_examples = gr.Examples(examples=[[example["text"], example["image"], example["is_english"]] for example in examples], 
                                  inputs=[input_text, image_prompt, is_english],
                                  label="Example Inputs (Click to insert an examplet into the input box)",
                                  examples_per_page=6)

        gr.Markdown(MAINTENANCE_NOTICE1)

        print(gr.__version__)
        run_button.click(fn=post,inputs=[input_text, temperature, top_p, top_k, image_prompt, result_text, hidden_image_hash, is_english],
                         outputs=[input_text, result_text, hidden_image_hash])
        input_text.submit(fn=post,inputs=[input_text, temperature, top_p, top_k, image_prompt, result_text, hidden_image_hash, is_english],
                         outputs=[input_text, result_text, hidden_image_hash])
        clear_button.click(fn=clear_fn, inputs=clear_button, outputs=[input_text, result_text, image_prompt])
        image_prompt.upload(fn=clear_fn2, inputs=clear_button, outputs=[result_text])
        image_prompt.clear(fn=clear_fn2, inputs=clear_button, outputs=[result_text])

        print(gr.__version__)

    demo.launch(max_threads=10)


if __name__ == '__main__':
    main()