机器视觉初步9:目标检测专题

news2024/11/19 13:13:45

文章目录

  • 1.Two-Stage方法
    • 1.1 Faster R-CNN
    • 1.2 R-FCN
  • 2.One-Stage方法
    • 2.1 YOLOv3(你只看一次)
    • 2.2 SSD(单次多框检测器)
  • 3.传统滑动窗口方法

机器视觉领域中常见的目标检测方法主要分为以下两类:

  1. Two-Stage方法1:在这类方法中,首先使用一个分类器(如SVM、神经网络等)将目标与背景区分开,然后再确定目标的位置。
    这个过程通常需要两步:
    (1)先进行候选区域(Region Proposal)生成,将图像中可能包含目标的区域提取出来;
    (2)再在候选区域中进行分类与位置精修。代表性算法有:R-CNN(Region-based Convolutional Neural Networks)、Fast R-CNN、Faster R-CNN、YOLO(You Only Look Once)和SSD(Single Shot MultiBox Detector)等。
  2. One-Stage方法2:在这类方法中,通常直接在原始图像上进行目标检测,不需要进行候选区域的生成。代表性算法有:YOLO、YOLOv2、YOLOv3、YOLOv4和YOLOv5等。
    值得注意的是,尽管这些方法在检测准确性上有一定差异,但它们的性能与速度并非不可兼得。通过改进模型结构和训练策略,可以在保证检测精度的前提下,提高模型的速度和计算资源需求的降低。

不同算法的基本框架图
不同算法的基本框架图

1.Two-Stage方法

Two-Stage方法首先使用预选区域提取(Region Proposal)产生候选框,然后对候选框进行分类和边界框回归。这类方法速度相对较慢但精度较高。常见的Two-Stage方法有Faster R-CNN、R-FCN、YOLOv2等。

1.1 Faster R-CNN

Faster R-CNN是一种用于物体检测的卷积神经网络(Convolutional Neural Network, CNN)方法。
在这里插入图片描述

Faster R-CNN 使用区域生成网络(Region Proposal Network, RPN)来生成可能包含物体的候选区域(Regions of Interest, RoIs),然后在这些候选区域上训练物体检测器(Object Detector, Detector)。这种方法比传统的滑动窗口方法更快。
在这里插入图片描述

在Halcon中,可以使用以下算子实现:

dev_close_window()
dev_open_file_dialog ('choose file', '*.png', '', 'path/to/your/image', '*.png', ['Image', 'path/to/your/image'])
read_image (Image, 'path/to/your/image')

convert_image_color (Image, Image, 'RGB')

dev_display (Image)
dev_display (Dog)

region_copy (Region, RegionCopy)

connection (RegionCopy, ConnectedRegions)

select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 20000, 1000000)

gen_empty_obj (Obj)

append_rectangle2 (Obj, SelectedRegions, 12, 12)

text_obj_detection (SelectedRegions, ObjectTexts, 'both', 'true', 'false', 'true', 'true', 'true', 'true', 'true')

推荐阅读这篇文章深入了解:一文读懂Faster RCNN

1.2 R-FCN

R-FCN(Region-based Fully Convolutional Networks)是一种用于物体检测的卷积神经网络方法。与 Faster R-CNN 类似,R-FCN 使用 FPN (Feature Pyramid Network) 进行多尺度特征提取。
在这里插入图片描述

但是,R-FCN 使用全卷积网络(Fully Convolutional Networks)在每个尺度上进行物体检测,而不是采用候选区域方法。这使得 R-FCN 在不同尺度的图像上表现出更好的性能。
在这里插入图片描述

在Halcon中,可以使用以下算子实现:

dev_close_window()
dev_open_file_dialog ('choose file', '*.png', '', 'path/to/your/image', '*.png', ['Image', 'path/to/your/image'])
read_image (Image, 'path/to/your/image')

convert_image_color (Image, Image, 'RGB')

dev_display (Image)
dev_display (Dog)

region_copy (Region, RegionCopy)

connection (RegionCopy, ConnectedRegions)

select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 20000, 1000000)

gen_empty_obj (Obj)

append_rectangle2 (Obj, SelectedRegions, 12, 12)

connection (Obj, Connection)

这里我们使用了Python的OpenCV库和Halcon库实现目标检测。Python代码如下:

import cv2
import numpy as np

def detect_objects(image_path):
    # 加载图像
    image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)

    # 创建Halcon对象
    halcon_objects = []

    # 使用Halcon读取图像
    ho_image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)

    # 使用Halcon提取特征
    features = detect_objects_with_hasc(ho_image)

    # 找到感兴趣的物体
    found_objects = []
    for ho_feature in features:
        if ho_feature.GetPoses():
            for obj in ho_feature.GetObjects():
                obj = cv2.CvPoint2D32f(obj.GetPosition()[0], obj.GetPosition()[1])
                obj = cv2.boxPoints(obj)
                if obj.shape != (5, 5):
                    found_objects.append(obj)

    # 显示结果
    for obj in found_objects:
        cv2.rectangle(image, (obj[0], obj[1]), (obj[2], obj[3]), (0, 255, 0), 2)
        cv2.putText(image, "Object", (obj[0], obj[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
        cv2.imshow("Halcon Object Detection", image)
    cv2.waitKey(0)

if __name__ == "__main__":
    image_path = "path/to/your/image.png"
    detect_objects(image_path)

2.One-Stage方法

One-Stage方法直接在输出层生成目标边界框,速度快但精度相对较低。这类方法通常使用候选区域提取(Region Proposal)和分类两个阶段,候选区域在输入图像中生成大量候选框,然后进行分类和边界框回归。常见的One-Stage方法有YOLO(You Only Look Once)、SSD(Single Shot MultiBox Detector)等。

2.1 YOLOv3(你只看一次)

YOLO(You Only Look Once)是一种用于物体检测的卷积神经网络方法。
在这里插入图片描述

YOLO 将物体检测任务视为回归问题,并将图像划分为网格,每个网格预测物体的类别和边界框。YOLO v3 在前两代版本的基础上,引入了新的特征映射、多尺度检测和更先进的卷积神经网络结构,从而提高了检测速度和准确性。
在这里插入图片描述

在Halcon中,可以使用以下算子实现:

dev_clear_window()
dev_update_off()
dev_close_window()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)

read_image (Image, 'path/to/your/image')

convert_image_dtype (Image, Image, 'uint8')

inner_product (Image, Results, 'false', 'false', 'false')

threshold (Results, RegionGrowth, 0, 255)

select_shape (RegionGrowth, SelectedRegions, 'area', 'and', 10000, 1000000)

dilation_rectangle1 (SelectedRegions, RegionDilation, 15, 15)

connection (RegionDilation, ConnectedRegions)

select_shape (ConnectedRegions, SelectedObjects, 'area', 'and', 10000, 1000000)

text_object_detection (SelectedObjects, DetectedObjects, 'both', 'true', 'false', 'true', 'true', 'true', 'true', 'true')

更多参考:【yolov3详解】一文让你读懂yolov3目标检测原理

2.2 SSD(单次多框检测器)

SSD(Single Shot MultiBox Detector)是一种用于物体检测的卷积神经网络方法。
在这里插入图片描述

SSD 同样将物体检测任务视为回归问题,但使用卷积神经网络(Convolutional Neural Network, CNN)在单次前向传播中预测物体的类别和边界框。
SSD使用多尺度特征图3进行检测,通过特征提取网络(如MobileNet、VGG等)产生候选区域,再使用分类器和边界框回归器进行目标定位和分类。

换言之,SSD 通过使用不同尺度的卷积特征映射对多个位置和大小的物体进行检测。
SSD 的主要优势在于其检测速度,因为它不需要在图像上滑动候选区域。

在Halcon中,可以使用以下算子实现:

dev_close_window()
dev_open_file_dialog ('choose file', '*.png', '', 'path/to/your/image', '*.png', ['Image', 'path/to/your/image'])
read_image (Image, 'path/to/your/image')

convert_image_color (Image, Image, 'RGB')

gray_scale (Image, GrayImage, 0, 255)

fg_threshold (GrayImage, Regions, 0, 255)

dev_display (Image)
dev_display (Regions)

可参考这篇文章:目标检测|SSD原理与实现

3.传统滑动窗口方法

“滑动窗口方法”是一种基于滑动窗口的图像分析方法。该方法通过在图像中滑动一系列窗口,并将每个窗口内的图像特征提取出来,然后通过特征提取算法对窗口内的图像进行处理和分析。滑动窗口方法可以用来进行图像分割、特征提取、目标检测、目标跟踪等任务。
在这里插入图片描述

以下是滑动窗口方法的基本原理:

  1. 对于图像中的每个像素,在窗口内进行特征提取,并将特征存储在一个特征向量中。
  2. 将特征向量传输到下一个窗口中。
  3. 重复步骤1和2,直到遍历完整个图像。
  4. 将所有窗口中的特征向量传输到另一个处理器中,并对这些特征向量进行计算和分析。
    以下是Halcon算子实现滑动窗口方法的示例:
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)

* 创建一个与原始图像大小相同的全零窗口
gen_empty_obj (Obj)
Obj_numPoints := 0

* 遍历图像中的每个像素
for I := 1 to ImageLength by 1
    * 在窗口中进行特征提取
    gen_corner_feat (Obj, I, Contours)

    * 检测角点
    detect_contours_xld (Obj, Contours, Contours, Row, Column, Height, Width, Score, MinScore, Number, ContoursNumber)
    
    * 将角点传递到下一个窗口
    dev_display (Image[I:I+ImageLength-1])
    
    * 计算角点之间的距离并可视化
    disp_message (WindowHandle, 'Distance: ' + Distance::String, 'image', Row, Column, 'black')
endfor

以下是Python实现滑动窗口方法的示例:

import cv2

def extract_features(image):
    # 生成特征检测器
    corners = cv2.cornerSubPix(image, corners, (11, 11), (-1, -1), criteria=cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER)
    return corners

# 遍历图像中的每个像素
for I in range(1, image.shape[0] + 1, 1):
    # 在窗口中进行特征提取
    corners = extract_features(image[I - 1:I + 1])
    
    # 检测角点
    detect_contours_xld(corners, corners, None, (0, 0, 255), 2, 0.01, 10, False)
    
    # 将角点传递到下一个窗口
    cv2.drawContours(image[I - 1:I + 1], [0], -1, (0, 0, 255), 2)
    
    # 计算角点之间的距离并可视化
    disp_message(window_handle, 'Distance: ' + distance, 'image', I, 'black')

PS:在Halcon和Python中,实现滑动窗口方法时需要对窗口大小进行指定
在Halcon中,需要指定ImageLength和ImageWidth;
在Python中,需要指定image。

参考文章:计算机视觉(Computer Vision)入门四----滑动窗口


  1. Two-Stage方法则采用复杂的深度学习模型,如Faster R-CNN、R-FCN、YOLOv3等,这些模型通常分为两个阶段进行处理。第一阶段先生成目标区域,例如通过使用区域卷积神经网络(Region Proposal Networks,RPN)来生成Region Proposals。第二阶段则在目标区域中进行分类和回归,从而进行目标检测。相比于One-Stage方法,Two-Stage方法的检测精度通常更高,但是由于需要两个阶段的计算,所以推理速度相对较慢。
    总之,One-Stage方法和Two-Stage方法各有优缺点,通常在不同的应用场景下选择不同的方法。 ↩︎

  2. One-Stage方法通常采用简单的深度学习模型,如YOLO、SSD等,可以在一次前向传播中直接输出目标的类别和位置。这种方法在检测速度上通常更快,因为它们在推理过程中只需要一次计算,但是由于没有单独的目标区域生成步骤,所以One-Stage方法的检测精度可能会略低于Two-Stage方法。 ↩︎

  3. 多尺度特征图(Multiscale Feature Map)是指在计算机视觉任务中,在不同尺寸的图像金字塔4上进行卷积操作,从而提取不同尺度下的特征信息。
    在图像识别、目标检测、语义分割等计算机视觉任务中,由于场景的复杂性和多样性,不同尺度的物体可能会出现在图像中。为了捕捉这些不同尺度的物体,可以使用多尺度特征图的方法。
    在多尺度特征图中,卷积核的尺寸和步长是可配置的。通常情况下,卷积核会从较小的尺寸逐渐变大,步长也会随之增大。这种方法能够捕获图像中不同尺度的特征信息,从而提高模型在不同尺度物体上的检测和识别能力。
    例如,在目标检测任务中,可以通过堆叠多个不同尺寸的特征图来提取多尺度特征信息。这些特征图可以通过上采样(upsampling)或下采样(downsampling)的方式来调整尺寸,以匹配原始图像的尺寸。这样,模型可以同时关注到小尺度和大尺度的物体,从而提高检测精度。 ↩︎

  4. 图像金字塔是一种用于图像处理和分析的技术,用于表示一组具有不同分辨率和大小的图像。金字塔的每一层代表了图像的不同分辨率,通常从最高分辨率开始,逐渐降低分辨率,直到变成一个像素矩阵。金字塔的每一层可以包含原始图像,也可以是原始图像经过降采样后的结果。
    图像金字塔可以用于图像分割、特征提取、图像识别和图像压缩等领域。在图像分割中,金字塔可以帮助算法逐步降低图像分辨率,以便更好地处理细节信息,并提高计算效率。在特征提取中,金字塔可以用于从多个分辨率级别提取有用的图像特征,以便进行分类和识别。在图像识别中,金字塔可以用于逐步缩小图像的范围,以便更好地识别目标物体。在图像压缩中,金字塔可以用于减少图像的数据量,以便更好地存储和传输图像。 ↩︎

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ThreadPoolExecutor的addWorker方法

该方法内部有两个for循环。外for循环用于校验线程池的线程个数。内for循环用于添加for循环并启动工作线程。 retry:打上标记位,方便后期内层for循环跳出到外层for循环。int c ctl.get();获取ctl的值。int rs runStateOf©; 获取ctl高三位的值。if (rs > SH…

【2022吴恩达机器学习课程视频翻译笔记】2.2监督学习-part-1

B站上面那个翻译我有点看不懂,打算自己啃英文翻译了(有自己意译的部分),然后懒得做字幕,就丢在博客上面了,2.2之前的章节结合那个机翻字幕能看懂 监督学习 part 1(Supervised learning part 1) Supervise…

MySQL数据库的优化技术三

如何选择mysql的存储引擎 在开发中,我们经常使用的存储引擎 myisam / innodb/ memory存储引擎针对的是表和数据库 事务:MySQL事务主要用于处理操作量大,复杂度高的数据,比如说,在人员管理系统中,你删除一…

ProTable查询表单必填项不生效解决方法

配置完发现不生效,需要在protable组件里再配置一项属性form才能生效 如此才能真正生效

Kafka消息队列核心概念以及部署

文章目录 1.消息队列核心概念1.1.为什么要引入消息队列1.2.消息队列的流派 2.Kafka消息队列基本概念2.1.Kafka消息队列基本概念2.2.Kafka与Zookeeper的关系2.3.Kafka消息队列各组件概念2.4.Kafka消息队列应用场景 3.部署Kafka消息队列3.1.搭建Zookeeper分布式协调服务3.2.部署K…

loss.backward

如何计算:autograd包根据tensor进行过的数学运算来自动计算梯度 注意:1:autograd实现的。2:对tensor进行计算梯度。 之前损失计算:分割损失和边界损失计算正常。 踩坑1:模型有两个损失,分别为分…

FTL没有映射管理,跟上班没有钱有什么区别

大家好,我是五月。 前言 FTL(Flash Translation Layer),即闪存转换层,是各种存储设备的核心算法,作用是将Host传下来的逻辑地址转换成物理地址,也就是映射。 可以说,地址映射是FT…

【五、软件包管理】

1 rpm rpm -qa 查询命令 [rootredis100 ~]# rpm -qa[rootredis100 ~]# rpm -qa |grep firefox firefox-68.10.0-1.el7.centos.x86_64rpm -e 卸载命令 [rootredis100 ~]# rpm -e fixerpm -ivh 安装命令 2 yum [rootredis100 ~]# yum -y install firefox修改网络源 切换目录…

机器学习——概率与统计

参考资料: 《机器学习》周志华https://zhuanlan.zhihu.com/p/27056207 1 马尔可夫链 1.1 定义 直观含义:在已知现在的条件下,过去与未来相互独立。 1.2 马尔可夫模型 根据定义,A 必为方阵 其中, p i j ( n ) P {…

JMeter在高分辨率电脑上,页面显示字体特别小

最近使用JMeter的过程中,发现一个问题,在高分辨率的电脑上,JMeter启动后,页面显示的字体特别小,上图 我电脑的分辨率是2880*1800,缩放200% 上图里显示的字体真心看不清楚 我以为是JMeter的bug&#xff0c…

[React]面向组件编程

1. 定义组件 - 函数式定义&#xff08;简单组件&#xff09;&#xff0c;使用function定义 import React from react; import ReactDOM from react-dom/client;function App() {return (<button onClick{handleClick}>click</button> // 直接把方法handleClick赋…

Pycharm+Gitlab+Jenkins持续集成自动化测试总结

一、Gitlab如何删除远程仓库的代码 1、如果本地仓库不小心删除&#xff0c;没关系&#xff0c;再新建一个空文件夹&#xff1b; 2、在空文件夹中右键&#xff0c;进入Git Bash命令行模式&#xff1b; 3、然后克隆远程仓库&#xff1b; git clone http://175.30.32.65:9000/r…

由半数年轻人存款不足10万而引发的思考!

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

windows安装youcompleteme

通过vim-plug&#xff0c;安装youcompleteme安装clangd-completer。python .\install.py --clangd-completer --msvc16c系补全需提供编译参数给clangd。两种种方式 安装c开发编译环境&#xff0c;即visual c 相关环境。 参考 ycm-core/YouCompleteMe: A code-completion en…

PMBOK第七版有什么新变化?影响8月PMP考试吗?

PMBOK是项目管理学习过程中必不可少的重要教材&#xff0c;从1996年PMI发布第一版PMBOK到现在&#xff0c;PMBOK已经更新到第七版&#xff0c;那么第七版PMBOK有哪些新变化呢&#xff1f;会影响8月考试吗&#xff1f;下面老师来为您详细解答。 1 PMBOK主要变化演进情况 私免费…

Istio 什么是服务网格

什么是服务网格 服务网格(Service Mesh)这个术语通常用于描述构成这些应用程序的微服务网络以及应用之间的交互。随着规模和复杂性的增长&#xff0c;服务网格越来越难以理解和管理。 它的需求包括服务发现、负载均衡、故障恢复、指标收集和监控以及通常更加复杂的运维需求&am…

高压功率放大器在超声波探测器中的应用

超声波探测技术是一种非常重要的无损检测技术&#xff0c;广泛应用于医学、工业等领域。超声波探测器中的高压功率放大器是其中一个关键部件&#xff0c;它主要用于将微弱的超声信号放大到能够进行后续处理和分析的程度。 在超声波探测器中&#xff0c;超声波发射器会向被测物体…

Qt编码方式

中文乱码算是一个常见的问题&#xff0c;本文提供两种解决方案 1 对字符串单独进行处理(不推荐) QString strQString::fromLocal8Bit("阿萨德");//使用此函数进行转码以显示正常(本地语言方式) QString strQString::fromUtf8("阿萨德");//qt还提供了从其他…

Bug小能手系列(python)_8: 使用mne库读取gdf文件报错 Cannot cast ufunc ‘clip‘ output

Cannot cast ufunc clip output from dtype float64 to dtype uint32 with casting rule same_kind 0. 错误介绍1. 环境介绍2. 问题分析3. 解决方法4. 总结 0. 错误介绍 在加载BCI Competition IV 2a数据集时&#xff0c;当使用mne库的io的read_raw_gdf()函数时出错。注&#…

Haproxy开源负载均衡部署

第一步环境准备&#xff1a; systemctl stop firewalld setenforce 0 systemctl disable firewalld.service #设置开机不启动防火墙sed -i s/SELINUX.*/SELINUXdisabled/ /etc/sysconfig/selinux #设置开机不启动防火墙iptables -F centos7服务器 haproxy 192.168…