void InputDataProcessingCPU(ImageSegmentaionModels imageSegmentaionModels, Color32[] inputImage, float[] processedInputBuffer) { float weight = 1f / 255f; float bias = 0; bool rgbRepeats = false; switch (imageSegmentaionModels) { case ImageSegmentaionModels.hair_segmentation: rgbRepeats = true; break; case ImageSegmentaionModels.pspnet_hair_segmentation: InputDataProcessingCPU_PSP(inputImage, processedInputBuffer); return; case ImageSegmentaionModels.deeplabv3: weight = 1f / 127.5f; bias = -1; break; default: break; } // flatten input data if (rgbRepeats) { for (int i = 0; i < inputImage.Length; i++) { // rgbrgbrgb... processedInputBuffer[i * 3 + 0] = (inputImage[i].r) * weight + bias; processedInputBuffer[i * 3 + 1] = (inputImage[i].g) * weight + bias; processedInputBuffer[i * 3 + 2] = (inputImage[i].b) * weight + bias; } } else { for (int i = 0; i < inputImage.Length; i++) { // rrr...ggg...bbb... processedInputBuffer[i + inputImage.Length * 0] = (inputImage[i].r) * weight + bias; processedInputBuffer[i + inputImage.Length * 1] = (inputImage[i].g) * weight + bias; processedInputBuffer[i + inputImage.Length * 2] = (inputImage[i].b) * weight + bias; } } }
void LoadImage(ImageSegmentaionModels imageSegmentaionModels, AiliaImageSource ailiaImageSource) { switch (imageSegmentaionModels) { case ImageSegmentaionModels.HRNetV2_W18_Small_v2: case ImageSegmentaionModels.HRNetV2_W18_Small_v1: case ImageSegmentaionModels.HRNetV2_W48: ailiaImageSource.CreateSource("file://" + Application.dataPath + "/AXIP/AILIA-MODELS/ImageSegmentation/SampleImage/road.png"); break; case ImageSegmentaionModels.hair_segmentation: ailiaImageSource.CreateSource("file://" + Application.dataPath + "/AXIP/AILIA-MODELS/ImageSegmentation/SampleImage/hair.jpg"); break; case ImageSegmentaionModels.pspnet_hair_segmentation: ailiaImageSource.CreateSource("file://" + Application.dataPath + "/AXIP/AILIA-MODELS/ImageSegmentation/SampleImage/hair2.jpg"); break; case ImageSegmentaionModels.deeplabv3: ailiaImageSource.CreateSource("file://" + Application.dataPath + "/AXIP/AILIA-MODELS/ImageSegmentation/SampleImage/couple.jpg"); break; } }
void SetShape(ImageSegmentaionModels imageSegmentaionModels) { Ailia.AILIAShape shape = null; switch (imageSegmentaionModels) { case ImageSegmentaionModels.HRNetV2_W18_Small_v2: case ImageSegmentaionModels.HRNetV2_W18_Small_v1: case ImageSegmentaionModels.HRNetV2_W48: case ImageSegmentaionModels.pspnet_hair_segmentation: case ImageSegmentaionModels.deeplabv3: shape = ailiaModel.GetInputShape(); InputWidth = (int)shape.x; InputHeight = (int)shape.y; InputChannel = (int)shape.z; shape = ailiaModel.GetOutputShape(); OutputWidth = (int)shape.x; OutputHeight = (int)shape.y; OutputChannel = (int)shape.z; break; case ImageSegmentaionModels.hair_segmentation: shape = new Ailia.AILIAShape(); shape.x = 3; shape.y = (uint)AiliaImageSource.Width; shape.z = (uint)AiliaImageSource.Height; shape.w = 1; shape.dim = 4; ailiaModel.SetInputShape(shape); InputWidth = AiliaImageSource.Width; InputHeight = AiliaImageSource.Height; InputChannel = 3; OutputWidth = AiliaImageSource.Width; OutputHeight = AiliaImageSource.Height; OutputChannel = 1; break; } }
void InputDataProcessing(ImageSegmentaionModels imageSegmentaionModels, Texture inputImage, float[] processedInputBuffer, bool upsideDown = false) { float weight = 1; float bias = 0; bool rgbRepeats = false; switch (imageSegmentaionModels) { case ImageSegmentaionModels.hair_segmentation: rgbRepeats = true; break; case ImageSegmentaionModels.pspnet_hair_segmentation: InputDataProcessingPSP(inputImage, processedInputBuffer, upsideDown); return; case ImageSegmentaionModels.deeplabv3: weight = 2; bias = -1; break; default: break; } if (cbuffer == null || cbuffer.count != processedInputBuffer.Length) { if (cbuffer != null) { cbuffer.Release(); } cbuffer = new ComputeBuffer(processedInputBuffer.Length, sizeof(float)); } int kernelIndex; if (rgbRepeats) { if (upsideDown) { kernelIndex = channelLastUpsideDownKernel; } else { kernelIndex = channelLastKernel; } } else { if (upsideDown) { kernelIndex = channelFirstUpsideDownKernel; } else { kernelIndex = channelFirstKernel; } } inputDataProcessingShader.SetFloat(computeShaderWeightId, weight); inputDataProcessingShader.SetFloat(computeShaderBiasId, bias); inputDataProcessingShader.SetInt(computeShaderWidthId, inputImage.width); inputDataProcessingShader.SetInt(computeShaderHeightId, inputImage.height); inputDataProcessingShader.SetTexture(kernelIndex, computeShaderTextureId, inputImage); inputDataProcessingShader.SetBuffer(kernelIndex, computeShaderResultId, cbuffer); inputDataProcessingShader.Dispatch(kernelIndex, inputImage.width / 32 + 1, inputImage.height / 32 + 1, 1); cbuffer.GetData(processedInputBuffer); }
// Download models and Create ailiaModel AiliaModel CreateAiliaNet(ImageSegmentaionModels modelType, bool gpu_mode = true) { string asset_path = Application.temporaryCachePath; string serverFolderName = ""; string prototxtName = ""; string onnxName = ""; switch (modelType) { case ImageSegmentaionModels.HRNetV2_W18_Small_v2: serverFolderName = "hrnet"; prototxtName = "HRNetV2-W18-Small-v2.onnx.prototxt"; onnxName = "HRNetV2-W18-Small-v2.onnx"; break; case ImageSegmentaionModels.HRNetV2_W18_Small_v1: serverFolderName = "hrnet"; prototxtName = "HRNetV2-W18-Small-v1.onnx.prototxt"; onnxName = "HRNetV2-W18-Small-v1.onnx"; break; case ImageSegmentaionModels.HRNetV2_W48: serverFolderName = "hrnet"; prototxtName = "HRNetV2-W48.onnx.prototxt"; onnxName = "HRNetV2-W48.onnx"; break; case ImageSegmentaionModels.hair_segmentation: serverFolderName = "hair_segmentation"; prototxtName = "hair_segmentation.opt.onnx.prototxt"; onnxName = "hair_segmentation.opt.onnx"; break; case ImageSegmentaionModels.pspnet_hair_segmentation: serverFolderName = "pspnet-hair-segmentation"; prototxtName = "pspnet-hair-segmentation.onnx.prototxt"; onnxName = "pspnet-hair-segmentation.onnx"; break; case ImageSegmentaionModels.deeplabv3: serverFolderName = "deeplabv3"; prototxtName = "deeplabv3.opt.onnx.prototxt"; onnxName = "deeplabv3.opt.onnx"; break; } ailiaModel = new AiliaModel(); if (gpu_mode) { // call before OpenFile ailiaModel.Environment(Ailia.AILIA_ENVIRONMENT_TYPE_GPU); } AiliaDownload ailia_download = new AiliaDownload(); ailia_download.DownloaderProgressPanel = UICanvas.transform.Find("DownloaderProgressPanel").gameObject; var urlList = new List <ModelDownloadURL>(); urlList.Add(new ModelDownloadURL() { folder_path = serverFolderName, file_name = prototxtName }); urlList.Add(new ModelDownloadURL() { folder_path = serverFolderName, file_name = onnxName }); StartCoroutine(ailia_download.DownloadWithProgressFromURL(urlList, () => { modelPrepared = ailiaModel.OpenFile(asset_path + "/" + prototxtName, asset_path + "/" + onnxName); })); return(ailiaModel); }