#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);
})();
}
}, []);
Я думал о том, чтобы просто добавить кнопку для обновления страницы, но я бы предпочел, если бы мне не нужно было этого делать.