TensorCamera никогда не вызывает onReady, молчаливый сбой

Вопрос или проблема

Я пытаюсь использовать TFJS, потому что пакет react-native-fast-tflite не может загрузить модели VertexAI 🤷🏻‍♂️. Я попытался следовать примеру репозитория TFJS + ReactNative, однако он сильно устарел. Я установил следующие версии:

"@tensorflow/tfjs": "^4.22.0",
"@tensorflow/tfjs-backend-cpu": "^4.22.0",
"@tensorflow/tfjs-react-native": "^1.0.0",
"expo-camera": "~15.0.16",
"expo-gl": "~14.0.2",
"expo": "^51.0.0",
"react-native": "0.74.5",

На данный момент я 1) вынужден исключить использование RNVC, так как TensorCamera ищет именно expo-camera… ладно, не беда. 2) У меня возникает проблема после открытия камеры:

Возможное необработанное отклонение Promise (id: 0):
TypeError: Невозможно прочитать свойство ‘Type’ неопределенно

У этой ошибки типа нет трассировки стека…

  const [model, setModel] = useState<LayersModel | null>(null);
  const [isModelReady, setIsModelReady] = useState(false);


const loadModel: LoadModelType = async (setModel, setIsModelReady) => {
  try {
    await ready();
    const modelJson = require('../../assets/tfjs/model.json');
    const modelWeights1 = require('../../assets/tfjs/1of3.bin');
    const modelWeights2 = require('../../assets/tfjs/2of3.bin');
    const modelWeights3 = require('../../assets/tfjs/3of3.bin');

    const bundle = bundleResourceIO(modelJson, [
      modelWeights1,
      modelWeights2,
      modelWeights3,
    ]);
    const modelConfig = await loadGraphModel(bundle);

    setModel(modelConfig);
    setIsModelReady(true);
  } catch (e) {
  console.error((e as Error).message)
  }
};

  useEffect(
    function initTFJS() {
      if (hasPermission) {
        (async () => {
          // const isGPUSupported = await TFGPUManager.enableGPU();
          // setGpuSupported(isGPUSupported);
          console.log('загрузка модели');

          await loadModel(setModel, setIsModelReady);
        })();
      }
    },
    [hasPermission]

return isModelReady && <TensorCamera
      autorender
      cameraTextureHeight={textureDims.height}
      cameraTextureWidth={textureDims.width}
      onReady={handleCameraStream}
      resizeDepth={3}
      resizeHeight={TENSOR_HEIGHT}
      resizeWidth={TENSOR_WIDTH}
      style={{ flex: 1 }}
      useCustomShadersToResize={false}
    />

Моя model кажется загруженной корректно, и isModelReady равен true, так что камера отображается. Однако обратный вызов onReady={handleCameraStream} похоже никогда не срабатывает, так что, хоть камера и выглядит активной, что-то идет не так.

Есть идеи? Является ли TFJS+reactnative хорошей идеей с современными версиями RN?

Ответ или решение

Ваша проблема с использованием TensorCamera и её не срабатыванием на событие onReady действительно вызывает определённые затруднения, особенно с учётом современных версий React Native и библиотек TensorFlow.js. Ниже приведены возможные причины и решения, которые могут помочь вам в устранении данной проблемы.

1. Проверка совместимости версий

Сначала убедитесь, что версии библиотек, которые вы используете, совместимы друг с другом. Учитывая, что вы идёте по пути использования TensorFlow.js с React Native, важно отметить:

  • @tensorflow/tfjs и @tensorflow/tfjs-react-native: Обратите внимание, что у вас установлена версия 1.0.0 для tfjs-react-native. Эта версия может быть не оптимально совместима с tfjs 4.22.0. Рекомендуется проверить документацию на наличие совместимых версий.
  • expo-camera и другие пакеты Expo: Убедитесь, что все ваши зависимости совместимы с текущей версией Expo (51.0.0).

2. Проверка разрешений

Убедитесь, что вы запрашиваете и получаете разрешения для доступа к камере. Проблемы с разрешениями могут предотвратить корректную инициализацию камеры, что, в свою очередь, влияет на работу TensorCamera. Убедитесь, что вы правильно обрабатываете переменную hasPermission, которая должна быть истинной перед инициализацией камеры.

3. Обработка ошибок

Ваш код пытается загрузить модель и установить её, однако если что-то пойдёт не так, и вы не отловите эту ошибку, это может привести к сбоям. Например, если модель или один из весов не загружается, можно будет получить неявную ошибку. Улучшите обработку ошибок при загрузке моделей и добавьте дополнительную отладочную информацию в консоли:

} catch (e) {
  console.error('Ошибка загрузки модели:', (e as Error).message);
}

4. Вызов handleCameraStream

Если onReady не срабатывает, возможно, проблема заключается в самом обработчике. Проверьте, правильно ли определён метод handleCameraStream. Убедитесь, что он принимает ожидаемые параметры и не содержит ошибок, которые могут препятствовать его выполнению.

5. Использование TensorCamera

Убедитесь, что TensorCamera и его свойства корректно настроены. Проверьте, что значения cameraTextureHeight и cameraTextureWidth, а также другие параметры соответствуют фактическим характеристикам камеры устройства. Неверные параметры могут вызвать молчаливый сбой.

6. Логи и отладка

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

7. Тестирование на другом устройстве

Попробуйте запустить ваш код на другом устройства или эмуляторе. Иногда проблемы могут быть связаны с конкретным устройством или версией операционной системы.

Заключение

Работа с TensorFlow.js и React Native может быть сложной, особенно с учетом постоянно меняющегося стека технологий. Советую также исследовать альтернативные решения, такие как использование других библиотек для работы с моделями, если проблем становится слишком много. Если у вас остались вопросы, предложите, пожалуйста, больше деталей о вашем окружении или коде, чтобы дальнейшая помощь была более целенаправленной.

Оцените материал
Добавить комментарий

Капча загружается...