示例#1
0
    // Start is called before the first frame update
    void Start()
    {
        var model = ModelLoader.LoadFromStreamingAssets(modelName + ".bytes");

        var worker = BarracudaWorkerFactory.CreateWorker(BarracudaWorkerFactory.Type.Compute, model);

        foreach (var layer in model.layers)
        {
            Debug.Log("Layer " + layer.name + " does: " + layer.inputs);
        }

        var inputs = new Dictionary <string, Tensor>();

        Texture2D img = Resources.Load("tennis_in_crowd") as Texture2D;
        //    Texture2D img = testImage.mainTexture as Texture2D;

        var tensor = new Tensor(img, 3);

        inputs.Add("image", tensor);

        worker.ExecuteAndWaitForCompletion(inputs);
        var Heatmap = worker.Fetch("heatmap");
        var Offset  = worker.Fetch("offset_2");
        var Dis_fwd = worker.Fetch("displacement_fwd_2");
        var Dis_bwd = worker.Fetch("displacement_bwd_2");

        poses = posenet.DecodeMultiplePosesOG(Heatmap, Offset, Dis_fwd, Dis_bwd,
                                              outputStride: 16, maxPoseDetections: 2, scoreThreshold: 0.02f, nmsRadius: 20);

        gl = GameObject.Find("GLRenderer").GetComponent <GLRenderer>();

        Debug.Log(poses.Length);

//        Debug.Log(Heatmap.height);
        Heatmap.Dispose();
        Offset.Dispose();
        Dis_fwd.Dispose();
        Dis_bwd.Dispose();
        worker.Dispose();
    }
    IEnumerator PoseUpdateNoTex(NativeArray <Color32> buffer, int width, int height, float secondsToWait)
    {
        //    isPosing = true;

        var _model = ModelLoader.LoadFromStreamingAssets(modelName + ".bytes");

        //var _model = model;

        var _worker = BarracudaWorkerFactory.CreateWorker(BarracudaWorkerFactory.Type.Compute, _model);
        //var _worker = worker;

        var frame = new Texture2D(width, height, TextureFormat.RGB24, false);

        frame.SetPixels32(buffer.ToArray());
        frame.Apply();

        //yield return new WaitForSeconds(secondsToWait);

        yield return(new WaitForEndOfFrame());

        //frame.ResizePro(Width, Height, false, false);
        posenet.scale(frame, Width, Height, FilterMode.Bilinear);

        // Save frame image jpg to disk for debugging
        /// var randomInt = UnityEngine.Random.Range(0, 100000000000000000);
        /// File.WriteAllBytes(Application.persistentDataPath + "/pose-" + randomInt + ".jpg", frame.EncodeToJPG());
        /// Debug.Log("Saved size converted image path: " + Application.persistentDataPath + "/pose-" + randomInt + ".jpg");

        var inputs = new Dictionary <string, Tensor>();

        var tensor = new Tensor(frame, 3);

        inputs.Add("image", tensor);

        _worker.ExecuteAndWaitForCompletion(inputs);

        //yield return new WaitForSeconds(secondsToWait);
        yield return(new WaitForEndOfFrame());

        var Heatmap = _worker.Fetch("heatmap");

        //yield return new WaitForSeconds(secondsToWait);
        yield return(new WaitForEndOfFrame());

        var Offset = _worker.Fetch("offset_2");

        //yield return new WaitForSeconds(secondsToWait);
        yield return(new WaitForEndOfFrame());

        var Dis_fwd = _worker.Fetch("displacement_fwd_2");

        //yield return new WaitForSeconds(secondsToWait);
        yield return(new WaitForEndOfFrame());

        var Dis_bwd = _worker.Fetch("displacement_bwd_2");

        //yield return new WaitForSeconds(secondsToWait);
        yield return(new WaitForEndOfFrame());

        poses = posenet.DecodeMultiplePosesOG(Heatmap, Offset, Dis_fwd, Dis_bwd,
                                              outputStride: 16, maxPoseDetections: 1, scoreThreshold: 0.8f, nmsRadius: 30);


        Offset.Dispose();
        Dis_fwd.Dispose();
        Dis_bwd.Dispose();
        Heatmap.Dispose();
        _worker.Dispose();


        isPosing = false;

        frame  = null;
        inputs = null;

        //    Resources.UnloadUnusedAssets();


        yield return(null);
    }