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);
        }