Linux c网络专栏第二章协程框架

核心内容摘要

django基于python的在线课程学习平台
告别官方同步:Zotero 7 与 OneDrive 深度整合的跨设备文献管理方案

职场效率封神:Claude 辅助文案创作/报告撰写实战技巧

YOLOE官版镜像Gradio定制YOLOE-v8l-seg界面添加历史记录与导出功能

为什么需要给YOLOE Gradio界面加历史记录和导出功能YOLOE官版镜像开箱即用但原生Gradio界面只提供基础的单次推理交互——上传一张图、输入几个词、点一下运行结果一闪而过。

你没法回看上一次检测了什么物体不能对比不同提示词的效果更无法把分割掩码、边界框坐标或检测日志保存下来做后续分析。

这在实际工作中很不方便。

比如你在调试一个新场景的文本提示词时想对比“person, dog, bicycle”和“human, pet, two-wheeler”的识别差异又比如你要批量处理一批工业零件图像需要把每次的分割掩码和类别置信度导出成JSON供下游系统使用再比如团队协作时同事想复现你昨天跑出的那个高精度分割结果却找不到参数和输入图。

所以我们对YOLOE-v8l-seg的Gradio界面做了轻量但实用的增强不改模型、不重写推理逻辑、不增加依赖只在前端交互层添加两个刚需功能——自动保存历史记录和一键导出结构化结果。

整个过程只需修改不到50行Python代码所有改动都兼容原镜像环境部署后立即生效。

环境准备与定制前确认

1 确认YOLOE官版镜像已就绪请确保你正在使用的容器已按官方指南完成初始化Conda环境yoloe已激活项目路径/root/yoloe存在且可读写gradio库版本 ≥

30本定制基于Gradio

35测试通过你可以用以下命令快速验证conda activate yoloe cd /root/yoloe python -c import gradio as gr; print(fGradio version: {gr.__version__})如果输出类似Gradio version:

4.

3

2说明环境完全就绪。

2 原生Gradio入口定位YOLOE官版镜像中Gradio演示界面由app.py启动。

它默认位于/root/yoloe/app.py该文件调用predict_text_prompt.py的核心逻辑构建了一个简洁的三栏界面左侧上传区、中间提示词输入框、右侧结果展示区。

我们的所有定制都将围绕这个文件展开不触碰任何模型代码或预测脚本。

重要提醒定制前建议先备份原文件cp /root/yoloe/app.py /root/yoloe/app.py.bak

添加历史记录功能让每一次推理都可追溯

1 历史记录的设计思路我们不采用数据库或外部存储而是用最轻量的方式——内存本地JSON文件双备份内存缓存实时保存最近10次推理记录防止页面刷新丢失磁盘持久化每次新记录自动追加到/root/yoloe/history.json关机也不丢记录内容原始图片名哈希ID、提示词、检测时间、物体列表含类别、置信度、框坐标、掩码尺寸、处理耗时这样既保证响应速度又确保数据不丢失还完全符合镜像的离线部署要求。

2 修改app.py实现历史记录打开/root/yoloe/app.py找到gr.Interface创建部分在其上方添加以下代码import json import time import os from pathlib import Path HISTORY_FILE /root/yoloe/history.json # 初始化历史记录 def load_history(): if os.path.exists(HISTORY_FILE): try: with open(HISTORY_FILE, r, encodingutf-

as f: return json.load(f) except: return [] return [] def save_history(record): history load_history() history.append(record) # 只保留最近10条 history history[-10:] with open(HISTORY_FILE, w, encodingutf-

as f: json.dump(history, f, indent2, ensure_asciiFalse) # 全局历史缓存用于页面内实时显示 history_cache load_history()接着找到原推理函数通常是run_inference或类似名称在其返回结果前插入记录逻辑# 假设原函数返回值为 result_dict包含 boxes, masks, names, confidences def run_inference(image, text_prompt): # ... 原有推理代码保持不变 ... # 新增构造历史记录项 record { timestamp: time.strftime(%Y-%m-%d %H:%M:%S), prompt: text_prompt.strip(), image_hash: str(hash(image.tobytes()))[:8] if hasattr(image, tobytes) else unknown, objects: [ { name: name, confidence: float(conf), bbox: [int(x) for x in box] if box in locals() else [] } for name, conf, box in zip(result_dict[names], result_dict[confidences], result_dict[boxes]) ], mask_shape: list(result_dict[masks].shape) if masks in result_dict else [], inference_time_ms: int((time.time() - start_time) *

} # 保存到磁盘和内存 save_history(record) history_cache.append(record) return result_dict

3 在Gradio界面中展示历史记录在gr.Interface创建之后添加一个独立的历史面板with gr.Blocks() as demo: # 原有界面代码保持不变... # 新增历史记录区域 gr.Markdown(### 最近10次推理记录) history_table gr.Dataframe( headers[时间, 提示词, 检测物体数, 耗时(ms), 图片ID], datatype[str, str, number, number, str], interactiveFalse, row_count(10, fixed) ) # 刷新按钮 refresh_btn gr.Button( 刷新历史) # 绑定刷新逻辑 def refresh_history(): history load_history() # 格式化为表格数据 table_data [ [ h[timestamp], h[prompt][:30] ... if len(h[prompt]) 30 else h[prompt], len(h[objects]), h[inference_time_ms], h[image_hash] ] for h in reversed(history) # 最新在最上 ] return table_data refresh_btn.click(refresh_history, outputshistory_table) # 页面加载时自动刷新一次 demo.load(refresh_history, outputshistory_table)现在启动python app.py你会在界面底部看到一个动态更新的历史表格点击“刷新”即可同步最新记录。

添加导出功能一键生成结构化结果文件

1 导出内容定义我们支持导出三种格式覆盖不同下游需求格式内容适用场景JSON完整检测结果坐标、掩码、类别、置信度、元信息开发者集成、算法评测CSV表格化物体列表每行一个检测框含类别、置信度、x1,y1,x2,y2Excel分析、业务报表PNG掩码二值分割掩码图透明背景物体区域白色图像标注、视觉验证所有导出文件自动命名为yoloe_export_时间戳.格式保存在/root/yoloe/exports/目录下。

2 实现导出逻辑在app.py中添加导出函数import csv from PIL import Image, ImageDraw, ImageFont import numpy as np EXPORT_DIR /root/yoloe/exports os.makedirs(EXPORT_DIR, exist_okTrue) def export_results(image, text_prompt, result_dict): timestamp int(time.time()) base_name fyoloe_export_{timestamp} #

JSON导出 json_path os.path.join(EXPORT_DIR, f{base_name}.json) export_data { prompt: text_prompt, timestamp: time.strftime(%Y-%m-%d %H:%M:%S), image_size: list(image.shape[:2]) if hasattr(image, shape) else [0, 0], objects: [] } for i, (name, conf, box, mask) in enumerate(zip( result_dict[names], result_dict[confidences], result_dict[boxes], result_dict[masks] )): export_data[objects].append({ id: i 1, class: name, confidence: float(conf), bbox: [int(x) for x in box], mask_shape: list(mask.shape), mask_sum: int(np.sum(mask)) # 掩码像素总数便于快速判断 }) with open(json_path, w, encodingutf-

as f: json.dump(export_data, f, indent2, ensure_asciiFalse) #

CSV导出 csv_path os.path.join(EXPORT_DIR, f{base_name}.csv) with open(csv_path, w, newline, encodingutf-

as f: writer csv.writer(f) writer.writerow([ID, Class, Confidence, X1, Y1, X2, Y2]) for i, (name, conf, box) in enumerate(zip( result_dict[names], result_dict[confidences], result_dict[boxes] )): writer.writerow([i 1, name, f{conf:.3f}, int(box[0]), int(box[1]), int(box[2]), int(box[3])]) #

PNG掩码导出仅取第一个物体掩码作示例如需全部可扩展 if len(result_dict[masks]) 0: mask_img Image.fromarray((result_dict[masks][0] *

.astype(np.uint

) mask_path os.path.join(EXPORT_DIR, f{base_name}_mask.png) mask_img.save(mask_path) return json_path, csv_path, mask_path if len(result_dict[masks]) 0 else

3 在界面中添加导出组件在gr.Interface的outputs参数后新增三个输出组件并在按钮区域添加导出按钮# 在原有outputs列表中追加 outputs [ # ... 原有outputs如 gr.Image(), gr.JSON() 等 ... gr.File(label 导出JSON完整结果), gr.File(label 导出CSV物体列表), gr.File(label 导出PNG首物体掩码), ] # 在按钮区域添加 with gr.Row(): export_btn gr.Button( 一键导出所有格式, variantprimary) # 绑定导出事件 export_btn.click( fnexport_results, inputs[input_image, text_prompt_input, *original_outputs], # 注意需传入原始输出作为输入 outputsoutputs[-3:] # 只更新最后三个File组件 )注意export_results函数的输入需与Gradio组件严格对应。

若原界面无显式输出组件变量可将run_inference改为返回元组并在gr.Interface中明确声明outputs类型。

定制后效果实测与使用技巧

1 实际操作流程演示以一张街景图bus.jpg为例输入提示词person, bus, traffic light上传图片→ 选择ultralytics/assets/bus.jpg输入提示→person, bus, traffic light点击运行→ 界面右侧显示带分割掩码的检测结果查看历史→ 底部表格自动新增一行显示“

14:22:05 | person, bus... | 3 | 428 | 9a3b1c7d”导出结果→ 点击“一键导出”三秒后弹出下载链接点击即可获取yoloe_export_

json含所有物体的坐标、掩码形状、置信度yoloe_export_

csvExcel可直接打开的表格yoloe_export_1744467725_mask.png首物体person的纯白掩码图

2 高效使用小技巧快速复现历史复制历史表格中的提示词粘贴到输入框换图即测批量导出管理所有文件存于/root/yoloe/exports/可用ls -lt /root/yoloe/exports/按时间排序查看清理历史手动删除/root/yoloe/history.json即可清空下次运行自动重建调整保存数量修改save_history函数中的history[-10:]为[-20:]即可存20条

6.

总结小改动带来大价值这次对YOLOE官版镜像的Gradio定制没有改动一行模型代码没有引入新依赖却实实在在解决了三个高频痛点不再凭记忆调试历史记录让每次提示词尝试都有据可查告别“我刚才输的是什么”无缝对接下游JSON/CVS/PNG三格式导出让检测结果能直接喂给标注平台、BI系统或训练流水线零学习成本上手所有功能都集成在原界面老用户无需适应新操作新用户看一眼就会用更重要的是这套方案是可复用的模式——你完全可以把它迁移到YOLOE-v8s-seg、YOLOE-v8m-seg甚至其他基于Gradio的AI镜像上。

只需要替换对应的推理函数名和结果字段名5分钟就能完成同类定制。

技术的价值不在于多炫酷而在于多实在。

当你不用再手动截图、不用再复制粘贴坐标、不用再写临时脚本导出数据时那才是工具真正长出了牙齿。

获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

9·1短视频在线观看电影-9·1短视频在线观看电影应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123