作者:黃明明
英特爾邊緣計算創新大使
簡介
本文使用來自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
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
-
英特爾
+關注
關注
61文章
9964瀏覽量
171765 -
開發板
+關注
關注
25文章
5050瀏覽量
97456 -
adas
+關注
關注
309文章
2184瀏覽量
208649 -
OpenVINO
+關注
關注
0文章
93瀏覽量
201
發布評論請先 登錄
相關推薦
評論