import gradio as gr import torch from PIL import Image from ultralytics import YOLO import matplotlib.pyplot as plt import io from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas model = YOLO('detect-best.pt') def predict(img, conf, iou): results = model.predict(img, conf=conf, iou=iou) name = results[0].names cls = results[0].boxes.cls crazing = 0 inclusion = 0 patches = 0 pitted_surface = 0 rolled_inscale = 0 scratches = 0 for i in cls: if i == 0: crazing += 1 elif i == 1: inclusion += 1 elif i == 2: patches += 1 elif i == 3: pitted_surface += 1 elif i == 4: rolled_inscale += 1 elif i == 5: scratches += 1 # 绘制柱状图 fig, ax = plt.subplots() categories = ['crazing','inclusion', 'patches' ,'pitted_surface', 'rolled_inscale' ,'scratches'] counts = [crazing,inclusion, patches ,pitted_surface, rolled_inscale ,scratches] ax.bar(categories, counts) ax.set_title('Category-Count') plt.ylim(0,5) plt.xticks(rotation=45, ha="right") ax.set_xlabel('Category') ax.set_ylabel('Count') # 将图表保存为字节流 buf = io.BytesIO() canvas = FigureCanvas(fig) canvas.print_png(buf) plt.close(fig) # 关闭图形,释放资源 # 将字节流转换为PIL Image image_png = Image.open(buf) # 绘制并返回结果图片和类别计数图表 for i, r in enumerate(results): # Plot results image im_bgr = r.plot() # BGR-order numpy array im_rgb = Image.fromarray(im_bgr[..., ::-1]) # RGB-order PIL image # Show results to screen (in supported environments) return im_rgb, image_png base_conf, base_iou = 0.25, 0.45 title = "基于改进YOLOv8算法的工业瑕疵辅助检测系统" des = "鼠标点击上传图片即可检测缺陷,可通过鼠标调整预测置信度,还可点击网页最下方示例图片进行预测" interface = gr.Interface( inputs=['image', gr.Slider(maximum=1, minimum=0, value=base_conf), gr.Slider(maximum=1, minimum=0, value=base_iou)], outputs=["image", 'image'], fn=predict, title=title, description=des, examples=[["example1.jpg", base_conf, base_iou], ["example2.jpg", base_conf, base_iou], ["example3.jpg", base_conf, base_iou]]) interface.launch()