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 plt.rcParams['font.family'] = 'SimHei' # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 model = YOLO(r'pcb-best.pt') def predict(img, conf, iou): results = model.predict(img, conf=conf, iou=iou) name = results[0].names cls = results[0].boxes.cls copper = 0 mousebite = 0 open_defect = 0 pin_hole = 0 short = 0 spur = 0 for i in cls: if i == 0: copper += 1 elif i == 1: mousebite += 1 elif i == 2: open_defect += 1 elif i == 3: pin_hole += 1 elif i == 4: short += 1 elif i == 5: spur += 1 # 绘制柱状图 fig, ax = plt.subplots() categories = ['Copper', 'Mousebite', 'Open Defect', 'Pin Hole', 'Short', 'Spur'] counts = [copper, mousebite, open_defect, pin_hole, short, spur] ax.bar(categories, counts) ax.set_title('缺陷类别计数') plt.ylim(0,5) ax.set_xlabel('缺陷类别') ax.set_ylabel('数目') # 将图表保存为字节流 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 = "基于YOLO-V8的PCB电路板缺陷检测" 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()