File size: 1,766 Bytes
6922116
 
 
 
 
 
a4eba0a
6922116
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
from ultralytics import YOLO
from PIL import Image
import io

# 加载 YOLOv8 模型
model = YOLO('best.pt')  # 替换为您的模型文件路径

def detect_objects(image):
    # 使用 YOLOv8 模型进行预测
    results = model(image)

    # 处理预测结果
    class_counts = {}
    output_text = ''
    annotated_image = Image.fromarray(results[0].plot())  # 将 NumPy 数组转换为 PIL 图像

    # 将 PIL 图像转换为 bytes 以供 Gradio 显示
    buffered = io.BytesIO()
    annotated_image.save(buffered, format="PNG")
    annotated_image_bytes = buffered.getvalue()

    # 将 bytes 转换为 PIL 图像对象
    annotated_image = Image.open(io.BytesIO(annotated_image_bytes))

    for result in results[0].boxes.data:
        class_id = int(result[5])
        class_name = model.names[class_id]
        confidence = result[4]
        x1, y1, x2, y2 = result[:4].cpu().numpy().astype(int)

        # 统计类别数量
        if class_name in class_counts:
            class_counts[class_name] += 1
        else:
            class_counts[class_name] = 1

        # 构建输出文本
        output_text += f'类别: {class_name}, 置信度: {confidence:.2f}, 坐标: ({x1}, {y1}), ({x2}, {y2})\n'

    # 构建每个类别数量的输出
    class_count_text = '\n'.join([f'{class_name}: {count}' for class_name, count in class_counts.items()])
    output_text += f'\n每个类别的数量:\n{class_count_text}'

    return annotated_image, output_text

# 创建 Gradio 界面
demo = gr.Interface(
    fn=detect_objects,
    inputs=gr.Image(type="pil"),
    outputs=[gr.Image(type="pil"), "text"],
    title="细胞检测",
    description="上传图片,进行物体检测并显示结果"
)

# 启动应用
demo.launch()