成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

YOLOv8 圖像分類及 .tflite 部署

開發 機器視覺
YOLO開發者將目標檢測問題構建為回歸問題,而不是分類任務,通過空間上分離邊界框,并使用單個卷積神經網絡(CNN)將概率與每個檢測到的圖像相關聯。

目標檢測是計算機視覺中用于識別和定位圖像或視頻中對象的一種技術。圖像定位是使用邊界框來識別一個或多個對象的正確位置的過程,這些邊界框對應于對象周圍的矩形形狀。這個過程有時會與圖像分類或圖像識別混淆,后者的目標是將圖像或圖像中的對象預測為一個類別或類別之一。

YOLO開發者將目標檢測問題構建為回歸問題,而不是分類任務,通過空間上分離邊界框,并使用單個卷積神經網絡(CNN)將概率與每個檢測到的圖像相關聯,如這里所示。

將圖像分割成小單元,并將概率與每個檢測到的圖像關聯

YOLO在競爭中領先的原因包括其:

  • 速度
  • 檢測精度
  • 良好的泛化能力
  • 開源

將YOLO模型部署到Flutter應用程序中,通過手機相機識別對象:

1. 創建新項目并設置您的環境:

在android/app/build.gradle中,在android塊中添加以下設置。

android{


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

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

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

在android/build.gradle中,調整“ext.kotlin_version”構建腳本塊為此:

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

2. 將您的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';

3. 開始編程:

(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(),
    ),
  );
}

我的Yolov8 Flutter應用程序的截圖

責任編輯:趙寧寧 來源: 小白玩轉Python
相關推薦

2024-01-29 09:29:02

計算機視覺模型

2024-05-15 09:16:05

2023-12-11 10:18:38

YOLOv8檢測器實戰

2024-07-22 13:49:38

YOLOv8目標檢測開發

2024-11-28 10:04:14

2024-11-18 17:31:27

2024-10-25 08:30:57

計算機視覺神經網絡YOLOv8模型

2024-07-11 08:25:34

2025-02-07 14:52:11

2025-01-24 07:37:19

計算機視覺熱力圖YOLOv8

2024-08-27 12:40:59

2024-10-16 16:49:44

定向邊界框目標檢測YOLOv8

2024-10-10 17:05:00

2024-09-09 16:35:10

YOLO模型

2025-01-21 11:41:14

2023-02-02 09:00:00

2024-07-01 12:55:50

2023-01-12 12:20:29

YOLOv8模型

2023-11-15 17:48:04

Yolo V8人工智能

2024-09-20 10:02:13

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久久九九九九 | av中文在线| 亚洲精品日日夜夜 | 日本亚洲欧美 | 成人在线观 | 永久网站 | 国产a区 | 精品自拍视频在线观看 | 午夜激情网 | 龙珠z在线观看 | 伊人免费在线观看高清 | 精品久 | 久久亚洲一区 | 成人免费视频网站在线观看 | 国产欧美日韩一区 | 欧美aaaaa| 久草在线中文888 | 999www视频免费观看 | 久久成人精品视频 | 国产综合欧美 | 久久久婷| 男女羞羞视频在线看 | av在线二区| 91高清免费 | 国产黑丝av | 色橹橹欧美在线观看视频高清 | 欧美成年黄网站色视频 | 欧美精品一区在线 | 欧美极品在线观看 | 欧美中文字幕一区二区三区亚洲 | 成人av在线网站 | 国产目拍亚洲精品99久久精品 | 亚洲精品一二区 | 91精品久久久久久久久中文字幕 | 国产成人精品久久二区二区91 | 91在线看 | 一区二区三区国产精品 | 国产95在线| 懂色tv | 可以免费观看的av片 | 四虎在线观看 |