Выход:
В этой статье мы будем сканировать объекты с помощью 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. Пожалуйста, свяжитесь со мной, чтобы помочь вам с вашими задачами и проектами.