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