英特尔开发套件『哪吒』在Java环境实现ADAS道路识别演示 | 开发者实战

描述

作者:黄明明
英特尔边缘计算创新大使

 

简介

本文使用来自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

查看各个系统的安装文档:

开发板

 

编写测试代码

大致上分为四步:

  1.     加载OpenVINO Runtime

 2.      加载模型

 3.      加载图片并推理

 4.      处理结果

 

加载OpenVINO Runtime

1.     OpenVINO vino = OpenVINO.load();
2.     //加载OpenCV Dll
3.     vino.loadCvDll();
4.     OvVersion version = vino.getVersion();
5.     Console.println("---- OpenVINO INFO----");
6.     Console.println("Description : %s", version.description);
7.     Console.println("Build number: %s", version.buildNumber);

结果将输出当前系统OpenVINO版本:

1.      ---- OpenVINO INFO----
2.      Description : OpenVINO Runtime
3.      Build number: 2023.2.0-13089-cfd42bd2cb0-HEAD

 

加载模型

1.      String modelPath = "model/road-segmentation-adas-0001.xml";
2.      Core core = new Core();
3.      // -------- Step 2. Read a model --------
4.      Console.println("[INFO] Loading model files: %s", modelPath);
5.      Model model = core.readModel(modelPath);
6.      CompiledModel compiledModel = core.compileModel(model, "AUTO");

 

加载图片并处理

1.      Input inputLayerIr = compiledModel.input(0);
2.      Tensor inputTensor = inferRequest.getInputTensor();
3.      Mat rgbImage = new Mat();
4.      Imgproc.cvtColor(mat, rgbImage, Imgproc.COLOR_BGR2RGB);
5.      int imageH = mat.height();
6.      int imageW = mat.width();
7.      int channels = mat.channels();
8.      Shape shape = inputLayerIr.getShape();
9.      long N = shape.getDims().get(0);
10.    long C = shape.getDims().get(1);
11.    long H = shape.getDims().get(2);
12.    long W = shape.getDims().get(3);

13.      
14.    Mat resizedImage = new Mat();
15.    Imgproc.resize(mat,resizedImage, new Size(W, H));
16.    int[] data = matToIntArray(resizedImage)
17.    NDArray array =  manager.create(data,new Shape(H,W,C));
18.    NDArray inputImage = array.transpose(2,0,1).expandDims(0);
19.    float[] floats = intToFloatArray(inputImage.toIntArray());

 

开始推理&处理结果

1.      inputTensor.setData(floats);
2.      inferRequest.infer();
3.      Tensor outputTensor = inferRequest.getOutputTensor(0);
4.      int outputLength = (int) outputTensor.getSize();
5.      float[] outputData = outputTensor.getData(float[].class, outputLength);
6.      NDArray ndArray = manager.create(outputData,new Shape(1,4,H,W));
7.      ndArray = ndArray.argMax(1);
8.      if (ndArray.getShape().get(0) == 1){    
9.           ndArray = ndArray.squeeze(0);
10.     }
11.     ndArray = ndArray.toType(DataType.UINT8, true);
12.     NDArray mask = manager.zeros(new Shape(ndArray.getShape().get(0),ndArray.getShape().get(1),3),DataType.UINT8);
13.     Mat _mat = new Mat((int)ndArray.getShape().get(0),(int)ndArray.getShape().get(1), CvType.CV_8UC3);
14.     byte[] b = mask.toByteArray();
15.     _mat.put(0,0,b);
16.     double[][] colors = new double[][]{{255, 44, 255}, {48, 255, 141}, {53, 255, 120}, {199, 216, 52}};
17.     for (int i = 0 ; i < colors.length;i++) {
18.           NDArray labelIndexMap = ndArray.eq(i);
19.           labelIndexMap = labelIndexMap.toType(DataType.UINT8,true).mul(255);
20.           Mat mat1 = new Mat((int) labelIndexMap.getShape().get(0), (int) labelIndexMap.getShape().get(1),CvType.CV_8UC1);
21.           mat1.put(0,0,labelIndexMap.toByteArray());
22.           List contours = new ArrayList<>();
23.           Mat hierarchies = new Mat();
24.           Imgproc.findContours(mat1,contours,hierarchies,Imgproc.RETR_EXTERNAL,Imgproc.CHAIN_APPROX_SIMPLE);          

25.           Imgproc.drawContours(_mat,contours,-1,new Scalar(colors[i][0], colors[i][1], colors[i][2]),Imgproc.FILLED);
26.      }
27.      Mat resized_mask = new Mat();
28.      Imgproc.resize(_mat,resized_mask, new Size(imageW, imageH));
29.      Core.addWeighted(resized_mask,0.2F,mat,0.8F,0,resized_mask);

 

结果展示

 

这里将背景、道路、路缘和标记都分别标记了出来,我们可以根据各个类别做自己想做的事情,比如分割出道路,将背景去除等等。

开发板

 

结语

整体步骤是这样,在该项目中,基于N97的『哪吒』平台通过Java API实现了基于segmentation 模型的分割代码,并且成功处理图片并展示。后续笔者将基于OpenVINO 实现OCR,背景扣除等模型实现。

 

关于英特尔 OpenVINO 工具套件的详细资料,包括三百多个经验证并优化的预训练模型的详细资料,请您前往

https://www.intel.com/content/www/us/en/developer/tools/openvino-toolkit/overview.html

 

除此之外,为了方便大家了解并快速掌握 OpenVINO 的使用,我们还提供了一系列开源的 Jupyter notebook demo。

 

运行这些 notebook,就能快速了解在不同场景下如何利用 OpenVINO 实现一系列、包括计算机视觉、语音及自然语言处理任务。

 

OpenVINO notebooks 的资源可以在 GitHub 下载安装:

https://github.com/openvinotoolkit/openvino_notebooks

 

 

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分