File size: 2,570 Bytes
f39c6eb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from PIL import Image
import torch
from transformers import BertForSequenceClassification, BertConfig, BertTokenizer
from transformers import CLIPProcessor, CLIPModel
import numpy as np
import time
import gradio as gr
import re

# 加载Taiyi 中文 word encoder
text_tokenizer = BertTokenizer.from_pretrained("IDEA-CCNL/Taiyi-CLIP-Roberta-102M-Chinese")
text_encoder = BertForSequenceClassification.from_pretrained("IDEA-CCNL/Taiyi-CLIP-Roberta-102M-Chinese").eval()
# 加载CLIP的image encoder
clip_model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")


def imgclassfiy(query_texts,img_url):
    start_time = time.time()
    query_texts =re.split(",|,",query_texts)
    text = text_tokenizer(query_texts, return_tensors='pt', padding=True)['input_ids']
    url = img_url

    image = processor(images=Image.open(url), return_tensors="pt")

    with torch.no_grad():
        image_features = clip_model.get_image_features(**image)
        text_features = text_encoder(text).logits

        # 归一化
        image_features = image_features / image_features.norm(dim=1, keepdim=True)
        text_features = text_features / text_features.norm(dim=1, keepdim=True)

        # 计算余弦相似度 logit_scale是尺度系数
        logit_scale = clip_model.logit_scale.exp()
        logits_per_image = logit_scale * image_features @ text_features.t()
        logits_per_text = logits_per_image.t()
        probs = logits_per_image.softmax(dim=-1).cpu().numpy()

        #res = np.around(probs, 3)[0]
        res = query_texts[np.argmax(probs)]

    end_time = time.time()
    print('用时:', end_time - start_time)
    return res

if __name__ =="__main__":

    with gr.Blocks(title="自定义类别的图像分类") as demo:
        # 标题
        gr.HTML('<br>')
        gr.HTML(
            f'<center><p style="color:#4377ec;font-size:42px;font-weight:bold;text-shadow: #FDEDB7 2px 0 0, #FDEDB7 0 2px 0, #FDEDB7 -2px 0 0, #FDEDB7 0 -2px 0;">自定义类别的图像分类</p></center>')
        gr.HTML('<br>')
        with gr.Row() as row:
            with gr.Column():
                img_input = gr.Image(type="filepath")
                out_input = gr.Textbox(lable='自定义类别')
                text_btn = gr.Button("提交")

            with gr.Column(scale=5):
                img_out =  gr.Textbox(lable='输出类别')

        text_btn.click(fn=imgclassfiy, inputs=[out_input,img_input], outputs=[img_out])

    demo.launch(show_api=False,inbrowser=True)