Не удается заставить распознавание лиц работать должным образом при использовании Flutter и Firebase_ml_vision
Я боролся с этим около 24 часов и подошел к концу своих идей о том, как с этим справиться.
Я написал код, который загружает изображение из Firebase и обнаруживает на нем лицо - никаких проблем. Но когда я затем смотрю, чтобы сделать снимок, используя стандартный класс imagePicker во Flutter, несмотря на то, что я фактически отображал изображение на экране, чтобы проверить, что это действительный файл, faceDetector не может найти на изображении лица.
Отредактированная версия кода ниже. Не буду компилировать, так как кое-что из моего проекта отсутствует, но, надеюсь, вы поняли идею. Тестовая платформа - iOS (устройство, а не эмулятор). Плагин - firebase_ml_vision 0.9.6+2, а версия flutter - последняя, выпущенная несколько дней назад.
У кого-нибудь есть идеи?
import 'package:flutter/material.dart';
import 'package:firebase_ml_vision/firebase_ml_vision.dart';
import 'package:image_picker/image_picker.dart';
import 'package:modal_progress_hud/modal_progress_hud.dart';
import 'dart:io';
import 'dart:async';
import 'package:camera/camera.dart';
class imageComparison extends StatefulWidget {
@override
_imageComparison createState() => _imageComparison();
}
class _imageComparison extends State<imageComparison> {
CameraController controller;
List<CameraDescription> cameras;
File chosenImage;
bool gotImage = false;
File grabbedImage;
FaceDetector faceDetector;
File tempImg;
@override
void initState() {
super.initState();
faceDetector = FirebaseVision.instance.faceDetector(FaceDetectorOptions(enableLandmarks: true, enableContours: true, enableClassification: true));
availableCameras().then((value) {
cameras = value;
controller = CameraController(cameras[1], ResolutionPreset.medium);
controller.initialize().then((_) {
if (!mounted) {
return;
}
setState(() {});
});
});
}
@override
Widget build(BuildContext context) {
if (controller == null) {
return Scaffold(
backgroundColor: Colors.white,
body: Container(),
);
}
if (!gotImage) {
File img;
downloadImage(imageURLs[0], 'verificationImage.jpg').then((value) {
img = tempImg = value;
extractFace(img).then((value2) {
print('got image');
gotImage = true;
setState(() {});
});
});
}
return Scaffold(
backgroundColor: Colors.white,
body: ModalProgressHUD(
inAsyncCall: globals.showSpinner,
child: Container(
width: globals.SizeConfig.blockSizeHorizontal * 100,
height: globals.SizeConfig.blockSizeVertical * 100,
decoration: BoxDecoration(
gradient: gradient,
),
child: Stack(
children: <Widget>[
Positioned(
left: globals.SizeConfig.blockSizeHorizontal * 10,
top: globals.SizeConfig.blockSizeVertical * 5,
child: Column(
children: [
FlatButton(
child: Text(
'check',
textAlign: TextAlign.center,
style: TextStyle(color: Colors.white, fontSize: globals.SizeConfig.blockSizeHorizontal * 4),
),
color: Colors.red,
onPressed: () async {
bool res = await takeAndAnalyseImage();
//other stuff
},
),
],
),
),
],
),
),
),
);
}
Future<bool> takeAndAnalyseImage() async {
//String filepath = await takePicture();
grabbedImage = File((await ImagePicker().getImage(source: ImageSource.camera)).path);
//grabbedImage = File(filepath);
setState(() {
print('setting state');
});
while (grabbedImage == null) {}
if (mounted) {
extractFace(grabbedImage).then((value) {
//irrelevant stuff
});
}
return null;
}
Future<Map<String, dynamic>> extractFace(File img) async {
FirebaseVisionImage visionImage;
visionImage = FirebaseVisionImage.fromFile(img);
Map<String, dynamic> facevals = Map<String, dynamic>();
List<Face> faces;
try {
faces = await faceDetector.processImage(visionImage);
} catch (e) {
print('can\'t extract face from image. e = ' + e.toString());
}
for (Face face in faces) {
//do irrelevant stuff to question.
}
return facevals;
}
}
РЕДАКТИРОВАТЬ: преобразование изображения в
'FirebaseVisionImage'
похоже, работает нормально - это
FaceDetector.processImage
это не удается...