- 新增 mingxi-capture(PyQt5桌面程序)目录骨架 - 新增 mingxi-vision(FastAPI推理服务)目录骨架 - 新增 mingxi-backend(Django业务后端)目录骨架 - 新增 mingxi-frontend(Vue3管理后台)目录骨架 - 迁入 docs/(技术设计文档和PCB调研资料) - 补充 .gitignore(模型文件、Node.js依赖、运行时数据库) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
29 KiB
29 KiB
明析平台 软件重构设计文档
版本:v2.0 · 日期:2026-05-24
项目:基于机器视觉的图像识别技术应用平台——明析
参赛:梅州市2026年新一代电子信息暨人工智能产业创新创业大赛 · 初创企业(创客)组
1. 重构背景
1.1 现有代码概况
当前仓库 yolo_classification_system 是一套通用YOLO推理系统,实现了:
| 模块 | 现状 |
|---|---|
| 后端 | Django 4 + DRF,JWT鉴权,支持图片/视频/摄像头三种推理模式 |
| 推理 | inference.py 封装 ultralytics YOLO,模型缓存,结果落库 |
| 数据模型 | UserProfile、YoloResult、SceneNews、SystemLog、YoloStatsDaily |
| 前端 | Vue 3 + Vite,开发/生产环境分离,API代理配置完整 |
| 演示模型 | 驾驶员疲劳检测(driver-drowsiness-detection/best.pt) |
1.2 重构目标
将通用系统改造为PCB线路板缺陷检测专用平台(明析),在不改动客户现有硬件的前提下,通过算法叠加实现AI视觉质检能力升级。
2. 系统物理架构
2.1 两台机器部署
┌─────────────────────────────────┐ 局域网 ┌──────────────────────────────────────┐
│ 前置机(工业PC) │ ─────────────→ │ 推理服务器(Linux+GPU) │
│ │ │ │
│ 相机 ──USB3──→ mingxi-capture │ │ mingxi-vision :8001 (FastAPI) │
│ (PyQt5桌面程序) │ │ mingxi-backend :8000 (Django) │
│ Win7 SP1+ 工业机 │ │ mingxi-frontend :80 (Vue3) │
└─────────────────────────────────┘ └──────────────────────────────────────┘
| 角色 | 机器 | 操作系统 | 运行软件 |
|---|---|---|---|
| 前置机 | 工厂现有工业PC(USB3.0) | Windows 7 SP1 及以上 | mingxi-capture.exe |
| 推理服务器 | 团队配置(RTX 4060 或以上) | Linux | mingxi-vision + mingxi-backend + mingxi-frontend |
2.2 数据流
操作工(点击按钮)或 PLC触发信号
│
▼
mingxi-capture(前置机)
│
├─① 同步 POST 图像 ──────────────→ mingxi-vision(推理服务器:8001)
│ │ 推理完成
│ ←── 返回标注图+缺陷列表+结论 ──────┘
│
├─ 立即在桌面程序展示结果(操作工可见)
│ · 合格 / 不合格 结论
│ · 标注了缺陷位置的图像
│ · 每个缺陷的类型、等级、置信度
│
└─② 异步队列 POST 结果 ──────────→ mingxi-backend(:8000)
│ 存入 SQLite
若失败 → 本地SQLite重试队列 │
▼
管理员/组长/厂长
通过浏览器查看
(短轮询,1-2秒延迟)
2.3 端口分配
| 服务 | 端口 | 调用方 |
|---|---|---|
| mingxi-vision | 8001 | mingxi-capture(同步推理) |
| mingxi-backend | 8000 | mingxi-capture(存档)、浏览器前端 |
| mingxi-frontend | 80 | 浏览器 |
3. 子项目拆分方案
3.1 项目总览
mingxi-capture/ Python 3.8 · PyQt5 · Windows桌面程序(前置机运行)
mingxi-vision/ Python 3.8 · FastAPI · PCB缺陷推理服务(推理服务器运行)
mingxi-backend/ Python 3.8 · Django 4 · 业务后端(推理服务器运行)
mingxi-frontend/ Vue 3.0 · 管理后台(推理服务器运行,浏览器访问)
3.2 代码迁移决策
| 现有文件/模块 | 处置方式 | 说明 |
|---|---|---|
yolo8/models.py → UserProfile |
直接复用 | JWT鉴权体系完整,扩展 role 字段 |
yolo8/models.py → SystemLog |
直接复用 | 日志结构通用 |
yolo8/jwt_utils.py |
直接复用 | token版本机制保留 |
yolo8/models.py → YoloResult |
重构为 DefectResult |
增加PCB专用字段:缺陷等级、产线 |
yolo8/models.py → SceneNews |
删除 | 与PCB业务无关 |
yolo8/models.py → YoloStatsDaily |
重构为 ProductionStat |
改为产线维度统计 |
yolo8/inference.py → run_image_inference |
迁移至 mingxi-vision |
推理服务核心,增加ONNX支持 |
yolo8/inference.py → run_camera_inference |
删除 | 由 mingxi-capture 海康SDK替代 |
yolo8/inference.py → _copy_to_ascii_temp_input |
删除 | 改为内存读图,彻底消除中文路径问题 |
yolo8/views.py → 鉴权相关视图 |
直接复用 | auth_*、user_* 无需改动 |
yolo8/views.py → yolo_task_image |
重构为 detect_pcb |
简化,接收capture推送 |
frontend/ |
重构 | 删除通用YOLO页面,改为管理后台 |
4. mingxi-capture(前置采集程序)
4.1 定位
运行在前置机(工厂工业PC)上的 Windows 原生桌面程序。操作工唯一的交互界面,负责连接相机、触发检测、展示结果,并将结果异步上报至后台。
4.2 技术栈
语言:Python 3.8
GUI:PyQt5(支持 Windows 7 SP1 及以上,系统托盘、对话框完整支持)
相机:MvImport(海康威视MVS Python SDK,随MVS安装包提供)
本地存储:SQLite(通过 Python 内置 sqlite3)
网络:requests(同步调用vision)+ threading(异步队列推送backend)
打包:PyInstaller → 单文件 .exe 或目录,客户解压即用
最低系统:Windows 7 SP1 x64
4.3 目录结构
mingxi-capture/
├── camera/
│ ├── hik_camera.py # 海康相机封装(MvImport,Phase 2接入)
│ └── mock_camera.py # 模拟模式(读本地图片文件夹,Demo/开发用)
├── ui/
│ ├── main_window.py # 主窗口:触发按钮 + 图像展示 + 缺陷列表
│ ├── config_dialog.py # 配置弹窗:服务器地址、端口、相机参数
│ └── tray_icon.py # 系统托盘图标:显示/隐藏主窗口、退出
├── core/
│ ├── capture_worker.py # 拍图+调推理(在QThread中执行,不阻塞UI)
│ ├── upload_queue.py # 异步上报队列(本地SQLite缓存+重试)
│ └── settings.py # 读写 config.ini 配置文件
├── assets/
│ └── tray_icon.png # 托盘图标
├── config.ini # 默认配置(首次运行生成)
├── queue.db # 本地重试队列(SQLite,运行时生成)
├── main.py # 程序入口
├── requirements.txt
└── mingxi-capture.spec # PyInstaller打包配置
4.4 主窗口功能
┌─────────────────────────────────────────┐
│ 明析采集程序 [最小化到托盘] [×] │
├─────────────┬───────────────────────────┤
│ │ ┌───────────────────────┐│
│ [手动检测] │ │ ││
│ │ │ 标注图显示区域 ││
│ 状态: 就绪 │ │ (检测后显示) ││
│ │ │ ││
│ 结论: │ └───────────────────────┘│
│ ██ 不合格 │ │
│ │ 缺陷列表: │
│ 共 3 处 │ 类型 等级 置信度 │
│ 最高: 致命 │ 断路 致命 0.94 │
│ │ 短路 致命 0.88 │
│ │ 毛刺 轻微 0.72 │
└─────────────┴───────────────────────────┘
4.5 配置弹窗(系统托盘右键→设置)
推理服务地址: [192.168.1.100] 端口: [8001]
后台服务地址: [192.168.1.100] 端口: [8000]
相机序列号: [自动检测 ▼]
模拟模式: [✓] 启用 图片目录: [C:\test_images\ 浏览]
置信度阈值: [0.45]
[保存] [取消]
配置持久化至 config.ini,程序启动时自动读取。
4.6 异步上报队列
# core/upload_queue.py 逻辑
# 1. capture_worker 推理成功后,将结果插入本地 SQLite queue.db
# 2. 后台线程每 5 秒扫描一次 queue.db 中状态为 pending 的记录
# 3. 尝试 POST 到 mingxi-backend
# 成功 → 标记为 sent
# 失败 → retry_count + 1,超过 10 次标记为 failed(不再重试)
# 4. 队列表结构:
# id, image_base64, result_json, created_at, status, retry_count, last_error
4.7 mock_camera 模拟模式
Phase 1(路演)无真实相机时,从配置目录中按序读取 .jpg/.png 文件,接口与 hik_camera.py 完全一致,上层代码无感知切换。
4.8 打包部署
pyinstaller mingxi-capture.spec
# 输出:dist/mingxi-capture/(目录模式)或 dist/mingxi-capture.exe(单文件)
# 客户端:解压后双击 mingxi-capture.exe 即可运行
# 随安装包附带:海康 MVS Runtime DLL(如需相机功能)
4.9 触发模式(阶段支持)
| 触发方式 | Phase 1 | Phase 2 |
|---|---|---|
| 手动点击按钮 | ✅ | ✅ |
| PLC/传感器信号(串口/数字IO) | — | ✅ |
| 定时自动(固定频率) | — | ✅ |
5. mingxi-vision(推理服务)
5.1 职责
- 接收图像(来自
mingxi-capture) - 调用明析平台(YOLOv8/ONNX)执行PCB缺陷检测
- 返回缺陷列表(位置、类别、置信度、等级)+ 标注图(可选)
- 支持模型热重载(管理员通过后台切换模型时调用)
5.2 技术栈
语言:Python 3.8
框架:FastAPI + uvicorn(workers=1,单进程,GPU不跨进程共享)
推理:ultralytics YOLOv8(开发阶段)/ ONNX Runtime(生产部署)
并发:asyncio.Lock(推理串行化,防止GPU冲突)
GPU:CUDA 11.x + cuDNN
5.3 并发处理:推理锁
# engine/loader.py
import asyncio
_inference_lock = asyncio.Lock()
_engine: Optional[BaseInferenceEngine] = None
def get_inference_lock() -> asyncio.Lock:
return _inference_lock
# api/detect.py
async def detect(image: UploadFile, conf: float = 0.45, ...):
raw = await image.read()
img = cv2.imdecode(np.frombuffer(raw, np.uint8), cv2.IMREAD_COLOR)
async with get_inference_lock(): # 请求自动排队,GPU串行执行
result = engine.detect(img, conf)
return build_response(result)
- 并发请求不会崩溃,自动排队等待
- RTX 4060,YOLOv8s,PCB图:约 20
40ms/张 → 2550 fps - Windows / Linux 行为完全一致(asyncio 事件循环原语,无OS依赖)
5.4 模型热重载接口
POST /api/model/reload
Body: { "model_path": "/opt/mingxi/models/pcb_v2.onnx" }
Response: { "status": "ok", "model_version": "pcb_v2", "warmup_ms": 312 }
热重载流程:
- 管理员在浏览器上传新模型并点击"切换"
mingxi-backend保存文件、更新数据库,调用此接口mingxi-vision获取推理锁(等待当前推理完成),卸载旧模型,加载新模型,执行 warmup- 释放锁,返回成功
5.5 目录结构
mingxi-vision/
├── api/
│ ├── detect.py # POST /api/detect
│ ├── model.py # POST /api/model/reload
│ └── health.py # GET /api/health, /api/health/gpu
├── engine/
│ ├── base.py # DefectBox, DetectResult, BaseInferenceEngine
│ ├── loader.py # 单例 + asyncio.Lock + init_engine()
│ ├── ultralytics_adapter.py
│ ├── onnx_adapter.py
│ ├── annotator.py # 标注图生成(按severity着色)
│ └── defect_classes.py # HRIPCB 6类 + 扩展4类
├── models/ # .pt 和 .onnx 文件(gitignored)
├── scripts/
│ ├── export_onnx.py # pt → onnx 导出脚本
│ └── benchmark.py
├── tests/
├── schema.py # Pydantic 响应模型
├── config.py # BaseSettings(读 .env)
├── main.py # FastAPI lifespan + app
└── requirements.txt
5.6 推理接口
POST /api/detect
Content-Type: multipart/form-data
Fields:
image: <图像文件>
conf: float (default: 0.45)
return_annotated: bool (default: false)
Response 200:
{
"task_id": "uuid",
"duration_ms": 38,
"verdict": "fail", // pass / fail
"defect_count": 2,
"max_severity": "fatal",
"avg_confidence": 0.89,
"defects": [
{
"class_id": 2,
"class_name": "open_circuit",
"class_name_zh": "断路",
"confidence": 0.94,
"severity": "fatal",
"box_xyxy": [120, 45, 198, 123]
}
],
"annotated_image_base64": "..." // 仅 return_annotated=true 时返回
}
5.7 缺陷类别与等级映射
DEFECT_CLASSES = {
# HRIPCB 数据集原始6类
0: {"name": "missing_hole", "zh": "缺孔", "severity": "fatal"},
1: {"name": "mouse_bite", "zh": "鼠咬", "severity": "major"},
2: {"name": "open_circuit", "zh": "断路", "severity": "fatal"},
3: {"name": "short_circuit", "zh": "短路", "severity": "fatal"},
4: {"name": "spur", "zh": "毛刺", "severity": "minor"},
5: {"name": "spurious_copper", "zh": "余铜", "severity": "major"},
# 扩展类(Phase 2 标注后训练)
6: {"name": "oxidation", "zh": "氧化", "severity": "minor"},
7: {"name": "solder_ball", "zh": "锡珠", "severity": "rework"},
8: {"name": "scratch", "zh": "划痕", "severity": "minor"},
9: {"name": "label_error", "zh": "标签错贴","severity": "rework"},
}
6. mingxi-backend(业务后端)
6.1 职责
- 接收
mingxi-capture推送的检测结果,持久化至 SQLite - 提供 REST API 给浏览器管理后台
- 用户管理、三级权限控制
- 模型文件管理(上传、备份、切换、触发vision热重载)
- 系统参数配置
6.2 技术栈
语言:Python 3.8
框架:Django 4.0 + django-rest-framework
数据库:SQLite(内网单服务器部署,无高并发写入,SQLite足够)
认证:JWT(从现有系统直接复用)
初期不引入 Celery/Redis,保持部署简单。告警推送(Phase 2)再评估是否引入。
6.3 用户权限设计
| 角色 | 检测记录可见范围 | 其他权限 |
|---|---|---|
| 操作工 | 仅自己触发的记录 | 无 |
| 组长 | 本组所有成员的记录 | 查看本组统计 |
| 管理员 | 全部记录 | 用户管理、系统配置、模型管理、查看所有统计 |
# UserProfile 扩展
class UserProfile(models.Model):
user = models.OneToOneField(User)
role = models.CharField(choices=[
("operator", "操作工"),
("leader", "组长"),
("admin", "管理员"),
], default="operator")
group = models.ForeignKey("WorkGroup", null=True) # 操作工和组长属于某个工组
class WorkGroup(models.Model):
name = models.CharField(max_length=100)
leader = models.ForeignKey(UserProfile, null=True, related_name="led_group")
6.4 模型管理设计
class ModelRegistry(models.Model):
"""模型版本注册表"""
name = models.CharField(max_length=100) # 文件名(含扩展名)
runtime = models.CharField(choices=["pt", "onnx"])
file_path = models.CharField(max_length=500) # 服务器本地路径
file_size = models.IntegerField() # 字节数
is_active = models.BooleanField(default=False) # 当前生效模型
uploaded_by = models.ForeignKey(UserProfile)
uploaded_at = models.DateTimeField(auto_now_add=True)
notes = models.TextField(blank=True)
模型管理规则:
- 同时只有一个
is_active=True - 最多保留 10 个版本,超出时自动删除最早上传的非活跃版本及其文件
- 切换模型时:更新
is_active→ 调用POST http://localhost:8001/api/model/reload
6.5 管理员可配置参数
| 参数类别 | 具体参数 |
|---|---|
| 推理参数 | 置信度阈值、IOU阈值、图像输入尺寸 |
| 模型管理 | 上传模型、切换活跃模型、查看备份列表 |
| 产线配置 | 产线名称、前置机IP(仅记录,不主动通信) |
| 用户管理 | 新增/停用账号、分配角色、分配工组 |
| 告警规则 | Phase 2,预留接口 |
6.6 数据模型设计
class DefectResult(models.Model):
"""单次检测记录"""
operator = models.ForeignKey(UserProfile, null=True)
line_id = models.CharField(max_length=50, blank=True)
source_image = models.ImageField(upload_to="originals/")
annotated_image = models.ImageField(upload_to="annotated/", null=True)
verdict = models.CharField(choices=["pass", "fail"])
defect_count = models.IntegerField(default=0)
max_severity = models.CharField(choices=["none","rework","minor","major","fatal"])
detections_json = models.TextField() # 完整缺陷列表JSON
avg_confidence = models.FloatField()
duration_ms = models.IntegerField()
model_version = models.CharField(max_length=100)
created_at = models.DateTimeField(auto_now_add=True)
class ProductionStat(models.Model):
"""每日产线统计(聚合)"""
stat_date = models.DateField()
line_id = models.CharField(max_length=50)
total_count = models.IntegerField(default=0)
pass_count = models.IntegerField(default=0)
fail_count = models.IntegerField(default=0)
defect_dist = models.TextField() # 各缺陷类型数量JSON
class SysConfig(models.Model):
"""系统参数键值存储"""
key = models.CharField(max_length=100, unique=True)
value = models.TextField()
updated_at = models.DateTimeField(auto_now=True)
6.7 API 接口设计
# 认证(直接复用现有代码)
POST /api/auth/login
POST /api/auth/refresh
POST /api/auth/logout
GET /api/user/me
# 检测结果(capture推送入口)
POST /api/detect/result/ # capture 上报推理结果
GET /api/detect/results/ # 列表(按角色自动过滤)
GET /api/detect/results/{id}/
# 统计
GET /api/stats/overview/ # 今日合格率、缺陷总数
GET /api/stats/trend/ # 近N天趋势
GET /api/stats/defect-dist/ # 缺陷类型分布
# 模型管理(管理员)
GET /api/admin/models/ # 模型列表(最多10条)
POST /api/admin/models/upload/ # 上传新模型
POST /api/admin/models/{id}/activate/ # 切换活跃模型(触发vision热重载)
DELETE /api/admin/models/{id}/ # 手动删除某个备份
# 系统配置(管理员)
GET /api/admin/config/
PATCH /api/admin/config/
# 用户管理(管理员)
GET /api/admin/users/
POST /api/admin/users/
PATCH /api/admin/users/{id}/
GET /api/admin/groups/
POST /api/admin/groups/
# 系统日志(直接复用)
GET /api/admin/logs/
7. mingxi-frontend(管理后台)
7.1 定位
纯管理后台,供组长、厂长、管理员通过浏览器使用。操作工不通过浏览器操作(操作工使用前置机桌面程序)。
7.2 技术栈
框架:Vue 3 + Vite + TypeScript(保持现有配置不变)
UI:Element Plus(复用现有)
图表:ECharts(统计报表)
实时:短轮询(每1秒请求一次最新记录,满足1-2秒延迟要求,无需WebSocket)
短轮询而非 WebSocket:部署简单,Django 无需 Channels,延迟满足要求。
7.3 页面规划
| 路由 | 页面 | 可见角色 | 现有/新增 |
|---|---|---|---|
/login |
登录 | 全部 | 复用 |
/dashboard |
实时监控看板 | 组长、管理员 | 新增 |
/history |
检测历史记录 | 全部(按权限过滤) | 新增 |
/stats |
统计报表 | 组长、管理员 | 新增 |
/admin/models |
模型管理 | 管理员 | 新增 |
/admin/config |
系统配置 | 管理员 | 新增 |
/admin/users |
用户管理 | 管理员 | 复用改造 |
7.4 实时监控看板(/dashboard)
- 最新检测结果卡片(标注图缩略图 + 结论)
- 今日合格率仪表盘
- 缺陷类型分布饼图
- 近10条记录时间线
- 每1秒轮询
/api/detect/results/?limit=1&ordering=-created_at
7.5 需删除的现有页面
SceneNews 相关页面
通用YOLO视频/摄像头检测页面
驾驶员疲劳检测相关组件
8. 系统间通信
8.1 完整通信图
前置机(Windows) 推理服务器(Linux)
┌──────────────────────┐ ┌──────────────────────┐
│ mingxi-capture │ │ mingxi-vision │
│ │──① POST─────→│ /api/detect │
│ QThread推理线程 │←─ 结果返回──│ asyncio.Lock串行 │
│ │ └──────────────────────┘
│ 主线程展示结果 │
│ │ ┌──────────────────────┐
│ upload_queue线程 │──② 异步────→│ mingxi-backend │
│ (失败则重试) │ │ /api/detect/result │
└──────────────────────┘ │ │
│ SQLite存档 │
└──────────┬───────────┘
│ REST API
┌──────────▼───────────┐
│ mingxi-frontend │
│ 浏览器短轮询 │
└──────────────────────┘
管理员/组长/厂长 浏览器访问
8.2 关键通信约定
| 通信路径 | 协议 | 格式 | 备注 |
|---|---|---|---|
| capture → vision | HTTP POST | multipart/form-data(图像二进制) | 同步,等待结果 |
| vision → capture | HTTP Response | JSON(含 base64 标注图) | 一次请求一次响应 |
| capture → backend | HTTP POST | JSON(推理结果) | 异步,本地队列保障 |
| browser → backend | HTTP REST | JSON | 短轮询 + 增删改查 |
| backend → vision(热重载) | HTTP POST | JSON | 仅管理员切换模型时触发 |
8.3 前置机配置两个地址
前置机桌面程序配置界面中填写:
- 推理服务地址:
http://192.168.x.x:8001(vision) - 后台服务地址:
http://192.168.x.x:8000(backend)
两个服务通常在同一台服务器上,填写相同IP、不同端口。
9. 硬件集成(相机配置)
9.1 推荐型号
| 阶段 | 型号 | 分辨率 | 接口 | 用途 |
|---|---|---|---|---|
| Demo/POC | MV-CS060-10GM | 600万像素 | USB3.0 | 算法验证,接工业PC |
| 产线部署 | MV-CA060-10GM | 600万像素 | GigE | 稳定产线,线长100m |
| 大板检测 | MV-CA120-10GM | 1200万像素 | GigE | 视野≥200mm的PCB |
9.2 分辨率选型计算
视野:100mm × 75mm(单次拍摄区域)
最小缺陷:0.1mm(针孔、断路)
像素尺寸 ≤ 0.1mm ÷ 3 = 0.033mm/pixel
所需分辨率:100 ÷ 0.033 ≈ 3030 pixels(水平)
结论:600万像素(3072×2048)满足需求 ✓
9.3 配套清单(单工位 Demo 版)
| 器材 | 型号/规格 | 估价 |
|---|---|---|
| 工业相机 | MV-CS060-10GM | 1800-2500元 |
| 镜头 | 16mm C口定焦(1/1.8"靶面) | 500-800元 |
| LED环形光源 | 同轴/低角度,直径120mm | 400-600元 |
| USB3.0线缆 | ≤3m,锁扣式 | 80-150元 |
| 简易支架光箱 | 铝型材,可调高度 | 200-400元 |
| 合计 | 约 3000-4450元 |
10. 开发阶段划分
Phase 1:Demo版(目标:2026年6月中旬决赛前)
路演方式: 预先准备好的PCB图片,模拟模式演示完整流程,约5分钟。
核心展示: 操作工点击→检测→标注图展示→管理后台历史记录。
P0(必须完成,路演核心):
[ ] mingxi-vision:图片推理API + asyncio.Lock + 启动warmup
[ ] mingxi-capture:PyQt5桌面程序,Mock模式,结果展示界面
[ ] mingxi-backend:接收capture推送,DefectResult落库,基础REST API
[ ] mingxi-frontend:登录 + 检测历史列表 + 详情页
[ ] mingxi-backend:三级权限(操作工/组长/管理员)
P1(有时间做,加分项):
[ ] mingxi-frontend:实时监控看板(短轮询)
[ ] mingxi-backend:模型管理(上传/备份/切换)
[ ] mingxi-frontend:统计报表页
[ ] mingxi-capture:系统托盘图标
Phase 2:POC版(目标:2026年Q3,接入真实相机)
[ ] mingxi-capture:接入海康MVS SDK,对接 MV-CS060-10GM
[ ] mingxi-capture:PLC触发接口(串口/数字IO)
[ ] mingxi-vision:ONNX Runtime部署(export_onnx.py导出)
[ ] mingxi-vision:模型热重载接口完善
[ ] mingxi-backend:告警规则引擎(连续不良数、缺陷率阈值)
[ ] 完成1家PCB厂POC试用
Phase 3:产线版(目标:2026年Q4,首单签约)
[ ] 多相机支持(多条产线并发采集)
[ ] 模型迁移学习(基于客户真实样本微调)
[ ] 告警推送(企业微信/短信)
[ ] MES/ERP对接接口
[ ] 边缘部署探索(Jetson Orin,脱离大型服务器)
[ ] 软件著作权申请
11. 开发环境搭建
11.1 各项目启动命令
# mingxi-vision(推理服务器,Linux)
cd mingxi-vision
pip install -r requirements.txt
uvicorn main:app --host 0.0.0.0 --port 8001 --workers 1
# mingxi-backend(推理服务器,Linux)
cd mingxi-backend
pip install -r requirements.txt
python manage.py migrate
python manage.py runserver 0.0.0.0:8000
# mingxi-frontend(推理服务器,Linux)
cd mingxi-frontend
npm install
npm run build # 生产:dist/ 由 nginx 托管
npm run dev # 开发:localhost:5173
# mingxi-capture(前置机,Windows,开发阶段)
cd mingxi-capture
pip install -r requirements.txt
python main.py # 启动桌面程序,自动进入Mock模式(若配置了图片目录)
11.2 环境变量
# mingxi-vision/.env
MODEL_PATH=./models/pcb_defect_v1.pt
RUNTIME=ultralytics # 或 onnx
DEVICE=cuda # 或 cpu
CONF_THRESHOLD=0.45
# mingxi-backend/.env
SECRET_KEY=...
DATABASE_PATH=./db.sqlite3
VISION_SERVICE_URL=http://127.0.0.1:8001
CORS_ALLOWED_ORIGINS=http://localhost:5173
MODEL_STORAGE_DIR=/opt/mingxi/models
MODEL_MAX_BACKUPS=10
11.3 开发联调注意事项
mingxi-capture在 Windows 开发机上运行,配置 vision/backend 为开发机局域网IPmingxi-vision和mingxi-backend建议在同一台机器(或WSL2)上启动- SQLite 文件在
mingxi-backend/目录下,无需额外数据库服务
12. 参考资料
| 资料 | 路径/来源 |
|---|---|
| 创业技术书 | 梅州创新创业大赛/创业技术书v1.3.docx |
| 明析vision架构详细设计 | 梅州创新创业大赛/mingxi-vision-架构设计.md |
| 现有后端代码 | yolo_classification_system/ |
| PCB缺陷检测调研 | 梅州创新创业大赛/pcb缺陷检测初步方案.md |
| 海康MVS SDK | 随MVS安装包提供,路径:C:\Program Files (x86)\MVS\Development\ |
| HRIPCB数据集 | 公开学术数据集,CC BY 4.0,6类缺陷,10,000+样本 |
| PyQt5文档 | https://doc.qt.io/qtforpython-5/ |
| PyInstaller文档 | https://pyinstaller.org/en/stable/ |