EmguCV学习笔记 VB.Net 11.5 目标检测

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。

教程VB.net版本请访问:EmguCV学习笔记 VB.Net 目录-CSDN博客

教程C#版本请访问:EmguCV学习笔记 C# 目录-CSDN博客

笔者的博客网址:https://blog.csdn.net/uruseibest

教程配套文件及相关说明以及如何获得pdf教程和代码,请移步:EmguCV学习笔记

学习VB.Net知识,请移步: vb.net 教程 目录_vb中如何用datagridview-CSDN博客

 学习C#知识,请移步:C# 教程 目录_c#教程目录-CSDN博客

 

11.5 目标检测

11.5.1 Yolo

YOLO(You Only Look Once)是一种流行的目标检测算法,它使用单个神经网络同时进行对象检测和对象分类。相比于传统的目标检测算法,YOLO在目标检测任务中表现优秀,有更快的速度和更高的准确性,被广泛应用于自动驾驶、安防监控等领域。

【代码位置:frmChapter11】Button3_Click

   '目标检测:yolo

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click

        '对象分类,coco.names文件提供了80类对象

        Dim classnames() As String

        classnames = File.ReadAllLines("C:\learnEmgucv\yolo\coco.names")

        '需要测试的图像文件

        Dim m As New Mat("C:\learnEmgucv\dnntest.jpg", ImreadModes.Color)

        Dim hm As Integer = m.Height

        Dim wm As Integer = m.Width

        Dim net As Dnn.Net

        '读取yolo的推理模型文件

        net = DnnInvoke.ReadNetFromDarknet("C:\learnEmgucv\yolo\yolov3.cfg", "C:\learnEmgucv\yolo\yolov3.weights")

        net.SetPreferableBackend(Dnn.Backend.OpenCV)

        net.SetPreferableTarget(Target.Cpu)

        Dim blob As Mat

        '注意:BlobFromImagesize参数

        '以前使用(416,416),现在是(608, 608),参看yolov3.cfg

        '如果继续使用(416,416),那么会有部分物体检测不出

        blob = DnnInvoke.BlobFromImage(m, 1.0 / 255.0, New Size(608, 608), New MCvScalar(0, 0, 0), True, False)

        net.SetInput(blob)

        '获取推理模型中未连接的输出层名称列表

        Dim names() As String = net.UnconnectedOutLayersNames

        '或者以下方法获得

        'Dim outLayers() As Integer = net.UnconnectedOutLayers        ''

        'Dim layerNames() As String = net.LayerNames

        'Dim names(outLayers.Length - 1) As String

        'For i As Integer = 0 To outLayers.Length - 1

        '    names(i) = layerNames(outLayers(i) - 1)

        'Next

        Dim mout As New VectorOfMat

        net.Forward(mout, names)

        '只有一张图片,只需要mout(0)即可

        Dim mout1 As New Mat

        mout1 = mout(0)

        '返回二维数组

        Dim detection(,) As Single

        detection = mout1.GetData()

        Dim rows As Integer = detection.GetLength(0)

        Dim cols As Integer = detection.GetLength(1)

        '置信度

        Dim lstYoloConf As New List(Of Single)

        '方框坐标

        Dim lstYoloRects As New List(Of Rectangle)

        '识别到的物体序号

        Dim lstYoloIndex As New List(Of Integer)

        '行数为检测出对象的数量

        '每列从 0 84,一共85个元素,

        '    0-1为矩形区域的中心坐标XY的百分比

        '    2-3为矩形的宽度和高度的百分比

        '    4为矩形区域的置信度

        '    5-84为对应的80类对象分别的置信度

        '存在两个置信度

        For i As Integer = 0 To rows - 1

            '第一个置信度是矩形区域的置信度

            Dim conf As Single = detection(i 4)

            '先判断矩形区域的置信度是否符合要求

            If conf > 0.5 Then

                Dim x As Single = detection(i 0) * wm  '百分比,需要乘以源图像的宽度

                Dim y As Single = detection(i 1) * hm  '百分比,需要乘以源图像的高度

                Dim w As Single = detection(i 2) * wm  '百分比,需要乘以源图像的宽度

                Dim h As Single = detection(i 3) * hm  '百分比,需要乘以源图像的高度

                For k As Integer = 5 To 84

                    '第二个置信度是检测出的对象分类的置信度

                    '判断对象分类的置信度是否符合要求

                    If detection(i, k) > 0.5 Then

                        lstYoloConf.Add(conf)

                        lstYoloRects.Add(New Rectangle(CInt(x - w / 2), CInt(y - h / 2), w, h))

                        '注意,是从第6个(索引为5)开始

                        lstYoloIndex.Add(k - 5)

                    End If

                Next

            End If

        Next

        '利用NMS把重复位置的rectangle去除

        Dim selectedObj() As Integer

        selectedObj = DnnInvoke.NMSBoxes(lstYoloRects.ToArray, lstYoloConf.ToArray, 0.2F, 0.3F)

        For i As Integer = 0 To lstYoloRects.Count - 1

            '只画出被保留下來的rectangle

            If (selectedObj.Contains(i)) Then

                '输出检测出的对象所在矩形区域

                CvInvoke.Rectangle(m, lstYoloRects(i), New MCvScalar(0, 255, 0), 1)

                '获得检测出的对象的种类名称

                Dim objName As String

                objName = classnames(lstYoloIndex(i))

                '输出检测出的对象名称

                CvInvoke.PutText(m, objName,

                                 New Point(lstYoloRects(i).X, lstYoloRects(i).Y - 5),

                                 FontFace.HersheyTriplex, 0.3, New MCvScalar(0, 0, 255))

                '输出检测出的置信度

                CvInvoke.PutText(m, lstYoloConf(i),

                                 New Point(lstYoloRects(i).X + 40, lstYoloRects(i).Y - 5),

                                 FontFace.HersheyComplex, 0.3, New MCvScalar(255, 0, 0))

            End If

        Next

        ImageBox1.Image = m

End Sub

输出结果如下图所示:

图11-2 使用YOLO进行目标检测的结果

11.5.2 SSD

SSD(Single Shot MultiBox Detector)是一种流行的目标检测算法,它使用单个神经网络同时进行对象检测和对象分类。相比于传统的目标检测算法,SSD可以快速准确地检测出图像中的对象,被广泛应用于自动驾驶、安防监控等领域。

【代码位置:frmChapter11】Button4_Click

   'ssd

    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click

        '对象分类,object_detection_classes_pascal_voc.txt文件提供了21类对象(含background

        Dim classnames() As String

        classnames = File.ReadAllLines("C:\learnEmgucv\ssd\object_detection_classes_pascal_voc.txt")

        '需要测试的图像文件

        Dim m As New Mat("C:\learnEmgucv\dnntest.jpg", ImreadModes.Color)

        Dim hm As Single = m.Height

        Dim wm As Single = m.Width

        Dim net As Dnn.Net

        '读取SSD的推理模型文件

        net = DnnInvoke.ReadNetFromCaffe("C:\learnEmgucv\ssd\MobileNetSSD_deploy.prototxt.txt",

                           "C:\learnEmgucv\ssd\MobileNetSSD_deploy.caffemodel")

        net.SetPreferableBackend(Dnn.Backend.OpenCV)

        net.SetPreferableTarget(Target.Cpu)

        '输入图像必须是(300,300),参看MobileNetSSD_deploy.prototxt.txtinput_shape

        Dim mCopy As New Mat

        CvInvoke.Resize(m, mCopy, New Drawing.Size(300, 300))

        Dim blob As Mat

        blob = DnnInvoke.BlobFromImage(mCopy, 0.007843, New Size(300, 300),

                                       New MCvScalar(127.5 127.5 127.5), False, False)

        net.SetInput(blob)

        '

        Dim mout As New Mat

        mout = net.Forward()

        '返回四维数组

        Dim fout(,,,) As Single

        fout = mout.GetData()

        '检测到的所有对象的数量

        Dim allObjCount As Integer = fout.GetLength(2)

        '识别到的对象序号

        Dim lstSsdIndex As New List(Of Integer)

        '置信度

        Dim lstSsdConf As New List(Of Single)

        '矩形

        Dim lstSsdRects As New List(Of Rectangle)

        For i As Integer = 0 To allObjCount - 1

            '置信度

            Dim conf As Single

            conf = fout(0, 0, i, 2)

            If conf > 0.5 Then

                lstSsdConf.Add(conf)

                '对应对象序号

                lstSsdIndex.Add(fout(0, 0, i, 1))

                '左上角X

                Dim lbx As Integer = CInt(fout(0, 0, i, 3) * wm)

                '左上角Y

                Dim lby As Integer = CInt(fout(0, 0, i, 4) * hm)

                '右下角X

                Dim rtx As Integer = CInt(fout(0, 0, i, 5) * wm)

                '右下角Y

                Dim rty As Integer = CInt(fout(0, 0, i, 6) * hm)

                '对应矩形

                lstSsdRects.Add(New Rectangle(lbx, lby, rtx - lbx, rty - lby))

            End If

        Next

        For i As Integer = 0 To lstSsdIndex.Count - 1

            '检测出的对象所在矩形区域

            CvInvoke.Rectangle(m, lstSsdRects(i), New MCvScalar(0, 255, 0), 1)

            Dim objName As String

            objName = classnames(lstSsdIndex(i))

            Console.WriteLine(objName & lstSsdConf(i))

            '输出检测出的对象名称

            CvInvoke.PutText(m, objName,

                                 New Point(lstSsdRects(i).X, lstSsdRects(i).Y - 5),

                                 FontFace.HersheyTriplex, 0.3, New MCvScalar(0, 0, 255))

            '输出检测出的置信度

            CvInvoke.PutText(m, lstSsdConf(i),

                                 New Point(lstSsdRects(i).X + 40, lstSsdRects(i).Y - 5),

                                 FontFace.HersheyComplex, 0.3, New MCvScalar(255, 0, 0))

        Next

        ImageBox1.Image = m

End Sub

输出结果如下图所示:

图11-3使用SSD进行目标检测的结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/874801.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Day7 | Java框架 | SpringMVC

Day7 | Java框架 | SpringMVC SpringMVC简介SpringMVC 概述入门案例入门案例工作流程分析Controller 加载控制与业务bean加载控制(SpringMVC & Spring)PostMan 请求与响应请求映射路径请求方式(不同类型的请求参数)&#xff1…

基于JAVA+SpringBoot+Vue的前后端分离企业oa管理系统

基于JAVASpringBootVue的前后端分离企业oa管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接&#x1…

信号保存和处理

把上一篇回顾一下吧:共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,进程不再通过执行进入内核的系统调用来传递彼此的数据 共享内存的数据结构: struct shmid_ds {…

Vant 按需引入导致 Typescript,eslint 报错问题

目录 1,按需引入问题2,Typescript 报错解决3,eslint 报错解决 1,按需引入问题 vant4 通过 按需引入的配置 使用组件时,会同时将样式也自动导入。所以可直接使用相关的 API 和组件,不会有问题。比如&#x…

Elasticsearch基础(七):Logstash如何开启死信队列

文章目录 Logstash如何开启死信队列 一、确保 Elasticsearch 输出插件启用 DLQ 支持 二、配置 Logstash DLQ 设置 三、查看死信队列 四、排查 CSV 到 Elasticsearch 数据量不一致的问题 Logstash如何开启死信队列 在 Logstash 中,死信队列(Dead Le…

QT 联合opencv 易错点

https://blog.csdn.net/qq_51699436/article/details/135777911 网上已经有大量优秀切详尽的文章来讲述QT联合opencv了,我把容易出错的点列出来备忘 1、在进行opencv进行编译时,要确认好是32位还是64位,因为在创建QT项目的时候QT和opencv要匹…

基于R语言的统计分析基础:使用ggplot2包进行绘图

安装ggplot2包并查看官方文档 ggplot2是一个基于图形语法的R包,它允许用户通过声明式方式指定数据、美学映射和图形元素来灵活创建复杂且美观的可视化图表。 ggplot2包官方教学文档:ggplot2官方文档 在R语言中安装ggplot2有两种方法: 安装整…

【自动驾驶】控制算法(八)横向控制Ⅱ | Carsim 与 Matlab 联合仿真基本操作

写在前面: 🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝 个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。 🔍 本文系 清流君 原创之作&…

GEE 将本地 GeoJSON 文件上传到谷歌资产

在地理信息系统(GIS)领域,Google Earth Engine(GEE)是一个强大的平台,它允许用户处理和分析大规模地理空间数据。本文将介绍如何使用 Python 脚本批量上传本地 GeoJSON 文件到 GEE 资产存储,这对…

初识C++|继承

🍬 mooridy-CSDN博客 🧁C专栏(更新中!) 目录 1. 继承的概念及定义 1.1 继承的概念 1.2 继承定义 1.2.1 定义格式 1.2.2 继承父类成员访问方式的变化 1.3继承类模板 2. 父类和子类对象赋值兼容转换 3. 继承中的…

国内外大模型汇总(包括科大星火、文心一言、通义千问、智普清言、华为大模型)

国内外大模型汇总 1. 科大讯飞星火认知大模型 主要特点: 多语言能力:以中文为核心,同时支持多语言处理,能够进行跨语种的语言理解和生成。 广泛的任务能力:具备内容生成、语言理解、知识问答、推理、数学计算、代码…

数学建模笔记—— 主成分分析(PCA)

数学建模笔记—— 主成分分析 主成分分析1. 基本原理1.1 主成分分析方法1.2 数据降维1.3 主成分分析原理1.4 主成分分析思想 2. PCA的计算步骤3. 典型例题4. 主成分分析说明5. python代码实现 主成分分析 1. 基本原理 在实际问题研究中,多变量问题是经常会遇到的。变量太多,无…

小怡分享之栈和队列

前言: 🌈✨前面小怡给大家分享了顺序表和链表,今天小怡给大家分享一下栈和队列。 1.栈 1.1 概念 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#x…

WPF中依赖属性或附加属性的继承

引言 我们可以轻易的编写一个附加属性类,增加任意类型的附加属性并编写一定的逻辑来处理附加值的变化通知。假如控件是我们自定义的一个label、button 、textbox等,自定义控件当然是其他基础类型元素的组合,如shape、line、rectangle、geome…

针对SVM算法初步研究

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝心态决定高度,细节决定成败…

从OracleCloudWorld和财报看Oracle的转变

2024年9月9-12日Oracle Cloud World在美国拉斯维加斯盛大开幕 押注AI和云 Oracle 创始人Larry Ellison做了对Oracle战略和未来愿景的主旨演讲,在演讲中Larry将AI技术和云战略推到了前所未有的高度,从新的Oracle 23c改名到Oracle23ai,到Oracl…

活动|华院计算宣晓华受邀出席“AI引领新工业革命”大会,探讨全球科技的最新趋势

8月31日,“AI引领新工业革命”大会于上海图书馆圆满落幕。本次大会由TAA校联会和台协科创工委会联合主办,得到上海市台办、上海市台联、康师傅的大力支持。大会邀请了NVIDIA全球副总裁、亚太区企业营销负责人刘念宁,元禾厚望资本创始合伙人潘…

828华为云征文|华为云Flexus X实例docker部署Jitsi构建属于自己的音视频会议系统

828华为云征文|华为云Flexus X实例docker部署Jitsi构建属于自己的音视频会议系统 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求&a…

[Web安全 网络安全]-文件包含漏洞

文章目录: 一:前言 1.什么是文件包含漏洞 2.文件包含漏洞的成因 3.文件包含漏洞的分类 4.文件包含漏洞的防御策略 5.文件包含函数(触发点Sink) 6.环境 6.1 靶场 6.2 其他工具 二:文件包含LFI labs靶场实验…

docker-01 创建一个自己的镜像并运行容器

docker-01 创建一个自己的镜像并运行容器 前言 我们都知道使用Docker的镜像可以快速创建和部署应用,大大的节约了部署的时间。并且Docker 的镜像提供了除内核外完整的运行时环境,确保代码的环境一致性,从而不会在出现这段代码在我机器上没问…