Вопрос или проблема
Я пытаюсь использовать 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 может быть сложной, особенно с учетом постоянно меняющегося стека технологий. Советую также исследовать альтернативные решения, такие как использование других библиотек для работы с моделями, если проблем становится слишком много. Если у вас остались вопросы, предложите, пожалуйста, больше деталей о вашем окружении или коде, чтобы дальнейшая помощь была более целенаправленной.