基于深度神经网络的图像分类与训练系统(MATLAB GUI版,代码+图文详解)

news2024/11/17 7:51:54

摘要:本博客详细介绍了基于深度神经网络的图像分类与训练系统的MATLAB实现代码,包括GUI界面和数据集,可选择模型进行图片分类,支持一键训练神经网络。首先介绍了基于GoogleNet、ResNet进行图像分类的背景、意义,系统研究现状及相关算法。然后展示了系统的界面演示效果,包括选择图片分类、选择文件夹批量识别、更换不同网络模型和通过界面选择数据集一键训练模型等功能。强调了GUI界面的设计和实现,使得用户可以直观、方便地完成图像分类和模型训练任务。接着,详细介绍了神经网络训练的过程,包括训练代码、训练曲线和模型评估结果。在第四节中,我们讲述了系统实现的两个部分:预测部分和训练部分,结合GUI界面给出了设计框架和实现。最后,对整个博客的内容进行了总结,并提出了一些潜在的改进方向和挑战,以期推动图像分类技术的发展和进步。

文章目录

  • 1. 引言
  • 2. 系统界面演示效果
  • 3. 神经网络训练
  • 4. 系统实现
  • 5. 总结与展望
  • 下载链接
  • 6. 总结与展望
  • 参考文献

基于深度神经网络的图像分类与训练系统演示与介绍(MATLAB GUI版)

➷点击跳转至文末所有涉及的完整代码文件下载页☇


1. 引言

        撰写这篇博客的初衷是分享YOLOv5目标检测算法的实现与应用,为大家提供实践指南。感谢粉丝们的支持。我们鼓励读者深入理解背后原理,发挥创造力,进行探索与尝试,而不是简单地套用现成的解决方案。期待在未来的技术交流中,共同进步与成长。本博客内容为博主原创,相关引用和参考文献我已在文中标注,考虑到可能会有相关研究人员莅临指导,博主的博客这里尽可能以学术期刊的格式撰写,如需参考可引用本博客格式如下:

[1] 思绪无限. 基于深度神经网络的图像分类与训练系统(MATLAB GUI版,代码+图文详解)[J/OL]. CSDN, 2023.05. https://wuxian.blog.csdn.net/article/details/130469122.
[2] Suxu Wu. (2023, May). Image classification and training system based on deep neural networks (MATLAB GUI version, with code and detailed explanation) [J/OL]. CSDN. https://wuxian.blog.csdn.net/article/details/130469122

        图像分类作为计算机视觉领域的一个重要问题,随着深度学习技术的快速发展,已经取得了显著的进展。卷积神经网络(CNN)模型被广泛应用于图像分类任务中,如GoogleNet(Szegedy et al., 2015)和ResNet(He et al., 2016)。GoogleNet的主要贡献是提出了Inception模块,通过多尺度卷积操作来增加网络的宽度(Szegedy et al., 2015)。ResNet则采用了残差连接,通过跨层连接的方式解决了深度网络的梯度消失问题,从而使网络可以加深(He et al., 2016)。这些卷积神经网络在多个知名数据集上取得了显著成果,如ImageNet(Deng et al., 2009)和CIFAR-10(Krizhevsky, 2009)。ImageNet是一个大规模视觉识别数据集,包含超过1400万张图片,涵盖了2万多个类别(Deng et al., 2009)。CIFAR-10则是一个小规模数据集,包含60000张32x32像素的彩色图片,分为10个类别(Krizhevsky, 2009)。

        除了GoogleNet和ResNet,还有其他卷积神经网络模型在图像分类任务中取得了较好的成绩。例如,VGGNet(Simonyan and Zisserman, 2014)通过使用更小的卷积核(3x3)和更深的网络结构提高了分类性能。DenseNet(Huang et al., 2017)则引入了密集连接,将每一层的特征图与后续所有层进行连接,提高了信息流动性。为了更好地理解卷积神经网络的内部特征,Zeiler和Fergus(2014)提出了一种反卷积网络(DeconvNet),用于可视化各层的特征图。此外,为了防止过拟合,Hinton等人(2012)提出了Dropout方法;为了加速训练过程,Ioffe和Szegedy(2015)提出了Batch Normalization技术。

        本博客的目的是介绍一种基于深度神经网络的图像分类与训练系统,该系统使用MATLAB实现,并提供友好的图形用户界面,方便用户在不同的网络模型和数据集上进行实验。本博客的贡献点如下:

  1. 提供一个基于MATLAB的图像分类与训练系统,支持多种卷积神经网络模型,如GoogleNet和ResNet。
  2. 系统提供友好的图形用户界面,支持选择图片分类、选择文件夹批量识别、更换不同网络模型等功能。
  3. 系统可以通过界面选择数据集进行训练,并给出训练曲线和模型评估结果。

2. 系统界面演示效果

        在本节中,我们将介绍系统的图形用户界面(GUI)及其功能。该界面允许用户执行以下操作:

(1)选择图片分类:用户可以选择一张图片,系统将根据预训练的卷积神经网络模型对其进行分类,并显示预测结果。

在这里插入图片描述

(2)选择文件夹批量识别:用户可以选择一个文件夹,系统将对文件夹中的所有图片进行分类,并在预测完成后生成一个包含结果的列表和可视化展示。

在这里插入图片描述

(3)更换不同网络模型:用户可以在GoogleNet和ResNet等预训练模型之间进行切换,以便在不同模型上进行实验。

在这里插入图片描述

通过界面选择数据集训练一键训练模型:用户可以选择一个自定义的数据集文件夹,系统将自动训练一个新的卷积神经网络模型,并显示训练过程中的损失和准确率曲线。

在这里插入图片描述


3. 神经网络训练

        在这一节详细阐述如何使用MATLAB实现基于ResNet-50的图像分类模型的训练过程。这里详细解释每个代码段的作用,以便于读者更好地理解模型的训练过程。

        首先进行一些准备工作,包括清空MATLAB的环境变量、设置随机数生成器的种子以保证结果的可重复性、获取当前脚本所在的目录并将工作目录切换到该目录。这些操作有助于确保代码可以在不同的计算机上顺利运行。

clear
clc
rng default  % 保证结果运行一致
mpath = matlab.desktop.editor.getActiveFilename; % 程序所在目录
[pathstr,~]=fileparts(mpath);
cd(pathstr); % 自动切换至程序所在目录

        接下来,我们需要加载数据集,首先指定图像数据所在的目录。然后,使用checkDataset函数对数据集进行检查,以确保数据集中不存在灰度图像或二值图像。如果发现这些图像,就将它们从数据集中删除。使用每个子文件夹的名称作为图像的标签,以便于后续的训练和分类任务。

imgDir = fullfile("./10_ObjectCategories/");
file_list = checkDataset(imgDir);  % 执行数据集检查
if isempty(file_list)
    disp('未检查到灰度图或二值图')
else
    disp('检查到灰度图或二值图, 以下文件已被删除')
    disp(file_list)
end
dataSet = imageDatastore(imgDir, 'IncludeSubfolders', true, 'LabelSource', 'foldernames');
trainSetDetail = countEachLabel(dataSet) % 训练数据

在这里插入图片描述

        数据集加载完成后,我们需要将其划分为训练集、验证集和测试集。这里采用随机划分的方法,将60%的数据作为训练集,20%的数据作为验证集,剩下的20%作为测试集。通过这种方式,可以确保模型在不同类型的数据上都能得到充分的训练和有效的评估。

[imdsTrain,imdsValidation, imdsTest] = splitEachLabel(dataSet, 0.6, 0.2, 'randomize');  % 划分数据集

        为了直观展示训练数据,我们随机选择16个训练样本并将它们显示在一个图像中。这有助于了解数据集的大致情况和图像样本的特点。

numTrainImages = numel(imdsTrain.Labels);
idx = randperm(numTrainImages,16);
figure
for i = 1:16
    subplot(4,4,i)
    I = readimage(imdsTrain,idx(i));
    imshow(I)
    title(imdsTrain.Labels(idx(i)))
end

在这里插入图片描述

        然后,我们需要加载一个预训练的ResNet-50模型。ResNet-50是一个具有50层的深度卷积神经网络,已在大型数据集上进行了预训练。通过使用预训练的模型,可以利用在其他数据集上学到的特征来加速训练过程并提高模型性能。

net = resnet50;
layers = net.Layers
inputSize = net.Layers(1).InputSize  % 网络输入尺寸

        加载预训练模型后,需要对其进行一些修改以适应分类任务。首先,需要替换模型中的全连接层,以适应数据集中的类别数量。接下来,需要替换模型中的分类层,使其与我们的任务相对应。这里采用新的全连接层和分类层来实现这一目的。

lgraph = layerGraph(net); 
newLearnableLayer = fullyConnectedLayer(numClasses, ...
    'Name','new_fc', ...
    'WeightLearnRateFactor',10, ...
    'BiasLearnRateFactor',10);

lgraph = replaceLayer(lgraph,'fc1000',newLearnableLayer);
newClassLayer = classificationLayer('Name','new_classoutput');
lgraph = replaceLayer(lgraph,'ClassificationLayer_fc1000',newClassLayer);

        执行以上代码输出网络层情况如下:

layers = 
  具有以下层的 177×1 Layer 数组:

     1   'input_1'                      图像输入         224×224×3 图像: 'zerocenter' 归一化
     2   'conv1'                        卷积             64 7×7×3 卷积: 步幅 [2  2],填充 [3  3  3  3]
     3   'bn_conv1'                     批量归一化        批量归一化: 64 个通道
     4   'activation_1_relu'            ReLU            ReLU
     5   'max_pooling2d_1'              最大池化         3×3 最大池化: 步幅 [2  2],填充 [1  1  1  1]
     6   'res2a_branch2a'               卷积             64 1×1×64 卷积: 步幅 [1  1],填充 [0  0  0  0]
     7   'bn2a_branch2a'                批量归一化        批量归一化: 64 个通道
     8   'activation_2_relu'            ReLU            ReLU
...

        为了提高模型的泛化能力,我们在训练过程中使用数据增强技术。数据增强可以通过对训练图像进行随机变换(例如翻转、平移等)来生成更多的训练样本。这有助于模型在面对不同视角、尺度和形态的图像时具有更好的泛化能力。在本例中,采用随机水平翻转以及随机平移的方法进行数据增强。此外,还需要处理灰度图像。由于预训练的ResNet-50模型期望输入为彩色图像,需要将灰度图像转换为伪彩色图像,使其可以被模型正确处理。

pixelRange = [-30 30];
imageAugmenter = imageDataAugmenter( ...
    'RandXReflection',true, ...
    'RandXTranslation',pixelRange, ...
    'RandYTranslation',pixelRange);
augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain, ...
    'Data

        在完成数据预处理和模型修改后,需要设置训练选项。这里,选择随机梯度下降法(SGDM)作为优化器,并设置批大小为32、最大迭代次数为2、初始学习率为1e-4。此外,还设置了每轮打乱训练数据的顺序、指定验证集以及验证频率等参数。最后,选择实时绘制训练进度曲线,以便于观察模型训练过程中的性能变化。

options = trainingOptions('sgdm', ...
    'MiniBatchSize',32, ...
    'MaxEpochs',2, ...
    'InitialLearnRate',1e-4, ...
    'Shuffle','every-epoch', ...
    'ValidationData',augimdsValidation, ...
    'ValidationFrequency',3, ...
    'Verbose', true, ...
    'Plots','training-progress');

        接下来,使用修改后的模型和训练选项对训练集进行训练。在训练过程中,模型会根据设定的验证频率使用验证集对性能进行评估。这有助于了解模型在未知数据上的泛化能力。

model = trainNetwork(augimdsTrain,lgraph,options);

        执行以上代码进行训练,训练的过程输出如下:

在单 GPU 上训练。
正在初始化输入数据归一化。
|=============================================================================|
|  轮  |  迭代  |    经过的时间     |  小批量准确度  |  验证准确度  |  小批量损失  |  验证损失  |  基础学习率  |
|     |      |  (hh:mm:ss)  |          |         |         |        |         |
|=============================================================================|
|   1 |    1 |     00:00:03 |    9.38% |   8.82% |  2.3537 | 2.3766 | 1.0000e-04 |
|   1 |    3 |     00:00:06 |    9.38% |  21.24% |  2.2348 | 2.0908 | 1.0000e-04 |
|   1 |    6 |     00:00:09 |   43.75% |  53.51% |  1.6566 | 1.6016 | 1.0000e-04 |
|   1 |    9 |     00:00:11 |   62.50% |  67.13% |  1.3257 | 1.2302 | 1.0000e-04 |
|   1 |   12 |     00:00:14 |   68.75% |  71.94% |  1.1022 | 0.9980 | 1.0000e-04 |
|   1 |   15 |     00:00:17 |   87.50% |  78.56% |  0.5462 | 0.8436 | 1.0000e-04 |
...

在这里插入图片描述

        训练完成后,将训练好的模型保存到文件中,以便于后续的使用和分析。

save('ResNet_10_classes.mat', 'model');

        为了评估模型的性能,使用测试集进行分类。通过将模型预测的结果与真实标签进行比较,可以计算出模型在测试集上的准确率。这是衡量模型性能的一个重要指标。

[YPred,scores] = classify(model, augimdsTest);
YTest = imdsTest.Labels;
accuracy = mean(YPred == YTest)

        为了更直观地展示模型的预测效果,随机选择四个测试样本并将它们显示在一个图像中。这有助于直观地了解模型在不同类型图像上的预测效果。

idx = randperm(numel(imdsTest.Files),4);
figure
for i = 1:4
    subplot(2,2,i)
    I = readimage(imdsTest,idx(i));
    imshow(I)
    label = YPred(idx(i));
    title(string(label));
end

在这里插入图片描述

        最后,绘制混淆矩阵以展示模型在各个类别上的性能。混淆矩阵是一种常用的可视化方法,可以直观地显示模型在不同类别上的正确分类和误分类情况。通过混淆矩阵,可以进一步分析模型在哪些类别上表现较好,以及在哪些类别上存在改进空间。

figure
plotconfusion(imdsTest.Labels, YPred);  % 绘制混淆矩阵图

在这里插入图片描述


4. 系统实现

        本节介绍如何在MATLAB中实现图像分类与训练系统的设计:该系统将分为两个部分,第一部分是预测部分,负责选择图片、文件夹分类和更换模型;第二部分是训练部分,负责选择数据集、设置训练参数、一键训练模型并评估。将结合GUI界面展示系统的设计框架和实现方法。

        在本图像分类与训练系统中,可以通过一个技术逻辑图来概括整个系统的结构和工作流程。以下是技术逻辑图的文字描述:

  1. 用户界面(GUI):用户界面是整个系统的核心部分,它负责接收用户的输入和指令。用户界面包括两个主要部分:预测部分和训练部分。预测部分允许用户选择图片、文件夹和模型进行分类;训练部分允许用户选择数据集、设置训练参数并一键训练模型。
  2. 数据预处理:在用户选择了数据集后,系统将对数据进行预处理,包括数据增强和灰度图像转换。这一步骤确保输入的数据符合模型的要求,同时增强模型的泛化能力。
  3. 模型训练:在用户设置好训练参数后,系统将使用第三节中介绍的方法对模型进行训练。在训练过程中,系统会实时绘制训练进度曲线,以便用户了解模型的训练情况。
  4. 模型评估:训练完成后,系统将自动评估模型的性能,并将结果展示给用户。这有助于用户了解模型在未知数据上的泛化能力。
  5. 图像分类:在预测部分,用户可以选择图片、文件夹和模型进行分类。系统将根据用户的选择加载相应的模型,并对选择的图片或文件夹中的图像进行分类。

在这里插入图片描述


5. 总结与展望

        本博客介绍了基于深度神经网络的图像分类与训练系统(MATLAB实现)。从引言开始,介绍基于GoogleNet、ResNet进行图像分类的背景、意义,系统研究现状及相关算法。随后,展示了系统的界面演示效果,包括选择图片分类、选择文件夹批量识别、更换不同网络模型和通过界面选择数据集一键训练模型等功能。在第三节中,详细介绍了神经网络训练的过程,包括训练代码、训练曲线和模型评估结果。第四节讲述了系统实现的两个部分:预测部分和训练部分,结合GUI界面给出了设计框架和实现。

        虽然本博客已经详细介绍了基于深度神经网络的图像分类与训练系统(MATLAB实现),但仍有一些潜在的改进方向和挑战。以下是未来可能进行的研究和改进:

  1. 更多的预训练模型:在目前的系统中,主要使用了GoogleNet和ResNet作为预训练模型。为了提高系统的泛化能力和适应性,未来可以考虑引入更多的预训练模型,如VGGNet、DenseNet等。
  2. 提升训练效率:虽然已经实现了数据增强和批量训练等功能,但训练过程仍然可能需要较长的时间。未来,可以尝试使用更高效的优化算法和硬件加速设备,如GPU,以提高训练效率。
  3. 更多的数据集支持:目前,我们的系统仅支持用户选择固定格式的数据集进行训练。未来可以考虑支持更多类型的数据集,以便用户可以更灵活地进行训练。
  4. 实时识别和在线学习:为了使系统更具实用性,可以考虑在未来的版本中加入实时识别和在线学习功能。这将使得用户能够在任何时间、任何地点使用系统进行图像分类,并根据新的数据不断更新模型。
  5. 更友好的用户界面:虽然已经实现了一个简洁明了的用户界面,但仍有改进空间。在未来的版本中,可以考虑进一步优化用户界面,使其更加直观易用。

        通过这些改进和拓展,基于深度神经网络的图像分类与训练系统能够为更广泛的用户群体提供更高效、更便捷的图像分类和训练服务。希望本博客能够为相关领域的研究者和开发者提供启发和参考,共同推动图像分类技术的发展和进步。通过持续改进和优化系统,类似的系统将在实际应用中发挥更大的作用,例如,在医学诊断、工业检测、智能安防等领域,图像分类技术将助力提升诊断准确率、降低生产成本和提高安防水平。随着计算能力的提升和算法的不断完善。


下载链接

    若您想获得博文中涉及的实现完整全部程序文件(包括测试图片、视频,mlx, mlapp文件等,如下图),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:

在这里插入图片描述

    在文件夹下的资源显示如下图所示:

在这里插入图片描述

注意:该代码采用MATLAB R2022a开发,经过测试能成功运行,运行界面的主程序为ImageClassifier.mlapp,测试图片脚本可运行testimage.py,训练模型脚本可运行trainResNet.mlx。为确保程序顺利运行,请使用MATLAB2022a运行并在“附加功能管理器”(MATLAB的上方菜单栏->主页->附加功能->管理附加功能)中添加有以下工具。

在这里插入图片描述

完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见参考博客文章里面,或参考视频的简介处给出:➷➷➷

参考博客文章:https://zhuanlan.zhihu.com/p/626515642

参考视频演示:https://www.bilibili.com/video/BV1Fh4y1J7BD/


6. 总结与展望

        由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。


参考文献

[1] Szegedy, C., Liu, W., Jia, Y., Sermanet, P., Reed, S., Anguelov, D., … & Rabinovich, A. (2015). Going deeper with convolutions. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 1-9).

[2] He, K., Zhang, X., Ren, S., & Sun, J. (2016). Deep residual learning for image recognition. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 770-778).

[3] Deng, J., Dong, W., Socher, R., Li, L. J., Li, K., & Fei-Fei, L. (2009, June). Imagenet: A large-scale hierarchical image database. In 2009 IEEE conference on computer vision and pattern recognition (pp. 248-255). IEEE.

[4] Krizhevsky, A. (2009). Learning multiple layers of features from tiny images (Doctoral dissertation, University of Toronto).

[5] Simonyan, K., & Zisserman, A. (2014). Very deep convolutional networks for large-scale image recognition. arXiv preprint arXiv:1409.1556.

[6] Huang, G., Liu, Z., Van Der Maaten, L., & Weinberger, K. Q. (2017). Densely connected convolutional networks. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 4700-4708).

[7] Zeiler, M. D., & Fergus, R. (2014). Visualizing and understanding convolutional networks. In European conference on computer vision (pp. 818-833). Springer, Cham.

[8] Hinton, G. E., Srivastava, N., Krizhevsky, A., Sutskever, I., & Salakhutdinov, R. R. (2012). Improving neural networks by preventing co-adaptation of feature detectors. arXiv preprint arXiv:1207.0580.

[9] Ioffe, S., & Szegedy, C. (2015). Batch normalization: Accelerating deep network training by reducing internal covariate shift. arXiv preprint arXiv:1502.03167.

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

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

相关文章

S3C6410 中的 cascaded irqdomain 之 gpio

文章目录 VIC 中断 与 gpio 中断 的硬件拓扑图描述linux cascaded irq domainirq domain 初始化时获取 IRQ number(软件中断号) 时中断发生时如何调试linux irq domain 实例 VIC domain 与 gpio domain 的硬件拓扑语言描述VIC 与 INT_EINTx 的关系INT_EINTx 与 GPIO的关系INT_E…

python+excel的接口自动化测试框架实战教程(视频讲解+源码)

目录 设计流程图 Excel和结果预览 框架结构 Excel相关 日志封装 正则操作 核心操作 测试操作 测试报告发送邮件类 运行 设计流程图 这张图是我的excel接口测试框架的一些设计思路。 首先读取excel文件,得到测试信息,然后通过封装的requests方…

PyTorch中的优化器探秘:加速模型训练的关键武器

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

shell的基础学习三

文章目录 一、Shell 流程控制二、Shell 函数三、Shell 输入/输出重定向四、Shell 文件包含总结 一、Shell 流程控制 for 循环 与其他编程语言类似,Shell支持for循环。 for循环一般格式为: while 语句 while 循环用于不断执行一系列命令,也…

数字取证在打击和预防网络犯罪中的作用

数字取证在调查网络犯罪、防止数据泄露、在法律案件中提供证据、保护知识产权和恢复丢失的数据方面发挥着关键作用。 详细了解数字取证的重要性、如何进行网络安全调查以及数字取证专家面临的挑战。 数字取证的 4 种类型 数字取证涉及使用专门的技术和工具来检查数字设备、网…

【Python零基础学习入门篇④】——第四节:Python的列表、元组、集合和字典

⬇️⬇️⬇️⬇️⬇️⬇️ ⭐⭐⭐Hello,大家好呀我是陈童学哦,一个普通大一在校生,请大家多多关照呀嘿嘿😁😊😘 🌟🌟🌟技术这条路固然很艰辛,但既已选择&…

SPSS如何进行均值比较和T检验之案例实训?

文章目录 0.引言1.均值过程2.单样本T检验3.独立样本T检验4.成对样本T检验 0.引言 因科研等多场景需要进行绘图处理,笔者对SPSS进行了学习,本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结,本文对均值比较…

Day5_创建mapper文件/编写查询语句sql

上一节主要介绍了springboot集成mybatis进行,以及后端开发思想。这一节主要编写sql映射文件,即真正的sql语句。实现增删改查用户数据,以及配置application.yml或者configuration文件实现控制台打印SQL语句。 接着上一节编写续写~~~~~~ 目录…

目标检测模型量化---用POT工具实现YOLOv5模型INT8量化

POT工具是什么 POT工具,全称:Post-training Optimization Tool,即训练后优化工具,主要功能是将YOLOv5 OpenVINO™ FP32 模型进行 INT8 量化,实现模型文件压缩,从而进一步提高模型推理性能。 不同于 Quantiz…

vim操作笔记

1. Vim普通模式指令 指令描述yy复制当前行y{n}y复制当前行起的后面 n 行p在当前行粘贴{n}p在当前行重复粘贴 n 次dd删除当前行d{n}d删除当前行起的后面 n 行x剪切当前光标的字符X剪切当前光标的前一个字符r{char}替换一个字符R不定长替换yw复制一个词dw删除一个词(…

【GAMES101】03 Transformation

2D线性变换 ——写成矩阵形式 1、Scale(缩放) 2、Reflection Matrix(反射矩阵) 3、Shear Matrix(剪切矩阵) 4、Rotation Matrix(旋转矩阵) 推导过程: 5、Translation Ma…

第十四届蓝桥杯大赛软件赛省赛(Java 大学B组)

目录 试题 A. 阶乘求和1.题目描述2.解题思路3.模板代码 试题 B.幸运数字1.题目描述2.解题思路3.模板代码 试题 C.数组分割1.题目描述2.解题思路3.模板代码 试题 D.矩形总面积1.问题描述2.解题思路3.模板代码 试题 E.蜗牛1.问题描述2.解题思路3.模板代码 试题 F.合并区域1.题目描…

Vue2加载倾斜摄影

vue3项目加载倾斜摄影 vue3项目加载倾斜摄影的教程可见此人的教程,亲测可用 https://blog.csdn.net/qq_37750030/article/details/124680036 vue2项目加载倾斜摄影 可是为什么到了vue2的老项目里面用不了呢? 原因在于这几个库,全是ts的&…

只出现一次(N次)的数字 / 出现次数最多的数字 / 数组中数字出现的次数

一.题目类型简介 数组中数字出现的次数是一类经典的问题,通常让我们求数组中数字出现的次数及其衍生的问题,比如,只出现一次的数字,只出现两次的数字,在一个数组中只有一个数字出现一次,其他出现两次或者三…

基于FPGA+JESD204B 时钟双通道 6.4GSPS 高速数据采集模块设计(二)研究 JESD204B 链路建立与同步的过程

基于 JESD204B 的采集与数据接收电路设计 本章将围绕基于 JESD204B 高速数据传输接口的双通道高速数据采集实现展 开。首先,简介 JESD204B 协议、接口结构。然后,研究 JESD204B 链路建立与同 步的过程。其次,研究基于 JESD204B …

linux驱动开发 - 10_阻塞和非阻塞 IO

文章目录 1 阻塞和非阻塞 IO1.1 阻塞和非阻塞简介1.2 等待队列1、等待队列头2、等待队列项3、将队列项添加/移除等待队列头4、等待唤醒5、等待事件 1.3 Linux驱动下的poll操作函数 2 阻塞 IO 实验1、驱动程序编写2、编写测试 APP3、编译驱动程序和测试 APP4、运行测试 3 阻塞 I…

elform 动态 rules

一.使用v-for渲染时 前端由于某些需求场景需要,部分表单的渲染是通过 v-for循环渲染显示,此时如何实现表单验证呢?如下,点击第一行的号可以动态的增加更多行表单,不同于单一固定的表单行[参见下文一般情况下]&#xf…

book-riscv-rev1.pdf 翻译(自用)第一章 操作系统接口

Job of operating system: 操作系统使得多个程序分享一台计算机,提供一系列仅靠硬件无法支持的服务。 管理与抽象低级别硬件(如:文件处理程序不需要关注使用哪种硬盘)使得多个程序分享硬件(programs that can run at…

【代码练习】旋转矩阵题解思路记录分析

题目 给你一幅由 N N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。 不占用额外内存空间能否做到? 示例 1: 给定 matrix [ [1,2,3], [4,5,6], [7,8,9] ], 原地旋转输入矩阵,使其变为: [ [7…

【C语言】学习

文章目录 前言1. warm up1.1 输出helloworld1.2 示例1.3 C语言程序结构 前言 以后要学习操作系统深度学习了&#xff0c;所以C语言就不可缺少了。 1. warm up 1.1 输出helloworld #include<stdio.h> void main() {printf("Hello World!!"); }std 标准 io输…