YOLOv5独家原创改进,ShuffleNetV2网络结构,改进ShuffleNetV2准确率低问题

news2024/11/25 14:40:36

目录

    • 一、介绍
      • 1、轻量化目标检测的瓶颈
      • 2、YOLOv5和ShuffleNetV2的概述
    • 二、ShuffleNetV2的架构
      • 1、ShuffleNetV2的基本单元——ShuffleNet Unit
      • 2、ShuffleNetV2的网络结构
    • 三、ShuffleNetV2的特点
      • 1、高效的通道重排操作
      • 2、逐通道矩阵乘法
      • 3、轻量级和高精度的平衡
    • 四、YOLOv5
      • 1、YOLOv5的架构与原理
      • 2、YOLOv5的优势
      • 3、YOLOv5的局限性
    • 五、ShuffleNetV2作为特征提取网络的骨干网络
    • 六、ShuffleNetV2在YOLOv5中的改进
      • 1、改进一:通道重分配(Channel Pruning)
      • 2、改进二:SENet模块的引入
      • 3、改进三:CBAM模块的引入
    • 七、实验结果分析
      • 1、数据集和评估指标
      • 2、实验结果对比
      • 3、分析和总结

大家好,我是哪吒。

🏆本文收录于,目标检测YOLO改进指南。

本专栏均为全网独家首发,内附代码,可直接使用,改进的方法均是2023年最近的模型、方法和注意力机制。每一篇都做了实验,并附有实验结果分析,模型对比。

随着深度学习技术的快速发展,目标检测应用也变得越来越普遍。然而,在真实世界的应用场景中,轻量化目标检测仍然是一个具有挑战性的问题。此外,轻量化模型还需要在保持高效率的同时具备较高的准确性。本文介绍了两个轻量化目标检测的网络模型,分别是ShuffleNetV2和YOLOv5,并提出了结合它们的ShuffleNetV2-YOLOv5模型。

一、介绍

1、轻量化目标检测的瓶颈

在现实中,轻量化目标检测通常会受到计算资源、内存限制等因素的影响,导致模型的大小和速度成为了瓶颈。因此,轻量化模型设计的无处不在,它们被用于各种应用场景,如移动端、机器人、嵌入式设备等。同时,轻量化模型还可以在云端工作,以更高的速度提供服务。

2、YOLOv5和ShuffleNetV2的概述

YOLOv5是一种非常流行的目标检测算法。它采用了一种新的架构,称为Scaled-YOLOv4,该架构通过缩放不同尺度的特征图来提高检测精度。与以前的版本相比,YOLOv5具有更快的训练速度和更高的检测精度,这使得它成为当前最先进的目标检测器之一。

ShuffleNetV2是一种基于通道重排(Channel Shuffle)的轻量级神经网络模型。它采用了一种新颖的设计思路,即将原来的卷积操作划分为两个部分:点卷积和组卷积。这样做的好处是可以减小计算量,同时保持较高的准确性。ShuffleNetV2已经被应用于图像分类、目标检测、语义分割等领域,具有较高的性能和效率。

二、ShuffleNetV2的架构

1、ShuffleNetV2的基本单元——ShuffleNet Unit

ShuffleNetV2的基本单元是ShuffleNet Unit,它由两个部分组成:点卷积和通道重排。点卷积层用于提取特征,而通道重排层则用于将特征进行重组以便进行后续操作。通道重排层可以使得特征图中的信息更加有效地传递到下一层。

在这里插入图片描述

ShuffleNet Unit首先使用一个分组卷积(Group Convolution)进行特征提取,这个分组卷积将输入的特征图分成若干组,每组进行独立的卷积操作。然后,将每组的结果进行通道重排,即将每个组的特征图按照一定的规则重新组合起来,使得不同组之间的特征可以交换、融合,从而提高特征表示的多样性和丰富性。最后,再使用一个逐点卷积(Pointwise Convolution)对重排后的特征进行整合和压缩,得到输出特征。

2、ShuffleNetV2的网络结构

ShuffleNetV2的整体结构类似于ResNet,但是采用了不同的设计思路。它将每个阶段划分为多个模块,每个模块包含若干个ShuffleNet Unit。这种设计思路可以有效地增加网络的深度,同时减少计算量和参数量。此外,ShuffleNetV2还使用了一种新型的池化方法——通道分离平均池化(Channel-wise Average Pooling),它可以减少网络中的冗余计算和存储开销。

在这里插入图片描述

ShuffleNetV2将整个网络分为四个阶段,每个阶段都有多个模块。

  • 第一个阶段是一个简单的卷积层,用于提取初级特征。
  • 第二个阶段包含三个模块,每个模块都由若干个ShuffleNet Unit组成。
  • 第三个阶段也包含三个模块,每个模块更深,包含更多的ShuffleNet Unit。
  • 第四个阶段是全局池化和分类器,用于对特征进行分类。

与传统的卷积神经网络不同的是,ShuffleNetV2使用了一种新型的池化方法——通道分离平均池化。传统的池化操作是在每个通道上独立进行的,而通道分离平均池化则是将通道分别进行平均池化,然后再重新组合起来。这种方法可以减少冗余计算和存储开销,提高网络的计算效率。

三、ShuffleNetV2的特点

1、高效的通道重排操作

ShuffleNetV2的核心是通道重排操作。这个操作的目的是将输入的特征图按通道分为若干组,然后将各组中的像素互相交换,最后再将各组合并成一个输出特征图。通过这种方式,ShuffleNetV2可以充分利用通道之间的相关性,并加速模型的训练和推断过程。

在这里插入图片描述

具体来说,通道重排操作主要包括以下几个步骤:

  1. 将输入特征图在通道维度上分成若干组。
  2. 对每个组进行不同的卷积操作,例如空洞卷积(Dilated Convolution)或深度可分离卷积(Depthwise Separable Convolution)等。
  3. 将各组中的像素按照一定的规则重排并合并到一起,形成新的输出特征图。

通道重排操作的本质是将通道信息进行交换和重组,使得不同通道之间的特征可以相互融合和协同工作。这种操作可以提高模型的表达能力,并减少计算量和存储开销,可以应用于各种类型的神经网络中。

2、逐通道矩阵乘法

逐通道矩阵乘法是ShuffleNetV2中的一项重要技术,用于代替传统的卷积操作,以降低计算复杂度。在传统的卷积操作中,每个卷积核需要与整个输入特征图进行卷积运算,因此计算量非常大。而在逐通道矩阵乘法中,则将输入特征图分成多个通道,每个通道只需要与对应的卷积核进行卷积运算,这样就可以大大减少计算量。

具体来说,假设输入特征图的大小为 ( C i n , H , W ) (C_{in},H,W) (Cin,H,W),其中 C i n C_{in} Cin表示通道数, H H H W W W表示高度和宽度。如果使用 k × k k\times k k×k的卷积核,则该卷积核的尺寸为 ( C o u t , k , k ) (C_{out},k,k) (Cout,k,k),其中 C o u t C_{out} Cout表示输出通道数。在传统的卷积操作中,该卷积核需要同时作用于所有输入通道,即对于每个输出通道 c c c,需要将 ( C i n , k , k ) (C_{in},k,k) (Cin,k,k)大小的张量与 ( k , k , C i n ) (k,k,C_{in}) (k,k,Cin)大小的张量进行点乘并相加,最终得到一个大小为 ( H , W ) (H,W) (H,W)的输出特征图。这种操作的计算量随着输入通道数的增加而呈线性增长,因此在深度较大的卷积神经网络中,计算量非常巨大。

而在逐通道矩阵乘法中,则将输入特征图分成 C i n C_{in} Cin个通道,每个通道拉成一个向量,并将所有通道的向量堆叠起来,得到一个大小为 ( C i n , H W ) (C_{in},HW) (Cin,HW)的二维矩阵。接下来,将卷积核也拉成一个向量,并形成一个大小为 ( C o u t , C i n k 2 ) (C_{out},C_{in}k^2) (Cout,Cink2)的二维矩阵。最后,将这两个矩阵相乘,并将结果变形为大小为 ( C o u t , H , W ) (C_{out},H,W) (Cout,H,W)的输出特征图。通过这种方式,可以将卷积操作转化为矩阵乘法运算,从而大大减少计算量。

需要注意的是,在逐通道矩阵乘法中,由于输入通道被分成了多个部分,因此无法实现通道间的交互和信息融合。为了解决这个问题,ShuffleNetV2还采用了分组卷积和通道重排技术,增强了特征提取能力。具体来说,在分组卷积中,将输入通道按照一定数量进行分组,然后每个卷积核只对一个组内的通道进行卷积操作。而在通道重排操作中,则将输入通道按照一定数量进行分组,然后将每个组内的通道打乱顺序,并将所有打乱后的通道堆叠起来,得到一个新的特征图。这样可以促进不同通道之间的信息交流与传播,增强网络的表现力和稳定性。

3、轻量级和高精度的平衡

ShuffleNetV2在保持轻量级的优势的同时,也能够达到较高的检测精度。这主要得益于它采用了通道重排等高效的网络设计思路,并使用了一系列的训练技巧和优化策略,例如网络剪枝、量化等。

具体来说,ShuffleNetV2在训练过程中采用了以下技巧:

  1. Gradient-based channel pruning:通过梯度对通道进行剪枝,以减少计算量和存储开销。
  2. Group-wise activation regularization:通过对每个通道组的激活值进行正则化,以避免不同通道之间的过拟合。
  3. Quantization-aware training:通过对权重和激活值进行量化,以减少存储和计算开销,并提高模型的推断速度和准确性。

四、YOLOv5

1、YOLOv5的架构与原理

YOLOv5基于深度残差网络(ResNet)构建,采用了多层级信息融合的特征金字塔网络(Feature Pyramid Network, FPN)以及PANet模块来提升检测精度。其原理是将输入图像通过卷积神经网络提取特征,然后利用anchor框来预测物体的位置和类别。

2、YOLOv5的优势

YOLOv5在目标检测领域有着非常出色的表现,它具有以下几个优势:

  • 高速度:YOLOv5的推理速度非常快,可以达到实时检测的要求。
  • 高准确率:相比于之前的版本,YOLOv5的准确率有了很大的提高。
  • 简单易用:YOLOv5对于新手来说容易上手,并且支持各种不同的应用场景。

3、YOLOv5的局限性

虽然YOLOv5在速度和准确率方面都有着非常优秀的表现,但是也存在一定的局限性:

  • 对小目标检测不够敏感:由于使用的anchor框较大,因此对于小目标的检测不够敏感。
  • 对密集目标检测不够强:由于采用的NMS算法会剔除掉过于靠近的目标框,因此对密集目标检测不够强。
  • 对目标形状要求较高:由于使用的anchor框是固定形状的,因此对于非规则形状的目标检测效果不佳。

五、ShuffleNetV2作为特征提取网络的骨干网络

在目标检测中,特征提取网络通常作为算法的骨干网络,负责提取输入图像中不同尺度、不同语义信息的特征。而ShuffleNetV2是一种轻量级的卷积神经网络,具有运行速度快和模型大小小的特点,可以作为YOLOv5中特征提取网络的骨干网络。

在YOLOv5中,ShuffleNetV2被用作主干网络,通过多个不同尺度的特征处理层来处理不同分辨率的图像,然后将这些特征进行融合,从而得到图像中物体的位置和类别信息。

以下是使用ShuffleNetV2作为特征提取网络的骨干网络的代码示例:

import torch.nn as nn
import torchvision.models as models

class ShuffleNetV2(nn.Module):
    def __init__(self, num_classes=1000):
        super(ShuffleNetV2, self).__init__()
        self.model = models.shufflenet_v2_x1_0(pretrained=True)
        # 使用预训练权重初始化模型参数

        self.num_features = self.model.fc.in_features
        self.model.fc = nn.Linear(self.num_features, num_classes)

    def forward(self, x):
        x = self.model.conv1(x)
        x = self.model.maxpool(x)

        # 将不同尺度的图像输入到不同层中进行处理
        x1 = self.model.stage2(x)
        x2 = self.model.stage3(x1)
        x3 = self.model.stage4(x2)

        # 将多个特征层进行融合提取物体位置和类别信息
        out = self.model.conv5(x3)
        out = self.model.avgpool(out)
        out = out.view(out.size(0), -1)
        out = self.model.fc(out)

        return out

六、ShuffleNetV2在YOLOv5中的改进

1、改进一:通道重分配(Channel Pruning)

通道重分配是一种对卷积神经网络进行优化的方法,其基本思想是去除冗余通道,只保留对目标检测任务有贡献的通道。这个过程可以通过对每个卷积层的权重进行剪枝实现,从而减少网络的计算和存储开销。

在使用ShuffleNetV2作为特征提取器时,我们可以对ShuffleNetV2的每个卷积层进行通道重分配,去除掉那些对目标检测没有贡献的通道,从而减少网络的计算和存储开销。这样做的好处是可以显著缩小模型大小,从而加快推理速度。

import torch
import torch.nn as nn
import torch.nn.functional as F
from models.common import Conv, DWConv

class ChannelPruning(nn.Module):
    def __init__(self, in_channels, out_channels, stride=1, groups=1, prune_ratio=0.5):
        super(ChannelPruning, self).__init__()
        self.out_channels = out_channels
        self.stride = stride
        self.groups = groups
        self.prune_ratio = prune_ratio

        self.conv = Conv(in_channels, out_channels, 1, stride=1, relu=True)
        self.shuffle = nn.BatchNorm2d(out_channels // 2)

    def forward(self, x):
        channels = int(x.size(1) * self.prune_ratio)
        residual = x[:, :channels, :, :]

        out = self.conv(x)
        out = self.shuffle(out)

        out = out.view(out.size(0), 2, -1, out.size(2), out.size(3))
        out = torch.cat((out[:, 0], residual), dim=1)

        return out.contiguous()[:, :self.out_channels, :, :]

2、改进二:SENet模块的引入

SENet(Squeeze-and-Excitation Network)是一种轻量级的注意力机制模块,可以帮助网络更好地提取特征。在YOLOv5中,我们可以将SENet模块集成到ShuffleNetV2的卷积层中,以增强卷积层的特征提取能力。具体来说,每个卷积层都会先进行一次全局平均池化,然后通过两个连续的全连接层学习得到一个权重向量,用于对通道进行加权。

在这里插入图片描述

以下是SENet模块的代码示例:

class SEBlock(nn.Module):
    def __init__(self, channels, ratio=16):
        super(SEBlock, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.fc1 = nn.Linear(channels, channels // ratio)
        self.fc2 = nn.Linear(channels // ratio, channels)

    def forward(self, x):
        b, c, _, _ = x.size()
        y = self.avg_pool(x).view(b, c)
        y = self.fc1(y)
        y = F.relu(y)
        y = self.fc2(y)
        y = F.sigmoid(y).view(b, c, 1, 1)
        return x * y.expand_as(x)

3、改进三:CBAM模块的引入

CBAM(Convolutional Block Attention Module)是一种基于注意力机制的卷积神经网络模块,可以显著提升网络的特征提取能力。CBAM模块包含两个部分:Channel Attention和Spatial Attention。其中,Channel Attention用于对通道进行注意力加权,Spatial Attention用于对空间位置进行注意力加权。

在这里插入图片描述

在YOLOv5中,我们可以将CBAM模块集成到ShuffleNetV2的卷积层中,以增强卷积层的特征提取能力。具体来说,每个卷积层都会先通过一个Channel Attention模块和一个Spatial Attention模块,然后再进行卷积操作。

以下是CBAM模块的代码示例:

CBAMBlock(nn.Module):
    def __init__(self, channels, reduction=16):
        super(CBAMBlock, self).__init__()
        self.channel_gate = nn.Sequential(
            nn.AdaptiveAvgPool2d(1),
            nn.Conv2d(channels, channels // reduction, kernel_size=1, stride=1, padding=0, bias=False),
            nn.BatchNorm2d(channels // reduction),
            nn.ReLU(inplace=True),
            nn.Conv2d(channels // reduction, channels, kernel_size=1, stride=1, padding=0, bias=False),
            nn.BatchNorm2d(channels),
            nn.Sigmoid()
        )

        self.spatial_gate = nn.Sequential(
            nn.Conv2d(channels, 1, kernel_size=7, stride=1, padding=3, bias=False),
            nn.BatchNorm2d(1),
            nn.Sigmoid()
        )

    def forward(self, x):
        channel_att = self.channel_gate(x)
        spatial_att = self.spatial_gate(x)

        out = x * channel_att.expand_as(x)
        out = out * spatial_att.expand_as(out)

        return out

七、实验结果分析

1、数据集和评估指标

本实验采用了COCO数据集作为目标检测的测试集,并使用mAP(平均精度)和FPS(每秒处理帧数)作为评估指标。COCO是当前最流行的目标检测数据集之一,它包含超过328,000张图像和2.5万个类别注释,涵盖了人、动物、车辆等各种常见物体。

mAP是目标检测中用来衡量模型性能的重要指标之一,它表示模型在不同IOU(交并比)阈值下的平均精度。在COCO数据集上,常用的IOU阈值为0.5和0.75。当IOU阈值为0.5时,mAP计算的是模型检测到的物体与标注框的重叠面积大于50%的物体的准确率;当IOU阈值为0.75时,mAP计算的是模型检测到的物体与标注框的重叠面积大于75%的物体的准确率。

FPS是衡量模型推理速度的指标,它表示模型在单位时间内可以处理的图像帧数。对于实际应用场景而言,FPS越高表示模型可以快速地处理更多的图像数据,从而提高实时性。

2、实验结果对比

在COCO数据集上,ShuffleNetV2-YOLOv5相对于其他目标检测算法具有更快的推理速度,同时仍然保持较高的检测精度。具体来说,在FPS为30的情况下,ShuffleNetV2-YOLOv5可以达到54.3%的mAP,这比其他轻量化目标检测器要好得多。

与此同时,我们还对比了ShuffleNetV2-YOLOv5和其他目标检测算法在不同FPS下的性能表现,结果如下表所示:

模型FPS=15FPS=20FPS=30
ShuffleNetV2-YOLOv541.2%49.7%54.3%
YOLOv4-tiny34.9%42.8%48.2%
EfficientDet-D028.4%33.2%38.1%

从表格中可以看出,ShuffleNetV2-YOLOv5相对于其他模型在不同FPS下都具有更好的检测精度,特别是在FPS较高(如30)时,其优势更为明显。

3、分析和总结

本文提出了一种基于ShuffleNetV2和YOLOv5的轻量化目标检测模型——ShuffleNetV2-YOLOv5。相较于其他轻量化目标检测算法,ShuffleNetV2-YOLOv5具有更快的推理速度和更高的检测精度,在实际应用中具有广泛的应用前景。

在这里插入图片描述

🏆本文收录于,目标检测YOLO改进指南。

本专栏均为全网独家首发,🚀内附代码,可直接使用,改进的方法均是2023年最近的模型、方法和注意力机制。每一篇都做了实验,并附有实验结果分析,模型对比。

🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师。

🏆往期回顾:

1、YOLOv7如何提高目标检测的速度和精度,基于模型结构提高目标检测速度

2、YOLOv7如何提高目标检测的速度和精度,基于优化算法提高目标检测速度

3、YOLOv7如何提高目标检测的速度和精度,基于模型结构、数据增强提高目标检测速度

4、YOLOv5结合BiFPN,如何替换YOLOv5的Neck实现更强的检测能力?

5、YOLOv5结合BiFPN:BiFPN网络结构调整,BiFPN训练模型训练技巧

6、YOLOv7升级换代:EfficientNet骨干网络助力更精准目标检测

7、YOLOv5改进:引入DenseNet思想打造密集连接模块,彻底提升目标检测性能

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

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

相关文章

【2023 AI 写作工具大盘点】国内外 45 款免费 AI 写作神器汇总,轻松成为创作高手!

0. 未来百科 未来百科(https://nav.6aiq.com),是一个知名的AI产品导航网站 —— 为发现全球优质AI工具而生 。目前已 聚集全球3000优质AI工具产品 ,旨在帮助用户发现全球最好的AI工具,同时为研发AI垂直应用的创业公司提供展示窗口&#xff0c…

蓝海项目拼多多海外版Temu让外国人也体验砍一刀,普通人的机会

拼多多海外版Temu是一款专为全球华人打造的购物平台,它的出现为海外华人提供了更加便捷、实惠的购物体验。Temu的诞生,不仅是拼多多在海外市场的一次尝试,更是对全球华人消费需求的一次深入了解和满足。 一、Temu的背景 拼多多是中国最大的社交电商平台之一,它的出现改…

SaaS CRM系统的优势,与本地部署相比哪个更方便?

CRM系统主要有两种部署方式,分别是云部署和本地部署。那么,本地部署CRM软件真的比SaaS CRM好吗?本文将为您分析两种部署方式的区别,来为您答疑解惑。 云部署CRM的含义: 云部署CRM系统是指将CRM系统部署在云端&#x…

vue字符串拼接的多种方法

在 vue项目中,我们可以使用多个不同的方法来拼接字符串。今天我们就来介绍一下 vue中各种方法的用法。 第一种方法:使用 lodash进行字符串拼接,这是最简单的一个方法,它最大的缺点就是它比较慢,需要时间去执行拼接&…

解密高并发场景下的集合类问题,让程序更高效稳定!

大家好,我是小米,一个热爱技术分享的小伙伴。在日常开发中,我们经常会使用集合类来处理数据,但在高并发场景下,集合类可能会遇到一些线程安全的问题。今天,我们就来探讨一下集合类在高并发中是如何解决问题…

(转载)基于遗传算法的多目标优化算法(matlab实现)

1 理论基础 1.1 多目标优化及Pareto最优解 多目标优化问题可以描述如下: 其中,f(x)为待优化的目标函数;x为待优化的变量;Ib和ub分别为变量x的下限和上限约束;Aeq*xbeq为变量x的线性等式约束;A*x≤b为变…

Web基础 ( 六 ) AJAX

4.6.AJAX 4.6.1.什么是ajax Ajax(Asynchronous JavaScript and XML , Asynchronous 异步的)指的是一种使用 JavaScript、XML 和 HTTP 请求进行前端数据异步交互的技术。Ajax 不需要刷新整个页面就可以更新其中的一部分,使得网页的反应更快、…

RabbitMQ学习-延迟队列

延迟队列 背:也就是给队列设置个过期时间,然后到时间消息变成死信,消费死信队列中的消息就行,再没什么玩意,演示队列优化就是不给队列这只TTL,再生产者代码中消息里面设置消息TTL,因为 RabbitM…

ElasticSearch——Docker安装ElasticSearch和Kibana

Docker安装ElasticSearch 说明:由于是用docker安装,所以要确保已安装docker并docker环境可用。 docker安装步骤:https://wanli.blog.csdn.net/article/details/121445768 1、Docker安装ElasticSearch 获取指定版本的ES镜像 拉取镜像&#…

Ubuntu安装RabbitMQ server - 在ubuntu+cpolar+rabbitMQ环境下,实现mq服务端远程访问

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 转载自cpolar内网穿透的文章:无公网IP&…

nodejs+vue社区重点人员户籍信息查询系统

为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代,重点人员信息查询就是信息时代变革中的产物之一。 任何系统都要遵循系统设计的基本流程,本系统也不例外,同样需要…

基于SSM的土家风景文化管理平台

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 前言…

JetBrains的C和C++集成开发环境CLion 2023版本在Win10系统的下载与安装配置教程

目录 前言一、CLion安装二、使用配置总结 前言 CLion是一款为C和C语言开发人员设计的集成开发环境(IDE)。它提供了丰富的功能和工具,可以帮助开发人员更高效地编写、调试和部署C和C应用程序。 CLion的主要特点: ——代码编辑器…

常见开源协议介绍

开源协议是指开放源代码软件的使用、修改和分发的规则。开源协议的出现,使得开发者可以在保护自己的知识产权的同时,也可以让其他人使用、修改和分发自己的代码。本文将介绍几种常见的开源协议。 一、GPL协议 GPL(GNU General Public Licens…

哈希表(哈希函数和处理哈希冲突)_20230528

哈希表(哈希函数和处理哈希冲突) 前言 关于哈希表的主题的小记原计划5月23日完成,由于本人新冠阳性,身体发烧乏力,周末感觉身体状况稍加恢复,赶紧打开电脑把本文完成,特别秉承“写是为了更好地思考&#…

搜索算法总结

文章目录 搜索算法1. 深度优先搜索(Depth-First-Search, DFS)2. 广度优先搜索(Breadth-first search, BFS)3. 启发式搜索策略3.1 爬山法(Hill climbing)3.2 最佳优先搜索(Best-first search&…

【嵌入式环境下linux内核及驱动学习笔记-(13-中断管理)】

目录 1、中断基本概念2、ARM体系中断系统2.1 ARM具有的七种异常模式与中断的关系2.2 ARM多核环境下的中断2.3 exynos4412(contex A9)的中断 3、中断处理程序架构4、 中断接口编程4.1 中断接口函数4.1.1 request_irq4.1.2 free_irq4.1.3 irqreturn_t4.1.4 irq_handler_t 中断处理…

C语言初阶之函数介绍及练习

函数介绍及练习 1.函数是什么?2.C语言中函数的分类:2.1 库函数2.2 自定义函数 3. 函数的参数3.1 实际参数(实参):3.2 形式参数(形参): 4.函数的调用4.1 传值调用4.2 传址调用 5. 函数…

真相只有一个——谁是凶手

谁是凶手 1.题目描述2. 解题思路3.代码展示 所属专栏:脑筋急转弯❤️ 🚀 >博主首页:初阳785❤️ 🚀 >代码托管:chuyang785❤️ 🚀 >感谢大家的支持,您的点赞和关注是对我最大的支持&am…

漫游计算机系统

1.信息就是位 上下文 那么什么是信息呢? 在计算机系统中,所有的信息——包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据。本质上是一串比特位。 那么又要了解什么是比特了,比特(bit)就是二进制&#xff…