NailongKiller / app.py
Hakureirm's picture
Update app.py
a046a3a verified
raw
history blame
2.64 kB
import gradio as gr
from ultralytics import YOLO
from fastapi import FastAPI
from PIL import Image
import torch
import spaces
import numpy as np
app = FastAPI()
device = 'cuda' if torch.cuda.is_available() else 'cpu'
# 移除 .to(device),在预测时指定设备
model = YOLO('nailong_yolo11.onnx')
@spaces.GPU
def predict(img):
# 将输入图像转换为PIL Image对象
input_image = Image.fromarray(img)
# 保持长宽比的情况下调整尺寸
w, h = input_image.size
scale = min(640/w, 640/h)
new_w, new_h = int(w * scale), int(h * scale)
if scale != 1:
input_image = input_image.resize((new_w, new_h), Image.LANCZOS)
# 转换为numpy数组并进行预测
img_array = np.array(input_image)
# 在predict时指定device
results = model.predict(img_array, device=device)
result = results[0]
# 获取预测结果
result_img = result.plot()
# 处理检测信息
info = {
"detected": len(result.boxes) > 0,
"count": len(result.boxes),
"detections": []
}
if info["detected"]:
# 获取每个检测框的信息
for box in result.boxes:
conf = float(box.conf[0])
cls = int(box.cls[0])
cls_name = result.names[cls]
detection_info = {
"class": cls_name,
"confidence": f"{conf:.2%}"
}
info["detections"].append(detection_info)
# 生成输出文本
output_text = f"""检测结果:
- 是否检测到目标: {'是' if info['detected'] else '否'}
- 检测到的目标数量: {info['count']}"""
if info["detections"]:
output_text += "\n- 详细信息:"
for idx, det in enumerate(info["detections"], 1):
output_text += f"\n 目标 {idx}: {det['class']} (置信度: {det['confidence']})"
# 如果需要将结果图像缩放回原始尺寸
if scale != 1:
result_img = Image.fromarray(result_img)
result_img = result_img.resize((w, h), Image.LANCZOS)
result_img = np.array(result_img)
return result_img, output_text
demo = gr.Interface(
fn=predict,
inputs=gr.Image(label="输入图片"),
outputs=[
gr.Image(label="检测结果", type="numpy"),
gr.Textbox(label="检测信息")
],
title="🐉 奶龙杀手 (NailongKiller)",
description="上传图片来检测奶龙 | Upload an image to detect Nailong",
# examples=[["example1.jpg"]],
# cache_examples=True
)
if __name__ == "__main__":
demo.launch(server_name="0.0.0.0", server_port=7860)