人工智能AI AgentMCP 服务工具调用GUI 自动化语音数字人交互助手【免费下载链接】airi 自托管、归你拥有的 Grok 风格 AI 伴侣与 waifu / 赛博生命灵魂容器目标是接近 Neuro-sama 的高度支持实时语音聊天、Minecraft 和 Factorio 游玩支持 Web / macOS / Windows。项目地址https://gitcode.com/moeru-ai/airi点击查看免费下载本文基于 AIRI 项目 2025 年 8 月 26 日的开发日志原文档整理完整还原airi-factorio在“纯视觉”方向的第一阶段成果如何把 Factorio 客户端装进 Docker 并提供 VNC 可视化、如何通过 Lua 脚本与 RCON 自动采集截图和标注数据、如何训练并导出 YOLO11n ONNX 模型、如何在浏览器里借助 WebGPU 完成接近实时的目标检测推理以及如何对 8400 组检测结果做置信度过滤与 NMS 后处理。读完本文你将获得一套可复现的“游戏画面 → 实时目标检测”工程链路以及纯前端推理性能调优的一手经验。为什么先做“纯视觉”方向在进入正题之前先交代一下上下文。AIRI 生态中有一个让 AI 游玩异星工厂Factorio的独立仓库airi-factorio早期方案是“TypeScript 编写 Mod RCON 交互 LLM 生成 Lua 代码操作游戏”具体做法与踩坑记录见前一篇 DevLog 2025.07.18包括用typescript-to-luatstl把 TypeScript 编译成 Lua、通过 factorio-rcon-api 调用/c命令执行 Mod 注册的函数、用 LLM 生成操作代码等等。但这条路线调试困难Mod 改动常需重进地图甚至重启游戏、健壮性差维护者随后参考 Factorio Learning EnvironmentFLE论文开始重新设计。本篇 DevLog 则切换到另一个更直接的思路纯视觉。受 2025 年 6 月发布的近乎实时的 VLM Playground 启发维护者想先验证“让 AI 看见游戏画面”这条通路——用实时目标检测识别游戏中的机器、传送带等对象把检测结果交给 AI 做决策最终输出动作让游戏执行。整个链路分为三个可独立复用的阶段可控的游戏运行环境Docker VNC→ 目标检测模型数据采集 训练→ 浏览器端实时推理。第一步把 Factorio 客户端装进 DockerAI 要“看见”游戏画面前提是游戏运行在可控环境中——不受窗口大小、位置、桌面环境影响最好还能开箱即用。因此第一步就是把 Factorio 客户端容器化。Factorio 官方虽然提供 Docker 镜像但那是纯服务端没有画面可供 AI 观察也无法让 AI 操控游戏。而社区中没有现成的客户端镜像Factorio 许可协议不允许分发客户端所以只能自己打包且最终也只能分享 Dockerfile不能分发打包好的客户端镜像。把 Factorio 客户端装进 Docker一共分三步下载 Factorio 客户端——它是主角准备虚拟显示器——图形界面程序需要一块“屏幕”准备 VNC 服务——读取虚拟显示器内容传给外部客户端同时把用户输入传给游戏。音频则被刻意忽略当时的 AI 还不会听声音。下载 Factorio 客户端官网下载需要登录手动操作不适合构建自动化流程于是维护者使用了factorio-dl这个下载脚本只需提供用户名、密码和目标版本脚本就会根据系统架构自动下载对应客户端从而可以在 Dockerfile 的构建阶段无人工介入地获取客户端。准备虚拟显示器图形界面程序其实不需要完整的桌面环境——不需要窗口管理器只要一个最简单的 X 环境加一个显示服务器就够了。在 Ubuntu/Debian 系镜像中安装三个包即可sudo apt install -y xvfb x11-apps mesa-utilsxvfb虚拟帧缓冲器和 X 服务器为无显示器环境提供“隐形屏幕”x11-appsX 相关工具集安装时顺带把 X 环境装齐mesa-utilsMesaOpenGL 的软件实现相关工具用于测试和调试 OpenGL 程序。准备 VNC 服务VNCVirtual Network Computing是远程桌面协议能让人像坐在那台计算机前一样远程操作。安装sudo apt install -y x11vnc至此Docker 内已经可以运行 Factorio 客户端并通过 VNC 控制它。但这还不足以在浏览器里游玩并实时做目标检测浏览器只能使用 HTTP 协议因此还需要websockify把 VNC 协议桥接成 HTTP 协议同时用noVNC提供一个网页界面来显示 VNC 画面并方便调试sudo apt install -y websockify novnc从源码结构看这套“浏览器 VNC 玩 Factorio”的 Playground 被组织在airi-factorio仓库的apps/factorio-yolo-v0-playground中配套的容器构建文件是仓库根目录下的docker/Dockerfile。AIRI 主仓库中与此衔接的功能是 Factorio 集成模块配置入口在 设置 → 机体模块 → 异星工厂其默认端口为34197见 gaming-factorio.ts 与 GamingFactorio.vue。第二步训练目标检测模型环境就绪后下一步是让模型认识游戏里的对象。为了快速验证维护者直接以 YOLO11n 预训练权重为基础微调目标检测模型。准备数据集用 Lua 脚本自动采集并自动标注数据采集的思路是“让游戏自己生成带标注的截图”全部通过 Factorio 的 Lua API 完成使用surface.create_entity在场景随机位置放置机器并记录机器选择框selection_box的大小与位置使用game.take_screenshot以各种缩放比例和光照条件daytime截屏根据选择框生成标注数据并用helpers.write_file保存到文件。采集脚本本体是 TypeScript 写的位于airi-factorio仓库的packages/factorio-rcon-snippets-for-node/src/factorio_yolo_dataset_collector_v0.ts它使用typescript-to-lua把 TypeScript 编译成 Lua再通过 RCON 传递给 Factorio 执行。数据集规模为三个型号的组装机和传送带每个机器采集 20 张 1280×1280 分辨率的截图画面中不包含 UI。为了更方便地调试采集脚本还配套开发了一个 VSCode 插件位于airi-factorio仓库的packages/vscode-factorio-rcon-evaluator提供 CodeLens 操作一键编译并执行脚本。按 YOLO 格式组织数据图片和标注收集完成后需要按 YOLO 官方数据集格式组织目录结构每个目标一行class x_center y_center width height坐标归一化然后可以上传到 Ultralytics Hub 预览效果训练与导出 ONNX训练代码非常直接以 YOLO11n 预训练模型为基础开始训练from ultralytics import YOLO model YOLO(yolo11n.pt) model.train(data./dataset/detect.yaml, epochs100, imgsz640, devicemps) model.export(formatonnx)几个关键训练参数的含义与取值imgsz640训练输入分辨率 640×640。注意模型在 640 尺度下训练与推理端输入尺寸必须保持一致后文“非正方形图片失效”的问题正与输入尺寸处理有关devicemps在 macOS 上使用 Apple MetalMPS设备可获得比 CPU 更好的训练性能epochs100共训练 100 个 epoch每个 epoch 有 5 个 batch大约在 70 个 epoch 时达到最佳效果model.export(formatonnx)导出 ONNX 格式供浏览器端onnxruntime-web加载推理。实际结果训练耗时约8 分钟导出模型大小约10MB。数据集、训练代码和导出的 ONNX 模型都放在airi-factorio仓库的apps/factorio-yolo-v0-playground中。第三步浏览器端实时推理把前两步的“零件”组装起来用novnc/novnc在浏览器中显示 VNC 画面同时把画布像素数据取出来喂给模型用onnxruntime-web在浏览器中做推理它提供 WebGPU 后端可以充分利用 GPU 性能。一个必须显式开启的选项executionProviders初版推理速度非常慢约 400ms还会卡死 UI连 VNC 画面都显示不正常。维护者临时补课 WebWorker把推理和显示拆到不同线程才解决了 UI 卡死问题——随后发现更关键的问题WebGPU 根本没有真正启用所以速度依然慢。正确写法是ort.InferenceSession.create(model, { executionProviders: [webgpu, wasm] })需要显式列出webgpu和wasm两种执行提供方这样在 WebGPU 不可用的环境下推理会自动回退到 WASM 执行。性能优化400ms → 80ms → 20ms启用 WebGPU 后推理速度从约 400ms 提升到约 80ms。继续优化时一个来自 AI 编程助手的建议点醒了维护者像素颜色值归一化时一直在做除法除以 255应该先把1/255算出来然后直接乘以这个常数避免逐像素除法。这看似微小的改动让推理速度提升到了约20ms体验已经相当不错——这也印证了在前端热路径里“乘优于除”的基本功。演示视频存放在 airi-factorio-yolo-v0-playground-vnc.mp4视频中左侧是通过网页 VNC 游玩的 Factorio 画面右侧是几乎实时的目标检测结果叠加。处理模型输出8400 组检测结果模型输出是一个 84000 个元素的一维数组dims为[1, 10, 8400]。也就是说84000 个元素按10 个为一组排列每组包含边界框中心 x、y 坐标边界框宽、高6 个类别各自的置信度合计8400 组检测结果。后处理分两步置信度过滤以 0.6 为阈值过滤掉置信度过低的边界框NMS非极大值抑制用 IOU 过滤掉重叠的边界框。用 NMS 去掉重叠框IOUIntersection over Union交并比的计算思路把两个框的面积加起来减去重叠面积得到“实际占用面积”并集再用重叠面积除以并集面积得到 01 之间的重合度。实现非常简单把所有边界框按置信度排序从高到低遍历若当前最高置信度框与某个候选框的 IOU 大于 0.7就认为它们指向同一个物体将其过滤掉function nms(boxes: Box[], iouThreshold: number): Box[] { // 1. Filter by confidence and sort in descending order const candidates boxes .filter(box box.confidence 0.6) .sort((a, b) b.confidence - a.confidence) const result: Box[] [] while (candidates.length 0) { // 2. Pick the box with the highest confidence const bestCandidate candidates.shift()! result.push(bestCandidate) // 3. Compare with remaining boxes and remove ones with high IOU for (let i candidates.length - 1; i 0; i--) { // The iou() function needs to be implemented separately, as described in the article. if (iou(bestCandidate, candidates[i]) iouThreshold) { candidates.splice(i, 1) } } } return result }Playground 的完整源码位于airi-factorio仓库的apps/factorio-yolo-v0-playground。本仓库中还保留了配套的可视化教学组件 nms-iou.vue它以两个可拖拽的检测框演示完整的 IOU 计算实时计算重叠判断isOverlapping、交叠区域intersect通过Math.max/Math.min求左右上下边界、并集面积union box1 面积 box2 面积 − 交叠面积以及iou intersect / union并把每一步的中间算式直接显示在界面下方。拖动标签改变框的位置即可直观感受两个框从分离到重叠再到高度重合时 IOU 值的变化是理解 NMS 阈值0.7含义的绝佳互动教具。实战中踩到的三个坑这套方案跑通之后维护者总结出三个在实践中发现的问题对后续迭代非常有参考价值无法识别非正方形图片一旦输入图片不是正方形模型输出的所有结果置信度都会非常低甚至为 0。这与训练时固定 640×640 的输入处理letterbox 填充直接相关类别混淆模型能区分一级组装机和二级组装机但会把箱子等方形物体也误识别为组装机——方形物体与组装机在视觉特征上过于接近状态标志干扰实际游戏中机器贴图上往往叠加状态标志电力状态、当前配方、使用的插件等这些标志会干扰模型的识别结果。有意思的是这些坑在后续项目中被系统性地解决并沉淀成了方法论在 DevLog 2026.02.16Dome Keeper 方向中维护者总结了更成熟的数据采集规则——只在出现目标时才采“有目标帧”、用“先采够 5 张有目标帧才允许采 1 张无目标帧”的规则稀释负样本、输出统一到 640×640 时用灰色114/255居中 padding 并对 bbox 做同样的缩放与偏移、按 30 秒时间段以 4/1/1 循环切分 train/val/test 等等。这些经验正是从本篇 Factorio 纯视觉实践中的问题延伸而来。后续方向与 AIRI 生态衔接这篇 DevLog 记录的是“纯视觉”的第一步AI 能够实时看见游戏画面。维护者明确表示接下来要做的是提升模型性能然后“以某种方式让 AI 来控制游戏”。在 AIRI 主仓库中Factorio 属于已规划的游戏集成之一见 README.md 中的功能清单与生态列表相关组件为 gaming-factorio.vue。桌面端提供连接配置服务器地址、端口、玩家名实际连接仍取决于可访问的 Factorio 服务器与服务端集成Factorio 集成文档。本篇的纯视觉 Playground 正是为这条“视觉感知 → AI 决策 → 游戏操作”链路补上最前端的感知环节。参考与延伸阅读本篇原始开发日志DevLog 2025.08.26前篇Factorio 方案重设计与 FLE 论文解读DevLog 2025.07.18后篇Dome Keeper 方向数据采集方法论延续DevLog 2026.02.16IOU/NMS 交互教学组件nms-iou.vueAIRI 的 Factorio 集成配置说明integrations/factorio.mdFactorio 集成前端实现GamingFactorio.vue 与 gaming-factorio.ts赞分享人工智能AI AgentMCP 服务工具调用GUI 自动化语音数字人交互助手【免费下载链接】airi 自托管、归你拥有的 Grok 风格 AI 伴侣与 waifu / 赛博生命灵魂容器目标是接近 Neuro-sama 的高度支持实时语音聊天、Minecraft 和 Factorio 游玩支持 Web / macOS / Windows。项目地址https://gitcode.com/moeru-ai/airi点击查看免费下载相关推荐airi-factorio 纯视觉路线实践Docker 化 Factorio 客户端 YOLO11n 浏览器端实时对象检测airi factorio 纯视觉路线实践Docker 化 Factorio 客户端 YOLO11n 浏览器端实时对象检测 本篇文章完整还原 AIRI 项人工智能AI AgentMCP 服务工具调用GUI 自动化语音数字人交互助手后端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 服务上一篇Hermes Agent终极指南如何打造你的个人AI智能助手下一篇如何用DanmakuFlameMaster打造沉浸式博物馆弹幕导览体验创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考