# MSLite-Segment-Anything **Repository Path**: ybf521/mslite-segment-anything ## Basic Information - **Project Name**: MSLite-Segment-Anything - **Description**: 使用mindspore lite把通用图像分割模型移植到HarmonyOS设备上 - **Primary Language**: C++ - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-04-23 - **Last Updated**: 2025-06-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基于MindSporeLite推理框架实现图像分割:Segment-anything ### 介绍 本文基于MindSporeLite推理能力,实现了从待选相册选择一张图片,通过对图片进行分析从而实现分割。 1. 选择图像分割模型。 2. 将模型转换成MindSporeLite模型格式。 3. 在端侧使用MindSporeLite推理模型,显示图像分割结果。 ### 效果预览 | 主页 | |----------------------------------------------------------------------------------------------------------------------| | ![img_1.png](entry/src/main/resources/base/media/demo.gif)| #### 使用说明 1. 在主界面,可以点击select photo按钮,进入选图界面; 2. 在选图界面,选择图片,并点击“start predict”按钮; 3. 待图片处理完成后,使用鼠标悬停在图片的局部查看分割效果。 ### 工程目录 ``` ├──entry/src/main/ets/ // 应用首页 │ ├──common │ │ └─Constants.ets // 常量类 │ ├──utils │ │ └─Logger.ets // 日志打印类 │ ├──view │ │ └─ImagePicker.ets // 图片选择组件 │ │ └─LoadingDialog.ets // 加载显示组件 │ │ │ ├──entryability │ │ └─EntryAbility.ets // 程序入口类 │ └──pages │ └──Index.ets // 主页入口 ├──entry/src/main/resource // 应用静态资源 │ └──resfile │ └──images // 示例图片输入 │ └──models // 模型文件 ├──entry/src/main/cpp/ // native模块 │ └──include // 头文件 │ └──src // 实现推理cpp源代码 │ └──types // napi接口 │ └──napi_init.cpp // napi接口实现逻辑 └──entry/src/main/module.json5 // 模块配置相关 ``` ### 具体实现 * 本示例程序中使用的终端图像分割模型文件为mobile_sam_image_encoder.ms、mobile_sam_with_mask_input_slim.ms,放置在entry\src\main\resources\resfile\models工程目录下。 注:开发者可按需手工导出或者下载ms模型。 * 调用MSLite推理框架、Media媒体框架、完成对用户选择的图片进行推理分割,完整代码请参见predictor.cpp。 ### 系统设计 #### 1、系统概要设计 ![img_5.png](entry/src/main/resources/base/media/img_5.png) 图片自动分割系统可以分为两大模块,其一是UI模块,该模块主要承担图像显示、图像编解码与用户行为记录与发送的职责,其二是推理模块,该模块主要承担模型推理相关职责,包括编码器与解码器的推理。 #### 2、用例设计 ![img_6.png](entry/src/main/resources/base/media/img_6.png) 用户应包含三个用例:用户选择图片、用户点击按钮加载图片、用户hover进行实时分割。其中,选择图片时,系统UI应进行图片的解码与显示;加载图片时,系统应进行编码器推理并保存编码结果image_embedding;用户进行图片分割时,系统应记录用户hover坐标,并发送信息给系统进行解码器推理。 #### 3、系统架构设计 ![img_7.png](entry/src/main/resources/base/media/img_7.png) 整个系统的执行时序可以分为三个步骤:用户初始化阶段、编码推理阶段、交互式分割阶段以下为详细解析: ##### 1-4:用户初始化阶段 用户首先在界面中选择待分割的图片文件(步骤1),系统接收到图片后执行解析操作,验证图片格式有效性并将原始图片存入临时存储区域(步骤2)。解析完成后,系统将图片送至显示模块,在用户界面中呈现预览效果(步骤3)。用户确认图片无误后,点击"推理"按钮触发分割流程(步骤4)。这一阶段主要完成用户输入验证和基础数据准备,为后续复杂计算奠定基础。 ##### 5-12:编码推理阶段 用户触发推理后,系统立即更新UI状态,显示加载动画防止用户重复操作(步骤5)。前端将图片数据与用户配置参数打包成请求消息(步骤6),后端服务接收到请求后动态创建包含必要依赖的推理环境(步骤7),包括加载模型权重、分配计算资源等。系统启动编码器执行前向传播(步骤8),编码器对输入图片进行多层次特征提取(步骤9),最终生成高维语义表征image_embedding(步骤10)。成功完成编码后返回状态标志(步骤11),UI相应更新状态显示初步完成提示(步骤12)。此阶段耗时较长,涉及GPU加速计算,是系统性能关键路径。 ##### 13-20:交互式分割阶段 当用户在预览图上悬停交互时(步骤13),系统实时捕获坐标信息并附加先前生成的image_embedding构成完整请求(步骤14)。解码器接收请求后启动交互式分割流程(步骤15),基于坐标提示和图像特征进行空间注意力计算(步骤16)。系统返回初步生成的分割掩码及置信度分数(步骤17),通过非极大值抑制(NMS)和IOU阈值处理消除重叠区域(步骤18)。最终优化的分割结果(步骤19)被发送至显示模块,以半透明叠加或轮廓标注等形式直观呈现(步骤20)。该阶段实现了实时交互体验,每次hover可在100-300ms内完成,依赖高效的解码器架构和缓存机制。 整个时序体现了典型的两阶段分割架构,编码阶段完成耗时的全局特征提取,解码阶段实现轻量级的实时交互。系统通过巧妙的职责划分,既保证了分割精度,又确保了用户体验的流畅性。关键技术挑战包括编码器优化、请求流水线处理和前后端通信效率等。 #### 4、系统编码实现 ![img_8.png](entry/src/main/resources/base/media/img_8.png) UI模块包含两个类,UIClass与ImageProcessor,其中,UIClass直接和用户进行交互,ImageProcessor则承担了前后端数据流的一个通道。UIClass通过按钮进行事件驱动,执行图像加载、图片解码保存的任务,通过hover事件进行图片实时分割任务。 推理模块则包含Predictor、MaskData、MSModel、MSModelImageEncoder、MSModelSamVitT五个类。其中,Predictor则是整个系统的核心类,是所有类的一个枢纽,与ImageProcessor类、MSModelImageEncoder类、MSModelSamVitT类是直接包含关系(Predictor持有这三个类的成员),由于一张图像可以有多个分割的掩码,少则10张以内,多则上百张,因此Predictor类与MaskData类则是聚合关系(Predictor持有MaskData的列表),在cpp工程中表现为std::vector mask_datas_;MSModel是一个基类,它包含了模型的填充输入、模型推理、模型同步创建和异步创建等方法。MSModelImageEncoder类、MSModelSamVitT类则继承于MSModel,根据模型的输入输出shape不同、推理的执行环境不同,需要复写MSModel的输入填充与推理方法。MaskData类则是解码器输出的重要数据工具类,承担了较为复杂的计算逻辑:IOU计算、掩码面积计算、BBox计算以及用户坐标偏离度等计算。 UI模块和推理模块的7个类构成了系统的整个架构,使得程序能够高效稳定执行。 ### 相关权限 ``` "requestPermissions": [ { "name": "ohos.permission.READ_MEDIA", "reason": "$string:permisson_read_image", "usedScene": { "abilities": [ "EntryAbility" // 使用该权限的Ability名称 ], "when": "always" } }, { "name": "ohos.permission.WRITE_MEDIA", "reason": "$string:permisson_write_image", "usedScene": { "abilities": [ "EntryAbility" ], "when": "always" } } ] ``` ### 约束与限制 1.本示例仅支持标准系统上运行,支持设备:华为手机、鸿蒙PC。 2.HarmonyOS系统:HarmonyOS 5.0.0 Release及以上。 3.DevEco Studio版本:DevEco Studio 5.0.0 Release及以上。 4.HarmonyOS SDK版本:HarmonyOS 5.0.0 Release SDK及以上。