Ошибка реализации моделей TFlite во флаттереAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Ошибка реализации моделей TFlite во флаттере

Сообщение Anonymous »


Итак, я пытался реализовать несколько моделей tflite во flutter, которые ранее конвертировал из файлов .h5. Я целенаправленно использовал функции печати во время отладки, чтобы понять, в чем заключается проблема. Приложение зависает после появления такого сообщения: введите сюда описание изображения Функции печати, которые я использовал до появления этого сообщения, указывают на то, что моя модель была успешно загружена. введите сюда описание изображения

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

Вот функции, которые я использую для реализации своей модели Tflite. По сути, мне нужно запустить несколько моделей (по одной) после запуска первой модели, и я поставил для нее несколько условий «если».

import 'package:flutter/material.dart'; импортировать «пакет: file_picker/file_picker.dart»; импортировать 'пакет:permission_handler/permission_handler.dart'; импортировать «пакет: tflite_flutter/tflite_flutter.dart»; импортируйте «пакет: изображение/image.dart» как img; импортировать «дротик: математика»; импортировать «дротик: io»; класс ImageScreen расширяет StatefulWidget { const ImageScreen({Key? key}) : super(key: key); @переопределить _ImageScreenState createState() => _ImageScreenState(); } класс _ImageScreenState расширяет State { вар imgFile; Строка Image_Path = ""; Future PickImage() async { // Тело функции // Добавляем оператор возврата в конце Статус PermissionStatus = ожидание Permission.storage.request(); ФилеПикерРезультат? результат = ожидайте FilePicker.platform.pickFiles( тип: FileType.custom, разрешенные расширения: ['jpg', 'jpeg', 'png'], ); если (результат!= ноль) { imgFile = result.files.single; print("Путь к файлу изображения: " + imgFile.path); Путь_изображения=imgFile.путь; print("выбранное изображение"); вернуть путь_изображения; } еще { // Пользователь отменил сборщик печать("Ошибка"); вернуть «Ошибка»; } } //ЗАГРУЗКА МОДЕЛИ РАБОТАЕТ Устный переводчик? устный переводчик; Future loadModel(String modelPath) async { пытаться { интерпретатор = ждут Interpreter.fromAsset(modelPath); print('Модель успешно загружена'); // Получаем входные и выходные формы если (интерпретатор!= ноль) { вар inputShape = интерпретатор!.getInputTensor(0).shape; var outputShape = интерпретатор!.getOutputTensor(0).shape; print('Входная форма: $inputShape'); print('Выходная форма: $outputShape'); //I/futter (10135): Форма ввода: [1, 256, 256, 3] //I/futter (10135): Форма вывода: [1, 4] } } поймать (е) { print('Не удалось загрузить модель: $e'); } } Future runModel(String imagePath) async { // Загружаем изображение var image = img.decodeImage(File(imagePath).readAsBytesSync()); var resized = img.copyResize(изображение!, ширина: 256, высота: 256); // Преобразуем изображение в список чисел с плавающей запятой var input = resized.getBytes().buffer.asFloat32List().reshape([49152]); // Создаём выходной тензор var output = List.filled(4,0).reshape([1,4]);//попробуем заполнить(4.0), изменить форму([1,4]) // Проверяем, является ли интерпретатор нулевым если (интерпретатор == ноль) { print('Интерпретатор имеет значение null'); //возвращаться; } // Печать входных и выходных фигур print('Входная форма: ${input.shape}'); print('Выходная форма: ${output.shape}'); // Печать входных данных print('Входные данные: $input'); // Запускаем модель интерпретатор?.run(вход, вывод); print("хорошо, модель запущена"); обратный вывод; } Future makePredictions(String imagePath) async { // Загружаем и запускаем модель из 4 классов await loadModel('assets/models/four_class_STFT_80valacc.tflite'); вар предсказание_4class = ждут runModel (imagePath); Строковый результат = ''; // Преобразование List в List List предсказание_4class_double = предсказание_4class.cast(); // Находим индекс максимального значения в предсказании_4class int maxIndex = предсказание_4class.indexWhere((d) => d == предсказание_4class_double.reduce(макс)); // По результату загружаем и запускаем соответствующую бинарную модель если (maxIndex == 0) { print("ок 1"); результат = 'Нормальный'; } еще если (maxIndex == 1) { // Астма await loadModel('assets/models/NvsA.tflite'); print("ок 1"); вар предсказание_бинарный = ждут runModel (imagePath); result = 'Астма с уверенностью ${prediction_binary[0]}'; } еще если (maxIndex == 2) { // Пневмония print("ок 1"); await loadModel('assets/models/NvsP.tflite'); вар предсказание_бинарный = ждут runModel (imagePath); result = 'Пневмония с уверенностью ${prediction_binary[0]}'; } еще если (maxIndex == 3) { // ХОБЛ print("ок 1"); await loadModel('assets/models/NvsC_best.tflite'); вар предсказание_бинарный = ждут runModel (imagePath); result = 'ХОБЛ с уверенностью ${prediction_binary[0]}'; } вернуть результат; } //Удалите это, если вызывает ошибки /* @переопределить недействительный initState() { супер.initState(); loadModel(Image_Path).then((value) {setState((){});}); }*/ @переопределить Сборка виджета (контекст BuildContext) { вернуть эшафот( Цвет фона: Цвета.белый, AppBar:AppBar( высота: 0, заголовок:константная строка( mainAxisAlignment: MainAxisAlignment.center, дети: [ Текст( «Аускульт», стиль: TextStyle(цвет: Color.fromARGB(221, 7, 173, 224), fontWeight: FontWeight.w600), ), Текст( "Волна", стиль: TextStyle(цвет: Color.fromARGB(255, 248, 213, 16), fontWeight: FontWeight.w600), ), Text(" "), // балансирует, сохраняет центр, позже используйте более эффективные методы ], ),centerTitle: правда, BackgroundColor: const Color.fromARGB(255, 255, 255, 255), ), тело:Центр( ребенок:Контейнер( ширина: 200, высота: 250, дочерний:ListView( дети: [ константный текст( " Полученные результаты:", стиль: TextStyle (fontSize: 24, fontWeight: FontWeight.bold, цвет: Colors.black), ), const SizedBox(высота: 20), //ТОЛЬКО ДЛЯ ТЕСТИРОВАНИЯ: Контейнер( ширина: 200, дочерний элемент:ElevatedButton( onPressed: () асинхронный { //возможность добавить изображение Нить? imagePath = ждут выбора изображения (); если (imagePath!= ноль) { // Запускаем модель на изображении Строковый результат = ждут makePredictions(imagePath); // Отображение результата в диалоговом окне шоуДиалог( контекст: контекст, строитель: (контекст BuildContext) { вернуть AlertDialog( заголовок: Текст('Прогноз'), содержимое: Текст (результат), действия: [ ТекстКнопка( дочерний элемент: Текст («Закрыть»), onPressed: () { Навигатор.оф(контекст).pop(); }, ), ], ); }, ); } }, // здесь изменяем цвет кнопки с повышенными правами стиль: ElevatedButton.styleFrom( Цвет фона: Цвета.красный, Цвет переднего плана: Цвета.белый, форма: RoundedRectangleBorder( borderRadius: BorderRadius.circular(18.0), ), ), дочерний элемент: const Text («Добавить тестовое изображение», стиль: TextStyle (fontSize: 13),), ), ), const SizedBox(высота: 20), ], ), ), ), ); } } Я хочу получить выходные данные модели tflite, модели сообщают мне, нормальный ли человек или нет, а затем я помещаю дополнительные условия, такие, что если модель предсказывает, что человек ненормальный, и говорит, что у него есть болезни, для проверки того же используются другие модели. Я потратил более 10 часов, пробуя разные способы реализации файла dart из разных проектов, но все они потерпели неудачу и привели к одному и тому же результату или к тому, что приложение не собиралось само себя. Некоторые решения в Интернете включают пакеты, которые либо устарели, либо несовместимы с dart 3.0
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»