Flutter tflite图像分类如何不显示错误结果
Flutter tflite image classification how to not show wrong results
我想了解 tensorflow,我想创建一个带有猫或狗图像分类的 flutter 应用程序。
我使用 https://teachablemachine.withgoogle.com/ 用 100 个时期和 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% 的猫或狗反馈。如何不显示这些错误的结果?我们实际上可以做什么?
您必须在 3 类:
上训练您的原始模型
- 猫
- 狗
- 其他
然后转换为tflite模型并在你的flutter项目中使用它
我想了解 tensorflow,我想创建一个带有猫或狗图像分类的 flutter 应用程序。
我使用 https://teachablemachine.withgoogle.com/ 用 100 个时期和 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% 的猫或狗反馈。如何不显示这些错误的结果?我们实际上可以做什么?
您必须在 3 类:
上训练您的原始模型- 猫
- 狗
- 其他
然后转换为tflite模型并在你的flutter项目中使用它