如何使用java基于YOLO-Seg实现实例分割(Instance Segmentation)与语义分割(Semantic Segmentation)
使用SmartJavaAI开源项目实现在java中的yolo-seg的实例分割,语义分割
简介
实例分割比对象检测更进一步,包括识别图像中的各个对象并将它们与图像的其余部分分割开来。 实例分割模型的输出是一组掩码或轮廓,它们勾勒出图像中每个对象,以及每个对象的类别标签和置信度分数。 当您不仅需要知道对象在图像中的位置,还需要知道它们的精确形状时,实例分割非常有用。
与其他任务的区别
-
目标检测(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
更多推荐
所有评论(0)