NailongKiller / app.py
Hakureirm's picture
Update app.py
a046a3a verified
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)