// Reinitialize variables related with modes.
        void ExchangeModel(PoseLandmarkModel poseLandmarkModel)
        {
            woker?.Dispose();

            // Switch neural network models.
            NNModel nnModel;

            switch (poseLandmarkModel)
            {
            case PoseLandmarkModel.lite:
                nnModel = liteModel;
                break;

            case PoseLandmarkModel.full:
                nnModel = fullModel;
                break;

            default:
                nnModel = fullModel;
                break;
            }
            model = ModelLoader.Load(nnModel);
            woker = model.CreateWorker();

            // Switch control flag.
            selectedModel = poseLandmarkModel;
        }
        public void ProcessImage(ComputeBuffer input, PoseLandmarkModel poseLandmarkModel = PoseLandmarkModel.full)
        {
            if (selectedModel != poseLandmarkModel)
            {
                // Reinitialize variables related with modes if mode of this frame was changed from previous mode.
                ExchangeModel(poseLandmarkModel);
            }

            //Execute neural network model.
            var inputTensor = new Tensor(1, IMAGE_SIZE, IMAGE_SIZE, 3, input);

            woker.Execute(inputTensor);
            inputTensor.Dispose();

            // Convert 4 dimensions Tensor to 1 dimension ComputeBuffer.
            var poseFlagBuffer         = TensorToBuffer("Identity_1", 1);
            var landmarkBuffer         = TensorToBuffer("Identity", BODY_LD_LEN);
            var worldLandmarkRawBuffer = TensorToBuffer("Identity_4", WORLD_LD_LEN);

            // Get final results of pose landmark.
            postProcessCS.SetInt("_keypointCount", vertexCount);
            postProcessCS.SetBuffer(0, "_poseFlag", poseFlagBuffer);
            postProcessCS.SetBuffer(0, "_Landmark", landmarkBuffer);
            postProcessCS.SetBuffer(0, "_LandmarkWorld", worldLandmarkRawBuffer);
            postProcessCS.SetBuffer(0, "_Output", outputBuffer);
            postProcessCS.SetBuffer(0, "_OutputWorld", worldLandmarkBuffer);
            postProcessCS.Dispatch(0, 1, 1, 1);

            // Set pose landmark segmentation texture.
            var segTemp = CopyOutputToTempRT("Identity_2", SEGMENTATION_SIZE, SEGMENTATION_SIZE);

            Graphics.Blit(segTemp, segmentationRT);
            RenderTexture.ReleaseTemporary(segTemp);
        }
        public void ProcessImage(Texture inputTexture, PoseLandmarkModel poseLandmarkModel = PoseLandmarkModel.full)
        {
            // Resize `inputTexture` texture to network model image size.
            preProcessCS.SetTexture(0, "_inputTexture", inputTexture);
            preProcessCS.SetBuffer(0, "_output", networkInputBuffer);
            preProcessCS.Dispatch(0, IMAGE_SIZE / 8, IMAGE_SIZE / 8, 1);

            ProcessImage(networkInputBuffer, poseLandmarkModel);
        }
        public PoseLandmarker(PoseLandmarkResource resource, PoseLandmarkModel poseLandmarkModel = PoseLandmarkModel.full)
        {
            preProcessCS  = resource.preProcessCS;
            postProcessCS = resource.postProcessCS;
            liteModel     = resource.liteModel;
            fullModel     = resource.fullModel;

            networkInputBuffer  = new ComputeBuffer(IMAGE_SIZE * IMAGE_SIZE * 3, sizeof(float));
            segmentationRT      = new RenderTexture(SEGMENTATION_SIZE, SEGMENTATION_SIZE, 0, RenderTextureFormat.ARGB32);
            outputBuffer        = new ComputeBuffer(vertexCount + 1, sizeof(float) * 4);
            worldLandmarkBuffer = new ComputeBuffer(vertexCount + 1, sizeof(float) * 4);

            // Initialize related with mode which full body or upper body.
            ExchangeModel(poseLandmarkModel);
        }