
Выход:

В этой статье мы будем сканировать объекты с помощью Google ML-KIT в нашем приложении флаттера. Машинное обучение — горячая тема во флаттере и в этой современной области технологий. Я много искал на среде здесь, Github и других сайтах и источниках, но я не нашел последний и официальный способ, который Google рекомендует реализовать по этой теме. Вот почему я использую Google ML-KIT в своих статьях, чтобы предоставить обновленный и правильный способ привнести вкус машинного обучения в наши приложения для флаттера. В предыдущей статье ML мы узнали, как сканировать лица в флаттер-приложении с помощью Google ML KIT.
На этот раз структура, шаблон и процедура проекта такие же, как и в предыдущем (Шаблон GetX), но вместо сканирования лиц мы внесем некоторые изменения. в Google ML-KIT для сканирования объектов на изображении.
Примечание:
ML Kit от Google для Flutter — это набор плагинов Flutter, которые позволяют приложениям Flutter использовать автономный ML Kit от Google.
В версиях 0.7.3 и более ранних все функции были включены в один плагин, но у многих разработчиков начались проблемы с размером их приложений, потому что, хотя им нужна была только одна функция, плагин включал все ресурсы для остальных функций, что значительно увеличило размер приложения.
Начиная с версии 0.8.0 мы разделили плагин на несколько плагинов, чтобы разработчики могли использовать только то, что им нужно. google_ml_kit теперь является зонтичным плагином, включающим все плагины.
Я использую единый полный набор подключаемых модулей, но вы можете посетить здесь, чтобы использовать определенный подключаемый модуль для конкретной задачи.
Теперь приступим.

1-Создать новый проект Flutter
Создайте новый проект флаттера с именем по вашему выбору (ml_kit_object_detector).
2-Shift Project to GetX Pattern
Примечание. если вы хотите использовать простой проект без GetX, создайте собственный шаблон (Контроллеры (логика) или Представления (экраны)).
Я буду использовать шаблон GetX с помощью команд Get & CLI. Если вы не знакомы с GET & CLI, прочтите мою предыдущую статью и активируйте CLI.
Чтобы перевести проект на шаблон GetX, перейдите в корневой терминал проекта и запустите приведенные ниже команды (работают только в том случае, если вы включили Get & CLI в вышеупомянутой статье).
получить инициализацию
Теперь структура проекта будет выглядеть так

Теперь структура проекта будет выглядеть так;
- Папка данных содержит все данные, которые нам нужно хранить в нашем проекте.
- Папка модуля содержит все страницы приложения (экран)
- Папка Routes будет содержать все маршруты проекта (автоматически создаются при создании страницы)
Дополнительная папка Modules содержит Модели, Контроллеры и Представления для хранения соответствующих файлов.
3- Установите необходимые пакеты в Pubspec.yaml
1- image_picker здесь
2- google_ml_kit здесь
dependencies:
cupertino_icons: ^1.0.2
get: 4.6.5
flutter:
sdk: flutter
image_picker: ^0.8.5+3
google_ml_kit: ^0.12.0
ПРИМЕЧАНИЕ. Пожалуйста, следуйте полному руководству для платформы (android, ios, web) из pub. dev при установке пакетов.
4- Создание пользовательского интерфейса
HomeView создается автоматически, вы можете создать новую страницу с помощью следующей команды
получить создать страницу: your_page_name
1- Пользовательский виджет кнопки
Создайте новый файл дротика для пользовательского виджета кнопки, чтобы мы могли вызывать его снова и снова для будущего использования, и поместите этот код как
import 'package:flutter/material.dart';
import 'package:get/get.dart';
class DefaultButton extends StatelessWidget {
DefaultButton({
Key? key,
this.text,
required this.btnColor,
this.press,
}) : super(key: key);
final String? text;
Color btnColor;
final Function? press;
@override
Widget build(BuildContext context) {
return SizedBox(
width: Get.width,
// height: getProportionateScreenHeight(100),
child: TextButton(
style: TextButton.styleFrom(
shape:
RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
primary: Colors.white,
backgroundColor: btnColor,
),
onPressed: press as void Function()?,
child: Text(
text!,
style: TextStyle(
fontSize: 16,
color: Colors.black,
),
),
),
);
}
}
2- Художник по объектам
Создайте новый файл дротика, чтобы создать прямоугольник, который будет выделять и закрашивать объекты на изображении. Вставьте код как
import 'package:flutter/material.dart';
import 'dart:ui'as ui;
import 'package:google_ml_kit/google_ml_kit.dart';
class ObjectPainter extends CustomPainter {
final ui.Image image;
final List<DetectedObject> objects;
final List<Rect> rects = [];
ObjectPainter(this.image, this.objects) {
for (var i = 0; i < objects.length; i++) {
rects.add(objects[i].boundingBox);
}
}
@override
void paint(ui.Canvas canvas, ui.Size size) {
final Paint paint = Paint()
..style = PaintingStyle.stroke
..strokeWidth = 4.0
..color = Colors.green;
canvas.drawImage(image, Offset.zero, Paint());
for (var i = 0; i < objects.length; i++) {
canvas.drawRect(rects[i], paint);
}
}
@override
bool shouldRepaint(ObjectPainter oldDelegate) {
return image != oldDelegate.image || objects != oldDelegate.objects;
}
}
3- Домашний вид (страница)
Перейдите в lib/app/modules/home/views.
HomeView.dart
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:ml_kit_object_detector_flutter/components/custom_button.dart';
import 'package:ml_kit_object_detector_flutter/painter/Object_Painter.dart';
import '../controllers/home_controller.dart';
class HomeView extends GetView<HomeController> {
const HomeView({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
Get.put(HomeController());
return GetBuilder<HomeController>(
builder: (context) {
return Scaffold(
appBar: AppBar(
title: Text("Object Detector flutter"),
centerTitle: true,
toolbarHeight: 40,
),
body: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
children: [
controller.isLoading.value
? Center(child: CircularProgressIndicator())
: Center(
child: Container(
width: Get.width,
height: 200,
padding: EdgeInsets.all(5),
decoration: BoxDecoration(
border: Border.all(color: Colors.grey)
),
child:
(controller.selectedImagePath.value.isEmpty)
? Center(child: Text('No image selected')):
FittedBox(
child: SizedBox(
width: controller.iimage?.width.toDouble(),
height: controller.iimage?.height.toDouble(),
child: Image.file(File(controller.selectedImagePath.value)),
),
),
),
),
DefaultButton(btnColor: Colors.white,press: (){
controller.getImageAndDetectObjects();
},
text: "Pick Image",),
Container(
width: Get.width,
height: 200,
padding: EdgeInsets.all(5),
decoration: BoxDecoration(
border: Border.all(color: Colors.grey)
),
child:
(controller.iimageFile == null)
? const Center(child: Text('No object detected in image')):
FittedBox(
child: SizedBox(
width: controller.iimage?.width.toDouble(),
height: controller.iimage?.height.toDouble(),
child: CustomPaint(
painter: ObjectPainter(controller.iimage!, controller.objectss!),
),
),
),
),
],
),
)
);
}
);
}
}
4- Домашний контроллер (бэкенд)
Перейдите в lib/app/modules/home/controllers.
HomeController.dart
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'dart:ui'as ui;
import 'package:google_ml_kit/google_ml_kit.dart';
import 'package:image_picker/image_picker.dart';
class HomeController extends GetxController {
//TODO: Implement HomeController
var selectedImagePath=''.obs;
var extractedBarcode=''.obs;
RxBool isLoading = false.obs;
XFile ?iimageFile;
List<DetectedObject> ?objectss;
ui.Image ?iimage;
Future <void>getImageAndDetectObjects() async {
final imageFile = (await ImagePicker().pickImage(source: ImageSource.gallery)) ;
//var imageFilee=imageFile.toFile();
isLoading.value = true;
selectedImagePath.value=imageFile!.path;
final image = InputImage.fromFilePath(imageFile.path) ;
var objectDetector=GoogleMlKit.vision.objectDetector(options: ObjectDetectorOptions(mode: DetectionMode.single, classifyObjects: true, multipleObjects: true));
List<DetectedObject> objects = await objectDetector.processImage(image);
iimageFile = imageFile;
objectss = objects;
_loadImage(imageFile);
update();
}
///////load image with object recognition
_loadImage(XFile file) async {
final data = await file.readAsBytes();
await decodeImageFromList(data).then(
(value) =>
iimage = value);
isLoading.value = false;
update();
}
@override
void onInit() {
super.onInit();
}
@override
void onReady() {
super.onReady();
}
@override
void onClose() {
super.onClose();
}
}
Вывод:
1-

2-

****************************************************************
Поздравляем! Вы научились сканировать объекты, используя официальный и правильный способ, предложенный Google ML-KIT с шаблоном flutter & GetX. . Следите за моей следующей статьей о машинном обучении с помощью флаттера.
Похлопайте статье и подпишитесь на меня, чтобы не пропустить новые флаттер-статьи.
Исходный код :
Больше статей от меня
Покажите мне некоторую поддержку
Я профессиональный разработчик мобильных приложений Flutter. Пожалуйста, свяжитесь со мной, чтобы помочь вам с вашими задачами и проектами.