PyTorch深度学习实战(22)——从零开始实现YOLO目标检测

news2024/10/13 0:38:16

PyTorch深度学习实战(22)——从零开始实现YOLO目标检测

    • 0. 前言
    • 1. YOLO 架构
      • 1.1 R-CNN 目标检测模型的局限性
      • 1.2 YOLO 目标检测模型原理
    • 2. 实现 YOLO 目标检测
      • 2.1 编译 DarkNet
      • 2.2 设置数据集格式
      • 2.3 配置网络架构
      • 2.4 模型训练和测试
    • 小结
    • 系列链接

0. 前言

YOLO (You Only Look Once) 是一种实时目标检测算法,它以其高效性和准确性而闻名。相比于传统的目标检测方法,YOLO 的主要特点是在单个前向传递中同时完成目标检测和分类,因此称为 You Only Look Once。由于整个检测过程只需要一次前向传递,因此非常高效,可以实现实时目标检测。此外,YOLO 通过全局感受野捕捉了整个图像中的上下文信息,对小尺寸物体的检测效果较好。在本节中,将介绍 YOLO 的工作原理,然后在自定义数据集上训练 YOLO 目标检测模型。

1. YOLO 架构

YOLO 目标检测模型与 Faster R-CNN 模型相比,YOLO 无需使用区域提议算法 (Region Proposal Network, RPN),其在单个神经网络中预测边界框和类别概率,因此推理效率更高。

1.1 R-CNN 目标检测模型的局限性

首先,我们了解基于 R-CNN 的目标检测算法的局限性。在 Faster R-CNN 中,使用锚框在图像上滑动并识别可能包含对象的区域,然后执行边界框校正。然而,在全连接层中,仅将检测到的区域的 RoI 池化输出作为输入传递,对于不完全包含对象的区域(即对象超出区域提议的边界框),网络只能猜测对象的边界框,因为网络仅仅看到了区域提议,并没有看到完整的图像。
YOLO 能够克服这一问题,它能够在预测目标对象边界框时看到整个图像。此外,由于 Faster R-CNN 有两个网络 (RPN 和预测对象类别及其边界框的分类-回归网络),因此,Faster R-CNN 的推理速度依然很慢。

1.2 YOLO 目标检测模型原理

接下来,我们将介绍 YOLO 如何克服 Faster R-CNN 的局限性,可以在一次前向传递过程中查看整个图像并进行预测。

(1) 为给定图像创建标签信息训练模型。

考虑以下带有真实边界框(红色边界框)的带标签图像:

示例图像

将图像划分为 N x N 个网格单元,假设 N=3

网格单元
识别包含至少一个真实边界框中心的网格单元,在示例中,为 3 x 3 网格图像的单元格 a1b3。真实边界框的中心点所在的单元负责预测对象的边界框,接下来,创建与每个单元格对应的标签信息。

每个单元格对应的输出标签信息格式如下:

y=pc
bx
by
bw
bh
c1
c2
c3

其中,pc (objectness score) 是单元格包含对象的概率。接下来,我们介绍如何计算 bxbybwbh
首先,我们将网格单元(考虑 a1 网格单元)视为独立图像,并将其尺寸归一化为 01 之间,如下所示:

网格单元
bxby 是真实边界框的中点相对于图像(网格单元)的位置,在示例中,bx = 0.8,因为真实边界框的中点距离原点(网格单元左上角) 0.8 个单位,同理,by = 0.25,而 bw 是边界框的宽度与网格单元格宽度的比值;bh 是边界框高度与网格单元格高度的比值:

网格单元
接下来,预测与网格单元对应的类别。如果有三个类别 (c1 – 气球、c2 – 玩具、c3 – 花篮),c1,c2,c3分别表示该单元格包含这三个类别的概率。这里我们不需要背景类别,因为 pc 对应于网格单元格是否包含对象。
我们已经了解如何表示每个单元格的输出,接下来,介绍如何构建以上 3 x 3 网格单元格的输出。
首先,考虑网格单元 a3 的输出:

y=0
?
?
?
?
?
?
?

单元格 a3 的输出如上图所示。由于网格单元不包含对象,因此第一个输出 pc0,其余值则无关紧要,因为该单元不包含任何目标对象的真实边界框中心。
接下来,考虑对应于网格单元 a1 的输出:

y=1
0.75
0.25
0.5
0.4
1
0
0

网格单元包含具有 bxbybwbh 值的对象,类别是气球,因此 c11,而 c2c30
对于每个单元格,均有 8 个输出。因此,对于 3 x 3 的单元格网格,将得到形状为 3 x 3 x 8 的输出。

(2) 定义模型,其中输入为图像,输出与上一步中定义的真实值相符,输出尺寸为 3 x 3 x 8

输出尺寸
(3) 通过使用锚框定义真实标签值。
在以上示例中,我们一直假设在一个网格单元格中只有一个对象。而在现实中,可能存在同一个网格单元内有多个对象的情况。如果仍按照一个对象构建训练数据,将导致创建的真实标签值并不正确。如下图所示,花篮和气球的真实边界框的中点落在同一个单元格(单元格 a1 中):

单元格
为了避免这种情况,一种方法是使用具有更多行和列的网格,例如,19 x 19 网格。但是,增加网格单元数量仍然可能无济于事。为了解决这一问题,需要再次使用锚框,假设我们有两个锚框,一个高大于宽,另一个宽大于高。通常,锚框的中心设定为网格单元格的中心。当存在两个锚框时,每个单元格的输出表示为两个锚框预期输出的连接:

y=pc
bx
by
bw
bh
c1
c2
c3
pc
bx
by
bw
bh
c1
c2
c3

此时,因为使用了两个锚框,模型输出尺寸为 3 x 3 x 16YOLO 模型预测输出的形状为 N x N x (num_classes + 1) x (num_anchor_boxes ),其中 N x N 是网格单元数,num_classes 是数据集中的类别数,num_anchor_boxes 是每个单元格的锚框数。

(3) 定义损失函数训练模型。

在计算与模型相关的损失时,需要确保在对象置信度得分小于某个阈值(表示单元格不包含目标对象)时不计算回归损失和分类损失。如果单元格包含一个对象,我们需要确保目标对象分类尽可能准确。
如果单元格包含对象,则边界框偏移量应尽可能接近真实边界框。但是,由于宽度和高度的偏移量比中心的偏移量高得多(因为中心的偏移量范围在 01 之间,而宽度和高度的偏移量并无此限制),因此通过获取平方根值来给予宽度和高度偏移较低的权重。
计算定位和分类的损失:
L l o c = λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j [ ( x i − x ^ i ) 2 + ( y i − y ^ i ) 2 + ( w i − w ^ i ) 2 + ( h i − h ^ i ) 2 ] L c l s = ∑ i = 0 S 2 ∑ j = 0 B ( 1 i j o b j + λ ( 1 − 1 i j o b j ) ) ( C i j − C ^ i j ) 2 + ∑ i = 0 S 2 ∑ c ∈ C 1 i j o b j ( p i ( c ) − p ^ i ( c ) ) 2 L = L l o c + L c l s L_{loc}=\lambda_{coord}\sum_{i=0}^{S^2}\sum_{j=0}^{B}1_{ij}^{obj}[(x_i-\hat x_i)^2+(y_i-\hat y_i)^2+(\sqrt {w_i}-\sqrt{\hat w_i})^2+(\sqrt {h_i}-\sqrt{\hat h_i})^2] \\ L_{cls}=\sum_{i=0}^{S^2}\sum_{j=0}^{B}(1_{ij}^{obj}+\lambda(1-1_{ij}^{obj}))(C_{ij}-\hat C_{ij})^2+\sum_{i=0}^{S^2}\sum_{c∈C}1_{ij}^{obj}(p_i(c)-\hat p_i(c))^2 \\ L=L_{loc}+L_{cls} Lloc=λcoordi=0S2j=0B1ijobj[(xix^i)2+(yiy^i)2+(wi w^i )2+(hi h^i )2]Lcls=i=0S2j=0B(1ijobj+λ(11ijobj))(CijC^ij)2+i=0S2cC1ijobj(pi(c)p^i(c))2L=Lloc+Lcls

其中, λ c o o r d \lambda_{coord} λcoord 是与回归损失相关的权重, 1 i j o b j 1_{ij}^{obj} 1ijobj 表示单元格是否包含对象, p ^ i ( c ) \hat p_i(c) p^i(c) 对应于预测的类别概率, C i j C_{ij} Cij 表示对象置信度得分,总损失是分类和回归损失值的之和。

2. 实现 YOLO 目标检测

为了实现 YOLO 目标检测模型,我们使用官方的 YOLO-v4 实现来识别图像中公共汽车和卡车的位置,继续使用与 R-CNN 一节中相同的数据集,并根据我们的需要对其进行修改。

2.1 编译 DarkNet

首先,从 GitHub 获取 DarkNet 存储库并进行编译,官方 YOLOv4 模型基于 C 语言编写的,为了在 PyTorch 中使用需要进行编译。

(1) 下载 DarkNet 存储库后,重新配置 Makefile 文件,在shell中执行以下命令:

darknet-master$ sed -i 's/OPENCV=0/OPENCV=1/' Makefile
darknet-master$ sed -i 's/GPU=0/GPU=1/' Makefile
darknet-master$ sed -i 's/CUDNN=0/CUDNN=1/' Makefile
darknet-master$ sed -i 's/CUDNN_HALF=0/CUDNN_HALF=1/' Makefile

Makefile 是编译 DarkNet 所需的配置文件,使用以下标志编译 DarkNetOPENCVGPUCUDNNCUDNN_HALF,使用这些优化标志能够使模型训练速度更快。sed 函数表示流编辑器,它是一个强大的 Linux 命令,可以直接从命令提示符修改文本文件中的信息,语法为 sed 's/<search-string>/<replace-with>/' path/to/text/file,例如,使用 sed -i 's/OPENCV=0/OPENCV=1/' Makefile 能够将 OPENCV=0 替换为 OPENCV=1

(2) 编译 darknet 源码:

darknet-master$ make

(3) 下载并解压数据集,使用与 R-CNN 一节中相同的数据集。

(4) 下载预训练权重 yolov4.weights 进行样本预测。

(5) 运行以下命令测试是否安装成功:

darknet-master$ ./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights data/test.jpeg

以上代码使用由神经网络配置 cfg/yolov4.cfg 和预训练权重 yolov4.weights 构建的神经网络对 data/test.jpeg 进行预测。此外,从 cfg/coco.data 文件中获取类别,文件中包含了预训练权重的训练对象类别,示例图像 (data/test.jpeg) 预测结果如下:

预测结果

我们已经安装了 darknet,在下一节中,我们将学习如何使用自定义数据集准备训练数据以满足 YOLOv4 输入、输出需求。

2.2 设置数据集格式

YOLO 使用固定格式进行训练,利用所需格式存储图像和标签后,就可以使用自定义数据集训练 YOLO 模型。接下来,我们介绍 YOLO 训练所需的文件和文件夹结构。

(1) 使用 vim 命令在 data 文件夹中创建 obj.names

darknet-master$ vim data/obj.names

data/obj.names 文件中添加以下内容:

bus
truck

obj.names
以上代码可以创建名为 obj.names 的文件,并将 “bus” 和 “truck” 写入其中,每个类别占一行。

(2) 创建文本文件 data/obj.data

darknet-master$ vim data/obj.data

data/obj.data 文件中添加以下内容,描述数据集中的参数以及包含训练和测试图像路径的文本文件位置,以及包含对象名称的文件的位置以及要保存训练模型的文件夹:

classes = 2
train = data/train.txt
valid = data/val.txt
names = data/obj.names
backup = backup/

data/obj.data
上述文本文件的扩展名并非 .txtYOLO 使用硬编码的名称和文件夹来识别数据的位置。

(3) 将所有图像和标签数据文本文件移动到 data/obj 文件夹中:

darknet-master$ mkdir -p data/obj
darknet-master$ cp -r open-images-bus-trucks/images/* data/obj/
darknet-master$ cp -r open-images-bus-trucks/yolo_labels/all/{train,val}.txt data/
darknet-master$ cp -r open-images-bus-trucks/yolo_labels/all/labels/*.txt data/obj/

所有训练和验证图像都位于 data/obj 文件夹中,且将所需文本文件移动到同一个文件夹中。每个包含图像标签数据的文件都与图像共享相同的名称,例如,该文件夹可能包含 1001.jpg1001.txt,文本文件包含该图像中目标对象的类别标签和边界框,如果 data/train.txt 包含 1001.jpg,则它为训练图像;如果它出现在 data/val.txt 中,表示它是验证图像。
文本文件本身包含如下信息:clsxcycwh,其中 cls(xc, yc) 处宽度为 w、高度为 h 的边界框中对象的类别索引,每行都存储图像中的一个目标对象。
例如,如果宽度为 800、高度为 600 的图像包含一个卡车和一个公交车,中心点分别位于 (500,300)(100,400),且它们的宽度和高度分别为 (200,100)(300,50),那么文本文件内容如下所示:

1 0.62 0.50 0.25 0.12
0 0.12 0.67 0.38 0.08

2.3 配置网络架构

YOLO 有多种大小不同的架构配置,适用于规模大小不同的训练数据集。架构配置可以使用不同的主干网络,使用 .cfg 文件定义网络架构配置,预定义的配置文件位于存储库的 cfgs 文件夹中,每个文本文件都包含一个不同的网络架构以及网络所用的超参数,例如批大小和学习率。本节中,使用最小的可用架构 (cfg/yolov4-tiny-custom.cfg) 并根据自定义数据集配置网络架构:

# 创建现有配置的副本
darknet-master$ cp cfg/yolov4-tiny-custom.cfg cfg/yolov4-tiny-bus-trucks.cfg
# 将最大批大小修改为4000
darknet-master$ sed -i 's/max_batches = 500200/max_batches=4000/' cfg/yolov4-tiny-bus-trucks.cfg
# 每个批数据的子批数据大小
darknet-master$ sed -i 's/subdivisions=1/subdivisions=16/' cfg/yolov4-tiny-bus-trucks.cfg
# 学习率衰减
darknet-master$ sed -i 's/steps=400000,450000/steps=3200,3600/' cfg/yolov4-tiny-bus-trucks.cfg 
# 类别数修改为2
darknet-master$ sed -i 's/classes=80/classes=2/g' cfg/yolov4-tiny-bus-trucks.cfg 
# 在分类和回归头中,修改输出卷积滤波器的数量255->21、57->33
darknet-master$ sed -i 's/filters=255/filters=21/g' cfg/yolov4-tiny-bus-trucks.cfg 
darknet-master$ sed -i 's/filters=57/filters=33/g' cfg/yolov4-tiny-bus-trucks.cfg

重新调整 yolov4-tiny 架构,使其可以自定义数据集上进行训练,接下来,就可以加载预训练的权重并微调模型参数。

2.4 模型训练和测试

GitHub 中下载预训练模型权重并存储在 build/darknet/x64 中:

darknet-master$ cp yolov4-tiny.conv.29 build/darknet/x64/

训练模型:

darknet-master$ ./darknet detector train data/obj.data cfg/yolov4-tiny-bus-trucks.cfg yolov4-tiny.conv.29 -dont_show -mapLastAt

在以上代码中,使用 -dont_show 标志跳过显示中间预测图像,-mapLastAt 将定期打印验证数据的平均平均精度,权重会定期存储在备份文件夹中,并且可以在训练后用于预测。
对新图像进行预测:

darknet-master$ ./darknet detector test data/obj.data cfg/yolov4-tiny-bus-trucks.cfg backup/yolov4-tiny-bus-trucks_4000.weights open-images-bus-trucks/images/0d39f132cdf7c027.jpg

测试结果

小结

YOLO 在目标检测任务中具有显著的优势,由于整个检测过程只需要一次前向传递,因此非常高效,并且可以实现实时目标检测。此外,YOLO 通过全局感受野捕捉了整个图像中的上下文信息,对小尺寸物体的检测效果较好。在本节中,使用 darknet 实现了 YOLO 目标检测模型,并了解了如何根据需要对模型进行修改。

系列链接

PyTorch深度学习实战(1)——神经网络与模型训练过程详解
PyTorch深度学习实战(2)——PyTorch基础
PyTorch深度学习实战(3)——使用PyTorch构建神经网络
PyTorch深度学习实战(4)——常用激活函数和损失函数详解
PyTorch深度学习实战(5)——计算机视觉基础
PyTorch深度学习实战(6)——神经网络性能优化技术
PyTorch深度学习实战(7)——批大小对神经网络训练的影响
PyTorch深度学习实战(8)——批归一化
PyTorch深度学习实战(9)——学习率优化
PyTorch深度学习实战(10)——过拟合及其解决方法
PyTorch深度学习实战(11)——卷积神经网络
PyTorch深度学习实战(12)——数据增强
PyTorch深度学习实战(13)——可视化神经网络中间层输出
PyTorch深度学习实战(14)——类激活图
PyTorch深度学习实战(15)——迁移学习
PyTorch深度学习实战(16)——面部关键点检测
PyTorch深度学习实战(17)——多任务学习
PyTorch深度学习实战(18)——目标检测基础
PyTorch深度学习实战(19)——从零开始实现R-CNN目标检测
PyTorch深度学习实战(20)——从零开始实现Fast R-CNN目标检测
PyTorch深度学习实战(21)——从零开始实现Faster R-CNN目标检测

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

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

相关文章

C# 关于托管调试助手 “FatalExecutionEngineError“:“运行时遇到了错误。解决方案

托管调试助手 “FatalExecutionEngineError”:“运行时遇到了错误。此错误的地址为 0x740161f8&#xff0c;在线程 0x1174 上。错误代码为 0xc0000005。此错误可能是 CLR 中的 bug&#xff0c;或者是用户代码的不安全部分或不可验证部分中的 bug。此 bug 的常见来源包括用户对 …

手术麻醉临床信息管理系统源码,客户端可以接入监护仪、麻醉机、呼吸机

一、手术麻醉临床信息管理系统介绍 1、手术麻醉临床信息管理系统是数字化手段应用于手术过程中的重要组成部分&#xff0c;用数字形式获取并存储手术相关信息&#xff0c;既便捷又高效。既然是管理系统&#xff0c;那就是一整套流程&#xff0c;管理患者手术、麻醉的申请、审批…

【C语言】输入一个正整数,判断其是否为素数

1、素数又叫质数。素数&#xff0c;指的是“大于1的整数中&#xff0c;只能被1和这个数本身整除的数”。 2、素数也可以被等价表述成&#xff1a;“在正整数范围内&#xff0c;大于1并且只有1和自身两个约数的数”。 #include<stdio.h>int main() {int i,m;printf("…

如何实现前端社交媒体分享功能?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

如何创建前端自定义主题和样式?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

【API篇】三、Flink转换算子API

文章目录 0、demo数据1、基本转换算子&#xff1a;映射map2、基本转换算子&#xff1a;过滤filter3、基本转换算子&#xff1a;扁平映射flatMap4、聚合算子&#xff1a;按键分区keyBy5、聚合算子&#xff1a;简单聚合sum/min/max/minBy/maxBy6、聚合算子&#xff1a;归约聚合re…

深入理解Java IO流: 包括字节流和字符流的用法、文件读写实践

文章目录 &#x1f4d5;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作者、产品软文创造者、技术文章评审老师、问卷调查设计师、个人社区创始人、开源项目贡献者。&#x1f30e;跑过十五…

CCF ChinaSoft 2023 论坛巡礼|形式验证@EDA论坛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

【Proteus仿真】【STM32单片机】路灯控制系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用LCD1602显示模块、人体红外传感器、光线检测模块、路灯继电器控制等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示时间、工作模…

SpringMVC - 详解RESTful

文章目录 1. 简介2. RESTful的实现3.HiddenHttpMethodFilter4. RESTful案例1、准备工作2、功能清单3、具体功能&#xff1a;访问首页a>配置view-controllerb>创建页面 4、具体功能&#xff1a;查询所有员工数据a>控制器方法b>创建employee_list.html 5、具体功能&a…

游戏设计模式专栏(十一):在Cocos游戏开发中运用享元模式

点击上方亿元程序员关注和★星标 引言 大家好&#xff0c;我是亿元程序员&#xff0c;一位有着8年游戏行业经验的主程。 本系列是《和8年游戏主程一起学习设计模式》&#xff0c;让糟糕的代码在潜移默化中升华&#xff0c;欢迎大家关注分享收藏订阅。 享元模式&#xff08…

Linux常用命令——colrm命令

在线Linux命令查询工具 colrm 删除文件中的指定列 补充说明 colrm命令用于删除文件中的指定列。colrm命令从标准输入设备读取书记&#xff0c;转而输出到标准输出设备。如果不加任何参数&#xff0c;则colrm命令不会过滤任何一行。 语法 colrm(参数)参数 起始列号&#…

使用Python找到相似图片的方法

使用Python找到相似图片的方法 作者&#xff1a;安静到无声 个人主页 摘要&#xff1a;在日常生活中&#xff0c;我们可能会遇到需要查找相似图片的情况。例如&#xff0c;我们可能有一张图片&#xff0c;并希望找到文件夹中与该图片相似的其他图片。本文将介绍如何使用Pytho…

二分法求多项式单根

输出格式&#xff1a; 在一行中输出该多项式在该区间内的根&#xff0c;精确到小数点后2位。 输入样例&#xff1a; 3 -1 -3 1 -0.5 0.5 输出样例&#xff1a; 0.33 idea 精确到小数点后两位 >阈值为0.001 solution1 #include <stdio.h> #include <math.h…

黑豹程序员-架构师学习路线图-百科:SpringBoot

文章目录 1、什么是SpringBoot&#xff1f;2、SpringBoot发展史3、为什么我们要使用SpringBoot 1、什么是SpringBoot&#xff1f; Spring Boot是一个用于创建独立的、基于Spring框架的Java应用程序的开源框架。 Spring Boot简化了Spring应用程序的开发和部署&#xff0c;使开发…

Java linux 部署命令

Java linux 部署命令 参考&#xff1a; nohup java -jar -Dspring.profiles.activetest businessIntegration-v2.0.0.jar & cd /var/www/datasync/backend/test 上传jar包 businessintegrationdatasynctask-v1.0.0.jar nohup java -jar -Dspring.profiles.activetest…

分位数损失和分位数回归

分位数损失和分位数回归 了解如何调整回归算法来预测数据的任何分位数 维亚切斯拉夫埃菲莫夫 跟随 出版于 走向数据科学 6 分钟阅读 1月29日 65 1 一、说明 右退出是一项机器学习任务&#xff0c;其目标是根据一组特征向量预测真实值。存在多种回归算法&#xff1a;线性回归…

(2023|AAAI,MS-VQGAN,分层扩散,PyU-Net,粗到细调制)Frido:用于复杂场景图像合成的特征金字塔扩散

Frido: Feature Pyramid Diffusion for Complex Scene Image Synthesis 公众号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 基础 3. 方法 3.1 学习多尺度感知潜在 …

Blizzard Battle 上使用代理

要在 Blizzard Battle 上使用代理设置&#xff0c;首先需要确保您已经安装了 Blizzard 游戏客户端。下面是一个详细的教程&#xff0c;将带您完成代理设置&#xff1a; 打开 Blizzard 游戏客户端。 在顶部菜单栏中&#xff0c;点击“设置”&#xff08;即齿轮图标&#xff09;…

远程开户身份证识别OCR技术:革新传统流程,实现高效身份验证

远程开户是指通过互联网或其他远程通信方式&#xff0c;不需要亲自前往银行、证券公司或其他金融机构的实体营业网点&#xff0c;即可完成开立账户和办理相关服务的过程。 相比传统柜台开户方式&#xff0c;远程开户具有更高的便利性和灵活性。它使得用户可以随时随地通过网络…