简介
本文使用来自Open Model Zoo的预训练的 road-segmentation-adas-0001模型。ADAS 代表高级驾驶辅助服务。该模型识别四个类别:背景、道路、路缘和标记。
硬件环境
此文使用了英特尔开发套件家族里的哪吒(Nezha)开发板,其为研扬科技针对边缘 AI 行业开发者推出的开发板,虽只有信用卡大小(85 x 56mm),但哪吒采用 Intel N97 处理器(Alder Lake-N),最大睿频 3.6GHz,Intel UHD Graphics 内核GPU,可实现高分辨率显示;板载 LPDDR5 内存、eMMC 存储及 TPM 2.0,配备 GPIO 接口,支持 Windows 和 Linux 操作系统,这些功能和无风扇散热方式相结合,为各种应用程序构建高效的解决方案,如您是树莓派开发者又需要更好的AI算力, 强力推荐此产品, 其适用于如自动化、物联网网关、数字标牌和机器人等应用。售价 RMB 999起, 哪吒开发套件Nezha intel x86开发板板载Alder N97 可Win10/Ubuntu N97 4G+32G。
模型下载
首先进入
https://storage.openvinotoolkit.org/repositories/open_model_zoo/2023.0/models_bin/1/road-segmentation-adas-0001/FP32/
下载指定版本的segmentation 模型文件

搭建OpenVINO Java环境
由于之前文章都介绍过Java环境的搭建,而这篇文章主要讲述代码怎么写的,所以对于环境的搭建不做过多的说明,大家可以进入
https://github.com/Hmm466/OpenVINO-Java-API/tree/main/docs/cn
查看各个系统的安装文档:

编写测试代码
大致上分为四步:
加载OpenVINO Runtime
加载模型
加载图片并推理
处理结果
加载OpenVINO Runtime
OpenVINO vino = OpenVINO.load(); //加载OpenCV Dll vino.loadCvDll(); OvVersion version = vino.getVersion(); Console.println("---- OpenVINO INFO----"); Console.println("Description : %s", version.description); Console.println("Build number: %s", version.buildNumber);
结果将输出当前系统OpenVINO版本:
---- OpenVINO INFO---- Description : OpenVINO Runtime Build number: 2023.2.0-13089-cfd42bd2cb0-HEAD
加载模型
String modelPath = "model/road-segmentation-adas-0001.xml";
Core core = new Core();
// -------- Step 2. Read a model --------
Console.println("[INFO] Loading model files: %s", modelPath);
Model model = core.readModel(modelPath);
CompiledModel compiledModel = core.compileModel(model, "AUTO");
加载图片并处理
Input inputLayerIr = compiledModel.input(0); Tensor inputTensor = inferRequest.getInputTensor(); Mat rgbImage = new Mat(); Imgproc.cvtColor(mat, rgbImage, Imgproc.COLOR_BGR2RGB); int imageH = mat.height(); int imageW = mat.width(); int channels = mat.channels(); Shape shape = inputLayerIr.getShape(); long N = shape.getDims().get(0); long C = shape.getDims().get(1); long H = shape.getDims().get(2); long W = shape.getDims().get(3); Mat resizedImage = new Mat(); Imgproc.resize(mat,resizedImage, new Size(W, H)); int[] data = matToIntArray(resizedImage) NDArray array = manager.create(data,new Shape(H,W,C)); NDArray inputImage = array.transpose(2,0,1).expandDims(0); float[] floats = intToFloatArray(inputImage.toIntArray());
开始推理&处理结果
inputTensor.setData(floats);
inferRequest.infer();
Tensor outputTensor = inferRequest.getOutputTensor(0);
int outputLength = (int) outputTensor.getSize();
float[] outputData = outputTensor.getData(float[].class, outputLength);
NDArray ndArray = manager.create(outputData,new Shape(1,4,H,W));
ndArray = ndArray.argMax(1);
if (ndArray.getShape().get(0) == 1){
ndArray = ndArray.squeeze(0);
}
ndArray = ndArray.toType(DataType.UINT8, true);
NDArray mask = manager.zeros(new Shape(ndArray.getShape().get(0),ndArray.getShape().get(1),3),DataType.UINT8);
Mat _mat = new Mat((int)ndArray.getShape().get(0),(int)ndArray.getShape().get(1), CvType.CV_8UC3);
byte[] b = mask.toByteArray();
_mat.put(0,0,b);
double[][] colors = new double[][]{{255, 44, 255}, {48, 255, 141}, {53, 255, 120}, {199, 216, 52}};
for (int i = 0 ; i < colors.length;i++) {
NDArray labelIndexMap = ndArray.eq(i);
labelIndexMap = labelIndexMap.toType(DataType.UINT8,true).mul(255);
Mat mat1 = new Mat((int) labelIndexMap.getShape().get(0), (int) labelIndexMap.getShape().get(1),CvType.CV_8UC1);
mat1.put(0,0,labelIndexMap.toByteArray());
List contours = new ArrayList<>();
Mat hierarchies = new Mat();
Imgproc.findContours(mat1,contours,hierarchies,Imgproc.RETR_EXTERNAL,Imgproc.CHAIN_APPROX_SIMPLE);
Imgproc.drawContours(_mat,contours,-1,new Scalar(colors[i][0], colors[i][1], colors[i][2]),Imgproc.FILLED);
}
Mat resized_mask = new Mat();
Imgproc.resize(_mat,resized_mask, new Size(imageW, imageH));
Core.addWeighted(resized_mask,0.2F,mat,0.8F,0,resized_mask);
结果展示
这里将背景、道路、路缘和标记都分别标记了出来,我们可以根据各个类别做自己想做的事情,比如分割出道路,将背景去除等等。

结语
整体步骤是这样,在该项目中,基于N97的哪吒平台通过Java API实现了基于segmentation 模型的分割代码,并且成功处理图片并展示。后续笔者将基于OpenVINO 实现OCR,背景扣除等模型实现。
审核编辑:刘清
-
英特尔
+关注
关注
61文章
10275浏览量
179336 -
物联网
+关注
关注
2939文章
47330浏览量
408038 -
JAVA
+关注
关注
20文章
2997浏览量
115692 -
ADAS系统
+关注
关注
4文章
228浏览量
26372 -
OpenVINO
+关注
关注
0文章
117浏览量
717
原文标题:英特尔开发套件在Java环境实现ADAS道路识别演示 | 开发者实战
文章出处:【微信号:英特尔物联网,微信公众号:英特尔物联网】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
科通技术获评英特尔首批尊享级合作伙伴
使用英特尔® NPU 插件C++运行应用程序时出现错误:“std::Runtime_error at memory location”怎么解决?
新思科技与英特尔在EDA和IP领域展开深度合作
英特尔发布全新GPU,AI和工作站迎来新选择
英特尔® 具身智能大小脑融合方案发布:构建具身智能落地新范式
2025英特尔人工智能创新应用大赛正式启动
英特尔借助开放生态系统,加速边缘AI创新

英特尔开发套件在Java环境实现ADAS道路识别演示
评论