简介

实例分割比对象检测更进一步,包括识别图像中的各个对象并将它们与图像的其余部分分割开来。 实例分割模型的输出是一组掩码或轮廓,它们勾勒出图像中每个对象,以及每个对象的类别标签和置信度分数。 当您不仅需要知道对象在图像中的位置,还需要知道它们的精确形状时,实例分割非常有用。

与其他任务的区别

  • 目标检测(Object Detection)
    通过边界框(bounding box)定位并分类目标,但不能精确到像素级,只能大致框出目标区域。

  • 语义分割(Semantic Segmentation)
    逐像素分类,能够精确划分目标形状,但无法区分同类别的不同个体。

  • 实例分割(Instance Segmentation)
    结合了目标检测和实例分割的优势,既能像实例分割那样进行像素级划分,又能像目标检测那样区分不同个体。

现在我们已经可以借助 SmartJavaAI 项目,通过 Java 快速接入语义分割、实例分割、目标检测能力。本文将手把手教你如何使用 SmartJavaAI 来实现语义分割、实例分割功能,即使你没有深度学习基础,也能轻松上手!

SmartJavaAI是什么?

SmartJavaAI是专为JAVA 开发者打造的一个功能丰富、开箱即用的 JAVA AI算法工具包,致力于帮助JAVA开发者零门槛使用各种AI算法模型,开发者无需深入了解底层实现,即可轻松在 Java 代码中调用人脸识别、目标检测、OCR 等功能。底层支持包括基于 DJL (Deep Java Library) 封装的深度学习模型,以及通过 JNI 接入的 C++/Python 算法,兼容多种主流深度学习框架如 PyTorch、TensorFlow、ONNX、Paddle 等,屏蔽复杂的模型部署与调用细节,开发者无需了解 AI 底层实现即可直接在 Java 项目中集成使用,后续将持续扩展更多算法,目标是构建一个“像 Hutool 一样简单易用”的 JAVA AI 通用工具箱


快速开始

借助 SmartJavaAI 开源项目,你可以直接在 Java 中集成语音识别模型,无需自己处理复杂的深度学习框架。

Maven引入

在项目的 pom.xml 中添加以下依赖,详细引入方式参考 Maven 引入

如需引入全部功能,请使用 【不推荐 ❌】 all 模块。

基础依赖
<dependency>
    <groupId>cn.smartjavaai</groupId>
    <artifactId>vision</artifactId>
    <version>1.0.24</version>
</dependency>

模型简介及下载

实例分割模型

模型名称 引擎 模型简介 模型开源网站
YOLOV8-SEG OnnxRuntime Ultralytics在COCO 数据集 上训练的模型 Github
YOLOV11-SEG OnnxRuntime Ultralytics在COCO 数据集 上训练的模型 Github
Mask R-CNN MXNet Mask R-CNN 是一种在目标检测基础上,同时为每个物体生成像素级分割区域的深度学习模型

语义分割模型

模型名称 引擎 模型简介 模型开源网站
DeepLabv3 PyTorch DeepLabv3 是一种图像分割模型,可以把图片里的每个像素分类出来

⚠️ 注意
不同模型支持的类别可能不一样,具体可查看模型目录下的 synset.txt 文件,其中列出了该模型支持的全部物体名称。


实例分割(Instance Segmentation)

1、获取实例分割模型

/**
* 获取实例分割模型
  * 注意事项:
  * 1、更多模型请查看文档:http://doc.smartjavaai.cn
  */
 public InstanceSegModel getModel(){
     InstanceSegModelConfig config = new InstanceSegModelConfig();
     //实例分割模型,切换模型需要同时修改modelEnum及modelPath
     config.setModelEnum(InstanceSegModelEnum.SEG_YOLO11N_ONNX);
     //模型所在路径,synset.txt也需要放在同目录下
     config.setModelPath("/Users/xxx/Documents/develop/model/vision/instance/yolo11n-seg-onnx/yolo11n-seg.onnx");
     // 指定允许的类别
//            config.setAllowedClasses(Arrays.asList("person","car"));
     //指定返回检测数量
     config.setDevice(device);
     //置信度阈值
     config.setThreshold(0.5f);
     return InstanceSegModelFactory.getInstance().getModel(config);
 }

2、实例分割

/**
  * 实例分割
  */
 @Test
 public void instanceSegmentation(){
     try {
         InstanceSegModel detectorModel = getModel();
         //创建Image对象,可以从文件、url、InputStream创建、BufferedImage、Base64创建,具体使用方法可以查看文档
         Image image = SmartImageFactory.getInstance().fromFile(Paths.get("src/main/resources/dog_bike_car.jpg"));
         R<DetectionResponse> result = detectorModel.detect(image);
         if(result.isSuccess()){
             log.info("实例分割结果:{}", JSONObject.toJSONString(result.getData()));
         }else{
             log.info("实例分割失败:{}", result.getMessage());
         }
     } catch (Exception e) {
         e.printStackTrace();
     }
 }

3、实例分割并绘制检测结果

public void instanceSegmentationAndDraw(){
    try {
        InstanceSegModel detectorModel = getModel();
        R<DetectionResponse> result = detectorModel.detectAndDraw("src/main/resources/dog_bike_car.jpg","output/dog_bike_car_detected.png");
        if(result.isSuccess()){
            log.info("实例分割结果:{}", JSONObject.toJSONString(result.getData()));
        }else{
            log.info("实例分割失败:{}", result.getMessage());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

语义分割(Semantic Segmentation)

1、获取语义分割模型

/**
  * 获取语义分割模型
  * 注意事项:
  * 1、更多模型请查看文档:http://doc.smartjavaai.cn
  */
 public SemSegModel getModel(){
     SemSegModelConfig config = new SemSegModelConfig();
     //语义分割模型,切换模型需要同时修改modelEnum及modelPath
     config.setModelEnum(SemSegModelEnum.DEEPLABV3);
     //模型所在路径,synset.txt也需要放在同目录下
     config.setModelPath("/Users/wenjie/Documents/develop/model/vision/semseg/deeplabv3/deeplabv3.pt");
     // 指定允许的类别
//            config.setAllowedClasses(Arrays.asList("person","car"));
     config.setDevice(device);
     return SemSegModelFactory.getInstance().getModel(config);
 }

2、语义分割

public void semSeg(){
    try {
        SemSegModel detectorModel = getModel();
        //创建Image对象,可以从文件、url、InputStream创建、BufferedImage、Base64创建,具体使用方法可以查看文档
        Image image = SmartImageFactory.getInstance().fromFile(Paths.get("src/main/resources/dog_bike_car.jpg"));
        R<CategoryMask> result = detectorModel.detect(image);
        if(result.isSuccess()){
            log.info("语义分割结果:{}", result.getData());
        }else{
            log.info("语义分割失败:{}", result.getMessage());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

3、语义分割并绘制检测结果

public void semSegAndDraw(){
    try {
        SemSegModel detectorModel = getModel();
        R<CategoryMask> result = detectorModel.detectAndDraw("src/main/resources/dog_bike_car.jpg","output/dog_bike_car_semseg.png");
        if(result.isSuccess()){
            log.info("语义分割结果:{}", result.getData());
        }else{
            log.info("语义分割失败:{}", result.getMessage());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

完整示例项目

项目地址:https://gitee.com/dengwenjie/SmartJavaAI/tree/master/examples


开源项目地址

🔗 Gitee 项目地址:https://gitee.com/dengwenjie/SmartJavaAI

🔗 GitHub 项目地址:https://github.com/geekwenjie/SmartJavaAI

🔗 GitCode 项目地址:https://gitcode.com/geekwenjie/SmartJavaAI

📖 在线文档地址:http://doc.smartjavaai.cn

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐