File size: 2,884 Bytes
74c6580
a8d57c0
29b171e
74c6580
a8d57c0
 
fd69589
 
 
 
a8d57c0
 
 
 
 
 
 
 
 
 
74c6580
a8d57c0
 
74c6580
fd69589
 
74c6580
 
 
 
 
 
fd69589
29b171e
74c6580
29b171e
74c6580
 
 
fd69589
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74c6580
 
fd69589
 
 
 
 
 
74c6580
a8d57c0
b555fe0
a8d57c0
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
import os
import gradio as gr
from PIL import Image
import pytesseract
import yolov5

from transformers import CLIPProcessor, CLIPModel
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")

# load model
model = yolov5.load('keremberke/yolov5m-license-plate')

# set model parameters
model.conf = 0.5  # NMS confidence threshold
model.iou = 0.25  # NMS IoU threshold
model.agnostic = False  # NMS class-agnostic
model.multi_label = False  # NMS multiple labels per box
model.max_det = 1000  # maximum number of detections per image

def license_plate_detect(img):
    results = model(img, size=640)

    # parse results
    predictions = results.pred[0]
    if len(predictions):
        boxes = predictions[:, :4] # x1, y1, x2, y2
        return boxes


def read_license_number(img):
    boxes = license_plate_detect(img)
    if boxes:
        image = Image.fromarray(img)
        return [pytesseract.image_to_string(
                    image.crop(bbox.tolist()))
               for bbox in boxes]


def zero_shot_classification(image, labels):
    inputs = processor(text=labels,
                       images=image,
                       return_tensors="pt",
                       padding=True)
    outputs = model(**inputs)
    logits_per_image = outputs.logits_per_image # this is the image-text similarity score
    return logits_per_image.softmax(dim=1) # we can take the softmax to get the label probabilities

installed_list = []
# image = Image.open(requests.get(url, stream=True).raw)
def check_solarplant_installed_by_license(license_number_list):
    if len(installed_list):
        return [license_number in installed_list
                for license_number in license_number_list]

def check_solarplant_installed_by_image(image, output_label=False):
    zero_shot_class_labels = ["bus with solar panel grids",
                              "bus without solar panel grids"]
    probs = zero_shot_classification(image, zero_shot_class_labels)
    if output_label:
        return zero_shot_class_labels[probs.argmax().item()]
    return probs.argmax().item() == 0

def check_solarplant_broken(image):
    zero_shot_class_labels = ["white broken solar panel",
                              "normal black solar panel grids"]
    probs = zero_shot_classification(image, zero_shot_class_labels)
    idx = probs.argmax().item()
    return zero_shot_class_labels[idx][1-idx]


def greet(img):
    boxes = license_plate_detect(img)
    if boxes:
        return (seg,
                "車牌: " + '; '.join(lns) + "\n\n" \
                + "類型: "+ check_solarplant_installed_by_image(img, True) + "\n\n" \
                + "狀態:" + check_solarplant_broken(img))
    return (img, "空地。。。")


iface = gr.Interface(fn=greet, inputs="image", outputs="text")
iface.launch()