资讯动态

airi-factorio 纯视觉路线实践:Docker 化 Factorio 客户端 + YOLO11n 浏览器端实时对象检测

发布时间:2026/10/16 8:47:07 来源:尧图企业网站定制
人工智能AI AgentMCP 服务工具调用GUI 自动化语音数字人交互助手【免费下载链接】airi 自托管、归你拥有的 Grok 风格 AI 伴侣与 waifu / 赛博生命灵魂容器目标是接近 Neuro-sama 的高度支持实时语音聊天、Minecraft 和 Factorio 游玩支持 Web / macOS / Windows。项目地址https://gitcode.com/moeru-ai/airi点击查看免费下载本篇文章完整还原 AIRI 项目在airi-factorio子项目「纯视觉pure vision」方向上的技术进展如何把 Factorio 游戏客户端封装进 Docker 容器并通过 VNC 暴露画面如何借助 Factorio 内置 Lua API 自动采集标注数据并微调 YOLO11n 检测模型以及如何用onnxruntime-web在浏览器端实现接近实时的对象检测推理。读完本文你将掌握一套从游戏画面采集、模型训练到浏览器端部署的完整闭环方案以及其中涉及的关键性能优化手段。背景从 FLE 论文到纯视觉路线在上一篇开发日志 DevLog 2025.07.18 中AIRI 维护者总结了半年多来airi-factorio的探索历程用 TypeScriptToLua 编译 TypeScript 编写 Factorio Mod、通过 RCON 与游戏内 Mod 交互、由 LLM 生成 Lua 代码控制玩家、借助游戏内聊天系统与 LLM 对话等。同时对照 Factorio Learning EnvironmentFLE 论文梳理了 FLE 在 Lab-play / Open-play 两种模式下的评测思路并计划用 MCP server 重构整体架构。而本篇 DevLog2025.08.26分享的并非架构重构本身而是其中的纯视觉方向进展灵感来自 6 月公开的 VLM Playground 演示基于 WebGPU 的近乎实时视觉模型推理作者决定先实现简单的实时图像识别把识别结果交给 AI 做决策再输出动作到游戏。演示视频中可以看到作者通过网页中的 VNC 连接游玩 Factorio右侧几乎实时显示对象检测结果。整个方案被部署为 HuggingFace Spacefactorio-yolo-v0-playground供公开体验。整个系统由三大部分组成本文依次拆解把 Factorio 客户端装进 Docker可控环境 画面对外暴露训练一个针对 Factorio 机械实体的 YOLO 对象检测模型在浏览器中完成 VNC 画面采集、模型推理与输出后处理。第一步把 Factorio 客户端「大象」装进 Docker「冰箱」要让 AI「看见」游戏画面前提是游戏运行在一个不受窗口大小、位置等外部因素干扰的受控环境中且该环境开箱即用。Factorio 官方提供了 Docker 镜像但那是纯服务端要让 AI 看画面、操作游戏必须使用客户端。由于现有镜像不可用且 Factorio 许可协议不允许以这种方式分发客户端只能自行打包客户端镜像——并且打包出的客户端镜像同样不能分发只能共享 Dockerfile 供他人构建。把「Factorio 客户端大象」装进「Docker冰箱」需要三步下载 Factorio 客户端当然是主角准备虚拟显示图形应用必须有可展示画面的显示设备准备 VNC 服务读取虚拟显示内容、把画面传给外部 VNC 客户端并把用户输入回传给游戏。至于音频——当前 AI 还听不到声音暂时忽略。1.1 下载 Factorio 客户端从 Factorio 官网直接下载需要手动登录对自动化工作流不友好。作者使用了开源下载脚本factorio-dl——一个非常复杂的 Shell 脚本只要给定用户名、密码和目标版本就能根据系统架构自动下载对应客户端完全适配 CI / Dockerfile 构建场景。1.2 准备虚拟显示Xvfb这一步比装完整桌面环境简单得多。关键认知是图形应用并不一定需要桌面环境或窗口管理器只要有一个最小的 X 环境和显示服务器即可。sudo apt install -y xvfb x11-apps mesa-utils各包作用xvfb虚拟帧缓冲Virtual Framebuffer与 X 服务器为无显示器环境提供「虚拟屏幕」x11-appsX 相关工具集安装时会一并装上 X 环境mesa-utilsMesa 相关工具集。Mesa 是 OpenGL 的软件实现这些工具帮助我们测试与调试 OpenGL 应用——Factorio 这类图形游戏在无 GPU 容器里恰恰依赖这类软件渲染路径。1.3 准备 VNC 服务x11vncVNCVirtual Network Computing是一种远程桌面协议能让我们像坐在电脑前一样远程控制另一台机器。安装x11vnc后即可把上述虚拟显示的内容导出为 VNC 画面sudo apt install -y x11vnc至此已经能在 Docker 中运行 Factorio 客户端并通过 VNC 控制它。但这还不够——目标是在浏览器中游玩并实时跑对象检测推理。浏览器只能使用 HTTP 协议因此还需要websockify把 VNC 协议转换成 HTTP / WebSocket 协议的桥接工具novnc在浏览器中显示 VNC 画面的 Web 界面同时便于调试。sudo apt install -y websockify novnc至此 Docker 镜像准备就绪。完整的 Dockerfile 与使用说明存放在airi-factorio仓库的docker/与apps/factorio-yolo-v0-playground目录中由于许可限制只共享构建文件而不分发镜像。第二步训练对象检测模型为快速验证可行性作者直接以 YOLO11n 预训练模型为基础微调自己的对象检测模型。2.1 数据采集用 Factorio Lua API 自动生成标注数据集通过游戏内脚本自动采集核心思路是利用 Factorio 内置 Lua API 精确获取实体位置与选择框selection box从而免去手工标注。采集流程分三步用surface.create_entity在场景任意位置放置机械同时取得其选择框selection box的大小与位置用game.take_screenshot在多种缩放级别与光照条件白天下拍摄截图依据选择框生成标注数据用helpers.write_file写入文件。采集脚本本身是 TypeScript 写的用typescript-to-luatstl把 TypeScript 编译成 Lua再通过 RCON 传入 Factorio 执行——这与 DevLog 2025.07.18 中「用 TypeScript 写 Factorio Mod」的开发方式一脉相承。脚本收集了**三种装配机assembler与传送带conveyor**四类对象每类机械 20 张图统一为1280×1280 分辨率、无 UI的画面。作者还顺手做了一个 VSCode 插件通过 CodeLens 一键编译并执行采集脚本大幅改善调试体验。收集完图像与标注数据后按 YOLO 官方数据集格式 整理再上传到 Ultralytics Hub 预览效果2.2 训练Ultralytics YOLO11n ONNX 导出训练代码直接取自 Ultralytics 检测任务官方入门示例仅数行from ultralytics import YOLO model YOLO(yolo11n.pt) model.train(data./dataset/detect.yaml, epochs100, imgsz640, devicemps) model.export(formatonnx)关键参数与实测结果输入分辨率imgsz640以 640×640 训练设备devicemps在 macOS 上使用 MPS 设备性能更优训练轮数epochs100每轮 5 个 batch约在70 轮左右达到最优性能导出格式formatonnx导出为 ONNX便于后续在浏览器端用onnxruntime-web推理训练耗时约8 分钟模型体积约10MB。数据集、训练代码与导出的 ONNX 模型都存放在airi-factorio仓库的apps/factorio-yolo-v0-playground目录中。第三步浏览器端推理两个部分Docker 环境 训练好的模型可以组装了。浏览器端方案依赖两个 npm 包novnc/novnc在浏览器中显示 VNC 画面同时从 canvas 中抽取像素数据喂给模型onnxruntime-web在浏览器中执行推理支持 WebGPU 以利用 GPU 算力。3.1 踩坑400ms 与 UI 冻结初始推理非常慢约400ms而且会卡死 UIVNC 根本无法使用。作者迅速补学了 WebWorker 用法把推理与画面渲染分离解决了 UI 卡顿随后又发现真正的问题——WebGPU 其实没有启用所以速度依然很慢。正确写法是显式声明同时允许 WebGPU 与 WASM 两种执行方式这样在 WebGPU 不可用时会自动回退到 WASM 执行ort.InferenceSession.create(model, { executionProviders: [webgpu, wasm] })启用 WebGPU 后推理速度提升到约80ms。3.2 再优化用乘法替代除法80ms 仍不理想作者当时不知如何继续优化结果被 Cursor 一语点醒「对像素颜色值做归一化时你一直在除以 255。应该先把1/255算出来再直接乘以这个值避免除法。」虽然「除法比乘法慢」让作者自嘲要补修跳过的计算机科学课但代码修改后推理速度确实提升到了约20ms体验已经相当流畅。3.3 模型输出处理从 [1, 10, 8400] 到检测框模型输出是一个84,000 个元素的数组dims为[1, 10, 8400]。也就是说84,000 个元素每 10 个一组每组包含边界框中心 x、y 坐标框宽、框高以及 6 个类别的置信度分数共 8,400 组结果。后处理分两步置信度过滤用阈值0.6滤掉低置信度的边界框NMS非极大值抑制用 IOU 去掉互相重叠的框。IOUIntersection over Union的计算思路把两个框的面积相加减去重叠部分得到实际占用面积并集再用重叠面积除以并集面积即得 IOU。作者使用了非常朴素的 NMS 实现——把所有框按置信度排序从高到低遍历凡是与当前最优框 IOU 大于 0.7 的都视为同一对象并滤除function nms(boxes: Box[], iouThreshold: number): Box[] { // 1. 按置信度过滤后降序排列 const candidates boxes .filter(box box.confidence 0.6) .sort((a, b) b.confidence - a.confidence) const result: Box[] [] while (candidates.length 0) { // 2. 取出置信度最高的框 const bestCandidate candidates.shift()! result.push(bestCandidate) // 3. 与剩余框比较IOU 过高的剔除 for (let i candidates.length - 1; i 0; i--) { // iou() 函数需按文中描述自行实现 if (iou(bestCandidate, candidates[i]) iouThreshold) { candidates.splice(i, 1) } } } return result }整套 Playground 的源码在airi-factorio仓库的apps/factorio-yolo-v0-playground目录。此外这篇博文还内嵌了一个可交互的 IOU / NMS 可视化组件——你可以直接拖拽两个检测框的位置实时观察重叠区域、并集面积与 IOU 数值的变化。该组件的实现基于vueuse/core的useDraggable与useElementBounding就保存在 nms-iou.vue 组件 中其核心计算逻辑与文中公式完全对应先判断两框是否相交四边区间比较再算交集面积与并集面积最后intersect.area / union.area得到 IOU。3.4 发现的问题实践过程中暴露了几个值得记录的问题无法识别非正方形图像一旦输入不是正方形所有结果的置信度会变得极低甚至为 0——这与训练时固定使用 640×640 / 1280×1280 正方形输入直接相关形状混淆模型虽然能区分 1 级与 2 级装配机但会把箱子这类方形物体也误判为装配机——同类方形实体间的视觉差异仍需更多数据与更细致的类别设计状态叠加干扰实际游玩时机械贴图上常叠加电力、当前配方、已装模块等状态指示这些 UI 覆盖层会干扰模型识别——说明训练数据无 UI与真实游戏画面带 UI之间存在分布差异。与 AIRI 主仓库的衔接Factorio 集成模块这次纯视觉验证并非孤立的玩具项目。在当前 AIRI 仓库中Factorio 已作为正式的「游戏模块」集成进桌面端集成入口位于 Factorio 集成文档配置页面组件为 gaming-factorio.vue 页面其底层 Store 由 gaming-module-factory.ts 的createGamingModuleStore工厂创建。从源码可以看出这套集成的形态以useFactorioStore createGamingModuleStore(factorio, 34197)创建名为factorio的 Pinia Storegaming-factorio.ts管理四项配置——启用开关、服务器地址、服务器端口默认34197即 Factorio 默认 UDP 端口与游戏内用户名configured状态仅表示三项字段非空真正能否连接仍取决于服务器端集成。值得注意的是桌面版只提供客户端侧配置并不附带可直接部署的 Factorio 机器人服务且官方文档明确警告只应连接受信任的服务器。这与本 DevLog 的定位一致airi-factorio的完整「AI 打游戏」链路仍在持续建设中。结语本月的成果相当充实一套可复现的「Docker 化游戏客户端 自动数据采集 YOLO 微调 浏览器端 WebGPU 推理」流水线已经跑通推理延迟从最初的 400ms 一路优化到约 20ms。接下来的方向是继续提升模型性能并设法让 AI 真正操作游戏——届时把这篇 DevLog 的视觉能力与 07.18 DevLog 规划的 MCP 架构结合起来airi-factorio的完整形态值得期待。赞分享人工智能AI AgentMCP 服务工具调用GUI 自动化语音数字人交互助手【免费下载链接】airi 自托管、归你拥有的 Grok 风格 AI 伴侣与 waifu / 赛博生命灵魂容器目标是接近 Neuro-sama 的高度支持实时语音聊天、Minecraft 和 Factorio 游玩支持 Web / macOS / Windows。项目地址https://gitcode.com/moeru-ai/airi点击查看免费下载相关推荐airi-factorio 纯视觉路线从 Docker 封装游戏客户端到浏览器端 YOLO 实时目标检测airi factorio 纯视觉路线从 Docker 封装游戏客户端到浏览器端 YOLO 实时目标检测 这篇 DevLog 源自 AIRI 维护者 Lem人工智能AI AgentMCP 服务工具调用GUI 自动化语音数字人交互助手后端基于 airi-factorio 的纯视觉实时目标检测管线实战Docker 虚拟化 Factorio 与浏览器端 YOLO 推理基于 airi factorio 的纯视觉实时目标检测管线实战Docker 虚拟化 Factorio 与浏览器端 YOLO 推理 本篇技术指南围绕 AIRI人工智能AI 应用大模型AI Agent交互助手语音数字人后端前端桌面应用移动开发GUI 自动化MCP 服务让 AI「看见」游戏airi-factorio 的 YOLO 实时目标检测实战Docker VNC onnxruntime-web让 AI「看见」游戏airi factorio 的 YOLO 实时目标检测实战Docker VNC onnxruntime web 这篇 DevL人工智能AI AgentMCP 服务工具调用GUI 自动化语音数字人交互助手后端上一篇DateTools性能基准建立长期性能监控体系下一篇krackattacks-scripts代码架构分析深入理解测试原理与实现机制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑