Flutter tflite图像分类如何不显示错误结果

Posted

技术标签:

【中文标题】Flutter tflite图像分类如何不显示错误结果【英文标题】:Flutter tflite image classification how to not show wrong results 【发布时间】:2021-08-02 09:32:49 【问题描述】:

我正在尝试了解 tensorflow,我想创建一个带有猫或狗图像分类的颤振应用程序。

我使用https://teachablemachine.withgoogle.com/ 用 100 个 epoch 和 128 个批次训练我的模型。我的模型的输出对猫和狗的准确率都是 97%。我使用了来自 kaggle 的数据集,其中每只猫和狗都有 4000 张图像。

我的代码:

import 'dart:io';
import 'package:tflite/tflite.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';

class MyHomePage extends StatefulWidget 
  @override
  _MyHomePageState createState() => _MyHomePageState();


class _MyHomePageState extends State<MyHomePage> 
  File? _image;
  bool _loading = false;
  List<dynamic>? _output;
  final _picker = ImagePicker();

  pickImage() async 
    var image = await _picker.getImage(source: ImageSource.camera);

    if (image == null) 
      return null;
    

    setState(() 
      _image = File(image.path);
    );
    classifyImage(_image);
  

  pickGalleryImage() async 
    var image = await _picker.getImage(source: ImageSource.gallery);

    if (image == null) 
      return null;
    

    setState(() 
      _image = File(image.path);
    );
    classifyImage(_image);
  

  @override
  void initState() 
    super.initState();
    _loading = true;
    loadModel().then((value) 
      // setState(() );
    );
  

  @override
  void dispose() 
    Tflite.close();
    super.dispose();
  

  classifyImage(File? image) async 
    var output = await Tflite.runModelOnImage(
      path: image!.path,
      numResults: 2,
      threshold: 0.5,
      imageMean: 127.5,
      imageStd: 127.5,
    );
    setState(() 
      _loading = false;
      _output = output;
    );
  

  loadModel() async 
    await Tflite.loadModel(
      model: 'assets/model_unquant.tflite',
      labels: 'assets/labels.txt',
    );
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(
        title: Text('Cat vs Dog Classifier'),
      ),
      body: Center(
        child: Column(
          children: [
            SizedBox(height: 160.0),
            _image == null
                ? Text('No image selected')
                : Container(
                    child: Image.file(_image!),
                    height: 250.0, // Fixed height for image
                  ),
            SizedBox(height: 20.0),
            _output != null ? Text('$_output![0]['label']') : Container(),
            SizedBox(height: 50.0),
            ElevatedButton(
              onPressed: pickImage,
              child: Text('Take Picture'),
            ),
            ElevatedButton(
              onPressed: pickGalleryImage,
              child: Text('Camera Roll'),
            ),
          ],
        ),
      ),
    );
  

我的问题:

如果我选择了一个不是猫或狗的不同图像,我在大多数情况下仍会得到 100% 的猫或狗反馈。如何不显示这些错误的结果?我们实际上可以做什么?

【问题讨论】:

【参考方案1】:

您必须在 3 个类上训练您的原始模型:

猫 狗 其他

然后转换为 tflite 模型并在你的 Flutter 项目中使用它

【讨论】:

你会为“其他”类使用什么样的对象?任何事物?如果我有 1000 张猫和狗的照片,我需要多少张训练照片?谢谢!

以上是关于Flutter tflite图像分类如何不显示错误结果的主要内容,如果未能解决你的问题,请参考以下文章

实体类如何不需要写set,get方法

使用 JAX,TFLite 和 Flutter 打造一个棋盘游戏

使用 toco 进行 tflite 转换中的“尺寸必须匹配”错误

如何在图像分类上快速运行 tflite 模型

通过 tflite 模型传递单个图像进行图像分类

Flutter:选择后删除选择文件图像