YOLOv8 图像分类及.tflite部署

点击下方卡片,关注“小白玩转Python”公众号

目标检测是计算机视觉中用于识别和定位图像或视频中对象的一种技术。图像定位是使用边界框来识别一个或多个对象的正确位置的过程,这些边界框对应于对象周围的矩形形状。这个过程有时会与图像分类或图像识别混淆,后者的目标是将图像或图像中的对象预测为一个类别或类别之一。

YOLO开发者将目标检测问题构建为回归问题,而不是分类任务,通过空间上分离边界框,并使用单个卷积神经网络(CNN)将概率与每个检测到的图像相关联,如这里所示。

b0393bcebfe741ff15298544c946090e.png

将图像分割成小单元,并将概率与每个检测到的图像关联

YOLO在竞争中领先的原因包括其:

  • 速度

  • 检测精度

  • 良好的泛化能力

  • 开源

将YOLO模型部署到Flutter应用程序中,通过手机相机识别对象:

- 创建新项目并设置您的环境:

在android/app/build.gradle中,在android块中添加以下设置。

android{


        aaptOptions {
            noCompress 'tflite'
            noCompress 'lite'
        }
    }

在同一路径的android/app/build.gradle中,调整“minSdkVersion”,“targetSdkVersion”和“compileSdkVersion”在android块如下所示:

e93acf3298a64456b31a5c15b1e2352c.png

android/app/build.gradle --> android块

在android/build.gradle中,调整“ext.kotlin_version”构建脚本块为此:

buildscript {
    ext.kotlin_version = '1.7.10'
    repositories {
        google()
        mavenCentral()
    }
}

- 将您的Yolov8模型添加到项目环境中:

模型必须以“.tflite”的形式导出,以便于在边缘设备上部署,如手机。如果您想用Python训练自定义的Yolov模型并将其导出为.tflite而不是.pt,您必须遵循这里的说明。我将在这里插入一个用于测试的预训练好的Yolov8目标检测模型。在您的Flutter项目中:

1. 创建一个assets文件夹,并将标签文件和模型文件放在其中。在pubspec.yaml中添加:

assets:
   - assets/labels.txt
   - assets/yolov8n.tflite

2. 导入所需的包flutter_vision / camera:

import 'package:flutter_vision/flutter_vision.dart';
import 'package:camera/camera.dart';

- 开始编程:

1. 在您的项目中初始化相机如下:

late List<CameraDescription> camerass;

2. 创建“YoloVideo”类:

class YoloVideo extends StatefulWidget {
  const YoloVideo({Key? key}) : super(key: key);




  @override
  State<YoloVideo> createState() => _YoloVideoState();
}




class _YoloVideoState extends State<YoloVideo> {
}

3. 在“YoloVideo”类中,声明所需的变量:

late CameraController controller;
  late FlutterVision vision;
  late List<Map<String, dynamic>> yoloResults;
  
  CameraImage? cameraImage;
  bool isLoaded = false;
  bool isDetecting = false;
  double confidenceThreshold = 0.5;

4. 初始化模型和相机:

@override
  void initState() {
    super.initState();
    init();
  }
  init() async {
    camerass = await availableCameras();
    vision = FlutterVision();
    controller = CameraController(camerass[0], ResolutionPreset.high);
    controller.initialize().then((value) {
      loadYoloModel().then((value) {
        setState(() {
          isLoaded = true;
          isDetecting = false;
          yoloResults = [];
        });
      });
    });
  }
  @override
  void dispose() async {
    super.dispose();
    controller.dispose();
    await vision.closeYoloModel();
  }

5. 简单的UI和确定视频流大小

@override
  Widget build(BuildContext context) {
    final Size size = MediaQuery.of(context).size;




    if (!isLoaded) {
      return const Scaffold(
        body: Center(
          child: Text("Model not loaded, waiting for it"),
        ),
      );
    }
    return Scaffold(
      body: Stack(
        fit: StackFit.expand,
        children: [
          AspectRatio(
            aspectRatio: controller.value.aspectRatio,
            child: CameraPreview(
              controller,
            ),
          ),
          ...displayBoxesAroundRecognizedObjects(size),
          Positioned(
            bottom: 75,
            width: MediaQuery.of(context).size.width,
            child: Container(
              height: 80,
              width: 80,
              decoration: BoxDecoration(
                shape: BoxShape.circle,
                border: Border.all(
                    width: 5, color: Colors.white, style: BorderStyle.solid),
              ),
              child: isDetecting
                  ? IconButton(
                      onPressed: () async {
                        stopDetection();
                      },
                      icon: const Icon(
                        Icons.stop,
                        color: Colors.red,
),
                      iconSize: 50,
                    )
                  : IconButton(
                      onPressed: () async {
                        await startDetection();
                      },
                      icon: const Icon(
                        Icons.play_arrow,
                        color: Colors.white,
),
                      iconSize: 50,
                    ),
            ),
          ),
        ],
      ),
    );
  }

6. 加载我们的模型

Future<void> loadYoloModel() async {
    await vision.loadYoloModel(
        labels: 'assets/CLASSES.txt',
        modelPath: 'assets/curr_float32.tflite',
        modelVersion: "yolov8",
        numThreads: 1,
        useGpu: true);
    setState(() {
      isLoaded = true;
    });
}








// 通过yoloOnFrame进行实时目标检测函数
  Future<void> yoloOnFrame(CameraImage cameraImage) async {
    final result = await vision.yoloOnFrame(
        bytesList: cameraImage.planes.map((plane) => plane.bytes).toList(),
        imageHeight: cameraImage.height,
        imageWidth: cameraImage.width,
        iouThreshold: 0.4,
        confThreshold: 0.4,
        classThreshold: 0.5);
    if (result.isNotEmpty) {
      setState(() {
        yoloResults = result;
      });
    }
  }

7. 启动视频流和开始或停止检测的函数

Future<void> startDetection() async {
    setState(() {
      isDetecting = true;
    });
    if (controller.value.isStreamingImages) {
      return;
    }
    await controller.startImageStream((image) async {
      if (isDetecting) {
        cameraImage = image;
        yoloOnFrame(image);
      }
    });
  }
  Future<void> stopDetection() async {
    setState(() {
      isDetecting = false;
      yoloResults.clear();
    });
  }

8. 检测到的对象周围的边界框

List<Widget> displayBoxesAroundRecognizedObjects(Size screen) {
    if (yoloResults.isEmpty) return [];
    double factorX = screen.width / (cameraImage?.height ?? 1);
    double factorY = screen.height / (cameraImage?.width ?? 1);




    Color colorPick = const Color.fromARGB(255, 50, 233, 30);




    return yoloResults.map((result) {
      double objectX = result["box"][0] * factorX;
      double objectY = result["box"][1] * factorY;
      double objectWidth = (result["box"][2] - result["box"][0]) * factorX;
      double objectHeight = (result["box"][3] - result["box"][1]) * factorY;
      
      speak() {
        String currentResult = result['tag'].toString();
        DateTime currentTime = DateTime.now();




        if (currentResult != previousResult ||
            currentTime.difference(previousSpeechTime) >= repeatDuration) {
          tts.flutterSpeak(currentResult);
          previousResult = currentResult;
          previousSpeechTime = currentTime;
        }
      }
      speak();




      return Positioned(
        left: objectX,
        top: objectY,
        width: objectWidth,
        height: objectHeight,
        child: Container(
          decoration: BoxDecoration(
            borderRadius: const BorderRadius.all(Radius.circular(10.0)),
            border: Border.all(color: Colors.pink, width: 2.0),
          ),
          child: Text(
            "${result['tag']} ${((result['box'][4] * 100).toStringAsFixed(0))}",
            style: TextStyle(
              background: Paint()..color = colorPick,
              color: const Color.fromARGB(255, 115, 0, 255),
              fontSize: 18.0,
            ),
          ),
        ),
      );
    }).toList();
  }
}

最后,您可以在Main.dart中将YoloVideo类作为函数调用,以在启动应用程序时启动视频流和实时目标检测,如下所示:

main() async {
  WidgetsFlutterBinding.ensureInitialized();




  runApp(
    const MaterialApp(
      home: YoloVideo(),
    ),
  );
}

ecf1c0ad63bf2cbcb76474f49504f877.png

我的Yolov8 Flutter应用程序的截图


·  END  ·

🌟 想要变身计算机视觉小能手?快来「小白玩转Python」公众号!

回复Python视觉实战项目,解锁31个超有趣的视觉项目大礼包!🎁

9be3af8924e4fc68d19a19b994388448.png

本文仅供学习交流使用,如有侵权请联系作者删除

对于将 YOLOv4-tiny 模型部署到 Android 平台,你可以使用 TensorFlow Lite 进行换和部署。以下是一些步骤: 1. 首先,你需要将 YOLOv4-tiny 模型换为 TensorFlow Lite 格式。你可以使用 TensorFlow 的换工具,具体的换步骤可以参考 TensorFlow 官方文档。确保在换时将模型尺寸调整为适合 Android 设备的大小。 2. 接下来,你需要在 Android 项目中集成 TensorFlow Lite 库。你可以通过在 Gradle 文件中添加依赖项来实现,具体的步骤可以参考 TensorFlow Lite 官方文档。 3. 在你的 Android 项目中创建一个 `Interpreter` 对象,并加载之前换后的 TensorFlow Lite 模型。 4. 准备输入数据。YOLOv4-tiny 模型通常需要图像数据作为输入。你可以使用 Android 的相机 API 或者从图库中选择图像来获取输入数据。 5. 对输入图像进行预处理,以满足模型的输入要求。这可能包括缩放、归一化和通道顺序调整等操作。 6. 将预处理后的图像数据传递给 TensorFlow Lite 模型的 `Interpreter` 对象进行推理。 7. 处理模型的输出结果。YOLOv4-tiny 模型通常会输出边界框坐标和类别标签。你可以根据输出结果绘制边界框或进行后续处理。 请注意,部署 YOLOv4-tiny 模型到 Android 平台可能需要一些手动的优化和调整,以确保在移动设备上能够获得良好的性能。这可能包括模型量化、使用 GPU 进行加速等技术。你可以参考 TensorFlow Lite 的文档和示例代码来获取更多详细信息和指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值