1.32、 基于区域卷积神经网络(R-CNN)的停车标志检测(matlab)

1、基于区域卷积神经网络(R-CNN)的停车标志检测原理及流程

基于区域卷积神经网络(R-CNN)的停车标志检测原理及流程如下:

  1. 原理: R-CNN 是一种用于目标检测的深度学习模型,其核心思想是首先在输入图像中提取出候选区域(Region Proposal),然后对提取的候选区域进行卷积神经网络(CNN)特征提取和目标分类。

  2. 流程

    • 候选区域提取:首先使用选择性搜索(Selective Search)等算法从输入图像中提取出多个候选区域,这些候选区域可能包含潜在的目标。
    • 特征提取:对每个候选区域进行裁剪和缩放,然后使用预训练的卷积神经网络(如VGG、ResNet等)提取特征。
    • 目标分类:将提取的特征输入到一个支持向量机(SVM)分类器中,用于判断每个候选区域中是否包含停车标志。
    • 回归框:对被分类为停车标志的候选区域进行回归操作,将其位置优化。
    • 非极大值抑制:对重叠的候选区域进行非极大值抑制,保留得分最高的停车标志框。
  3. 训练: 在训练阶段,需要构建一个包含标注停车标志框的训练数据集。利用这些训练样本,通过监督学习的方式训练R-CNN模型,使其能够准确地检测停车标志。

  4. 评估和调优: 在训练完成后,需要对R-CNN模型进行评估,可以通过精度、召回率等指标评估模型的性能,并根据需要对模型进行调优以提高检测准确率。

R-CNN 基于候选区域的思想,能够准确地定位和识别输入图像中的目标物体。停车标志检测作为目标检测的一个应用场景,使用R-CNN可以有效地检测出图像中的停车标志,有助于自动驾驶、智能交通等领域的应用。

2、基于区域卷积神经网络(R-CNN)的停车标志检测说明

训练用于检测停车标志的 R-CNN 目标检测器

R-CNN 是一个目标检测框架,它使用卷积神经网络 (CNN) 对图像中的图像区域进行分类

R-CNN 检测器不使用滑动窗对每个区域进行分类,而是只处理那些可能包含对象的区域。这大幅降低了运行 CNN 时的计算成本。

使用 CIFAR-10 数据集对一个 CNN 进行预训练,该数据集有 50,000 个训练图像。然后,只使用 41 个训练图像针对停车标志检测对这个预训练的 CNN 进行微调。如果没有预训练 CNN,训练停车标志检测器会需要更多图像。

3、下载 CIFAR-10 图像数据

1)将 CIFAR-10 数据下载到一个临时目录

实现代码

cifar10Data = tempdir;
url = 'https://www.cs.toronto.edu/~kriz/cifar-10-matlab.tar.gz';
helperCIFAR10Data.download(url,cifar10Data);

2)加载 CIFAR-10 训练和测试数据

实现代码

[trainingImages,trainingLabels,testImages,testLabels] = helperCIFAR10Data.load(cifar10Data);

3)每个图像参数

实现代码

size(trainingImages)

4)CIFAR-10 有 10 个图像类别

实现代码

numImageCategories = 10;
categories(trainingLabels)

4、创建卷积神经网络 (CNN)

1)创建网络

CNN 由一系列层组成,每层定义一项特定计算

imageInputLayer - 图像输入层

convolution2dLayer - 卷积神经网络的二维卷积层

reluLayer - 修正线性单元 (ReLU) 层

maxPooling2dLayer - 最大池化层

fullyConnectedLayer - 全连接层

softmaxLayer- Softmax 层

classificationLayer - 神经网络的分类输出层

实现代码

[height,width,numChannels, ~] = size(trainingImages);imageSize = [height width numChannels];
inputLayer = imageInputLayer(imageSize)

2)定义网络的中间层

中间层包含多个由卷积层、ReLU(修正线性单元)层和池化层组成的重复模块。

 这三个层构成卷积神经网络的核心构建模块。卷积层定义滤波器权重集,这些权重集在网络训练期间会更新。

ReLU 层在网络中引入非线性,让网络能够逼近非线性函数,这些函数将图像像素映射到图像语义内容。池化层在数据流经网络时对其进行下采样。

 在具有许多层的网络中,应谨慎使用池化层,以避免过早对网络中的数据进行下采样。

实现代码

filterSize = [5 5];
numFilters = 32;middleLayers = [
convolution2dLayer(filterSize,numFilters,'Padding',2)
reluLayer()
maxPooling2dLayer(3,'Stride',2)
convolution2dLayer(filterSize,numFilters,'Padding',2)
reluLayer()
maxPooling2dLayer(3, 'Stride',2)convolution2dLayer(filterSize,2 * numFilters,'Padding',2)
reluLayer()
maxPooling2dLayer(3,'Stride',2)
]

3)CNN 的最终层

CNN 的最终层通常包括全连接层和 softmax 损失层。

实现代码

finalLayers = [fullyConnectedLayer(64)reluLayer
fullyConnectedLayer(numImageCategories)softmaxLayer
classificationLayer
]

4)对输入层、中间层和最终层进行合并

实现代码

layers = [inputLayermiddleLayersfinalLayers]

5)初始化权重

使用标准差为 0.0001 的正态分布随机数初始化第一个卷积层的权重。这有助于改善训练的收敛性。

实现代码

layers(2).Weights = 0.0001 * randn([filterSize numChannels numFilters]);

5、训练CNN

1)使用 trainingOptions 函数设置网络训练算法

网络训练算法使用具有动量的随机梯度下降 (SGDM),初始学习率为 0.001。

在训练期间,初始学习率每 8 轮降低一次(1 轮定义为对整个训练数据集进行一次完整遍历)。训练算法运行 40 轮。

实现代码

opts = trainingOptions('sgdm', ...'Momentum', 0.9, ...'InitialLearnRate', 0.001, ...'LearnRateSchedule', 'piecewise', ...'LearnRateDropFactor', 0.1, ...'LearnRateDropPeriod', 8, ...'L2Regularization', 0.004, ...'MaxEpochs', 40, ...'MiniBatchSize', 128, ...'Verbose', true);

2) 使用 trainNetwork 函数训练网络

实现代码

doTraining = false;if doTraining    % Train a network.cifar10Net = trainNetwork(trainingImages, trainingLabels, layers, opts);
else% Load pre-trained detector for the example.load('rcnnStopSigns.mat','cifar10Net')       
end

6、验证 CIFAR-10 网络训练

1)可视化第一个卷积层

快速可视化第一个卷积层的滤波器权重有助于识别训练中的任何直接问题

实现代码

w = cifar10Net.Layers(2).Weights;
% rescale the weights to the range [0, 1] for better visualization
w = rescale(w);
figure
montage(w)

2)使用 CIFAR-10 测试数据来测量网络的分类准确度

实现代码

YTest = classify(cifar10Net, testImages);% Calculate the accuracy.
accuracy = sum(YTest == testLabels)/numel(testLabels)

 视图效果

7、加载训练数据

1)加载停车标志的真实值数据

实现代码

% Load the ground truth data
data = load('stopSignsAndCars.mat', 'stopSignsAndCars');
stopSignsAndCars = data.stopSignsAndCars;% Update the path to the image files to match the local file system
visiondata = fullfile(toolboxdir('vision'),'visiondata');
stopSignsAndCars.imageFilename = fullfile(visiondata, stopSignsAndCars.imageFilename);% Display a summary of the ground truth data
summary(stopSignsAndCars)

2)数据标签

实现代码

stopSigns = stopSignsAndCars(:, {'imageFilename','stopSign'});% Display one training image and the ground truth bounding boxes
I = imread(stopSigns.imageFilename{1});
I = insertObjectAnnotation(I,'Rectangle',stopSigns.stopSign{1},'stop sign','LineWidth',8);figure
imshow(I)

视图效果

 

8、训练 R-CNN 停车标志检测器

实现代码

doTraining = false;if doTraining% Set training optionsoptions = trainingOptions('sgdm', ...'MiniBatchSize', 128, ...'InitialLearnRate', 1e-3, ...'LearnRateSchedule', 'piecewise', ...'LearnRateDropFactor', 0.1, ...'LearnRateDropPeriod', 100, ...'MaxEpochs', 100, ...'Verbose', true);% Train an R-CNN object detector. This will take several minutes.    rcnn = trainRCNNObjectDetector(stopSigns, cifar10Net, options, ...'NegativeOverlapRange', [0 0.3], 'PositiveOverlapRange',[0.5 1])
else% Load pre-trained network for the example.load('rcnnStopSigns.mat','rcnn')       
end

9、测试 R-CNN 停车标志检测器

1)对测试图像试用该检测器

实现代码

% Read test image
testImage = imread('stopSignTest.jpg');% Detect stop signs
[bboxes,score,label] = detect(rcnn,testImage,'MiniBatchSize',128)

2)R-CNN 对象 detect (Computer Vision Toolbox) 方法返回每个检测的对象边界框、检测分数和类标签

实现代码

[score, idx] = max(score);bbox = bboxes(idx, :);
annotation = sprintf('%s: (Confidence = %f)', label(idx), score);outputImage = insertObjectAnnotation(testImage, 'rectangle', bbox, annotation);figure
imshow(outputImage)

视图效果 

10、总结

基于区域卷积神经网络(R-CNN)的停车标志检测在 MATLAB 中实现的总结如下:

  1. 数据准备

    • 准备包含停车标志和其对应标注框的训练数据集和测试数据集。
    • 可以使用 MATLAB 的图像标注工具进行标注,并将标注信息保存为MATLAB数据格式。
  2. 模型构建

    • 使用MATLAB内置的卷积神经网络工具箱构建R-CNN模型,包括候选区域提取、特征提取、目标分类和位置回归等模块。
    • 在模型中集成先前训练好的卷积神经网络作为特征提取器。
  3. 训练模型

    • 利用训练数据集对R-CNN模型进行训练,包括特征提取、目标分类和位置回归这几个阶段。
    • 可以使用MATLAB深度学习工具箱提供的训练接口和函数来进行模型的训练。
  4. 评估模型

    • 使用测试数据集对训练好的R-CNN模型进行评估,评估指标包括准确率、召回率、F1分数等。
    • 可以通过混淆矩阵等方式分析模型的性能。
  5. 应用模型

    • 在实际应用中,使用训练好的R-CNN模型对输入图像进行停车标志检测。
    • 可以将检测到的停车标志框标注在图像上,或者输出检测结果的位置和类别信息。

总体而言,利用 MATLAB 中的深度学习工具箱和图像处理工具箱,可以比较方便地实现基于R-CNN的停车标志检测。通过合理的数据准备、模型构建、训练和评估流程,可以开发出准确、高效的停车标志检测系统。

11、源代码

代码

%% 基于区域卷积神经网络(R-CNN)的停车标志检测
%训练用于检测停车标志的 R-CNN 目标检测器
%R-CNN 是一个目标检测框架,它使用卷积神经网络 (CNN) 对图像中的图像区域进行分类
%R-CNN 检测器不使用滑动窗对每个区域进行分类,而是只处理那些可能包含对象的区域。这大幅降低了运行 CNN 时的计算成本。
%使用 CIFAR-10 数据集对一个 CNN 进行预训练,该数据集有 50,000 个训练图像。然后,只使用 41 个训练图像针对停车标志检测对这个预训练的 CNN 进行微调。如果没有预训练 CNN,训练停车标志检测器会需要更多图像。
%% 下载 CIFAR-10 图像数据
%将 CIFAR-10 数据下载到一个临时目录
cifar10Data = tempdir;
url = 'https://www.cs.toronto.edu/~kriz/cifar-10-matlab.tar.gz';
helperCIFAR10Data.download(url,cifar10Data);
%加载 CIFAR-10 训练和测试数据
[trainingImages,trainingLabels,testImages,testLabels] = helperCIFAR10Data.load(cifar10Data);
%每个图像是一个 32×32 RGB 图像,共有 50,000 个训练样本
size(trainingImages)
%CIFAR-10 有 10 个图像类别
numImageCategories = 10;
categories(trainingLabels)
%% 创建卷积神经网络 (CNN)
%CNN 由一系列层组成,每层定义一项特定计算
%imageInputLayer - 图像输入层
%convolution2dLayer - 卷积神经网络的二维卷积层
%reluLayer - 修正线性单元 (ReLU) 层
%maxPooling2dLayer - 最大池化层
%fullyConnectedLayer - 全连接层
%softmaxLayer- Softmax 层
%classificationLayer - 神经网络的分类输出层
[height,width,numChannels, ~] = size(trainingImages);imageSize = [height width numChannels];
inputLayer = imageInputLayer(imageSize)
%定义网络的中间层。
%中间层包含多个由卷积层、ReLU(修正线性单元)层和池化层组成的重复模块。
% 这三个层构成卷积神经网络的核心构建模块。卷积层定义滤波器权重集,这些权重集在网络训练期间会更新。
% ReLU 层在网络中引入非线性,让网络能够逼近非线性函数,这些函数将图像像素映射到图像语义内容。池化层在数据流经网络时对其进行下采样。
% 在具有许多层的网络中,应谨慎使用池化层,以避免过早对网络中的数据进行下采样。
filterSize = [5 5];
numFilters = 32;middleLayers = [
convolution2dLayer(filterSize,numFilters,'Padding',2)
reluLayer()
maxPooling2dLayer(3,'Stride',2)
convolution2dLayer(filterSize,numFilters,'Padding',2)
reluLayer()
maxPooling2dLayer(3, 'Stride',2)convolution2dLayer(filterSize,2 * numFilters,'Padding',2)
reluLayer()
maxPooling2dLayer(3,'Stride',2)
]%CNN 的最终层通常包括全连接层和 softmax 损失层。
finalLayers = [fullyConnectedLayer(64)reluLayer
fullyConnectedLayer(numImageCategories)softmaxLayer
classificationLayer
]
%对输入层、中间层和最终层进行合并
layers = [inputLayermiddleLayersfinalLayers]
%初始化第一个卷积层的权重
%使用标准差为 0.0001 的正态分布随机数初始化第一个卷积层的权重。这有助于改善训练的收敛性。
layers(2).Weights = 0.0001 * randn([filterSize numChannels numFilters]);
%% 训练CNN
%使用 trainingOptions 函数设置网络训练算法
%网络训练算法使用具有动量的随机梯度下降 (SGDM),初始学习率为 0.001。
% 在训练期间,初始学习率每 8 轮降低一次(1 轮定义为对整个训练数据集进行一次完整遍历)。训练算法运行 40 轮。
opts = trainingOptions('sgdm', ...'Momentum', 0.9, ...'InitialLearnRate', 0.001, ...'LearnRateSchedule', 'piecewise', ...'LearnRateDropFactor', 0.1, ...'LearnRateDropPeriod', 8, ...'L2Regularization', 0.004, ...'MaxEpochs', 40, ...'MiniBatchSize', 128, ...'Verbose', true);
%使用 trainNetwork 函数训练网络
doTraining = false;if doTraining    % Train a network.cifar10Net = trainNetwork(trainingImages, trainingLabels, layers, opts);
else% Load pre-trained detector for the example.load('rcnnStopSigns.mat','cifar10Net')       
end
%% 验证 CIFAR-10 网络训练
%可视化第一个卷积层
%快速可视化第一个卷积层的滤波器权重有助于识别训练中的任何直接问题
w = cifar10Net.Layers(2).Weights;% rescale the weights to the range [0, 1] for better visualization
w = rescale(w);figure
montage(w)%使用 CIFAR-10 测试数据来测量网络的分类准确度
YTest = classify(cifar10Net, testImages);% Calculate the accuracy.
accuracy = sum(YTest == testLabels)/numel(testLabels)
%% 加载训练数据
%加载停车标志的真实值数据
% Load the ground truth data
data = load('stopSignsAndCars.mat', 'stopSignsAndCars');
stopSignsAndCars = data.stopSignsAndCars;% Update the path to the image files to match the local file system
visiondata = fullfile(toolboxdir('vision'),'visiondata');
stopSignsAndCars.imageFilename = fullfile(visiondata, stopSignsAndCars.imageFilename);% Display a summary of the ground truth data
summary(stopSignsAndCars)
% 数据标签
stopSigns = stopSignsAndCars(:, {'imageFilename','stopSign'});% Display one training image and the ground truth bounding boxes
I = imread(stopSigns.imageFilename{1});
I = insertObjectAnnotation(I,'Rectangle',stopSigns.stopSign{1},'stop sign','LineWidth',8);figure
imshow(I)
%% 训练 R-CNN 停车标志检测器
%使用 trainRCNNObjectDetector (Computer Vision Toolbox) 训练 R-CNN 目标检测器
doTraining = false;if doTraining% Set training optionsoptions = trainingOptions('sgdm', ...'MiniBatchSize', 128, ...'InitialLearnRate', 1e-3, ...'LearnRateSchedule', 'piecewise', ...'LearnRateDropFactor', 0.1, ...'LearnRateDropPeriod', 100, ...'MaxEpochs', 100, ...'Verbose', true);% Train an R-CNN object detector. This will take several minutes.    rcnn = trainRCNNObjectDetector(stopSigns, cifar10Net, options, ...'NegativeOverlapRange', [0 0.3], 'PositiveOverlapRange',[0.5 1])
else% Load pre-trained network for the example.load('rcnnStopSigns.mat','rcnn')       
end
%% 测试 R-CNN 停车标志检测器
%对测试图像试用该检测器
% Read test image
testImage = imread('stopSignTest.jpg');% Detect stop signs
[bboxes,score,label] = detect(rcnn,testImage,'MiniBatchSize',128)
%R-CNN 对象 detect (Computer Vision Toolbox) 方法返回每个检测的对象边界框、检测分数和类标签
[score, idx] = max(score);bbox = bboxes(idx, :);
annotation = sprintf('%s: (Confidence = %f)', label(idx), score);outputImage = insertObjectAnnotation(testImage, 'rectangle', bbox, annotation);figure
imshow(outputImage)

工程文件

https://download.csdn.net/download/XU157303764/89538510

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

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

相关文章

springboot3 web

springboot web配置 springboot web的配置有: SpringMvc配置的前缀为:spring.mvcweb场景的通用配置为:spring.web文件上传的配置为:spring.servlet.multipart服务器相关配置为:server 接管SpringMVC 的三种方式 方…

对LinkedList和链表的理解

一.ArrayList的缺陷 二.链表 三.链表部分相关oj面试题 四.LinkedList的模拟实现 五.LinkedList的使用 六.ArrayList和LinkedList的区别 一.ArrayList的缺陷: 1. ArrayList底层使用 数组 来存储元素,如果不熟悉可以来再看看: ArrayList与顺序表-CSDN…

2024年7月13日全国青少年信息素养大赛Python复赛小学高年级组真题

第一题 题目描述 握情况。他决定让每个人输入一个正整数 N (0≤N≤1000),然后计算并输出(5*N)的值。请用 在一个神秘的王国里,国王希望通过一个简单的测试来评估他的子民对基 础数学运算的掌 Python 编写程序,程序执行后要求用户输入一个正…

Hash表(C++)

本篇将会开始介绍有关于 unordered_map 和 unordered_set 的底层原理,其中底层实现其实就是我们的 Hash 表,本篇将会讲解两种 Hash 表,其中一种为开放定址法,另一种为 hash 桶,在unordered_map 和 unordered_set 的底层…

智驭未来:人工智能与目标检测的深度交融

在科技日新月异的今天,人工智能(AI)如同一股不可阻挡的浪潮,正以前所未有的速度重塑着我们的世界。在众多AI应用领域中,目标检测以其独特的魅力和广泛的应用前景,成为了连接现实与智能世界的桥梁。本文旨在…

20240715 每日AI必读资讯

🌐 代号“ 草莓 ”,OpenAI 被曝研发新项目:将 AI 推理能力提至新高度 - OpenAI 公司被曝正在研发代号为“ 草莓 ”的全新项目,进一步延伸去年 11 月宣布的 Q* 项目,不断提高 AI 推理能力,让其更接近人类的…

基于Java的休闲娱乐代理售票系统

你好,我是专注于Java开发的码农小野!如果你对系统开发感兴趣,欢迎私信交流。 开发语言:Java 数据库:MySQL 技术:Java技术、SpringBoot框架、B/S架构 工具:Eclipse IDE、MySQL数据库管理工具…

牛客小白月赛98 (个人题解)(补全)

前言: 昨天晚上自己一个人打的小白月赛(因为准备数学期末已经写烦了),题目难度感觉越来越简单了(不在像以前一样根本写不了一点,现在看题解已经能看懂一点了),能感受到自己在不断进步…

2024年是不是闰年?

闰年的由来 闰年的概念最早可以追溯到古罗马时期的朱利叶斯凯撒。当时的罗马历法是根据太阳年来制定的,每年大约有365.25天。为了使日历与季节保持同步,人们需要定期插入一个额外的日子。朱利叶斯凯撒在公元前46年颁布了一项法令,规定每四年增…

SAP PP学习笔记26 - User Status(用户状态)的实例,订单分割中的重要概念 成本收集器,Confirmation(报工)的概述

上面两章讲了生产订单的创建以及生产订单的相关内容。 SAP PP学习笔记24 - 生产订单(制造指图)的创建_sap 工程外注-CSDN博客 SAP PP学习笔记25 - 生产订单的状态管理(System Status(系统状态)/User Status(用户状态)),物料的可用性检查,生…

最长下降序列

如何理解这个题目呢,我们可以每个人的分数放到排名上&#xff0c;然后求解最长下降序列即可 #include<bits/stdc.h> using namespace std;int n; const int N (int)1e5 5; int a[N]; int b[N]; int d[N]; int dp[N]; int t;int main() {cin >> t;while (t--) {…

Apache Hadoop之历史服务器日志聚集配置

上篇介绍绍了Apache Hadoop的分布式集群环境搭建&#xff0c;并测试了MapReduce分布式计算案例。但集群历史做了哪些任务&#xff0c;任务执行日志等信息还需要配置历史服务器和日志聚集才能更好的查看。 配置历史服务器 在Yarn中运行的任务产生的日志数据不能查看&#xff0…

【计算机毕业设计】013新闻资讯微信小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Python数据分析案例51——基于K均值的客户聚类分析可视化

案例背景 本次案例带来的是最经典的K均值聚类&#xff0c;对客户进行划分类别的分析&#xff0c;其特点是丰富的可视化过程。这个经典的小案例用来学习或者课程作业在合适不过了。 数据介绍 数据集如下: 客户的编码&#xff0c;性别&#xff0c;年龄&#xff0c;年收入&#…

Vue2-集成路由Vue Router介绍与使用

文章目录 路由&#xff08;Vue2&#xff09;1. SPA 与前端路由2. vue-router基本使用创建路由组件声明路由链接和占位标签创建路由模块挂载路由模块 3. vue-router进阶路由重定向嵌套路由动态路由编程式导航导航守卫 本篇小结 更多相关内容可查看 路由&#xff08;Vue2&#xf…

安全防御----防火墙综合实验2

安全防御----防火墙综合实验2 一、题目 二、实验要求&#xff1a; 1&#xff0c;DMZ区内的服务器&#xff0c;办公区仅能在办公时间内&#xff08;9&#xff1a;00 - 18&#xff1a;00&#xff09;可以访问&#xff0c;生产区的设备全天可以访问. 2&#xff0c;生产区不允许访…

雷赛运动控制卡编程(1)

一、运动控制卡选择 电气常用知识-CSDN博客 如下旋转控制卡 DMC3800八轴高性能点位卡 - 东莞市雅恰达机电有限公司 轴少的时候选择脉冲系列卡 轴多的话就选总线型系列控制卡 样品 架构&#xff1a; 二、 添加文件 dll 添加接口文件 【最全&#xff0c;带注释版】雷赛运动…

OpenCV中使用Canny算法在图像中查找边缘

操作系统&#xff1a;ubuntu22.04OpenCV版本&#xff1a;OpenCV4.9IDE:Visual Studio Code编程语言&#xff1a;C11 算法描述 Canny算法是一种广泛应用于计算机视觉和图像处理领域中的边缘检测算法。它由John F. Canny在1986年提出&#xff0c;旨在寻找给定噪声条件下的最佳边…

Python+wxauto=微信自动化?

Pythonwxauto微信自动化&#xff1f; 一、wxauto库简介 1.什么是wxauto库 wxauto是一个基于UIAutomation的开源Python微信自动化库。它旨在帮助用户通过编写Python脚本&#xff0c;轻松实现对微信客户端的自动化操作&#xff0c;从而提升效率并满足个性化需求。这一工具的出现&…

详细分析Sql Server中的declare基本知识

目录 前言1. 基本知识2. Demo3. 拓展Mysql4. 彩蛋 前言 实战探讨主要来源于触发器的Demo 1. 基本知识 DECLARE 语句用于声明变量 声明的变量可以用于存储临时数据&#xff0c;并在 SQL 查询中多次引用 声明变量&#xff1a;使用 DECLARE 语句声明一个或多个变量变量命名&a…