Spaces:
Sleeping
Sleeping
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) |