在ASF-YOLO提出之初,我们就进行了相应的实践开发,感兴趣的话可以自行移步阅读:
《基于ASF-YOLO融合空间特征和尺度特征的新型注意力尺度序列融合模型开发构建医学场景下细胞分割检测识别系统,以【BCC、DSB2018数据集为基准】》
本文的主要目的是想要基于ASF-YOLO开发构建在涵洞隧道场景下壁体类建筑的缺陷分割识别系统,首先看下实例效果:
相关涵洞隧道场景下的墙体缺陷分割实践感兴趣的话可以自行移步阅读:
《AI助力隧道等洞体类场景下水泥基建缺陷检测,基于DeeplabV3Plus开发构建洞体场景下壁体建筑缺陷分割系统》
《基于轻量级yolov5n开发构建涵洞场景下洞体墙体缺陷病害检测分割系统》
《基于轻量级YOLOv5s开发构建隧道基建裂痕、脱落等缺陷问题检测系统》
《基于yolov5全系列[n/s/m/l/x]不同参数量级模型开发构建隧道巡检场景下水泥建筑墙体缺陷病害检测分割系统》
《探索图像分辨率对于模型的影响,基于yolov5x开发构建桥洞、隧道、涵洞等水泥洞体建筑裂缝缺陷等检测识别系统》
《助力涵洞场景安全智能巡检,基于yolov7/yolov7x/yolov7e6e开发构建基体建筑缺陷问题检测识别系统》
ASF-YOLO框架结合了空间和尺度特征,实现了准确快速的细胞实例分割。基于YOLO分割框架,我们使用尺度序列特征融合(SSFF)模块来增强网络的多尺度信息提取能力,并使用三重特征编码器(TPE)模块来融合不同尺度的特征图以增加详细信息。我们进一步引入了一种通道和位置注意机制(CPAM)来集成SSFF和TPE模块,该模块专注于信息通道和空间位置相关的小对象,以提高检测和分割性能。在两个细胞数据集上的实验验证表明,所提出的ASFYOLO模型具有显著的分割精度和速度。在2018年数据科学碗数据集上,它实现了0.91的boxmAP、0.887的maskmAP和47.3 FPS的推理速度,优于最先进的方法。
官方论文在这里,如下所示:
YOLO框架一般由backbone、neck和head三个主要组件构成。backbone网络是卷积神经网络,用于从不同的粒度下提取图像特征。CSPDarknet53是基于YOLOv4进行改进的backbone网络,被用作YOLOv5的主干网络。它包含了C3模块(包括3个卷积层)和ConvBNSiLU模块。在YOLOv5和YOLOv8的backbone中,有5个级别的特征提取分支:P1、P2、P3、P4和P5,与YOLO网络的输出相关联。YOLOv5 v7和YOLOv8是基于YOLO的主流架构之一,不仅可以用于检测和分类任务,还可以处理分割任务。
作者开发了一种新颖的特征融合网络架构,由两个主要组件网络组成,可以提供小目标分割的互补信息:
SSSF模块,它将来自多个尺度图像的全局或高级语义信息组合在一起;
TFE模块,它可以捕捉小目标目标的局部精细细节。将局部和全局特征信息相结合可以产生更准确的分割图。
为了识别密集重叠的小目标,一种方法是通过放大图像以参考和比较不同尺度下的形状或外观变化。然而,由于YOLO的backbone网络中的不同特征层具有不同的尺寸,传统的FPN融合机制只对小尺寸特征图进行上采样,并将其添加到前一层特征中,从而忽略了较大尺寸特征层中丰富的详细信息。为此,研究人员提出了TFE(Texture Feature Enhancement)模块,它将大、中、小尺寸的特征进行分离,并添加了较大尺寸的特征图,然后进行特征放大以增强详细特征信息。
为了整合详细特征信息和多尺度特征信息,研究人员提出了CPAM(Channel and Position Attention Module)。CPAM的结构如图5所示,它由两个部分组成。第一个部分是通道注意网络,它从TFE(输入1)接收输入,用于提取不同通道中包含的代表性特征信息。第二个部分是位置注意网络,它接收来自通道注意网络和SSFF(输入2)的输出,并进行叠加,用于引入位置信息。通过这种方式,CPAM能够融合不同注意力机制,综合利用通道和位置信息,以提高目标识别的性能。
想要进一步了解论文详情,建议还是自行移步阅读原论文,这里就不再赘述了。
作者同时开源了项目,地址在这里,如下所示:
简单看下本文构筑的数据集:
实例标注内容如下所示:
2 0.6818181818181818 0.5457142857142857 0.6829545454545455 0.63 0.7 0.6328571428571429 0.9488636363636364 0.6328571428571429 0.9988636363636364 0.6342857142857142 0.9988636363636364 0.5485714285714286 0.9806818181818182 0.5471428571428572 0.9681818181818181 0.5371428571428571 0.95 0.55 0.9204545454545454 0.54 0.9011363636363636 0.5528571428571428 0.8715909090909091 0.5642857142857143 0.8443181818181819 0.56 0.8159090909090909 0.5528571428571428 0.7636363636363637 0.5371428571428571 0.7181818181818181 0.5485714285714286
0 0.10227272727272728 0.47285714285714286 0.11818181818181818 0.4785714285714286 0.13977272727272727 0.4785714285714286 0.1534090909090909 0.4785714285714286 0.17045454545454544 0.4828571428571429 0.18636363636363637 0.48142857142857143 0.20909090909090908 0.48142857142857143 0.24886363636363637 0.48142857142857143 0.2715909090909091 0.48714285714285716 0.2818181818181818 0.49142857142857144 0.31136363636363634 0.48857142857142855 0.3409090909090909 0.49 0.3704545454545455 0.49142857142857144 0.3886363636363636 0.49857142857142855 0.4193181818181818 0.5 0.43636363636363634 0.5071428571428571 0.46136363636363636 0.5085714285714286 0.49204545454545456 0.5071428571428571 0.5113636363636364 0.5128571428571429 0.5363636363636364 0.5157142857142857 0.5761363636363637 0.5128571428571429 0.6022727272727273 0.5142857142857142 0.6238636363636364 0.5171428571428571 0.634090909090909 0.5285714285714286 0.6534090909090909 0.5285714285714286 0.6806818181818182 0.5328571428571428 0.6863636363636364 0.5342857142857143 0.678409090909091 0.5371428571428571 0.6602272727272728 0.5342857142857143 0.6454545454545455 0.5342857142857143 0.634090909090909 0.5314285714285715 0.6181818181818182 0.5214285714285715 0.6056818181818182 0.5214285714285715 0.5795454545454546 0.5157142857142857 0.5659090909090909 0.5185714285714286 0.5238636363636363 0.5214285714285715 0.5136363636363637 0.5185714285714286 0.49204545454545456 0.5171428571428571 0.47045454545454546 0.5128571428571429 0.44545454545454544 0.5171428571428571 0.4238636363636364 0.5057142857142857 0.4102272727272727 0.5057142857142857 0.3886363636363636 0.5057142857142857 0.3659090909090909 0.4957142857142857 0.35 0.49714285714285716 0.31022727272727274 0.4928571428571429 0.2806818181818182 0.5 0.2556818181818182 0.48857142857142855 0.23295454545454544 0.49142857142857144 0.2 0.49 0.17386363636363636 0.48857142857142855 0.14545454545454545 0.48714285714285716 0.1215909090909091 0.48714285714285716
使用如下训练参数设置进行训练:
parser = argparse.ArgumentParser()
parser.add_argument('--weights', type=str, default='weights/yolov5l-seg.pt', help='initial weights path')
parser.add_argument('--cfg', type=str, default='models/segment/asf-yolo.yaml', help='model.yaml path')
parser.add_argument('--data', type=str, default='data/bcc.yaml', help='dataset.yaml path')
parser.add_argument('--hyp', type=str, default='data/hyps/hyp.scratch-low.yaml', help='hyperparameters path')
parser.add_argument('--epochs', type=int, default=100, help='total training epochs')
parser.add_argument('--batch-size', type=int, default=8, help='total batch size for all GPUs, -1 for autobatch')
parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=640, help='train, val image size (pixels)')
parser.add_argument('--rect', action='store_true', help='rectangular training')
parser.add_argument('--resume', nargs='?', const=True, default=False, help='resume most recent training')
parser.add_argument('--nosave', action='store_true', help='only save final checkpoint')
parser.add_argument('--noval', action='store_true', help='only validate final epoch')
parser.add_argument('--noautoanchor', action='store_true', help='disable AutoAnchor')
parser.add_argument('--noplots', action='store_true', help='save no plot files')
parser.add_argument('--evolve', type=int, nargs='?', const=300, help='evolve hyperparameters for x generations')
parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')
parser.add_argument('--cache', type=str, nargs='?', const='ram', help='image --cache ram/disk')
parser.add_argument('--image-weights', action='store_true', help='use weighted image selection for training')
parser.add_argument('--device', default='0', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
parser.add_argument('--multi-scale', action='store_true', help='vary img-size +/- 50%%')
parser.add_argument('--single-cls', action='store_true', help='train multi-class data as single-class')
parser.add_argument('--optimizer', type=str, choices=['SGD', 'Adam', 'AdamW'], default='SGD', help='optimizer')
parser.add_argument('--sync-bn', action='store_true', help='use SyncBatchNorm, only available in DDP mode')
parser.add_argument('--workers', type=int, default=8, help='max dataloader workers (per RANK in DDP mode)')
parser.add_argument('--project', default='runs/train-seg', help='save to project/name')
parser.add_argument('--name', default='improve', help='save to project/name')
parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')
parser.add_argument('--quad', action='store_true', help='quad dataloader')
parser.add_argument('--cos-lr', action='store_true', help='cosine LR scheduler')
parser.add_argument('--label-smoothing', type=float, default=0.0, help='Label smoothing epsilon')
parser.add_argument('--patience', type=int, default=100, help='EarlyStopping patience (epochs without improvement)')
parser.add_argument('--freeze', nargs='+', type=int, default=[0], help='Freeze layers: backbone=10, first3=0 1 2')
parser.add_argument('--save-period', type=int, default=-1, help='Save checkpoint every x epochs (disabled if < 1)')
parser.add_argument('--seed', type=int, default=0, help='Global training seed')
parser.add_argument('--local_rank', type=int, default=-1, help='Automatic DDP Multi-GPU argument, do not modify')
# Instance Segmentation Args
parser.add_argument('--mask-ratio', type=int, default=4, help='Downsample the truth masks to saving memory')
parser.add_argument('--no-overlap', action='store_true', help='Overlap masks train faster at slightly less mAP')
return parser.parse_known_args()[0] if known else parser.parse_args()
训练启动,日志输出如下:
训练完成如下:
等待训练完成后我们来看下具体的结果内容。
【F1】
【precision】
【recall】
【PR】
【混淆矩阵】
【Batch实例】
感兴趣的话也都可以自己动手实践一下!