PaddleOCR模型ch_PP-OCRv3文本检测模型研究(一)骨干网络

从源码上看,PaddleOCR一共支持四个版本,分别是PP-OCR、PP-OCRv2、PP-OCRv3、PP-OCRv4。本文选择PaddleOCR的v3版本的骨干网络作为研究对象,力图探究网络模型的内部结构。

文章目录

  • 研究起点
  • 卷归层
  • 压发层
  • 残差层
  • 骨干网
  • 代码实验
  • 小结

研究起点

参考官网配置文件,提取其中21-36行描述模型架构的内容如下:

Architecture:model_type: detalgorithm: DBTransform:Backbone:name: MobileNetV3scale: 0.5model_name: largedisable_se: TrueNeck:name: RSEFPNout_channels: 96shortcut: TrueHead:name: DBHeadk: 50

从这段配置,描述了模型训练的网络架构。依次可以看出模型类型为文本检测det,检测算法为DB,骨干网backbone为MobileNetV3,颈部网络为RSEFPN,头部网络为DBHead。本文聚焦在骨干网络,单独列出其设置的参数值清单:

  • scale=0.5
  • model_name=‘large’
  • disable_se=True

而MobileNetV3的代码位于det_mobilenet_v3.py文件中,具体可以参考官方源码。为对照上述配置,这里仅仅摘取其构造函数如下:

def __init__(self, in_channels=3, model_name="large", scale=0.5, disable_se=False,**kwargs):

可以看出参数配置基本保持了默认,只有disable_se参数由默认值False改为了True。各参数含义如下:

  • in_channels,整数int类型,代表输入张量通道数,默认为3通道
  • model_name,字符串str类型,代表模型型号。支持large和small两类,其中large模型包含15个残差层,small模型给包含11个残差层。
  • scale,浮点float类型,代表模型通道拉伸系数,支持0.35/0.5/0.75/1.0/1.25五种,值越大中间层通道数越多,模型参数更多。以输入张量BCHW=5,3,64,192为例,scale分别选择0.5/1/1.25三种,模型的参数数量分别为1.57M/5.66M/8.77M。
  • disable_se,布尔bool类型,代表是否在残差层中禁用SE模块,默认值为False。

卷归层

ConvBNLayer类的定义在det_mobilenet_v3.py文件中第159-201行,主要包含了一个二维卷积层(Convolution2D Layer)一个批正则化层(Batch Normalization Layer),这里将ConvBNLayer翻译为卷归层。阅读卷归层的代码,可以看出其内部结构如下图:
卷归层

上图中的输入张量结构为c_in,h,w(为描述简便省略了张量实际结构中的批处理大小),分别代表输入通道数、高度、宽度。通过一个Conv2D操作,输出张量结构为c_out,h,w,分别代表输出通道数、高度、宽度,高宽的计算可以参考官方文档conv2d。接着是一个批正则化操作,张量结构不变。最后,如何设置了if_act参数为True,还会接一个激活函数计算,支持relu和hardswish两种,两个函数的说明可以参考官方文档relu和hard_swish。

压发层

SEModule类的定义在det_mobilenet_v3.py文件中第261-289行,主要包含了一个均值池化层(Adaptive Average Pool Layer)和两个卷积层,英文名称为Squeeze and Excitation Network,这里将SEModule翻译为压发层。阅读压发层的代码,可以看出其内部结构如下图:
压发层
上图中的输入张量结构为c_in,h,w。结果一个均值池化操作后,张量结构变为c_in,1,1。接着是一个挤压的卷积操作,输出通道数压缩到c_in//r,r参数可以设置,默认值为4。后接一个relu激活函数调用,然后是一个激发的卷积操作,通道数恢复到c_in。紧接着一个HardSigmoid操作,参见hard_sigmoid官方文档。然后与输入张量做乘法,最终输出的张量结构与输入相同。

残差层

ResidualUnit类的定义在det_mobilenet_v3.py文件中第204-258行,主要包含了三个卷归层(ConvBNLayer)和一个压发层(SEModule),这里将ResidualUnit翻译为残差层。阅读残差层的代码,可以看出其内部结构如下图:
残差层
上图中的输入张量结构为c_in,h,w,其中c_in代表输入通道数。经过第一个卷归层后,输出张量结构c_mid,h,w,其中c_mid为设置的中间通道数。因为第一个卷积层设置的卷积核k为1x1,步长s为1,填充p为0,所以输出张量的高宽不变。紧接着进入第二个卷归层,卷积核大小、步长、填充均由参数设置决定,所以输出张量结构为c_mid,h,w。如果设置use_se为True,那么进入到压发层,输出张量结构与输入相同。接着进入第三个卷归层,输出张量结构为c_out,h,w,其中c_out为设置的输出通道数参数。如果s_in设置为1,并且c_out与c_in相同,那么if_shortcut就等于True,此时第三个卷积层输出的张量结构与输入张量结构相同,网络最后增加了一个张量相加操作。这时,残差层的含义就凸显出来了,可以简单理解为通过多层神经网络处理,将结果加到输入上,增加的部分就是差额。

骨干网

MobileNetV3类的定义在det_mobilenet_v3.py文件中第37-156行,这里将MobileNetV3理解为骨干网。有了前几节的基础知识,清楚了卷归层就是卷积+归一化,压发层就是平均池化+卷积,残差层就是卷归+压发,那么骨干网的代码很容易看懂。为了理解的直观性,减少参数理解障碍,假设输入张量结构为5,3,64,320,分别代表批处理大小为5,通道数3,图像高度64,宽度320。在此前提下,加上第一节配置文件中的设置,可以总结出骨干网结构如下图:
骨干网上图中,对于ConvBNLayer,只列举k、s、p三个参数,分别代表卷积核大小、步长、填充;对于ResidualUnit,只列举mid、k、s、r四个参数,分别代表中间通道数、卷积核大小、步长、是否做残差加法(if_shortcut);每个层前后的四个数字代表BCHW的张量结构,蓝色字体表示层操作前后张量结构有变化。以下分五个部分来解释上图:

  • 第一个卷归层
    通过一个卷积核为3、步长为2的卷归层,将输入张量的通道数由3转为8通道输出,宽高各压缩一半。
  • 第一阶段stage0
    通过三个残差层,将输入通道8转为16通道输出,宽高各压缩一半。
  • 第二阶段stage1
    通过三个残差层,将输入通道16转为24通道输出,宽高各压缩一半。
  • 第三阶段stage2
    通过六个残差层,将输入通道24转为56通道输出,宽高各压缩一半。
  • 第四阶段stage3
    通过三个残差层和一个卷归层,将输入通道56转为480通道输出,宽高各压缩一半。

代码实验

通过调用paddle.summary函数,以(5, 3, 64, 320)为输入张量结构,得到以下输出:

---------------------------------------------------------------------------Layer (type)       Input Shape          Output Shape         Param #    
===========================================================================Conv2D-1      [[5, 3, 64, 320]]     [5, 8, 32, 160]          216      BatchNorm-1    [[5, 8, 32, 160]]     [5, 8, 32, 160]          32       ConvBNLayer-1   [[5, 3, 64, 320]]     [5, 8, 32, 160]           0       第一个卷归层Conv2D-2      [[5, 8, 32, 160]]     [5, 8, 32, 160]          64       stage0开始BatchNorm-2    [[5, 8, 32, 160]]     [5, 8, 32, 160]          32       ConvBNLayer-2   [[5, 8, 32, 160]]     [5, 8, 32, 160]           0       Conv2D-3      [[5, 8, 32, 160]]     [5, 8, 32, 160]          72       BatchNorm-3    [[5, 8, 32, 160]]     [5, 8, 32, 160]          32       ConvBNLayer-3   [[5, 8, 32, 160]]     [5, 8, 32, 160]           0       Conv2D-4      [[5, 8, 32, 160]]     [5, 8, 32, 160]          64       BatchNorm-4    [[5, 8, 32, 160]]     [5, 8, 32, 160]          32       ConvBNLayer-4   [[5, 8, 32, 160]]     [5, 8, 32, 160]           0       
ResidualUnit-1   [[5, 8, 32, 160]]     [5, 8, 32, 160]           0       Conv2D-5      [[5, 8, 32, 160]]     [5, 32, 32, 160]         256      BatchNorm-5    [[5, 32, 32, 160]]    [5, 32, 32, 160]         128      ConvBNLayer-5   [[5, 8, 32, 160]]     [5, 32, 32, 160]          0       Conv2D-6      [[5, 32, 32, 160]]    [5, 32, 16, 80]          288      BatchNorm-6    [[5, 32, 16, 80]]     [5, 32, 16, 80]          128      ConvBNLayer-6   [[5, 32, 32, 160]]    [5, 32, 16, 80]           0       Conv2D-7      [[5, 32, 16, 80]]     [5, 16, 16, 80]          512      BatchNorm-7    [[5, 16, 16, 80]]     [5, 16, 16, 80]          64       ConvBNLayer-7   [[5, 32, 16, 80]]     [5, 16, 16, 80]           0       
ResidualUnit-2   [[5, 8, 32, 160]]     [5, 16, 16, 80]           0       Conv2D-8      [[5, 16, 16, 80]]     [5, 40, 16, 80]          640      BatchNorm-8    [[5, 40, 16, 80]]     [5, 40, 16, 80]          160      ConvBNLayer-8   [[5, 16, 16, 80]]     [5, 40, 16, 80]           0       Conv2D-9      [[5, 40, 16, 80]]     [5, 40, 16, 80]          360      BatchNorm-9    [[5, 40, 16, 80]]     [5, 40, 16, 80]          160      ConvBNLayer-9   [[5, 40, 16, 80]]     [5, 40, 16, 80]           0       Conv2D-10     [[5, 40, 16, 80]]     [5, 16, 16, 80]          640      BatchNorm-10    [[5, 16, 16, 80]]     [5, 16, 16, 80]          64       
ConvBNLayer-10   [[5, 40, 16, 80]]     [5, 16, 16, 80]           0       
ResidualUnit-3   [[5, 16, 16, 80]]     [5, 16, 16, 80]           0       stage0结束Conv2D-11     [[5, 16, 16, 80]]     [5, 40, 16, 80]          640      stage1开始BatchNorm-11    [[5, 40, 16, 80]]     [5, 40, 16, 80]          160      
ConvBNLayer-11   [[5, 16, 16, 80]]     [5, 40, 16, 80]           0       Conv2D-12     [[5, 40, 16, 80]]      [5, 40, 8, 40]         1,000     BatchNorm-12     [[5, 40, 8, 40]]      [5, 40, 8, 40]          160      
ConvBNLayer-12   [[5, 40, 16, 80]]      [5, 40, 8, 40]           0       Conv2D-13      [[5, 40, 8, 40]]      [5, 24, 8, 40]          960      BatchNorm-13     [[5, 24, 8, 40]]      [5, 24, 8, 40]          96       
ConvBNLayer-13    [[5, 40, 8, 40]]      [5, 24, 8, 40]           0       
ResidualUnit-4   [[5, 16, 16, 80]]      [5, 24, 8, 40]           0       Conv2D-14      [[5, 24, 8, 40]]      [5, 64, 8, 40]         1,536     BatchNorm-14     [[5, 64, 8, 40]]      [5, 64, 8, 40]          256      
ConvBNLayer-14    [[5, 24, 8, 40]]      [5, 64, 8, 40]           0       Conv2D-15      [[5, 64, 8, 40]]      [5, 64, 8, 40]         1,600     BatchNorm-15     [[5, 64, 8, 40]]      [5, 64, 8, 40]          256      
ConvBNLayer-15    [[5, 64, 8, 40]]      [5, 64, 8, 40]           0       Conv2D-16      [[5, 64, 8, 40]]      [5, 24, 8, 40]         1,536     BatchNorm-16     [[5, 24, 8, 40]]      [5, 24, 8, 40]          96       
ConvBNLayer-16    [[5, 64, 8, 40]]      [5, 24, 8, 40]           0       
ResidualUnit-5    [[5, 24, 8, 40]]      [5, 24, 8, 40]           0       Conv2D-17      [[5, 24, 8, 40]]      [5, 64, 8, 40]         1,536     BatchNorm-17     [[5, 64, 8, 40]]      [5, 64, 8, 40]          256      
ConvBNLayer-17    [[5, 24, 8, 40]]      [5, 64, 8, 40]           0       Conv2D-18      [[5, 64, 8, 40]]      [5, 64, 8, 40]         1,600     BatchNorm-18     [[5, 64, 8, 40]]      [5, 64, 8, 40]          256      
ConvBNLayer-18    [[5, 64, 8, 40]]      [5, 64, 8, 40]           0       Conv2D-19      [[5, 64, 8, 40]]      [5, 24, 8, 40]         1,536     BatchNorm-19     [[5, 24, 8, 40]]      [5, 24, 8, 40]          96       
ConvBNLayer-19    [[5, 64, 8, 40]]      [5, 24, 8, 40]           0       
ResidualUnit-6    [[5, 24, 8, 40]]      [5, 24, 8, 40]           0       stage1结束Conv2D-20      [[5, 24, 8, 40]]     [5, 120, 8, 40]         2,880     stage2开始BatchNorm-20    [[5, 120, 8, 40]]     [5, 120, 8, 40]          480      
ConvBNLayer-20    [[5, 24, 8, 40]]     [5, 120, 8, 40]           0       Conv2D-21     [[5, 120, 8, 40]]     [5, 120, 4, 20]         1,080     BatchNorm-21    [[5, 120, 4, 20]]     [5, 120, 4, 20]          480      
ConvBNLayer-21   [[5, 120, 8, 40]]     [5, 120, 4, 20]           0       Conv2D-22     [[5, 120, 4, 20]]      [5, 40, 4, 20]         4,800     BatchNorm-22     [[5, 40, 4, 20]]      [5, 40, 4, 20]          160      
ConvBNLayer-22   [[5, 120, 4, 20]]      [5, 40, 4, 20]           0       
ResidualUnit-7    [[5, 24, 8, 40]]      [5, 40, 4, 20]           0       Conv2D-23      [[5, 40, 4, 20]]     [5, 104, 4, 20]         4,160     BatchNorm-23    [[5, 104, 4, 20]]     [5, 104, 4, 20]          416      
ConvBNLayer-23    [[5, 40, 4, 20]]     [5, 104, 4, 20]           0       Conv2D-24     [[5, 104, 4, 20]]     [5, 104, 4, 20]          936      BatchNorm-24    [[5, 104, 4, 20]]     [5, 104, 4, 20]          416      
ConvBNLayer-24   [[5, 104, 4, 20]]     [5, 104, 4, 20]           0       Conv2D-25     [[5, 104, 4, 20]]      [5, 40, 4, 20]         4,160     BatchNorm-25     [[5, 40, 4, 20]]      [5, 40, 4, 20]          160      
ConvBNLayer-25   [[5, 104, 4, 20]]      [5, 40, 4, 20]           0       
ResidualUnit-8    [[5, 40, 4, 20]]      [5, 40, 4, 20]           0       Conv2D-26      [[5, 40, 4, 20]]      [5, 96, 4, 20]         3,840     BatchNorm-26     [[5, 96, 4, 20]]      [5, 96, 4, 20]          384      
ConvBNLayer-26    [[5, 40, 4, 20]]      [5, 96, 4, 20]           0       Conv2D-27      [[5, 96, 4, 20]]      [5, 96, 4, 20]          864      BatchNorm-27     [[5, 96, 4, 20]]      [5, 96, 4, 20]          384      
ConvBNLayer-27    [[5, 96, 4, 20]]      [5, 96, 4, 20]           0       Conv2D-28      [[5, 96, 4, 20]]      [5, 40, 4, 20]         3,840     BatchNorm-28     [[5, 40, 4, 20]]      [5, 40, 4, 20]          160      
ConvBNLayer-28    [[5, 96, 4, 20]]      [5, 40, 4, 20]           0       
ResidualUnit-9    [[5, 40, 4, 20]]      [5, 40, 4, 20]           0       Conv2D-29      [[5, 40, 4, 20]]      [5, 96, 4, 20]         3,840     BatchNorm-29     [[5, 96, 4, 20]]      [5, 96, 4, 20]          384      
ConvBNLayer-29    [[5, 40, 4, 20]]      [5, 96, 4, 20]           0       Conv2D-30      [[5, 96, 4, 20]]      [5, 96, 4, 20]          864      BatchNorm-30     [[5, 96, 4, 20]]      [5, 96, 4, 20]          384      
ConvBNLayer-30    [[5, 96, 4, 20]]      [5, 96, 4, 20]           0       Conv2D-31      [[5, 96, 4, 20]]      [5, 40, 4, 20]         3,840     BatchNorm-31     [[5, 40, 4, 20]]      [5, 40, 4, 20]          160      
ConvBNLayer-31    [[5, 96, 4, 20]]      [5, 40, 4, 20]           0       
ResidualUnit-10   [[5, 40, 4, 20]]      [5, 40, 4, 20]           0       Conv2D-32      [[5, 40, 4, 20]]     [5, 240, 4, 20]         9,600     BatchNorm-32    [[5, 240, 4, 20]]     [5, 240, 4, 20]          960      
ConvBNLayer-32    [[5, 40, 4, 20]]     [5, 240, 4, 20]           0       Conv2D-33     [[5, 240, 4, 20]]     [5, 240, 4, 20]         2,160     BatchNorm-33    [[5, 240, 4, 20]]     [5, 240, 4, 20]          960      
ConvBNLayer-33   [[5, 240, 4, 20]]     [5, 240, 4, 20]           0       Conv2D-34     [[5, 240, 4, 20]]      [5, 56, 4, 20]        13,440     BatchNorm-34     [[5, 56, 4, 20]]      [5, 56, 4, 20]          224      
ConvBNLayer-34   [[5, 240, 4, 20]]      [5, 56, 4, 20]           0       
ResidualUnit-11   [[5, 40, 4, 20]]      [5, 56, 4, 20]           0       Conv2D-35      [[5, 56, 4, 20]]     [5, 336, 4, 20]        18,816     BatchNorm-35    [[5, 336, 4, 20]]     [5, 336, 4, 20]         1,344     
ConvBNLayer-35    [[5, 56, 4, 20]]     [5, 336, 4, 20]           0       Conv2D-36     [[5, 336, 4, 20]]     [5, 336, 4, 20]         3,024     BatchNorm-36    [[5, 336, 4, 20]]     [5, 336, 4, 20]         1,344     
ConvBNLayer-36   [[5, 336, 4, 20]]     [5, 336, 4, 20]           0       Conv2D-37     [[5, 336, 4, 20]]      [5, 56, 4, 20]        18,816     BatchNorm-37     [[5, 56, 4, 20]]      [5, 56, 4, 20]          224      
ConvBNLayer-37   [[5, 336, 4, 20]]      [5, 56, 4, 20]           0       
ResidualUnit-12   [[5, 56, 4, 20]]      [5, 56, 4, 20]           0       stage2结束Conv2D-38      [[5, 56, 4, 20]]     [5, 336, 4, 20]        18,816     stage3开始BatchNorm-38    [[5, 336, 4, 20]]     [5, 336, 4, 20]         1,344     
ConvBNLayer-38    [[5, 56, 4, 20]]     [5, 336, 4, 20]           0       Conv2D-39     [[5, 336, 4, 20]]     [5, 336, 2, 10]         8,400     BatchNorm-39    [[5, 336, 2, 10]]     [5, 336, 2, 10]         1,344     
ConvBNLayer-39   [[5, 336, 4, 20]]     [5, 336, 2, 10]           0       Conv2D-40     [[5, 336, 2, 10]]      [5, 80, 2, 10]        26,880     BatchNorm-40     [[5, 80, 2, 10]]      [5, 80, 2, 10]          320      
ConvBNLayer-40   [[5, 336, 2, 10]]      [5, 80, 2, 10]           0       
ResidualUnit-13   [[5, 56, 4, 20]]      [5, 80, 2, 10]           0       Conv2D-41      [[5, 80, 2, 10]]     [5, 480, 2, 10]        38,400     BatchNorm-41    [[5, 480, 2, 10]]     [5, 480, 2, 10]         1,920     
ConvBNLayer-41    [[5, 80, 2, 10]]     [5, 480, 2, 10]           0       Conv2D-42     [[5, 480, 2, 10]]     [5, 480, 2, 10]        12,000     BatchNorm-42    [[5, 480, 2, 10]]     [5, 480, 2, 10]         1,920     
ConvBNLayer-42   [[5, 480, 2, 10]]     [5, 480, 2, 10]           0       Conv2D-43     [[5, 480, 2, 10]]      [5, 80, 2, 10]        38,400     BatchNorm-43     [[5, 80, 2, 10]]      [5, 80, 2, 10]          320      
ConvBNLayer-43   [[5, 480, 2, 10]]      [5, 80, 2, 10]           0       
ResidualUnit-14   [[5, 80, 2, 10]]      [5, 80, 2, 10]           0       Conv2D-44      [[5, 80, 2, 10]]     [5, 480, 2, 10]        38,400     BatchNorm-44    [[5, 480, 2, 10]]     [5, 480, 2, 10]         1,920     
ConvBNLayer-44    [[5, 80, 2, 10]]     [5, 480, 2, 10]           0       Conv2D-45     [[5, 480, 2, 10]]     [5, 480, 2, 10]        12,000     BatchNorm-45    [[5, 480, 2, 10]]     [5, 480, 2, 10]         1,920     
ConvBNLayer-45   [[5, 480, 2, 10]]     [5, 480, 2, 10]           0       Conv2D-46     [[5, 480, 2, 10]]      [5, 80, 2, 10]        38,400     BatchNorm-46     [[5, 80, 2, 10]]      [5, 80, 2, 10]          320      
ConvBNLayer-46   [[5, 480, 2, 10]]      [5, 80, 2, 10]           0       
ResidualUnit-15   [[5, 80, 2, 10]]      [5, 80, 2, 10]           0       Conv2D-47      [[5, 80, 2, 10]]     [5, 480, 2, 10]        38,400     BatchNorm-47    [[5, 480, 2, 10]]     [5, 480, 2, 10]         1,920     
ConvBNLayer-47    [[5, 80, 2, 10]]     [5, 480, 2, 10]           0       stage3结束
===========================================================================
Total params: 410,848
Trainable params: 398,480
Non-trainable params: 12,368
---------------------------------------------------------------------------
Input size (MB): 1.17
Forward/backward pass size (MB): 116.78
Params size (MB): 1.57
Estimated Total Size (MB): 119.52
---------------------------------------------------------------------------

可以对照骨干网结构图,看懂各项输出,各阶段已经在输出中标注。由于yml文件中设置disable_se为True,即禁用SE模块,所以压发层实际上并没有用到主干网模型中。如果把disable_se改为False,可以在输出中看到SEModule-1到SEModule-8,有兴趣可以改代码测试。

小结

首先解释了卷归层ConvBNLayer、压发层SEModule、残差层ResidualUnit三个基本概念,接着分析了MobileNetV3的内部结构,最后通过python代码展示PaddleOCRv3文本检测神经网络的summary输出。测试代码可以参考gitee。

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

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

相关文章

数据结构——栈的模拟实现

大家好,今天我要介绍一下数据结构中的一个经典结构——栈。 一:栈的介绍 与顺序表和单链表不同的是: 顺序表和单链表都可以在头部和尾部插入和删除数据,但是栈的结构就锁死了(栈的底部是堵死的)栈只能从…

Ubuntu 安装 Samba Server

在 Mac 上如何能够与Ubuntu 服务器共享文件夹,需要在 Ubuntu 上安装 Samba 文件服务器。本文将介绍如何在 Ubuntu 上安装 Samba 服务器从而达到以下目的: Mac 与 Ubuntu 共享文件通过用户名密码访问 安装 Samba 服务 sudo apt install samba修改配置文…

Alan Chhabra:MongoDB AI应用程序计划(MAAP) 为客户提供价值

MongoDB全球合作伙伴执行副总裁 Alan Chhabra 每当有人向我问询MongoDB,我都会说他们很可能在不觉之间已经与MongoDB有过交集。事实上,包括70%财富百强在内的许多世界领先企业公司都在使用MongoDB。我们在MongoDB所做的一切都是为了服务客户&#xff0c…

计算机组成原理与系统结构——微程序控制

笔记内容及图片整理自XJTUSE “计算机组成原理与系统结构” 课程ppt,仅供学习交流使用,谢谢。 基本概念 微指令 将控制单元实现为基本逻辑单元之间的互连并非易事,且设计相对呆板,难以灵活地改变,因此实现微程序控制…

CUDA算子手撕与面试指南

引言 最近秋招落幕,期间一直在找高性能计算(HPC)相关岗位,整理了一些CUDA算子手撕的代码和知识点分享给大家。 项目地址:https://github.com/Tongkaio/CUDA_Kernel_Samples 如果觉得本项目对你有帮助,欢…

IIS部署程序https是访问出现403或ERR_HTTP2_PROTOCOL_ERROR

一、说明 在windows server 2016中的IIS程序池里部署一套系统,通过https访问站点,同时考虑到安全问题以及防攻击等行为,就用上了WAF云盾功能,能有效的抵挡部分攻击,加强网站的安全性和健壮性。 应用系统一直能够正常…

【EthIf-05】 Ethernet Interface main function

Ethernet Interface main function函数有以下功能和要点: 要实现支持轮询模式下帧传输确认和帧接收的以太网接口轮询机制:实现轮询功能,定期检查传入的帧。帧传输确认:包括确认帧已成功传输的机制。可配置轮询周期:允…

康耐视智能相机(Insight)通过ModbusTCP发送字符串到倍福(BECKHOFF)PLC中

文章目录 1.背景2.分析3.实现3.1.PLC的ModbusTCP_Server3.1.1.安装TF6250-Modbus-TCP3.1.2.PLC设置 3.2.智能相机的ModbusTCP_Client3.2.1.了解ModbusTCP的协议3.2.2.根据协议写代码3.2.2.1.纯函数代码3.2.2.2.脚本代码 3.2.3.非脚本处理时的代码逻辑图3.2.4.关于代码的问题及解…

ruoyi Cannot find module ‘@/views/system/user/index‘

Cannot find module /views/system/user/index 删除node_module 后打包成功

如何将你的 Ruby 应用程序从 OpenSearch 迁移到 Elasticsearch

作者:来自 Elastic Fernando Briano 将 Ruby 代码库从 OpenSearch 客户端迁移到 Elasticsearch 客户端的指南。 OpenSearch Ruby 客户端是从 7.x 版 Elasticsearch Ruby 客户端分叉而来的,因此代码库相对相似。这意味着当将 Ruby 代码库从 OpenSearch 迁…

spring cloud contract http实例

微服务很多时,服务之前相互调用,接口参数的一致性要变得很难维护。 spring cloud contract 提供了测试接口一致性的方法。 一 项目配置 plugins {id "groovy"id "org.springframework.cloud.contract" version "4.0.5"i…

帆软的无数据展示方案

文章目录 需求描述第一步、设置控件第二步、设置数据集优化改进 在日常工作中,使用到帆软报表工具,以下记录日常使用的过程, 需求描述 用帆软报表展示销量的信息,选择不同的订单状态,展示其订单数和总金额。 第一步、…

【操作系统】实验九:设备驱动程序

实验9 设备驱动程序 在钻研Linux内核的人当中,大多数人都是在写设备驱动程序。尽管由于设备的特殊性,使得每个驱动程序都不一样。但是编写设备驱动程序的许多原则和基本技巧都是一样的,甚至Windows下的设备驱动程序从原理上讲也与之相通。在…

文件上传—阿里云OSS对象存储

目录 一、OSS简介 二、OSS基本使用 1. 注册账号 2. 基本配置 (1) 开通OSS (2) 创建存储空间 (3) 修改权限 (4) 配置完成,上传一张图片,检验是否成功。 (5) 创建AccessKey 三、Java项目集成OSS 1. 导入依赖 2. Result.java代码: …

极米投影仪-看电视

文章目录 前言操作步骤1.进入GitHub下载软件2.修改后缀3.粘贴到U盘 前言 使用网络提供的电视接口免费看电视。 操作步骤 1.进入GitHub下载软件 地址:https://github.com/andandroidor/ourtv 也可以直接下载我已保存的apk,地址:https://d…

重生之我在异世界学编程之C语言:深入文件操作篇(下)

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 函数递归与迭代 引言正文一、文件的基本操作&#…

Rust HTTP请求库

GITHUB 地址 LTPP-GIT 地址 接口文档 说明 http-request 是一个轻量级、高效的库,用于在 Rust 应用程序中构建、发送和处理 HTTP/HTTPS 请求。它提供了一个简单直观的 API,使开发人员可以轻松地与使用 “HTTP” 或 “HTTPS” 协议的 Web 服务进行交互…

ERC论文阅读(03)--instructERC论文阅读笔记(2024-12-14)

instructERC论文阅读笔记 2024-12-14 论文题目:InstructERC: Reforming Emotion Recognition in Conversation with Multi-task Retrieval-Augmented Large Language Models 说明:以下内容纯属本人看论文及复现代码的记录,如想了解论文细节&…

uniapp - 微信小程序

一、background-image 大图不显示的问题 解决方法: 1、使用网络地址;2、使用 base64 urlTobase64(filePath) {// #ifdef MP-WEIXINlet img ${filePath},imgBase64 wx.getFileSystemManager().readFileSync(img, "base64"),base64Url data:…

MongoDB-ObjectID 生成器

前言 MongoDB中一个非常关键的概念就是 ObjectID,它是 MongoDB 中每个文档的默认唯一标识符。了解 ObjectID 的生成机制不仅有助于开发人员优化数据库性能,还能帮助更好地理解 MongoDB 的设计理念。 什么是 MongoDB ObjectID? 在 MongoDB …