mouseless(少鼠) 技术调研
一、技术架构决策:胖客户端 + 瘦服务器方案
核心结论: 结合端侧轻量级模型 + 云端增强的混合架构最优
为什么推荐混合架构?
MiniCPM-V 8B模型已能在移动设备上运行,性能超越GPT-4V,而Gemini 3在ScreenSpot-Pro上达到72.7%准确率,说明:
- 客户端有能力:现代PC完全可以运行量化后的小型视觉模型
- 服务端有优势:复杂场景下大模型准确率仍显著更高
二、技术方案细化
方案A:纯客户端方案(推荐入门)
核心技术栈:```
-
UI元素检测引擎
-
主选:Florence-2 (0.23B/0.77B参数)
- CPU即可运行,<1GB内存
- 支持物体检测、分割、OCR
- MIT开源协议
-
备选:传统CV方法 UIED
- 基于OpenCV边缘检测
- 无需GPU,极低资源消耗
- 适合固定布局界面
-
-
量化与部署
- ONNX Runtime + INT8量化
- 模型大小:~200MB(量化后)
- 推理速度:100-200ms/张(CPU i5+)
-
隐私预处理管道
- OCR检测文本区域 → 模糊/遮蔽敏感词
- 用户确认界面显示处理前后对比
- 支持自定义敏感词库
### **实现流程细化**
#### **阶段1:截图与自动标注(Client端)**
```python
# 伪代码示意
class ScreenshotProcessor:
def __init__(self):
# 加载量化的Florence-2模型
self.model = load_onnx_model("florence2-base-int8.onnx")
self.ocr = EasyOCR(['en', 'zh'])
def capture_and_process(self, window_handle):
# 1. 截图
screenshot = capture_window(window_handle)
# 2. 隐私遮蔽(上传前预处理)
sensitive_regions = self.detect_sensitive_text(screenshot)
blurred_img = self.blur_regions(screenshot, sensitive_regions)
# 3. 用户确认
if user_confirms(blurred_img, sensitive_regions):
# 4. 自动标注UI元素
elements = self.detect_ui_elements(blurred_img)
return elements
def detect_ui_elements(self, image):
# Florence-2 检测
prompt = "<OD>" # Object Detection任务
result = self.model(image, prompt)
# 返回格式: [{label, bbox, confidence}]
return parse_florence_output(result)
自动标注逻辑:
ShowUI使用UI引导的token选择进行视觉建模,我们可以简化实现:
def auto_annotate_clickable_elements(elements):
"""
自动识别可点击元素
规则:
1. 检测到的按钮、输入框、下拉菜单
2. 带有图标的小区域(16x16-64x64)
3. OCR检测到的交互文本(如"确定"、"取消")
"""
clickable = []
for elem in elements:
if elem['label'] in ['button', 'textbox', 'icon']:
clickable.append({
'bbox': elem['bbox'],
'description': generate_description(elem),
'suggested_key': auto_assign_key(elem)
})
return clickable
阶段2:热键绑定与执行
class HotkeyManager:
def __init__(self):
self.bindings = {}
self.leader_key = 'alt' # 可配置
def register_binding(self, key, target_element):
"""
target_element: {
'bbox': (x, y, w, h),
'match_template': image_patch, # 用于鲁棒匹配
'fallback_ocr': text # OCR文本备用
}
"""
self.bindings[key] = target_element
def execute(self, key):
target = self.bindings.get(key)
if not target:
return
# 智能点击:先尝试坐标,失败则模板匹配
current_screen = capture_screen()
# 方案A: 直接坐标点击
if self.verify_element_at_position(current_screen, target['bbox']):
click_at(target['bbox'])
return
# 方案B: 模板匹配(窗口位置变化时)
match_pos = template_match(current_screen, target['match_template'])
if match_pos:
click_at(match_pos)
return
# 方案C: OCR文本搜索(布局大变时)
ocr_pos = find_text(current_screen, target['fallback_ocr'])
if ocr_pos:
click_at(ocr_pos)
方案B:混合架构(推荐生产)
架构设计:
Client端(80%工作):
├─ 截图与隐私遮蔽
├─ 本地缓存的轻量模型(Florence-2-Base)
├─ 快速标注(常见UI元素)
└─ 热键执行引擎
Server端(20%增强):
├─ 多模态大模型(Claude 4.5 / GPT-4o)
├─ 处理复杂场景:
│ - 非标准UI(游戏界面、自定义软件)
│ - 语义理解(用户描述"红色的保存按钮")
│ - 多步骤工作流规划
└─ 模型微调与优化
何时调用Server:
def should_use_cloud_inference(screenshot, elements):
"""
触发云端推理条件:
1. 本地检测置信度<0.7
2. 用户手动请求增强标注
3. 新软件首次使用
4. 检测到非标准UI(游戏、3D界面)
"""
if max([e['confidence'] for e in elements]) < 0.7:
return True
if is_new_application(screenshot):
return True
return False
数据存储方案
Claude 4.5在ScreenSpot-Pro上表现出色,我们可以利用其能力:
# Server端API设计
POST /api/annotate
{
"screenshot": "base64_encoded_image",
"user_context": {
"application": "Photoshop",
"previous_bindings": [...],
"user_description": "标注图层面板中的按钮"
}
}
Response:
{
"elements": [
{
"bbox": [100, 200, 50, 30],
"semantic_label": "新建图层按钮",
"suggested_key": "L",
"confidence": 0.95
}
],
"cache_strategy": {
"local_model_update": "可微调本地模型以识别此类元素",
"template_features": "提取的视觉特征用于快速匹配"
}
}
三、关键技术细节
1. 窗口坐标自适应
class CoordinateManager:
def __init__(self):
self.calibration_points = {}
def calibrate_window(self, hwnd):
"""
记录窗口锚点(如标题栏、边角)
用于后续坐标转换
"""
rect = get_window_rect(hwnd)
self.calibration_points[hwnd] = {
'top_left': (rect.left, rect.top),
'client_offset': get_client_area_offset(hwnd),
'dpi_scale': get_dpi_for_window(hwnd)
}
def transform_coordinate(self, hwnd, saved_coord):
"""
将保存的坐标转换为当前窗口坐标
"""
calib = self.calibration_points[hwnd]
# DPI缩放
x = saved_coord[0] * calib['dpi_scale']
y = saved_coord[1] * calib['dpi_scale']
# 窗口位置偏移
x += calib['top_left'][0] + calib['client_offset'][0]
y += calib['top_left'][1] + calib['client_offset'][1]
return (x, y)
2. 智能匹配策略
UIED提供可定制化的非文本检测和合并算法,结合多种策略:
class ElementMatcher:
def match_element(self, saved_element, current_screen):
"""
多策略匹配,按优先级:
1. 精确坐标(最快,窗口未移动时)
2. 结构化匹配(基于相对位置)
3. 视觉特征匹配(模板匹配)
4. 语义匹配(OCR文本)
"""
# 策略1: 坐标验证
if self.verify_at_position(saved_element, current_screen):
return saved_element['bbox']
# 策略2: 相对位置(如"左上角第3个按钮")
if saved_element.get('relative_position'):
pos = self.find_by_relative_position(
saved_element['relative_position'],
current_screen
)
if pos: return pos
# 策略3: 模板匹配(SIFT特征)
template = saved_element.get('visual_template')
if template:
pos = cv2.matchTemplate(current_screen, template)
if match_score > 0.8: return pos
# 策略4: OCR文本搜索
if saved_element.get('text_label'):
pos = self.find_text_region(
current_screen,
saved_element['text_label']
)
return pos
return None # 匹配失败
3. 性能优化
# 渐进式加载
class ModelManager:
def __init__(self):
# 启动时只加载最小模型
self.ocr_model = load_fast_ocr() # 50MB
self.full_model = None # 延迟加载
def ensure_full_model_loaded(self):
if self.full_model is None:
self.full_model = load_onnx_model("florence2-base.onnx")
async def process_with_cache(self, screenshot):
"""
本地缓存策略:
- 相同应用+相似截图 → 直接返回缓存
- 增量更新(只检测变化区域)
"""
cache_key = hash_screenshot(screenshot)
if cache_key in self.cache:
return self.cache[cache_key]
# 首次处理
result = await self.infer(screenshot)
self.cache[cache_key] = result
return result
四、完整技术栈推荐
客户端:
编程语言: Rust (性能) 或 C# (生态)
UI框架:
- Rust: Tauri (跨平台)
- C#: WPF/Avalonia
AI推理: ONNX Runtime 1.23+
模型: Florence-2-base-int8 (~200MB)
OCR: PaddleOCR (支持中英文,端侧优化)
钩子: Windows: global-hotkey crate / C# GlobalHotkeys
图像: OpenCV 4.x (cv2-rust / OpenCvSharp)
服务端(可选):
框架: FastAPI (Python) / Axum (Rust)
AI:
- Anthropic Claude 4.5 API
- 或自托管 Qwen2-VL-7B (GPU服务器)
存储: PostgreSQL + pgvector (向量检索)
缓存: Redis (热数据)
对象存储: MinIO / S3 (截图归档)
五、开发路线图
Phase 1 - MVP(2周)
Phase 2 - 智能化(4周)
Phase 3 - 云端增强(3周)
Phase 4 - 生产优化(持续)
六、成本分析
纯客户端方案:
- 开发成本:1个全栈工程师 × 2个月
- 运营成本:$0(无服务器)
- 限制:复杂UI识别准确率60-70%
混合方案:
- 开发成本:2个工程师 × 3个月
- 运营成本:
- Claude API: $0.003/图(1000张/$3)
- 服务器: $50/月(轻量云主机)
- 优势:复杂场景准确率85-95%
七、竞品对比与差异化
| 特性 | 你的方案 | AutoHotkey | UI.Vision RPA |
|---|---|---|---|
| 配置门槛 | 可视化点选 | 脚本编程 | 录制宏 |
| 智能识别 | AI驱动 | 坐标/颜色 | 图像匹配 |
| 云同步 | ✓ | ✗ | ✓(付费) |
| 自适应 | 多策略 | 手动维护 | 中等 |
| 隐私保护 | 端侧遮蔽 | N/A | 云端处理 |
八、风险与应对
技术风险:
- 模型准确率不足 → 混合方案 + 用户纠错反馈循环
- 反外挂误判 → 纯模拟输入API,避免内存注入
- 性能问题 → 异步处理 + 渐进式加载
法律风险:
- 明确用户协议:禁止用于破坏性用途
- 开源协议选择:GPL防止闭源商用滥用
- 游戏TOS警告:提示可能违反服务条款
总结建议
最佳实践路径:
- 先做纯客户端MVP验证核心价值(Florence-2 + UIED混合)
- 收集真实使用数据识别哪些场景需要云端增强
- 渐进式引入Server端,只处理长尾复杂场景
- 建立社区模板库,众包常用软件配置
这个方案充分利用了2025年端侧AI的最新进展,在隐私、性能和准确率之间取得平衡。关键创新点在于多策略匹配和渐进式AI增强,既满足日常轻量使用,又能应对复杂场景。
浙公网安备 33010602011771号