mouseless(少鼠) 技术调研

一、技术架构决策:胖客户端 + 瘦服务器方案

核心结论: 结合端侧轻量级模型 + 云端增强的混合架构最优

为什么推荐混合架构?

MiniCPM-V 8B模型已能在移动设备上运行,性能超越GPT-4V,而Gemini 3在ScreenSpot-Pro上达到72.7%准确率,说明:

  • 客户端有能力:现代PC完全可以运行量化后的小型视觉模型
  • 服务端有优势:复杂场景下大模型准确率仍显著更高

二、技术方案细化

方案A:纯客户端方案(推荐入门)

核心技术栈:```

  1. UI元素检测引擎

    • 主选:Florence-2 (0.23B/0.77B参数)

      • CPU即可运行,<1GB内存
      • 支持物体检测、分割、OCR
      • MIT开源协议
    • 备选:传统CV方法 UIED

      • 基于OpenCV边缘检测
      • 无需GPU,极低资源消耗
      • 适合固定布局界面
  2. 量化与部署

    • ONNX Runtime + INT8量化
    • 模型大小:~200MB(量化后)
    • 推理速度:100-200ms/张(CPU i5+)
  3. 隐私预处理管道

    • 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 云端处理

八、风险与应对

技术风险:

  1. 模型准确率不足 → 混合方案 + 用户纠错反馈循环
  2. 反外挂误判 → 纯模拟输入API,避免内存注入
  3. 性能问题 → 异步处理 + 渐进式加载

法律风险:

  • 明确用户协议:禁止用于破坏性用途
  • 开源协议选择:GPL防止闭源商用滥用
  • 游戏TOS警告:提示可能违反服务条款

总结建议

最佳实践路径:

  1. 先做纯客户端MVP验证核心价值(Florence-2 + UIED混合)
  2. 收集真实使用数据识别哪些场景需要云端增强
  3. 渐进式引入Server端,只处理长尾复杂场景
  4. 建立社区模板库,众包常用软件配置

这个方案充分利用了2025年端侧AI的最新进展,在隐私、性能和准确率之间取得平衡。关键创新点在于多策略匹配渐进式AI增强,既满足日常轻量使用,又能应对复杂场景。

posted @ 2026-01-24 16:27  AI健康  阅读(2)  评论(0)    收藏  举报