Yolov8_demo / app.py
Anh-Chan's picture
Update app.py
9e92a1f verified
import gradio as gr
import cv2
import os
import numpy as np
from ultralytics import YOLO
model = YOLO('best.pt')
# path = [['lb0_1.jpg'],['lb1_1.jpg'],['lb2_1.jpg'],['lb3_1.jpg'],['lb4_1.jpg'],['lb5_1.jpg'],['lb6_1.jpg'],['lb7_1.jpg']]
path = []
video_path = []
label_colors = {
0: (255, 0, 0), # Màu đỏ cho nhãn 0
1: (0, 255, 0), # Màu xanh lá cho nhãn 1
2: (0, 0, 255), # Màu xanh dương cho nhãn 2
3: (255, 255, 0), # Màu vàng cho nhãn 3
4: (255, 0, 255), # Màu hồng cho nhãn 4
5: (0, 255, 255), # Màu cyan cho nhãn 5
6: (128, 0, 128), # Màu tím cho nhãn 6
7: (0, 128, 128) # Màu xanh dương đậm cho nhãn 7
}
def show_preds_image(image_path,threshold):
image = cv2.imread(image_path)
image_copy = image.copy()
image_height, image_width = image.shape[:2]
results = model(image)[0]
label_counts = {} # Đếm số lượng nhãn
for result in results.boxes.data.tolist():
x1, y1, x2, y2, score, class_id = result
if score > threshold:
color = label_colors.get(int(class_id), (255, 255, 255)) # Lấy màu từ bảng màu
# cv2.rectangle(image_copy, (int(x1), int(y1)), (int(x2), int(y2)), color, 4)
# cv2.putText(image_copy, results.names[int(class_id)].upper(), (int(x1), int(y1 - 10)),
# cv2.FONT_HERSHEY_SIMPLEX, 1.3, color, 3, cv2.LINE_AA)
# cv2.putText(image_copy, str(score), (int(x1), int(y2 + 10)),
# cv2.FONT_HERSHEY_SIMPLEX, 1.3, (0, 0, 255), 3, cv2.LINE_AA)
cv2.rectangle(image_copy, (int(x1), int(y1)), (int(x2), int(y2)), color, 4)
cv2.putText(image_copy, f"{results.names[int(class_id)].upper()} {score:.3f}", (int(x1), int(y1 - 10)),
cv2.FONT_HERSHEY_SIMPLEX, 1.3, color, 3, cv2.LINE_AA)
# Đếm số lượng nhãn
if class_id in label_counts:
label_counts[class_id] += 1
else:
label_counts[class_id] = 1
# Tạo hình ảnh với danh sách nhãn và màu sắc
label_image = create_label_image(label_counts, results.names, image_width)
combined_image = cv2.vconcat([cv2.cvtColor(image_copy, cv2.COLOR_BGR2RGB), label_image])
return combined_image
# def show_preds_image(image_path):
# image = cv2.imread(image_path)
# image_copy = image.copy()
# threshold = 0.1
# results = model(image)[0]
# for result in results.boxes.data.tolist():
# x1, y1, x2, y2, score, class_id = result
# if score > threshold:
# cv2.rectangle(image_copy, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 4)
# cv2.putText(image_copy, f"{results.names[int(class_id)].upper()} {score:.2f}", (int(x1), int(y1 - 10)),
# cv2.FONT_HERSHEY_SIMPLEX, 1.3, (0, 255, 0), 3, cv2.LINE_AA) # Hiển thị tên và điểm số
# return cv2.cvtColor(image_copy, cv2.COLOR_BGR2RGB)
# Hàm tạo hình ảnh danh sách nhãn
def create_label_image(label_counts, names, image_width):
line_height = 30
height = line_height * (len(label_counts) + 1)
label_image = 255 * np.ones(shape=[height, image_width, 3], dtype=np.uint8) # Kích thước phù hợp với ảnh đầu vào
y = line_height
for class_id, count in label_counts.items():
color = label_colors.get(int(class_id), (255, 255, 255))
cv2.putText(label_image, f"{names[int(class_id)].upper()}: {count}", (10, y),
cv2.FONT_HERSHEY_SIMPLEX, 1.3, color, 2, cv2.LINE_AA)
y += line_height
return label_image
inputs_image = [
gr.components.Image(type="filepath", label="Input Image"),
gr.components.Slider(minimum=0.0, maximum=1.0, step=0.01, value=0.1, label="Threshold")
]
outputs_image = [
gr.components.Image(type="numpy", label="Output Image"),
]
interface_image = gr.Interface(
fn=show_preds_image,
inputs=inputs_image,
outputs=outputs_image,
title="Demo Wood",
examples=path,
cache_examples=False,
)
def show_preds_video(video_path):
cap = cv2.VideoCapture(video_path)
while(cap.isOpened()):
ret, frame = cap.read()
if ret:
threshold = 0.1
frame_copy = frame.copy()
results = model(frame)[0]
for result in results.boxes.data.tolist():
x1, y1, x2, y2, score, class_id = result
if score > threshold:
cv2.rectangle(frame_copy, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 4)
cv2.putText(frame_copy, results.names[int(class_id)].upper(), (int(x1), int(y1 - 10)),
cv2.FONT_HERSHEY_SIMPLEX, 1.3, (0, 255, 0), 3, cv2.LINE_AA)
cv2.putText(frame_copy, str(score), (int(x1), int(y2 + 10)),
cv2.FONT_HERSHEY_SIMPLEX, 1.3, (0, 0, 255), 3, cv2.LINE_AA)
yield cv2.cvtColor(frame_copy, cv2.COLOR_BGR2RGB)
inputs_video = [
gr.components.Video(type="filepath", label="Input Video"),
]
outputs_video = [
gr.components.Image(type="numpy", label="Output Image"),
]
interface_video = gr.Interface(
fn=show_preds_video,
inputs=inputs_video,
outputs=outputs_video,
title="Demo Wood",
examples=video_path,
cache_examples=False,
)
gr.TabbedInterface(
[interface_image, interface_video],
tab_names=['Image inference', 'Video inference']
).queue().launch()