设为首页 加入收藏

TOP

机器学习框架ML.NET学习笔记【8】目标检测(采用YOLO2模型)(一)
2019-09-17 17:49:01 】 浏览:29
Tags:机器 学习 框架 ML.NET 笔记 目标 检测 采用 YOLO2 模型

一、概述

本篇文章介绍通过YOLO模型进行目标识别的应用,原始代码来源于:https://github.com/dotnet/machinelearning-samples

实现的功能是输入一张图片,对图片中的目标进行识别,输出结果在图片中通过红色框线标记出来。如下:

 YOLO简介

 YOLO(You Only Look Once)是一种最先进的实时目标检测系统。官方网站:https://pjreddie.com/darknet/yolo/

 本文采用的是TinyYolo2模型,可以识别的目标类型包括:"aeroplane", "bicycle", "bird", "boat", "bottle","bus", "car", "cat", "chair", "cow","diningtable", "dog", "horse", "motorbike", "person","pottedplant", "sheep", "sofa", "train", "tvmonitor" 。 

ONNX简介

ONNX 即Open Neural Network Exchange(开放神经网络交换格式),是一个用于表示深度学习模型的通用标准,可使模型在不同框架之间进行互相访问,其规范及代码主要由微软,亚马逊 ,Facebook 和 IBM 等公司共同制定与开发。有了ONNX标准,我们就可以在ML.NET代码中使用通过其他机器学习框架训练并保存的模型。

 

二、代码分析

 1、Main方法

        static void Main(string[] args)
        {
            TrainAndSave();
            LoadAndPredict();

            Console.WriteLine("Press any key to exit!");
            Console.ReadKey();
        }

 第一次运行时需要运行TrainAndSave方法,生成本地模型后,可以直接运行生产代码。

 

2、训练并保存模型

     static readonly string tagsTsv = Path.Combine(trainImagesFolder,  "tags.tsv");       
     private static void TrainAndSave() { var mlContext = new MLContext(); var trainData = mlContext.Data.LoadFromTextFile<ImageNetData>(tagsTsv); var pipeline = mlContext.Transforms.LoadImages(outputColumnName: "image", imageFolder: trainImagesFolder, inputColumnName: nameof(ImageNetData.ImagePath)) .Append(mlContext.Transforms.ResizeImages(outputColumnName: "image", imageWidth: ImageNetSettings.imageWidth, imageHeight: ImageNetSettings.imageHeight, inputColumnName: "image")) .Append(mlContext.Transforms.ExtractPixels(outputColumnName: "image")) .Append(mlContext.Transforms.ApplyOnnxModel(modelFile: YOLO_ModelFilePath, outputColumnNames: new[] { TinyYoloModelSettings.ModelOutput }, inputColumnNames: new[] { TinyYoloModelSettings.ModelInput })); var model = pipeline.Fit(trainData); using (var file = File.OpenWrite(ObjectDetectionModelFilePath)) mlContext.Model.Save(model, trainData.Schema, file); Console.WriteLine("Save Model success!"); }

  ImageNetData类定义如下:

    public class ImageNetData
    {
        [LoadColumn(0)]
        public string ImagePath;

        [LoadColumn(1)]
        public string Label;
    }

tags.tsv文件中仅包含一条样本数据,因为模型已经训练好,不存在再次训练的意义。这里只要放一张图片样本即可,通过Fit方法建立数据处理通道模型。

ApplyOnnxModel方法加载第三方ONNX模型,

    public struct TinyYoloModelSettings
    {
        // input tensor name
        public const string ModelInput = "image";

        // output tensor name
        public const string ModelOutput = "grid";
    }

 其中,输入、输出的列名称是指定的。可以通过安装Netron这样的工具来查询ONNX文件的详细信息,可以看到输入输出的数据列名称。


3、应用
        private static void LoadAndPredict()
        {
            var mlContext = new MLContext();

            ITransformer trainedModel;
            using (var stream = File.OpenRead(ObjectDetectionModelFilePath))
            {
                trainedModel = mlContext.Model.Load(stream, out var modelInputSchema);               
            }
            var predictionEngine = mlContext.Model.CreatePredictionEngine<ImageNetData, ImageNetPrediction>(trainedModel);

            DirectoryI
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Ocelot(四)- 认证与授权 下一篇C# Queue与RabbitMQ的爱恨情仇(..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目