簡介
本文使用來自O(shè)pen Model Zoo的預(yù)訓(xùn)練的 road-segmentation-adas-0001模型。ADAS 代表高級駕駛輔助服務(wù)。該模型識別四個類別:背景、道路、路緣和標(biāo)記。
硬件環(huán)境
此文使用了英特爾開發(fā)套件家族里的哪吒(Nezha)開發(fā)板,其為研揚科技針對邊緣 AI 行業(yè)開發(fā)者推出的開發(fā)板,雖只有信用卡大小(85 x 56mm),但哪吒采用 Intel N97 處理器(Alder Lake-N),最大睿頻 3.6GHz,Intel UHD Graphics 內(nèi)核GPU,可實現(xiàn)高分辨率顯示;板載 LPDDR5 內(nèi)存、eMMC 存儲及 TPM 2.0,配備 GPIO 接口,支持 Windows 和 Linux 操作系統(tǒng),這些功能和無風(fēng)扇散熱方式相結(jié)合,為各種應(yīng)用程序構(gòu)建高效的解決方案,如您是樹莓派開發(fā)者又需要更好的AI算力, 強力推薦此產(chǎn)品, 其適用于如自動化、物聯(lián)網(wǎng)網(wǎng)關(guān)、數(shù)字標(biāo)牌和機器人等應(yīng)用。售價 RMB 999起, 哪吒開發(fā)套件Nezha intel x86開發(fā)板板載Alder N97 可Win10/Ubuntu N97 4G+32G。
模型下載
首先進(jìn)入
https://storage.openvinotoolkit.org/repositories/open_model_zoo/2023.0/models_bin/1/road-segmentation-adas-0001/FP32/
下載指定版本的segmentation 模型文件
搭建OpenVINO Java環(huán)境
由于之前文章都介紹過Java環(huán)境的搭建,而這篇文章主要講述代碼怎么寫的,所以對于環(huán)境的搭建不做過多的說明,大家可以進(jìn)入
https://github.com/Hmm466/OpenVINO-Java-API/tree/main/docs/cn
查看各個系統(tǒng)的安裝文檔:
編寫測試代碼
大致上分為四步:
加載OpenVINO Runtime
加載模型
加載圖片并推理
處理結(jié)果
加載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);
結(jié)果將輸出當(dāng)前系統(tǒng)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());
開始推理&處理結(jié)果
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()); ? ?Listcontours = 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);
結(jié)果展示
這里將背景、道路、路緣和標(biāo)記都分別標(biāo)記了出來,我們可以根據(jù)各個類別做自己想做的事情,比如分割出道路,將背景去除等等。
結(jié)語
整體步驟是這樣,在該項目中,基于N97的哪吒平臺通過Java API實現(xiàn)了基于segmentation 模型的分割代碼,并且成功處理圖片并展示。后續(xù)筆者將基于OpenVINO 實現(xiàn)OCR,背景扣除等模型實現(xiàn)。
審核編輯:劉清
-
英特爾
+關(guān)注
關(guān)注
61文章
9949瀏覽量
171692 -
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2909文章
44557瀏覽量
372760 -
JAVA
+關(guān)注
關(guān)注
19文章
2966瀏覽量
104702 -
ADAS系統(tǒng)
+關(guān)注
關(guān)注
4文章
226瀏覽量
25691 -
OpenVINO
+關(guān)注
關(guān)注
0文章
92瀏覽量
196
原文標(biāo)題:英特爾開發(fā)套件在Java環(huán)境實現(xiàn)ADAS道路識別演示 | 開發(fā)者實戰(zhàn)
文章出處:【微信號:英特爾物聯(lián)網(wǎng),微信公眾號:英特爾物聯(lián)網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論