React native cameraWithTensors onReady вызывается только при сохранении файла

#javascript #reactjs #react-native #tensorflow.js

#javascript #reactjs #react-native #tensorflow.js

Вопрос:

Предполагается, что cameraWithTensors начнет отправлять кадры из входящего видео в функцию, которая обрабатывает ввод с камеры. Проблема в том, что функция вызывается только тогда, когда я перехожу на страницу и сохраняю код еще раз, без этого функция никогда не вызывается. Это странно, поскольку никаких ошибок не регистрируется.

Кадры cameraWithTensor передаются в handleCameraStream

         <TensorCamera
          style={styles.camera}
          type={type}
          zoom={0}
          cameraTextureHeight={textureDimsState.height}
          cameraTextureWidth={textureDimsState.width}
          resizeHeight={tensorDims.height}
          resizeWidth={tensorDims.width}
          resizeDepth={tensorDims.depth}
          onReady={imageAsTensors => handleCameraStream(imageAsTensors)}
          autorender={AUTORENDER}
        />
  

handleCameraStream принимает в качестве входных данных кадр из тензорной камеры и непрерывно выполняет циклы, делая прогнозы для кадров

Для blazeFaceModel и loadedModel изначально задается значение null, и когда загружаются обе модели, я устанавливаю их значения из useEffect()

   const handleCameraStream = imageAsTensors => {
    if (!imageAsTensors) {
      console.log("Image not found!");
    }
    const loop = async () => {
      const imageTensor = imageAsTensors.next().value;

      if (loadedModel !== null amp;amp; blazeFaceModel !== null) {
        console.log("Started");
        await getPrediction(imageTensor).catch(e => console.log(e));
      }
      tf.dispose(imageAsTensors);
      requestAnimationFrameId = requestAnimationFrame(loop);
    };
    //loop infinitely to constantly make predictions
    loop();
  };
  

useEffect() содержит данные, которые мне нужно установить изначально, здесь задаются loadedModel и blazeFaceModel

   useEffect(() => {
    if (!frameWorkReady) {
      (async () => {
        const { status } = await Camera.requestPermissionsAsync().catch(e =>
          console.log(e)
        );
        if (Platform.OS == "ios") {
          setTextureDims({ height: 1920, width: 1080 });
        } else {
          setTextureDims({ height: 1200, width: 1600 });
        }
        setHasPermission(status === "granted");
        await tf.ready().catch(e => console.log(e));
        setTFReady(true);
        setModelLoaded(await loadModel().catch(e => console.log(e)));
        setBlazeFaceModel(
          await loadBlazeFaceModel().catch(e => console.log(e))
        );
        setFrameWorkReady(true);
      })();
    }
  }, []);
  

Я думал о том, чтобы просто добавить кнопку для обновления страницы, но я бы предпочел, если бы мне не нужно было этого делать.