yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别

今天刚发表的一篇论文提出来了针对小目标和低分辨率图像检测性能提升的技术SPD-Conv,感觉还是挺有意义的,今天主要是基于这项技术融合进yolov5s模型中来开发对应的目标检测模型,实现五子棋的检测,本身五子棋就是比较密集的小目标检测,先来看下效果图:

 论文详情如下:

《No More Strided Convolutions or Pooling: A New CNN Building Block for Low-Resolution Images and Small Objects》
2022年8月7日发表在ECML PKDD 2022论文集上的最新paper
作者:来自于 Missouri 大学的 Raja Sunkara and Tie Luo
论文地址:https://arxiv.org/abs/2208.03641v1

yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别_第1张图片

论文截图如下所示:

yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别_第2张图片

yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别_第3张图片

yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别_第4张图片

 感兴趣的话可以自行下载仔细研读。
项目地址在这里,首页截图如下所示:

yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别_第5张图片

 yolov5可以说是yolo系列里面开发广度和深度维系最久的一款模型了知名度也是很高的,官方的项目地址在这里,首页截图如下所示:

yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别_第6张图片

yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别_第7张图片

yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别_第8张图片

 目前已经有34k的star量,还是很优秀的一个开源项目的,yolov5提供了n、s、m、l和x五种不同型号的模型,体积和参数量也是逐步递增的,我这里选用的是yolov5s系列的模型。

space_to_depth的核心实现如下:

class space_to_depth(nn.Module):
    # Changing the dimension of the Tensor
    def __init__(self, dimension=1):
        super().__init__()
        self.d = dimension

    def forward(self, x):
         return torch.cat([x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]], 1)
#         size_tensor = x.size()
#         return torch.cat([x[...,0:size_tensor[2]//2,0:size_tensor[3]//2],
#                          x[...,0:size_tensor[2]//2,size_tensor[3]//2:],
#                          x[...,size_tensor[2]//2:,0:size_tensor[3]//2],
#                          x[...,size_tensor[2]//2:,size_tensor[3]//2:]  ],1)

这是官方提供的实现方式应该是验证可行的,可以直接使用。

复制一份原始yolov5s.yaml,重命名为yolov5s_spd.yaml,内容如下:

#Parameters
nc: 2  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # 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


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


#head
head:
  [[-1, 1, Conv, [512, 1, 1]],                    # 14
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],    # 15
   [[-1, 9], 1, Concat, [1]],                     # 16 cat backbone P4
   [-1, 3, C3, [512, False]],                     # 17

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

   [-1, 1, Conv, [256, 3, 1]],                    # 22
   [-1,1,space_to_depth,[1]],                     # 23 -P2/4
   [[-1, 18], 1, Concat, [1]],                    # 24 cat head P4
   [-1, 3, C3, [512, False]],                     # 25 (P4/16-medium)

   [-1, 1, Conv, [512, 3, 1]],                    # 26
   [-1,1,space_to_depth,[1]],                     # 27 -P2/4
   [[-1, 14], 1, Concat, [1]],                    # 28 cat head P5
   [-1, 3, C3, [1024, False]],                    # 29 (P5/32-large)

   [[21, 25, 29], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

因为我这里要检测的是五子棋,只有黑白两种基础的目标对象,所以这里同步修改了nc=2,可以根据自己的实际需求来修改具体的nc值。

接下来看下数据集:

yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别_第9张图片

yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别_第10张图片

 单样本标注实例如下所示:

0 0.366667 0.235185 0.059259 0.059259
0 0.431481 0.431481 0.059259 0.059259
0 0.431481 0.366667 0.059259 0.059259
0 0.627778 0.366667 0.059259 0.059259
0 0.3 0.694444 0.059259 0.059259
0 0.498148 0.431481 0.059259 0.059259
0 0.3 0.562963 0.059259 0.059259
0 0.366667 0.431481 0.059259 0.059259
0 0.3 0.431481 0.059259 0.059259
0 0.3 0.498148 0.059259 0.059259
0 0.431481 0.627778 0.059259 0.059259
0 0.627778 0.759259 0.059259 0.059259
1 0.498148 0.498148 0.059259 0.059259
1 0.431481 0.562963 0.059259 0.059259
1 0.562963 0.431481 0.059259 0.059259
1 0.366667 0.627778 0.059259 0.059259
1 0.498148 0.562963 0.059259 0.059259
1 0.366667 0.562963 0.059259 0.059259
1 0.366667 0.498148 0.059259 0.059259
1 0.498148 0.627778 0.059259 0.059259
1 0.235185 0.431481 0.059259 0.059259
1 0.3 0.627778 0.059259 0.059259
1 0.562963 0.694444 0.059259 0.059259
1 0.498148 0.694444 0.059259 0.059259

训练模型的方式可以参考官方yolov5项目README操作即可。教程地址在这里,首页截图如下所示:

yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别_第11张图片

yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别_第12张图片

yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别_第13张图片

 教程还是很详细的,通俗易懂,这里我就不再班门弄斧了。

启动训练后,日志输出如下所示:

yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别_第14张图片

yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别_第15张图片

yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别_第16张图片

 默认100epoch的迭代计算,可以看到:训练结束后得到的mAP指标已经很好了。

为了更加直观简洁地使用训练好的模型,这里编写了对应的界面模块,启动界面如下:

yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别_第17张图片

 上传检测图像:
 

yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别_第18张图片

 推理检测识别:

yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别_第19张图片

yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别_第20张图片

yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别_第21张图片

 随机测试图像,可以看到整体的检测效果还是很不错的,检测框也是很贴合围棋棋子的边界。

你可能感兴趣的:(深度学习,深度学习,人工智能,计算机视觉)