钢筋计数

   日期:2023-09-02     浏览:206    

1.项目说明

在该项目中,主要向大家介绍如何使用目标检测来实现对钢筋计数。涉及代码亦可用于车辆计数、螺母计数、圆木计数等。

在工地现场,对于进场的钢筋车,验收人员需要对车上的钢筋进行现场人工点根,确认数量后钢筋车才能完成进场卸货。上述过程繁琐、消耗人力且速度很慢。针对上述问题,希望通过手机拍照->目标检测计数->人工修改少量误检的方式智能、高效的完成此任务:

业务难点:

  • 精度要求高 钢筋本身价格较昂贵,且在实际使用中数量很大,误检和漏检都需要人工在大量的标记点中找出,所以需要精度非常高才能保证验收人员的使用体验。需要专门针对此密集目标的检测算法进行优化,另外,还需要处理拍摄角度、光线不完全受控,钢筋存在长短不齐、可能存在遮挡等情况。

  • 钢筋尺寸不一 钢筋的直径变化范围较大且截面形状不规则、颜色不一,拍摄的角度、距离也不完全受控,这也导致传统算法在实际使用的过程中效果很难稳定。

  • 边界难以区分 一辆钢筋车一次会运输很多捆钢筋,如果直接全部处理会存在边缘角度差、遮挡等问题效果不好,目前在用单捆处理+最后合计的流程,这样的处理过程就会需要对捆间进行分割或者对最终结果进行去重,难度较大。

2.数据准备

数据集中包含了250张已经标注好的数据,原始数据标注形式为csv格式。该项目采用目标检测的标注方式,在本文档中提供了VOC数据集格式。

更多数据格式信息请参考数据标注说明文档

  • 数据切分 将训练集、验证集按照8.5:1.5的比例划分。 PaddleX中提供了简单易用的API,方便用户直接使用进行数据划分。

paddlex --split_dataset --format VOC --dataset_dir dataset --val_value 0.15

数据文件夹切分前后的状态如下:

  dataset/                          dataset/
  ├── Annotations/      -->         ├── Annotations/
  ├── JPEGImages/                   ├── JPEGImages/
                                    ├── labels.txt
                                    ├── train_list.txt
                                    ├── val_list.txt

3.模型选择

PaddleX提供了丰富的视觉模型,在目标检测中提供了RCNN和YOLO系列模型。在本项目中采用YOLO系列作为检测模型进行钢筋计数。

4. 模型训练

在项目中,我们采用yolov3作为钢筋检测的模型。具体代码请参考train.py

运行如下代码开始训练模型:

python code/train.py

若输入如下代码,则可在log文件中查看训练日志,log文件保存在code目标下

python code/train.py > log
```#运行train.py 开始进行训练
!python code/train.py

5.模型优化(进阶)

  • 精度提升 为了进一步提升模型的精度,在项目中采用了一系列模型优化的方式。

精度优化思路分析

本小节侧重展示在模型迭代过程中优化精度的思路,在本案例中,有些优化策略获得了精度收益,而有些没有。在其他场景中,可根据实际情况尝试这些优化策略。

(1) 基线模型选择

相较于二阶段检测模型,单阶段检测模型的精度略低但是速度更快。考虑到是部署到GPU端,本案例选择单阶段检测模型YOLOV3作为基线模型,其骨干网络选择MobileNetV1。训练完成后,模型在验证集上的精度如下:

模型推理时间 (ms/image)map(Iou-0.5)(coco)mmap
baseline: YOLOv3 - MobileNetV1+label_smooth=False +img_size(480)152.4065.338.3

(2) 基线模型效果分析与优化

使用PaddleX提供的paddlex.det.coco_error_analysis接口对模型在验证集上预测错误的原因进行分析,分析结果以图表的形式展示如下:

基线(移动端上线模型)GPU端上线模型

分析图表展示了7条Precision-Recall(PR)曲线,每一条曲线表示的Average Precision (AP)比它左边那条高,原因是逐步放宽了评估要求。以基线为例,各条PR曲线的评估要求解释如下:

  • C75: 在IoU设置为0.75时的PR曲线, AP为0.415。

  • C50: 在IoU设置为0.5时的PR曲线,AP为0.653。C50与C75之间的白色区域面积代表将IoU从0.75放宽至0.5带来的AP增益。

  • Loc: 在IoU设置为0.1时的PR曲线,AP为0.677。Loc与C50之间的蓝色区域面积代表将IoU从0.5放宽至0.1带来的AP增益。蓝色区域面积越大,表示越多的检测框位置不够精准。

  • Sim: 在Loc的基础上,如果检测框与真值框的类别不相同,但两者同属于一个亚类,则不认为该检测框是错误的,在这种评估要求下的PR曲线, AP为0.677。Sim与Loc之间的红色区域面积越大,表示子类间的混淆程度越高。VOC格式的数据集所有的类别都属于同一个亚类。

  • Oth: 在Sim的基础上,如果检测框与真值框的亚类不相同,则不认为该检测框是错误的,在这种评估要求下的PR曲线,AP为0.677。Oth与Sim之间的绿色区域面积越大,表示亚类间的混淆程度越高。VOC格式的数据集中所有的类别都属于同一个亚类,故不存在亚类间的混淆。

  • BG: 在Oth的基础上,背景区域上的检测框不认为是错误的,在这种评估要求下的PR曲线,AP为0.683。BG与Oth之间的紫色区域面积越大,表示背景区域被误检的数量越多。

  • FN: 在BG的基础上,漏检的真值框不认为是错误的,在这种评估要求下的PR曲线,AP为1.00。FN与BG之间的橙色区域面积越大,表示漏检的真值框数量越多。

从分析图表中可以看出,移动端和GPU部署端检测效果都存在比较严重的漏检情况,此外在定位方面有较大的待提升空间。

通过移动端与GPU端模型的C75指标与C50指标的差距可以看出,通过使用更好的骨干网络会有利于模型进行学习特征以及定位。

正是考虑到漏检问题,实验中采用ResNet34替换原有的MobileNetV1模型,以及输入图像适当放大后,在指标上的提升如下:

模型推理时间 (ms/image)map(Iou-0.5)(coco)mmap
YOLOv3 + ResNet34 + label_smooth=False + img_size(608)161.4569.248.1

我们可以通过其误差分析图,得到以下优化结论:

  • 通过骨干网络的更优替换,可以改善漏检情况:BG与FN的差值从0.317降低到0.297.

  • 在对输入图片进一步放大: 480–608,获得更多更准确的定位信息:C75从0.415提升到0.619.

  • 同时,在这版优化实验中,可以发现误检指标明显下降: Oth与BG的差值从0.005降低到0.001.

因此,得到一个结论,对于存在较大漏检的模型时,主要先考虑两个优化方向:

1.替换更好的backbone。

2.适当放大输入图像大小。

本次实验基于Paddlex1.3.11进行训练,因此在骨干网络上的可选择性要少一些,但是大体上的优化思路确实可以在往后的Paddlex版本中进行延伸——特别是骨干网络方面。

PS:在YOLOV3中目前的1.3.11版本没有ResNet50,但是可以利用PPYOLO来实现,只需要关掉其中所有的优化策略与结构即可。(本次实验未进行该模型实验,理论上骨干网络更好,最终优化结果应该会更加理想。)

(3) 数据增强选择

训练预处理1(a1)验证预处理
MixupImage(mixup_epoch=-1)Resize(target_size=480, interp=‘CUBIC’)
RandomDistort()Normalize()
RandomExpand()
RandomCrop()
Resize(target_size=480, interp=‘RANDOM’)
RandomHorizontalFlip()
Normalize()

在加入了RandomHorizontalFlipRandomDistortRandomCropRandomExpandResizeMixupImage这几种数据增强方法后,对模型的优化是有一定的积极作用了,在取消这些预处理后,模型性能会有一定的下降。

PS:建议在训练初期都加上这些预处理方法,到后期模型超参数以及相关结构确定最优之后,再进行数据方面的再优化: 比如数据清洗,数据预处理方法筛选等。

6 优化汇总

采用PaddleX在Tesla V100上测试模型的推理时间(输入数据拷贝至GPU的时间、计算时间、数据拷贝至CPU的时间),推理时间如下表所示:(20次推理取平均耗时

由于参与推理的图片较大,因此预处理时间在Resize处会消耗较多的时间。

模型推理时间 (ms/image)map(Iou-0.5)(coco)mmap
baseline: YOLOv3 - MobileNetV1+label_smooth=False +img_size(480)152.4065.338.3
YOLOv3 + MobileNetV1 + label_smooth=True + cluster_yolo_anchor+img_size(480)156.8657.429.0
YOLOv3 + ResNet34 + label_smooth=False  +cluster_yolo_anchor+ img_size(480)154.4966.537.7
PPYOLO + ResNet50_vd_ssld+ label_smooth=False+ cluster_yolo_anchor + img_size(608)221.3166.543.7
YOLOv3 + DarkNet53 + label_smooth=False+ img_size(608)173.0567.947.1
YOLOv3 + ResNet34 + label_smooth=False + img_size(608)161.4569.248.1




注意:

  • 608的图像大小,一般使用默认的anchors进行训练和推理即可。

  • cluster_yolo_anchor: 来源paddlex2.0API,用于生成拟合数据集的模型anchor

anchors = train_dataset.cluster_yolo_anchor(num_anchors=9, image_size=480)
anchor_masks = [[6, 7, 8], [3, 4, 5], [0, 1, 2]]

优化进展说明

  • 1.通过选择更好的backbone作为特征提取的骨干网络可以提高识别率、降低漏检率。<MobileNetV1 到 ResNet50_vd_ssld>

  • 2.通过选择理论上更好的检测架构PPYOLO未获得明显的完全性能提升(Iou0.5提升不是很大),但也提高了检测的mmap值——即Neck,Head部分的优化可以提高ap。<YOLOV3 到 PPYOLO>

  • 3.缩放适当的图像大小可以提高模型的识别率,但是存在一定的阈值——当图像大小到某一个阈值时会导致精度下降。

    <480到608>

    • 一般图像大小选择(YOLO系列):320,480, 608。

    • 一般图像如果较大,物体也比较大,可以较为放心的缩小图像大小再进行相关的训练和预测。

    • 物体较小,不易缩小,可以适当的裁剪划分原图或放大,并处理对应的标注数据,再进行训练。

  • 4.一般情况通过cluster_yolo_anchor生成当前网络输入图像大小下拟合数据集的预置anchors,利用新生成的anchors替换原来的默认anchor,会使得模型预测定位上框选位置更准确,但是本次实验并未得到提升。

  • 5.最初的两个YOLOV3的实验可以发现,本次优化中,如果开启label_smooth,会导致预测ap下降——原因是标签平滑相当于一种正则化,当前模型存在的问题是拟合不够好,因此加入标签平滑会适得其反。

  • 通过以上的简单优化方式,获取了两个较好的模型结果:【前者模型体积更小

  • 模型推理时间 (ms/image)map(Iou-0.5)(coco)mmap
    baseline: YOLOv3 - MobileNetV1+label_smooth=False +img_size(480)152.4065.338.3
    YOLOv3 + ResNet34 + label_smooth=False + img_size(608)161.4569.248.1

7.模型预测

运行如下代码:

python code/infer.py

则可生成result.txt文件并显示预测结果图片,result.txt文件中会显示图片中每个检测框的位置、类别及置信度,并给出检测框的总个数,从而实现了钢筋自动计数。

预测结果如下:

8.模型导出

模型训练后保存在output文件夹,如果要使用PaddleInference进行部署需要导出成静态图的模型,运行如下命令,会自动在output文件夹下创建一个inference_model的文件夹,用来存放导出后的模型。

paddlex --export_inference --model_dir=output/yolov3_resnet34/best_model --save_dir=output/inference_model --fixed_input_shape=[608,608]

注意:设定 fixed_input_shape 的数值需与 eval_transforms 中设置的 target_size 数值上保持一致。

9.模型上线选择

(1)针对GPU端部署

本案例选择面向GPU端的最终方案是选择一阶段检测模型YOLOV3,其骨干网络选择加入了ResNet34,训练阶段数据增强策略采用RandomHorizontalFlip、RandomDistort、RandomCrop等。

在Tesla V100的Linux系统下,模型的推理时间大约为161.45ms/image,包括transform、输入数据拷贝至GPU的时间、计算时间、数据拷贝至CPU的时间。

模型推理时间 (ms/image)map(Iou-0.5)(coco)mmap
YOLOv3 + ResNet34 + label_smooth=False + img_size(608)161.4569.248.1




上线模型的PR曲线:

在本项目中的钢筋检测数据中,标注信息错误较少,但是拍摄角度以及光照变化范围较大,从而影响模型的学习。针对本项目的问题而言,钢筋检测中的召回率比较低,而准确率较高

注意: 通过COCO指标使得评估时对多Iou尺度进行一个较完整的评估,使得得到该评估指标下最好的模型,以期望获得最好的泛化能力。

(2)针对移动端部署

本案例选择面向移动端的最终方案是选择一阶段检测模型YOLOV3,其骨干网络选择加入了MobileNetV1,训练阶段数据增强策略采用RandomHorizontalFlip、RandomDistort、RandomCrop等。

在Tesla V100的Linux系统下,模型的推理时间大约为152.40ms/image,包括transform、输入数据拷贝至GPU的时间、计算时间、数据拷贝至CPU的时间。

模型推理时间 (ms/image)map(Iou-0.5)(coco)mmap
baseline: YOLOv3 - MobileNetV1+label_smooth=False +img_size(480)152.4065.338.3




上线模型的PR曲线:

相对于GPU端上线模型,该模型具有以下优势:

  • 模型参数大小仅为: 145MB,而GPU端模型为:253MB

  • 输入图像更小,模型计算时间花销更小

  • 召回率更低,可能有更少的误检——但由于模型轻量化缘故,漏检情况可能会更多一点。

10.模型部署方式

模型部署采用了PaddleX提供的C++ inference部署方案,在改方案中提供了C#部署Demo,用户可根据实际情况自行参考。


 
 
更多>同类产业范例库

推荐产业范例库
点击排行

北京人工智能高质量数据集服务平台

创新数据服务,积极推进数据拓展应用

关于我们

联系我们

合作
咨询

15911018798
数据合作联系电话

微信
联系

微信联系