YOLOv5目标检测优化点(添加小目标头检测)

文章目录

  • 1、前言
  • 2、如何计算参数
  • 3、YOLOv5小目标改进-1
    • 3.1、结构文件
    • 3.2、结构图
    • 3.3、参数对比
      • 3.3.1、yolov5l.yaml 解析表
      • 3.3.2、 yolov5l-4P.yaml 解析表
  • 4、YOLOv5小目标改进-2
    • 4.1、结构文件
    • 4.2、结构图
  • 5、YOLOv5小目标改进-3
    • 5.1、结构文件
  • 6、YOLOv5小目标改进-4
    • 6.1、结构文件
  • 7、优化点
    • 7.1、改进模型其他思路
    • 7.2、如何使用更深层次的网络
  • 8、遇到的问题
  • 9、参考文章
  • 10、目标检测系列文章

1、前言

在检测过程中,碰到小的目标物体,采用YOLOv5模型,难以检测到小目标,因此本文提出,增加小目标检测头,从浅层特征图学习到小目标的特征信息后,与深层特征图拼接,从而使深层网络也能够学习到小目标的特征信息,让网络更加关注小目标的检测,提高目标检测效果。唯一缺点是随着网络层数增多,带来计算量的增加导致检测推理速度减慢。

2、如何计算参数

H₂=(H1-K+2P)/S+1

其中,H1代表输入宽度,K代表卷积核个数,P代表零填充,S代表步长。

  • Conv:卷积,一般来说宽高会降低一遍(主要看参数)。
  • Upsample: 上采样,宽高升高一倍。
  • Concat:拼接,宽高一致情况下,维度相加。

3、YOLOv5小目标改进-1

3.1、结构文件

yolov5l.yaml 源文件

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license

# Parameters
nc: 80  # number of classes
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple
anchors:
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

# YOLOv5 v6.0 backbone
backbone:
  # [from, number, module, args]
  # args: channel,kernel_size,stride,padding,bias等
  [[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, C3, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 6, C3, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, C3, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 3, C3, [1024]],
   [-1, 1, SPPF, [1024, 5]],  # 9
  ]

# YOLOv5 v6.0 head
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, C3, [512, False]],  # 13

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, C3, [256, False]],  # 17 (P3/8-small)

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, C3, [512, False]],  # 20 (P4/16-medium)

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, C3, [1024, False]],  # 23 (P5/32-large)

   [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

添加多一层小目标检测,即默认三头检测,现在是四头检测。

创建 yolov5l-4P.yaml ,代码如下

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license

# Parameters
nc: 80  # number of classes
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple
anchors:
  - [ 10,13, 16,30, 33,23 ]  # P2/4
  - [ 30,61, 62,45, 59,119 ]  # P3/8
  - [ 116,90, 156,198, 373,326 ]  # P4/16
  - [ 436,615,  739,380,  925,792 ]  # P5/32

# YOLOv5 v6.0 backbone
backbone:
  # [from, number, module, args]
  # args: channel,kernel_size,stride,padding,bias等
  [[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, C3, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 6, C3, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, C3, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 3, C3, [1024]],
   [-1, 1, SPPF, [1024, 5]],  # 9
  ]

# YOLOv5 v6.0 head
head:
  [[-1, 1, Conv, [512, 1, 1]],  # 10   20*20
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, C3, [512, False]],  # 13

   [-1, 1, Conv, [512, 1, 1]], # 14  40*40 [512,40,40]
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],   # [512,80,80]
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3   80*80  [768,80,80]
   [-1, 3, C3, [512, False]],  # 17 (P3/8-small)  80*80  [768,80,80]

   [-1, 1, Conv, [256, 1, 1]],  # 18  [256,80,80]
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],  # [256,160,160]
   [[-1, 2], 1, Concat, [1]],  # cat backbone P3 # [384,160,160]
   [-1, 3, C3, [256, False]],  # 21 (P3/8-small) # [256,160,160]

   [-1, 1, Conv, [256, 3, 2]],   # 22  80*8  [256,80,80]
   [[-1, 18], 1, Concat, [1]],  # cat head P4  [512,80,80]
   [-1, 3, C3, [256, False]],  # 24 (P4/16-medium) [256,80,80]

   [-1, 1, Conv, [256, 3, 2]],  # [256,40,40]
   [[-1, 14], 1, Concat, [1]],  # cat head P4 [768,40,40]
   [-1, 3, C3, [512, False]],  # 27 (P4/16-medium) [512,40,40]

   [-1, 1, Conv, [512, 3, 2]],  # [512,20,20]
   [[-1, 10], 1, Concat, [1]],  # cat head P5  [1024,20,20]
   [-1, 3, C3, [1024, False]],  # 30 (P5/32-large) [1024,20,20]

   [[21, 24, 27,30], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

3.2、结构图

改进前

在这里插入图片描述

改进后

在这里插入图片描述

3.3、参数对比

3.3.1、yolov5l.yaml 解析表

1. 注:yolov5l.yaml的depth_multiple和width_multiple都为1
2. 利用上述公式进行计算,H₂=(H1-K+2P)/S+1。
3. args: channel,kernel_size,stride,padding,bias等
4. (640-6+2*2)/ 2 +1 =320

层数frommouduleargumentsinputoutput
0-1Conv[3, 64, 6, 2, 2][3, 640, 640][64, 320, 320]
1-1Conv[64, 128, 3, 2][64, 320, 320][128, 160, 160]
2-1C3[128,128, 1][128, 160, 160][128 160, 160]
3-1Conv[128,256, 3, 2][128 160, 160][256, 80, 80]
4-1C3[256,256, 2][256, 80, 80][256, 80, 80]
5-1Conv[256,512, 3, 2][256, 80, 80][512, 40, 40]
6-1C3[512, 512, 3][512, 40, 40][512, 40, 40]
7-1Conv[512, 1024, 3, 2][512, 40, 40][1024, 20, 20]
8-1C3[1024, 1024, 1][1024, 20, 20][1024, 20, 20]
9-1SPPF[1024, 1024, 5][1024, 20, 20][1024, 20, 20]
10-1Conv[1024,512, 1, 1][1024, 20, 20][512, 20, 20]
11-1Upsample[None, 2, ‘nearest’][512, 20, 20][512, 40, 40]
12[-1, 6]Concat[512+512][1, 512, 40, 40],[1, 512, 40, 40][1024, 40, 40]
13-1C3[1024,512, 1, False][1024, 40, 40][512, 40, 40]
14-1Conv[512,256, 1, 1][512, 40, 40][256, 40, 40]
15-1Upsample[None, 2, ‘nearest’][256, 40, 40][256, 80, 80]
16[-1, 4]Concat[256+256][1, 256, 80, 80],[1, 256, 80, 80][512, 80, 80]
17-1C3[512, 256, 1, False][512, 80, 80][256, 80, 80]
18-1Conv[256, 256, 3, 2][256, 80, 80][256, 40, 40]
19[-1, 14]Concat[256+256][1, 256, 40, 40],[1, 256, 40, 40][512, 40, 40]
20-1C3[512, 512, 1, False][512, 40, 40][512, 40, 40]
21-1Conv[512, 512, 3, 2][512, 40, 40][512, 20, 20]
22[-1, 10]Concat[512+512][1, 512, 20, 20],[1, 512, 20, 20][1024 20, 20]
23-1C3[1024,1024, 1, False][1024, 20, 20][1024, 20, 20]
24[17, 20, 23]Detect[80, [[10, 13, 16, 30, 33, 23], [30, 61, 62, 45, 59, 119], [116, 90, 156, 198, 373, 326]], [128, 256, 512]][1, 256, 80, 80],[1, 512, 40, 40],[1, 1024, 20, 20][1, 3, 80, 80, 85],[1, 3, 40, 40, 85],[1, 3, 20, 20, 85]

3.3.2、 yolov5l-4P.yaml 解析表

注:yolov5l.yaml的depth_multiple和width_multiple都为1

层数frommouduleargumentsinputoutput
0-1Conv[3, 64, 6, 2, 2][3, 640, 640][64, 320, 320]
1-1Conv[64, 128, 3, 2][64, 320, 320][128, 160, 160]
2-1C3[128,128, 1][128, 160, 160][128 160, 160]
3-1Conv[128,256, 3, 2][128 160, 160][256, 80, 80]
4-1C3[256,256, 2][256, 80, 80][256, 80, 80]
5-1Conv[256,512, 3, 2][256, 80, 80][512, 40, 40]
6-1C3[512, 512, 3][512, 40, 40][512, 40, 40]
7-1Conv[512, 1024, 3, 2][512, 40, 40][1024, 20, 20]
8-1C3[1024, 1024, 1][1024, 20, 20][1024, 20, 20]
9-1SPPF[1024, 1024, 5][1024, 20, 20][1024, 20, 20]
10-1Conv[1024,512, 1, 1][1024, 20, 20][512, 20, 20]
11-1Upsample[None, 2, ‘nearest’][512, 20, 20][512, 40, 40]
12[-1, 6]Concat[512+512][1, 512, 40, 40],[1, 512, 40, 40][1024, 40, 40]
13-1C3[1024,512, 1, False][1024, 40, 40][512, 40, 40]
14-1Conv[512,512, 1, 1][512, 40, 40][512, 40, 40]
15-1Upsample[None, 2, ‘nearest’][512, 40, 40][512, 80, 80]
16[-1, 4]Concat[256+512][1, 256, 80, 80],[1, 512, 80, 80][768, 80, 80]
17-1C3[768, 512, 1, False][768, 80, 80][512, 80, 80]
18-1Conv[512, 256, 1, 1][512, 80, 80][256, 80, 80]
19-1Upsample[None, 2, ‘nearest’][256, 80, 80][256, 160, 160]
20[-1, 2]Concat[256+128][1, 256, 160, 160],[1, 128, 160, 160][384, 160, 160]
21-1C3[384, 256, 1, False][384, 160, 160][256, 160, 160]
22-1Conv[256, 256, 3, 2][256, 160, 160][256, 80, 80]
23[-1, 18]Concat[256+256][1, 256, 80, 80],[1,256, 80, 80][512, 80, 80]
24-1C3[512,256, 1, False][512, 80, 80][256,80,80]
25-1Conv[256, 3, 2][256,80,80][256,40,40]
26[-1, 14]Concat[256+512][256,40,40][768,40,40]
27-1C3[768,512, 1, False][768,40,40][512,40,40]
28-1Conv[512, 3, 2][512,40,40][512,20,20]
29[-1, 10]Concat[512+512][512,20,20][1024,20,20]
30-1C3[1024,1024, 1, False][1024,20,20][1024,20,20]
31[21, 24, 27,30]Detect[80, [[10, 13, 16, 30, 33, 23], [30, 61, 62, 45, 59, 119], [116, 90, 156, 198, 373, 326],[ 436,615, 739,380, 925,792 ]], [256, 256, 512,1024]][1, 256, 160, 160],[1, 256, 80, 80],[1, 512, 40, 40],[1, 1024, 20, 20][1, 3, 160, 160, 80],[1, 3, 80, 80, 80],[1, 3, 40, 40, 80],[1, 3, 20, 20, 80]

4、YOLOv5小目标改进-2

4.1、结构文件

自动锚框四头(P2, P3, P4, P5)

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license

# Parameters
nc: 80  # number of classes
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple
anchors: 3  # AutoAnchor evolves 3 anchors per P output layer

# YOLOv5 v6.0 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, C3, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 6, C3, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, C3, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 3, C3, [1024]],
   [-1, 1, SPPF, [1024, 5]],  # 9
  ]

# YOLOv5 v6.0 head with (P2, P3, P4, P5) outputs
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, C3, [512, False]],  # 13

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, C3, [256, False]],  # 17 (P3/8-small)

   [-1, 1, Conv, [128, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 2], 1, Concat, [1]],  # cat backbone P2
   [-1, 1, C3, [128, False]],  # 21 (P2/4-xsmall)

   [-1, 1, Conv, [128, 3, 2]],
   [[-1, 18], 1, Concat, [1]],  # cat head P3
   [-1, 3, C3, [256, False]],  # 24 (P3/8-small)

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, C3, [512, False]],  # 27 (P4/16-medium)

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, C3, [1024, False]],  # 30 (P5/32-large)

   [[21, 24, 27, 30], 1, Detect, [nc, anchors]],  # Detect(P2, P3, P4, P5)
  ]

4.2、结构图

在这里插入图片描述

5、YOLOv5小目标改进-3

5.1、结构文件

四头BiFPN(P3, P4, P5, P6)

# parameters
nc: 80  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple

# anchors
anchors:
  - [ 19,27,  44,40,  38,94 ]  # P3/8
  - [ 96,68,  86,152,  180,137 ]  # P4/16
  - [ 140,301,  303,264,  238,542 ]  # P5/32
  - [ 436,615,  739,380,  925,792 ]  # P6/64

# YOLOv5 backbone
backbone:
  # [from, number, module, args]
  [ [-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2
    [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
    [-1, 3, C3, [128]],
    [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
    [-1, 6, C3, [256]],
    [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
    [-1, 9, C3, [512]],
    [-1, 1, Conv, [768, 3, 2]],  # 7-P5/32
    [-1, 3, C3, [768]],
    [-1, 1, Conv, [1024, 3, 2]],  # 9-P6/64
    [-1, 3, C3, [1024]],
    [-1, 1, SPPF, [1024, 5]],  # 11
  ]

# YOLOv5 head
head:
  [ [ -1, 1, Conv, [ 768, 1, 1 ] ],    # 12 head
    [ -1, 1, nn.Upsample, [ None, 2, 'nearest' ] ],
    [ [ -1, 8 ], 1, BiFPN_Add2, [ 384,384] ],  # cat backbone P5
    [ -1, 3, C3, [ 768, False ] ],  # 15

    [ -1, 1, Conv, [ 512, 1, 1 ] ],
    [ -1, 1, nn.Upsample, [ None, 2, 'nearest' ] ],
    [ [ -1, 6 ], 1, BiFPN_Add2, [ 256,256] ],  # cat backbone P4
    [ -1, 3, C3, [ 512, False ] ],  # 19

    [ -1, 1, Conv, [ 256, 1, 1 ] ],
    [ -1, 1, nn.Upsample, [ None, 2, 'nearest' ] ],
    [ [ -1, 4 ], 1, BiFPN_Add2, [ 128,128] ],  # cat backbone P3
    [ -1, 3, C3, [ 256, False ] ],  # 23 (P3/8-small)

    [ -1, 1, Conv, [ 512, 3, 2 ] ],
    [ [ -1, 6, 19 ], 1, BiFPN_Add3, [ 256 , 256 ] ],  # cat head P4
    [ -1, 3, C3, [ 512, False ] ],  # 26 (P4/16-medium)

    [ -1, 1, Conv, [ 768, 3, 2 ] ],
    [ [ -1, 8, 15 ], 1, BiFPN_Add3, [ 384,384 ] ],  # cat head P5
    [ -1, 3, C3, [ 768, False ] ],  # 29 (P5/32-large)

    [ -1, 1, Conv, [ 1024, 3, 2 ] ], #30
    [ [ -1, 11 ], 1, BiFPN_Add2, [ 512, 512] ],  # cat head P6
    [ -1, 3, C3, [ 1024, False ] ],  # 32 (P6/64-xlarge)

    [ [ 23, 26, 29, 32 ], 1, Detect, [ nc, anchors ] ],  # Detect(P3, P4, P5, P6)
  ]

6、YOLOv5小目标改进-4

6.1、结构文件

两头(P3,P4)

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license

# Parameters
nc: 80  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple
anchors: 3  # AutoAnchor evolves 3 anchors per P output layer

# YOLOv5 v6.0 backbone
backbone:
  # [from, number, module, args]
  [ [ -1, 1, Conv, [ 64, 6, 2, 2 ] ],  # 0-P1/2
    [ -1, 1, Conv, [ 128, 3, 2 ] ],  # 1-P2/4
    [ -1, 3, C3, [ 128 ] ],
    [ -1, 1, Conv, [ 256, 3, 2 ] ],  # 3-P3/8
    [ -1, 6, C3, [ 256 ] ],
    [ -1, 1, Conv, [ 512, 3, 2 ] ],  # 5-P4/16
    [ -1, 9, C3, [ 512 ] ],
    [ -1, 1, Conv, [ 1024, 3, 2 ] ],  # 7-P5/32
    [ -1, 3, C3, [ 1024 ] ],
    [ -1, 1, SPPF, [ 1024, 5 ] ],  # 9
  ]

# YOLOv5 v6.0 head with (P3, P4) outputs
head:
  [ [ -1, 1, Conv, [ 512, 1, 1 ] ],
    [ -1, 1, nn.Upsample, [ None, 2, 'nearest' ] ],
    [ [ -1, 6 ], 1, Concat, [ 1 ] ],  # cat backbone P4
    [ -1, 3, C3, [ 512, False ] ],  # 13

    [ -1, 1, Conv, [ 256, 1, 1 ] ],
    [ -1, 1, nn.Upsample, [ None, 2, 'nearest' ] ],
    [ [ -1, 4 ], 1, Concat, [ 1 ] ],  # cat backbone P3
    [ -1, 3, C3, [ 256, False ] ],  # 17 (P3/8-small)

    [ -1, 1, Conv, [ 256, 3, 2 ] ],
    [ [ -1, 14 ], 1, Concat, [ 1 ] ],  # cat head P4
    [ -1, 3, C3, [ 512, False ] ],  # 20 (P4/16-medium)

    [ [ 17, 20 ], 1, Detect, [ nc, anchors ] ],  # Detect(P3, P4)
  ]

7、优化点

7.1、改进模型其他思路

在这里插入图片描述

7.2、如何使用更深层次的网络

更深层次的网络在models/hub里面自带了,一般是高分辨率图像适合使用的。

在这里插入图片描述

8、遇到的问题

RuntimeError: The size of tensor a (3) must match the size of tensor b (4) at non-singleton dimension 0

原因:

  1. 要求anchors个数是4个,目前匹配到了3个,还缺少1个。
  2. 因为添加了额外输出层,但是我们没有为该层定义任何的anchors。

解决方案:

  1. 我们额外为该层添加一个anchors
  2. 设置自动添加anchor
    • anchors: 3 # AutoAnchor evolves 3 anchors per P output layer,为每一个特征输出层自动生成3个锚框
# 原始:
anchors:
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32
  
# 添加新的anchors:
anchors:
  - [ 10,13, 16,30, 33,23 ]  # P2/4
  - [ 30,61, 62,45, 59,119 ]  # P3/8
  - [ 116,90, 156,198, 373,326 ]  # P4/16
  - [ 436,615,  739,380,  925,792 ]  # P5/32

9、参考文章

  1. 万字长文!YOLO算法模型yaml文件史上最详细解析与教程!小白也能看懂!掌握了这个就掌握了魔改YOLO的核心!
  2. YOLOv8/YOLOv7/YOLOv5系列算法改进【NO.6】增加小目标检测层,提高对小目标的检测效果

10、目标检测系列文章

  1. YOLOv5s网络模型讲解(一看就会)
  2. 生活垃圾数据集(YOLO版)
  3. YOLOv5如何训练自己的数据集
  4. 双向控制舵机(树莓派版)
  5. 树莓派部署YOLOv5目标检测(详细篇)
  6. YOLO_Tracking 实践 (环境搭建 & 案例测试)
  7. 目标检测:数据集划分 & XML数据集转YOLO标签
  8. YOLOv5改进–轻量化YOLOv5s模型
  9. DeepSort行人车辆识别系统(实现目标检测+跟踪+统计)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

KDTree索引(K近邻搜索,半径R内近邻搜索)——PCL

K近邻搜索(K Nearest Neighbors) K近邻搜索是一种基于点数量的搜索方法,它会找到指定点附近最接近的K个邻居点。K近邻搜索中的K值是一个参数,您需要指定要搜索的邻居数量。该方法适用于需要查找固定数量邻居点的情况,…

如何将三方库集成到hap包中——通过IDE集成cmak构建方式的C/C++三方库

简介 cmake构建方式是开源三方库的主流构建方式。DevEco Studio目前以支持cmake的构建方式。本文将通过在IDE上适配cJSON三方库为例讲来解如何在IDE上集成cmake构建方式得三方库。 创建工程 在开发进行三方库适配以及napi接口开发前,我们需要创建一个三方库对应的…

给你的AppImage创建桌面快捷方式

原文链接 https://www.cnblogs.com/HGNET/p/16396589.html 运行环境:Ubuntu 22.04 LTS 1.首先准备好AppImage文件并放在一个你知道的地方 2.打开终端,在/usr/share/applications下新建APP.desktop文件(APP可以改成你的应用名称) cd /usr/s…

如何对图像进行聚类

文章来源:https://medium.com/voxel51/how-to-cluster-images-6e09bdff7361 2024 年 4 月 10 日 使用 FiftyOne、Scikit-learn和特征嵌入 在 2024 年深度学习的计算密集型环境中,集群一词最常出现在讨论 GPU 集群时--高度优化的矩阵乘法机器的大规模集…

谈谈我的软考高级考证之路(系统架构设计师篇)

系统架构设计师备考资料请移步 2023年软考高级系统架构设计师视频教程,推荐下载!获取。 备考总体策略 • 总体策略:刷视频记笔记刷真题 • 备考时间:建议报完名之后,开始备考,大致2-3个月(基础…

最优算法100例之45-不用循环乘法求1-n的和

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句。不能用循…

JS - BOM(浏览器对象模型)

BOM 浏览器对象模型 BOM可以使我们通过JS来操作浏览器 在BOM中为我们提供了一组对象,用来完成对浏览器的操作 BOM对象 BOM(Browser Object Model)是指浏览器对象模型,它提供了与浏览器窗口进行交互的对象和方法。BOM包括一些核…

数据库系统概论(超详解!!!)第四节 数据库安全性

问题的提出: 数据库的一大特点是数据可以共享 数据共享必然带来数据库的安全性问题 数据库系统中的数据共享不能是无条件的共享。 1.数据库的安全概述 数据库的安全性是指保护数据库以防止不合法使用所造成的数据泄露、更改或破坏 。 系统安全保护措施是否有效…

Xcode 15.0 新 #Preview 预览让 SwiftUI 界面调试更加悠然自得

概览 从 Xcode 15 开始,苹果推出了新的 #Preview 宏预览机制,它无论从语法还是灵活性上都远远超过之前的预览方式。#Preview 不但可以实时预览 SwiftUI 视图,而且对 UIKit 的界面预览也是信手拈来。 想学习新 #Preview 预览的一些超实用调试…

2024年MathorCup数学建模C题物流网络分拣中心货量预测及人员排班解题文档与程序

2024年第十四届MathorCup高校数学建模挑战赛 C题 物流网络分拣中心货量预测及人员排班 原题再现: 电商物流网络在订单履约中由多个环节组成,图1是一个简化的物流网络示意图。其中,分拣中心作为网络的中间环节,需要将包按照不同流…

无人机巡检技术革命性变革光伏电站运维管理

在中国广袤的大地上,光伏电站如雨后春笋般崛起,晶体硅组件板在阳光下熠熠生辉,为人们带来了源源不断的绿色能源。然而,随着光伏产业的迅猛发展,电站运维管理面临着前所未有的挑战。而无人机巡检技术的引入,…

webpack or vite? vuex or pinia?

2022.2.18, 新建一个vue3的项目,过程如下: 目录结构如下: 当还在犹豫选择webpack还是vite,vuex或者pinia的时候,尤大大已经给出了默认选择,vite && pinia。

算法100例(持续更新)

算法100道经典例子,按算法与数据结构分类 1、祖玛游戏2、找下一个更大的值3、换根树状dp4、一笔画完所有边5、树状数组,数字1e9映射到下标1e56、最长回文子序列7、超级洗衣机,正负值传递次数8、Dijkstra9、背包问题,01背包和完全背…

Django模型入门

Django模型入门 为了能够学会使用Django模型,本节通过构建一个实际的Django模型来帮助读者尽快入门。 3.2.1 定义模型 既然Django模型实现了ORM功能,那么它就是对数据库实例的描述和实现。下面,我们通过一个简单的实例进行讲解。 如果需…

SF506DS-ASEMI开关电源二极管SF506DS

编辑:ll SF506DS-ASEMI开关电源二极管SF506DS 型号:SF506DS 品牌:ASEMI 封装:TO-252 最大平均正向电流(IF):5A 最大循环峰值反向电压(VRRM):600V 最大…

【opencv】示例-pca.cpp PCA图像重建演示

// 加载必要的头文件 #include <iostream> // 用于标准输入输出流 #include <fstream> // 用于文件的输入输出 #include <sstream> // 用于字符串的输入输出流操作#include <opencv2/core.hpp> // OpenCV核心功能的头文件 #include "o…

数据结构之单链表相关刷题

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构 数据结构之单链表的相关知识点及应用-CSDN博客 下面题目基于上面这篇文章&#xff1a; 下面有任何不懂的地方欢迎在评论区留言或…

OpenAI CEO山姆·奥特曼推广新AI企业服务,直面微软竞争|TodayAI

近期&#xff0c;OpenAI的首席执行官山姆奥特曼在全球多地接待了来自《财富》500强公司的数百名高管&#xff0c;展示了公司最新的人工智能服务。在旧金山、纽约和伦敦的会议上&#xff0c;奥特曼及其团队向企业界领袖展示了OpenAI的企业级产品&#xff0c;并进行了与微软产品的…

ansible的常见用法

目录 ##编辑hosts文件 ##copy模块##复制过去 ##fetch模块##拉取 ##shell模块 ##好用 ##command模块## ##file模块### ##cron模块### ##crontab 计划任务 ##下载好时间插件 ##script模块 ##yum模块## ##yum下载源配置文件 /etc/yum.repos.d/CentOS-Base.repo ##ser…

【opencv】示例-minarea.cpp 如何寻找一组随机生成的点的最小外接矩形、三角形和圆...

// 包含OpenCV库的高GUI模块和图像处理模块的头文件 #include "opencv2/highgui.hpp" #include "opencv2/imgproc.hpp"// 包含标准输入输出流的头文件 #include <iostream>// 使用命名空间cv和std&#xff0c;这样我们就可以直接使用OpenCV和标准库的…