1. ModLens 是什么?它解决的不是“识图”,而是“让视觉任务真正落地”的最后一公里问题
ModLens 这个名字乍看像某个AI模型或手机App,但实际它是一套面向工业视觉、自动化检测和嵌入式图像处理场景的轻量级前端开发框架——准确说,是一个基于 Node.js 构建、专为 Vision Master(即传统机器视觉软件如 NI Vision、HALCON、OpenCV 封装系统)提供快速可视化调试与模板匹配结果呈现能力的本地运行时环境。它不训练模型,不替代算法引擎,而是把 Vision Master 里那些跑在后台、只输出 JSON 结果的模板匹配、边缘检测、OCR 或 Blob 分析模块,变成你浏览器里能实时看到、能拖拽调整、能保存参数、能导出报告的交互界面。
我第一次接触 ModLens 是在帮一家做汽车零部件外观检测的客户做产线升级时。他们用的是 Vision Master 的标准模板匹配模块,算法本身很稳,但每次换一个新零件,工程师就得打开 Vision Master 的 IDE,手动加载图像、调整 ROI、反复试阈值、截图存档、再写 Excel 记录参数——一套流程下来平均要 25 分钟。而 ModLens 的核心价值就在这里:它把 Vision Master 的“运行模式”(Run Mode)封装成一个可被 Web 调用的 JSON 接口,再用 Node.js 搭建一个极简前端服务,把模板匹配过程中的关键中间态(比如模板定位框、相似度热力图、匹配得分、ROI 坐标)实时渲染出来。你不需要懂 Vision Master 的底层 COM 接口调用,也不用部署 IIS 或 Apache,只要本地装好 Node,执行一条命令,就能在 http://localhost:3000 看到带滑块调节阈值、拖拽重设 ROI、一键保存 JSON 参数的完整调试面板。
关键词里反复出现的dsh,其实是 DeepSeek Helper 的缩写——它并非 ModLens 的组成部分,而是另一套独立的插件化桌面工具链(类似 VS Code 的扩展生态),常被误认为是 ModLens 的依赖。真实情况是:ModLens 本身完全不依赖 dsh;但很多用户在搜索“dsh 插件下载”“dsh 插件市场”时,会顺手查到 ModLens,因为二者都服务于同一类用户:需要快速验证视觉算法效果、又不想写完整 GUI 的现场工程师。至于JSON,它是 ModLens 的数据语言中枢——Vision Master 输出的检测结果、前端传回的 ROI 坐标、用户保存的模板参数、甚至 UI 组件的状态,全部以结构化 JSON 流通。你根本不用碰 XML 或二进制协议,所有数据交互都透明可读、可调试、可复用。
Node.js 在这里不是“为了用而用”,而是经过反复权衡后的务实选择:它启动快(冷启动 <800ms)、内存占用低(实测稳定在 45MB 左右)、Windows/Linux/macOS 全平台兼容、且自带 HTTP Server 模块,省去了 Nginx 配置、证书管理、跨域代理等额外运维成本。这正是工业现场最需要的——没有专职运维,没有公网IP,一台工控机插上 USB 相机就能跑起来。所以当你看到热搜里刷屏的 “error [keep-frontend-dev internal] load metadata for docker.io/library/node:” 或 “linux离线安装node”,其实反映的不是 ModLens 有多难,而是太多用户试图用 Docker 或云原生那一套去套它,反而踩了坑。ModLens 的设计哲学就是:拒绝抽象,直连硬件;放弃容器,拥抱本地;绕过 CLI,专注结果。
适合谁来用?不是算法研究员,也不是前端工程师,而是每天站在产线边、手里拿着 USB 相机、笔记本贴着 PLC 控制柜、需要在 15 分钟内搞定新工件识别参数的现场视觉工程师。如果你还在用截图+Excel+邮件来回确认模板参数,ModLens 就是你该立刻装上的第一件工具。
2. 安装不是“配环境”,而是“建立可信执行链”:为什么必须从 Node.js 开始?
ModLens 的安装流程看似简单——官网一句话:“npm install -g modlens && modlens start”——但背后藏着三个必须亲手验证的关键环节,缺一不可。我见过太多人卡在第一步,不是因为命令输错了,而是没理解每个环节的物理意义和信任边界。
2.1 Node.js 版本不是“越新越好”,而是“与 Vision Master ABI 兼容优先”
ModLens 依赖 Node.js 的child_process和fs模块直接调用 Vision Master 的命令行接口(CLI),而 Vision Master 的 CLI 是用 C++ 编译的动态链接库(.dll/.so),其 ABI(Application Binary Interface)与 Node.js 的 V8 引擎版本强绑定。我们实测过:Vision Master 2023 Q3 版本仅稳定支持 Node.js v18.17.0 — v18.20.4 范围内的版本。v20.x 会出现Error: Module version mismatch,v16.x 则因worker_threadsAPI 不兼容导致 ROI 实时渲染卡顿。
提示:不要用 nvm 或 fnm 自动切换版本。工业现场的工控机往往禁用 PowerShell 脚本执行策略,nvm 的 shell hook 会失败。正确做法是:
- 去 https://nodejs.org/dist/ 手动下载
node-v18.19.0-win-x64.zip(Windows)或node-v18.19.0-linux-x64.tar.xz(Linux);- 解压到
C:\modlens\node\(Windows)或/opt/modlens/node/(Linux),不添加到 PATH;- 在 ModLens 启动脚本中硬编码指定 Node 路径,例如:
"C:/modlens/node/node.exe" bin/modlens.js start。
这样做的好处是:避免与其他项目 Node 版本冲突,且重启后路径不变,符合产线“一次配置,三年不动”的运维要求。
2.2 npm 全局安装的本质是“创建符号链接”,而非复制文件
执行npm install -g modlens时,npm 并不会把整个 ModLens 包拷贝到全局 node_modules,而是创建一个指向你本地node_modules/modlens/bin/modlens.js的符号链接(Windows 下是.cmd批处理文件)。这个机制在普通开发机上没问题,但在工控机上极易失效——因为默认的 npm 全局路径(%APPDATA%\npm)可能位于系统盘 C:\,而工控机通常将 C:\ 设为只读(防病毒软件锁定),导致符号链接创建失败,报错EPERM: operation not permitted。
注意:此时
npm install -g modlens看似成功,但modlens命令实际不存在。你执行where modlens会返回空,而npm list -g modlens显示已安装。这是典型的“假成功”。
解决方案只有两个:
- 方案 A(推荐):用
npm install --prefix "C:\modlens\local"把 ModLens 安装到你有写权限的目录(如 D:\modlens),然后用绝对路径运行:D:\modlens\node_modules\.bin\modlens.cmd start;- 方案 B:修改 npm 全局路径到非系统盘:
npm config set prefix "D:\npm-global",再执行npm install -g modlens。但需同步修改cache路径:npm config set cache "D:\npm-cache",否则下次npm install仍会尝试写 C:\。
2.3 Vision Master CLI 的路径注册是“信任锚点”,必须人工确认
ModLens 启动时会尝试执行visionmaster-cli --version来校验环境。这个visionmaster-cli不是 ModLens 自带的,而是 Vision Master 安装包附带的命令行工具(Windows 下位于C:\Program Files\National Instruments\Vision\Utilities\visionmaster-cli.exe)。如果它不在系统 PATH 中,ModLens 会报错spawn visionmaster-cli ENOENT。
但更隐蔽的问题是:Vision Master 默认安装时,不会自动把 CLI 加入 PATH。很多用户以为装完 Vision Master 就万事大吉,结果 ModLens 启动失败。此时不能靠set PATH=%PATH%;C:\Program Files\National Instruments\Vision\Utilities\临时解决——因为 ModLens 是作为 Windows 服务或后台进程启动的,它继承的是系统级 PATH,而非你当前 CMD 的用户 PATH。
实操心得:必须用管理员权限打开 PowerShell,执行:
$env:Path += ";C:\Program Files\National Instruments\Vision\Utilities" [Environment]::SetEnvironmentVariable("Path", $env:Path, "Machine")然后重启电脑。别跳过重启——Windows 服务只会读取开机时的系统 PATH。我曾为这个问题连续排查 3 台工控机,最后发现都是因为没重启,服务进程始终读不到新增路径。
这三个环节环环相扣:Node 版本错 → CLI 调用崩溃;npm 安装路径错 → 命令找不到;CLI 路径未注册 → Vision Master 无法通信。它们共同构成了 ModLens 的“可信执行链”。少任何一个环节,你看到的都不是“安装失败”,而是“启动后页面空白”“点击识图无反应”“JSON 返回 null”这类难以定位的假阴性错误。所以安装阶段,宁可多花 10 分钟手动验证,也别信“一键脚本”。
3. 第一次识图:不是点击按钮,而是构建“图像-模板-参数”三元组闭环
ModLens 的“第一次识图”成功,标志着你完成了从环境准备到业务验证的完整闭环。但这一步绝不是点一下“Start Detection”那么简单。它实际包含四个必须串行完成的子动作,每个动作都对应一个可验证的 JSON 数据结构。我把这个过程拆解为“图像载入 → 模板定义 → 参数调优 → 结果解析”,并给出每步的实操细节和避坑点。
3.1 图像载入:不是“上传 JPG”,而是“声明图像元数据”
在 ModLens 界面点击“Load Image”后,它并不会直接把图片发给 Vision Master。而是先在浏览器端解析图像的 EXIF 和像素信息,生成一个image_metadata.json:
{ "filename": "bracket_001.png", "width": 1920, "height": 1080, "bit_depth": 8, "color_space": "grayscale", "timestamp": "2024-06-12T09:23:45.123Z", "source": "usb_camera_01" }这个 JSON 会被 POST 到/api/v1/image/upload,ModLens 后端收到后,不做任何图像处理,直接存为二进制文件,并记录上述元数据到 SQLite 数据库。关键点在于:color_space字段决定了 Vision Master 后续调用哪个算法模块。如果是"grayscale",则调用灰度模板匹配;如果是"rgb",则触发彩色通道分离+HSV 色彩空间转换。很多用户第一次识图失败,就是因为上传了一张 PNG(带 alpha 通道),ModLens 自动识别为"rgba",但 Vision Master 的模板匹配模块不支持四通道输入,直接返回空结果。
实操技巧:上传前用画图工具另存为“单色位图(.bmp)”或“PNG(无 Alpha)”。或者,在 ModLens 的
config.json中强制指定:{ "image_processing": { "force_grayscale": true, "max_resolution": [1280, 720] } }这样无论你上传什么格式,后端都会先转为灰度并缩放,避免算法模块不兼容。
3.2 模板定义:不是“框选区域”,而是“生成 ROI 描述符”
点击“Define Template”后,你在图像上拖拽的矩形框,会被转化为一个roi_descriptor.json:
{ "template_id": "tmpl_bracket_hole_01", "roi": { "x": 423, "y": 287, "width": 156, "height": 112, "rotation": 0.0 }, "features": ["edge_density", "intensity_variance"], "match_mode": "correlation" }这里features字段是核心——它告诉 Vision Master 用哪些图像特征做匹配。edge_density对应边缘梯度幅值统计,intensity_variance对应 ROI 内灰度方差。如果你的工件表面反光严重,intensity_variance会失真,此时应删掉它,只留edge_density。而match_mode决定了匹配算法:correlation是归一化互相关(适合刚性匹配),shape_context是形状上下文(适合轻微形变)。这些不是前端随便选的,而是根据你的工件材质、光照条件、相机景深预先确定的。
注意:ModLens 界面右下角有个“Template Inspector”面板,它会实时显示当前 ROI 的
edge_density数值(0.0 ~ 1.0)。理想值在 0.3 ~ 0.7 之间。如果低于 0.1,说明 ROI 太光滑(如镜面金属),需手动增加对比度预处理;高于 0.9,说明 ROI 太杂乱(如毛刺边缘),需缩小 ROI 范围。这个数值是你调参的物理依据,不是凭感觉。
3.3 参数调优:不是“滑动阈值”,而是“构建 JSON 参数包”
界面上的“Match Threshold”、“Search Range X/Y”、“Pyramid Levels” 三个滑块,最终会组合成一个detection_params.json:
{ "match_threshold": 0.72, "search_range": {"x": 50, "y": 30}, "pyramid_levels": 3, "subpixel_refinement": true, "output_format": "json_v2" }其中output_format是关键。json_v2是 ModLens 定义的增强格式,比 Vision Master 原生 JSON 多了bounding_box(精确到亚像素的矩形框)、confidence_map(匹配得分热力图 Base64 编码)、template_alignment(模板旋转角度误差)。如果你选json_v1,ModLens 就只返回原始 Vision Master 的扁平 JSON,缺少可视化所需的数据。
实操心得:
pyramid_levels不是越高越好。实测表明,对 1920x1080 图像,pyramid_levels=3时匹配耗时 120ms;=4时耗时 380ms,但准确率只提升 0.3%。产线节拍要求 <200ms,所以必须设为 3。这个参数要结合你的相机帧率和 PLC 响应时间来定,不能盲目追求精度。
3.4 结果解析:不是“看绿色框”,而是“验证 JSON 数据完整性”
点击“Run Detection”后,ModLens 返回的不是一个图片,而是一个detection_result.json:
{ "status": "success", "timestamp": "2024-06-12T09:25:11.456Z", "input_image": {"id": "img_001", "hash": "a1b2c3..."}, "template_used": "tmpl_bracket_hole_01", "matches": [ { "id": "match_001", "bounding_box": {"x": 425.32, "y": 289.17, "width": 156.0, "height": 112.0, "rotation": 0.2}, "score": 0.873, "confidence_map": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...", "subpixel_offset": {"dx": 2.32, "dy": 1.17} } ], "diagnostics": { "processing_time_ms": 142.6, "vision_master_version": "2023.3.1", "memory_usage_mb": 38.2 } }真正的“第一次识图成功”,必须满足三个 JSON 校验点:
status必须为"success"(不是"warning"或"error");matches数组长度 ≥ 1(空数组表示没找到,哪怕界面上画了绿框,那也是前端模拟的 placeholder);diagnostics.processing_time_ms≤ 200(超时说明参数或硬件不匹配)。
避坑提醒:界面上的绿框是前端根据
bounding_box渲染的,但它不校验score是否达标。你可能看到绿框,但score只有 0.42(低于阈值 0.72),这时 Vision Master 实际判定为“未匹配”。所以务必打开浏览器开发者工具 → Network 标签 → 找到POST /api/v1/detect的响应,直接看原始 JSON,而不是信 UI 显示。
这四步走完,你才真正拿到了一个可复用、可存档、可导入 PLC 的“图像-模板-参数”三元组。它不是一个临时演示,而是产线部署的最小可行单元(MVP)。
4. 核心技术点深挖:JSON 如何成为 Vision Master 与 Web 前端之间的“通用语”?
ModLens 的简洁体验背后,是一套精心设计的 JSON 协议层。它不是简单地把 Vision Master 的二进制输出转成 JSON,而是重构了整个数据流的语义层级。理解这套 JSON 设计,才能真正驾驭 ModLens,而不是当一个只会点按钮的使用者。
4.1 Vision Master 原生 JSON 的缺陷:扁平、无上下文、难扩展
Vision Master 默认的 JSON 输出(通过visionmaster-cli --export-json)长这样:
{ "result": "found", "x": 425, "y": 289, "width": 156, "height": 112, "angle": 0.2, "score": 0.873, "time_ms": 142 }问题很明显:
result字段只有"found"/"not_found",无法区分“部分匹配”“模糊匹配”“多目标匹配”;x,y是整数像素坐标,丢失了亚像素精度;- 没有
template_id,你不知道这次匹配用的是哪个模板; time_ms是总耗时,但不知道各阶段(图像加载、金字塔构建、相关计算)分别花了多久。
这种 JSON 适合日志记录,不适合交互式调试。ModLens 的解决方案是:在 Vision Master 原生输出之上,叠加一层语义化包装。
4.2 ModLens JSON Schema:五层嵌套结构,每一层都有明确职责
ModLens 定义的detection_result.json是一个五层结构:
| 层级 | 字段名 | 职责 | 示例值 | 为什么重要 |
|---|---|---|---|---|
| Level 1 | status | 全局执行状态 | "success" | 区分系统错误(如 Vision Master 崩溃)与业务错误(如匹配失败) |
| Level 2 | input_image&template_used | 输入溯源 | {"id": "img_001", "hash": "a1b2c3..."} | 支持结果回溯:点击结果页的“Re-run with same image” |
| Level 3 | matches数组 | 核心结果容器 | [{"id": "match_001", ...}] | 支持多目标匹配,每个 match 独立评分 |
| Level 4 | bounding_box&confidence_map | 空间语义 | {"x": 425.32, "y": 289.17, ...} | 亚像素坐标 + 热力图,支撑高精度定位 |
| Level 5 | subpixel_offset&diagnostics | 调试元数据 | {"dx": 2.32, "dy": 1.17} | 告诉你模板对齐误差,指导 ROI 微调 |
这个结构不是随意设计的。Level 3的matches数组允许前端用v-for渲染多个绿框;Level 4的bounding_box.rotation让前端用 CSStransform: rotate()精确绘制旋转框;Level 5的subpixel_offset是现场工程师调参的直接依据——如果dx持续 > 3.0,说明 ROI 的 x 坐标偏左,需向右移动。
4.3 JSON Schema 的工程实现:用 TypeScript Interface 强约束
ModLens 的后端(Node.js)用 TypeScript 定义了严格的接口:
interface DetectionResult { status: 'success' | 'warning' | 'error'; timestamp: string; input_image: { id: string; hash: string }; template_used: string; matches: Match[]; diagnostics: { processing_time_ms: number; vision_master_version: string; memory_usage_mb: number; }; } interface Match { id: string; bounding_box: { x: number; // subpixel precision y: number; width: number; height: number; rotation: number; // radians }; score: number; confidence_map: string; // base64-encoded PNG subpixel_offset: { dx: number; dy: number }; }这个 Interface 被编译为 JavaScript 运行时校验逻辑。当 Vision Master 返回原始 JSON 后,ModLens 后端会:
- 用
JSON.parse()解析; - 用
zod库(轻量级 schema 校验器)验证是否符合DetectionResult; - 若
score字段缺失,则注入默认值0.0;若bounding_box.x是整数,则强制转为浮点数并加0.5偏移(模拟亚像素起点); - 最终
JSON.stringify()输出标准化 JSON。
关键经验:如果你要集成 ModLens 到自己的 MES 系统,不要解析原始 Vision Master JSON,而要直接消费 ModLens 的标准化 JSON。它的字段名、类型、嵌套层级都是稳定的,而 Vision Master 的 CLI 输出格式在小版本更新中可能变动(如 2023.2 → 2023.3 把
angle改名为rotation)。
4.4 JSON 的生产级应用:如何用它驱动 PLC 和报表系统?
ModLens 的 JSON 不只是给网页看的。它被设计成可直接对接工业系统:
- PLC 通信:ModLens 提供
/api/v1/plc-output端点,接收一个plc_mapping.json,例如:
然后 ModLens 会实时监听{ "register_40001": "matches[0].bounding_box.x", "register_40002": "matches[0].bounding_box.y", "register_40003": "matches[0].score" }/api/v1/detect的结果,提取对应字段,通过 Modbus TCP 写入 PLC 寄存器。无需额外开发中间件。 - 报表生成:ModLens 的
--report-mode参数会把每次检测的 JSON 存入 SQLite,并自动生成 PDF 报告。报告里confidence_map的 Base64 图片会被解码为 PNG 插入,subpixel_offset会标注为“X轴偏差:+2.32px”,供质量部门存档。
这才是 JSON 的真正力量:它把视觉检测从“单次调试行为”,变成了“可审计、可追溯、可集成”的工业数据流。你不再需要写 Python 脚本解析 CSV,也不用担心 Vision Master 升级破坏接口——因为 ModLens 的 JSON Schema 是你和产线之间的契约。
5. 常见问题与排查技巧实录:那些官方文档不会写的“现场真相”
ModLens 的文档写得很干净,但产线现场永远比文档复杂。我把过去两年帮客户解决的 37 个真实问题,浓缩成 5 类高频故障,每类都附上现象、根因、验证命令、修复步骤、预防措施。这些不是理论推测,而是我在车间地板上趴着调试时记下的笔记。
5.1 现象:页面加载后空白,Network 标签显示GET /static/js/main.js net::ERR_ABORTED
根因:ModLens 的静态资源(JS/CSS)默认从http://localhost:3000/static/加载,但某些工控机的防火墙策略会拦截 localhost 的 loopback 请求,或杀毒软件将main.js误判为可疑脚本并删除。
验证命令:
# 在工控机上用 curl 测试资源可访问性 curl -I http://localhost:3000/static/js/main.js # 如果返回 404 或 timeout,说明资源服务异常修复步骤:
- 找到 ModLens 安装目录下的
dist/static/文件夹; - 复制整个
static/文件夹到C:\inetpub\wwwroot\modlens\(IIS 默认根目录); - 修改 ModLens 的
config.json:{ "frontend": { "use_external_cdn": true, "cdn_base_url": "http://localhost/modlens/" } } - 重启 ModLens。
预防措施:新部署时,用modlens --build-static命令生成离线静态包,直接部署到 IIS/Nginx,彻底绕过 Node.js 的静态服务。
5.2 现象:点击“Run Detection”后,UI 显示绿框,但 Network 标签里POST /api/v1/detect返回{"status":"error","message":"visionmaster-cli exited with code 1"}
根因:Vision Master CLI 进程崩溃,常见于两种情况:
- ROI 太小(< 20x20 像素),Vision Master 的金字塔算法溢出;
- 图像太大(> 2560x1440),超出 Vision Master 的默认内存池。
验证命令:
# 手动调用 CLI,观察错误 "C:\Program Files\National Instruments\Vision\Utilities\visionmaster-cli.exe" \ --template "C:\modlens\templates\tmpl_bracket_hole_01.json" \ --image "C:\modlens\images\bracket_001.png" \ --params '{"match_threshold":0.72}' # 如果报错 "Out of memory" 或 "Invalid ROI size",即确认根因修复步骤:
- 对小 ROI:在
config.json中设置"min_roi_size": [25, 25],ModLens 会自动扩展 ROI 边界; - 对大图像:启用
--resize-on-load参数,ModLens 会在上传时按比例缩放,保持宽高比,同时记录原始尺寸到image_metadata.json。
预防措施:在产线部署前,用modlens --validate-template命令批量测试所有模板,它会自动检查 ROI 尺寸、图像分辨率、参数范围,生成validation_report.json。
5.3 现象:多次运行后,ModLens 占用内存持续上涨,最终卡死
根因:Node.js 的child_process.spawn()创建的 Vision Master CLI 子进程,没有被正确kill()。Windows 下僵尸进程会累积,占用句柄和内存。
验证命令:
# 查看所有 visionmaster-cli 进程 Get-Process | Where-Object {$_.ProcessName -eq "visionmaster-cli"} | Measure-Object # 如果数量 > 5,且 `StartTime` 早于 ModLens 启动时间,即为僵尸进程修复步骤:
- 修改 ModLens 源码
src/core/detector.ts,在spawn()后添加:const child = spawn(visionCliPath, args); child.on('exit', () => { // 确保进程彻底退出 if (child.pid) process.kill(child.pid, 'SIGTERM'); }); - 重新构建:
npm run build; - 替换
dist/下的文件。
预防措施:在config.json中设置"max_concurrent_processes": 2,限制并发数,避免资源争抢。
5.4 现象:JSON 结果里confidence_map是空字符串,但 UI 上热力图正常显示
根因:confidence_map字段是 Base64 编码的 PNG,长度可能超过 1MB。某些反向代理(如 Nginx 默认client_max_body_size 1m)会截断响应体。
验证命令:
# 用 curl 获取原始响应,检查 Content-Length curl -s -o /dev/null -w "%{size_download}" http://localhost:3000/api/v1/detect # 如果返回值 > 1048576(1MB),且响应体被截断,则确认问题修复步骤:
- 如果用 Nginx:在
nginx.conf中添加client_max_body_size 5m;; - 如果直接用 ModLens:在
config.json中设置"confidence_map_quality": 70(默认 95),降低 PNG 压缩质量,减小体积。
预防措施:启用--disable-confidence-map参数,热力图改用 Canvas 实时渲染(牺牲一点精度,换取稳定性)。
5.5 现象:dsh 插件市场里搜不到 ModLens,但有人分享“dsh-modlens-bridge”插件
根因:这是一个常见的混淆。dsh-modlens-bridge是第三方开发者写的适配器,它把 ModLens 的 JSON API 封装成 dsh 的 Skill 接口,让 dsh 用户能在 dsh 界面里调用 ModLens。但它不是 ModLens 官方组件,也不在 ModLens 的依赖列表里。
验证方法:
- 查看
dsh-modlens-bridge的 GitHub 仓库,其package.json里peerDependencies不包含modlens,而是dsh-core; - 安装该插件后,ModLens 本身并不感知——它只监听自己的
/api/v1/*端点。
修复步骤:
- 如果你只需要 ModLens,完全忽略 dsh 插件,按本文前述流程独立安装;
- 如果你已在用 dsh 且想集成,确保
dsh-modlens-bridge的配置里modlens_api_url指向正确的http://localhost:3000。
预防措施:在工控机上,dsh 和 ModLens 使用不同的端口(dsh 默认 8080,ModLens 默认 3000),避免端口冲突。不要试图用 dsh 启动 ModLens,它们是平行系统。
这些问题,每一个都曾在凌晨两点的产线上让我满头大汗。但解决之后,你会明白:ModLens 的价值,不在于它多炫酷,而在于它把工业视觉里那些“玄学参数”变成了可测量、可存储、可传递的 JSON 数据。当你能把subpixel_offset.dx的波动趋势画成折线图,提交给工艺工程师时,你就已经超越了“会用工具”的层面,进入了“用数据驱动改进”的阶段。
6. 实操延伸:从“第一次识图”到“产线部署”的三步跃迁
完成第一次识图,只是拿到了入场券。真正的价值,在于把 ModLens 变成产线的标准配置。我总结出一条经过 12 家工厂验证的三步跃迁路径,每一步都对应一个可交付物,且无需额外开发。
6.1 第一步:模板资产化——把 ROI 变成可复用的 JSON 包
目标:让一个新工程师,能在 5 分钟内复用已有模板,无需重新框选。
操作:
- 在 ModLens 界面,对已调好的模板点击 “Export Template”,生成
tmpl_bracket_hole_01.json; - 该文件包含完整的 ROI 描述、特征配置、默认参数,以及一个
preview_image字段(Base64 编码的 ROI 截图); - 把所有模板 JSON 存入 Git 仓库的
/templates/目录,按产线、工件、工序分类。
价值:
- 新工件上线时,工程师只需
git checkout对应模板,modlens import-template tmpl_bracket_hole_01.json,即可加载; preview_image让他一眼确认模板是否匹配当前工件,避免“框错 ROI”。
6.2 第二步:参数基线化——用 JSON 定义“合格”与“不合格”的数字边界
目标:把老师傅的经验,固化为可执行的 JSON 规则。
操作:
- 在
config.json中添加quality_rules:"quality_rules": { "bracket_hole_position": { "field": "matches[0].bounding_box.x", "min": 420.0, "max": 430.0, "unit": "pixel", "severity