File size: 1,921 Bytes
e82b28e
 
 
 
caff61e
e82b28e
 
a29d5e2
e82b28e
 
 
 
936b8a6
e82b28e
 
 
936b8a6
e82b28e
 
caff61e
e82b28e
a29d5e2
caff61e
 
e82b28e
 
a29d5e2
e82b28e
 
a29d5e2
46e3370
e82b28e
 
 
a29d5e2
 
 
46e3370
 
e82b28e
46e3370
e82b28e
 
a29d5e2
46e3370
a29d5e2
 
 
e82b28e
 
46e3370
e82b28e
 
 
 
 
 
46e3370
11bd727
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
!pip install -U torch torchvision cython
!pip install -U 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'
!pip install gradio

import torch
import torchvision
from torchvision.models.detection import fasterrcnn_resnet50_fpn
from torchvision.transforms import functional as F
from PIL import Image
import cv2
from google.colab.patches import cv2_imshow
import gradio as gr

!git clone https://github.com/ultralytics/yolov5
%cd yolov5
!pip install -r requirements.txt

import torch
from yolov5.models.yolo import Model

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True).to(device)
model.eval()

from yolov5.utils.general import non_max_suppression

def preprocess_image(image):
    image_tensor = F.to_tensor(image)
    return image_tensor.unsqueeze(0).to(device)

def draw_boxes(image, outputs, threshold=0.3):
    image = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR)
    h, w, _ = image.shape

    for box in outputs:
        score, label, x1, y1, x2, y2 = box[4].item(), int(box[5].item()), box[0].item(), box[1].item(), box[2].item(), box[3].item()
        if score > threshold:
            x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2)
            cv2.rectangle(image, (x1, y1), (x2, y2), (255, 0, 0), 2)
            text = f"{model.names[label]:s}: {score:.2f}"
            cv2.putText(image, text, (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)

    return cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

def detect_objects(image):
    image_tensor = preprocess_image(image)
    outputs = model(image_tensor)
    outputs = non_max_suppression(outputs)[0]
    result_image = draw_boxes(image, outputs)
    return result_image

iface = gr.Interface(
    fn=detect_objects,
    inputs=gr.inputs.Image(type="pil"),
    outputs=gr.outputs.Image(type="pil"),
    live=True
)

iface.launch()