Advertisement

基于YOLO11n图像检测模型的卫星 遥感固态废物检测

阅读量:

@TOC基于YOLO11n图像检测模型的卫星遥感固态废物检测

一、 固体废物检测意义

生态 civilization construction 是统筹推进"五位一体"总体布局的重要部分。
根据生态环境部发布的《固体废物分类与代码目录》,将工业固体废物、生活垃圾等五大类固体废物归类为35种约200余种堆积点,并进一步规定了相关的管理台账制定以及信息公开要求。
上海市对固态废物巡查采用季度卫星图巡查、年度航片巡查以及年度未监管固废堆放点约200-300个数量级的检查方式。
传统的人工卫星图巡查存在效率低下、处理速度慢以及资源浪费严重等问题。
引入图像检测类模型有助于提高检测速度并发现更多可能性的固废堆放点,这一改进方案具有较高的实际意义。
为了提高检测精度,在移动端设备上进行训练并采用yolo11n配置以减少参数数量至约26万。

在这里插入图片描述
在这里插入图片描述

固废卫星图:

在这里插入图片描述
在这里插入图片描述

二、数据来源

利用美国地质 Survey地球探索者平台发布的ESRI卫星图像对上海市辖区内的卫星遥感图进行裁剪处理,并确保所得图像符合YOLO模型所需640×640像素规格要求的同时尽量减少因模型重塑导致的形变。最终获得包含固废堆放点在内的原始图像共72张。
应用数据增强技术显著提升图片数量级别。
通过水平与垂直方向上的镜像翻转以及±90度范围内的随机旋转操作,并结合对比度调整至2倍因子后的方式生成360张变形前后的图像样本。
如图所示:

在这里插入图片描述

人工标注时可使用LabelImg工具来标记固废堆放点并绘制矩形框。根据需求可以选择性地采用5大类别或全部1种类别进行分类标注。保存为YOLO格式文件包含多行数据每行代表一个目标物包含四个字段:类别编号 x y w h。考虑到实际训练需求本次操作将选择单一类别进行标注以简化数据准备过程。

在这里插入图片描述

图像分配。按照6:2:1的比例。训练集232张、验证集87张、测试集41张。

三、实现方式

构建基础数据集。安装OpenVINO工具包、anaconda3和labelimg。通过datastrengthen.py脚本将一张图片转换为5张。

在这里插入图片描述

为了满足YOLO模型对数据路径的需求,在 datasets/images 目录结构中应分别存放训练图像于 train 子目录,并存入验证图像于 val 子目录;同时,在 datasets/labels 目录结构中应分别存放训练标注于 train 子目录,并存入验证标注于 val 子目录。

在这里插入图片描述

观察到垃圾堆呈现显著的形态特征,在空间分布上表现出明显的大小差异性;整体上垃圾堆的位置分布较为均匀;边缘点位的数量相对有限;在形状特征方面,则以长方形物体为主导;此外,在尺寸特征上呈现出长宽比例较小的特点;细长型物体的数量较少。

四、训练过程

训练过程中训练集损失曲线图中展示了横坐标表示训练迭代次数的曲线数据。观察发现该曲线整体呈现逐渐降低的趋势,在各轮次间波动幅度较小,并未出现过拟合现象。值得注意的是,在第100轮及之后出现了两次异常上升的峰值点(即损失值急剧增加),这一现象的出现是由于停止实施YOLo模型的数据增强技术(即关闭了数据增强中的mosaic数据扩大策略)所导致的

在这里插入图片描述

精度P、回收率R和综合评测指标。提升幅度较大,但还未过50%,说明误报和识别边界精度的情况还不够理想。

在这里插入图片描述

验证集损失变化图中可以看到,在前期阶段波动幅度明显较大;随后阶段损失持续下降;与训练集相比差距依然较为显著。

在这里插入图片描述

五、预测效果

在这里插入图片描述

上图堆放点较为杂乱,能检测出边缘颜色、阴影对比较强的部分堆点。

在这里插入图片描述

上图较为准确,检测出的范围较大一点。

在这里插入图片描述
在这里插入图片描述

上图左上角垃圾堆未检测出,可能因为训练集中边缘小点位较少的缘故。

在这里插入图片描述

尽管识别出了左侧垃圾物的存在,并非仅仅局限于这一区域,在其他较为平整的区域也出现了误判的情况,并由此可以看出,在训练数据中涉及黄边区域的测试样本数量相对较少

在这里插入图片描述

检测出两处,另外一处为误判。

在这里插入图片描述

识别准确。

在这里插入图片描述

识别准确,范围有些大。

灵敏度越高(即预测时conf参数设置的越低),可以检测到的非法堆放点就越多。模型评估的第二个方面是准确性。倾倒场模型的精度越高,预测结果中出现的误判就越少。
考虑到不同固废的种类、大小、形状、周边环境连续性都相差太大,整体的检测效果较低,但是可以看到训练的优化过程,并没有明显的过拟合现象。一是有待于大规模计算能力进行训练。二是对训练对象进行进一步聚焦,如只对白色泡沫垃圾、挖土方堆放进行模型细分,能够更准确的抓取对象的特征,大幅度提高识别准确性。

六、OPENVINO转化模型效果评估

选取编号为68的测试图片作为样本,并对YOLO原生模型与经OPENVINO优化的推理速度进行比较。实验结果显示二者检测结果完全一致,并提供了详细的性能对比数据如下:YOLO原生模型的代码位于detect.py文件中,并耗时共1.98秒完成整个推理过程,在这一过程中包括了图像输入与输出的时间段划分:其中预处理阶段耗时7.2毫秒,在完成图像预处理后立即进入物体堆叠检测环节并耗时210.5毫秒完成目标识别工作。而经过OPENVINO优化后的模型代码更新至detectWithOpenvino.py中,并在同样的测试条件下仅耗时共1.27秒完成全部推理任务:其中预处理阶段耗时0毫秒(得益于硬件加速技术的应用),随后直接进入快速堆叠检测环节并在46.9毫秒内完成目标定位任务)。

-- coding: utf-8 - -

从 ultralytics 中导入 YOLO
从 pathlib 中导入 Path
从 PIL 中导入 Image
从 notebook_utils 中导入 download_file、VideoPlayer 和 device_widget
从 openvino 中导入 openvino 作为 ov
从 ipywidgets 中导入选项式 widgets 作为 widgets
引入 time 模块

if name == ‘main ’:

复制代码
    # Load a model
    #SEG_MODEL_NAME="best"
    IMAGE_PATH=r'datasets\images\test\68.png'
    det_model = YOLO(model=r'./datasets/exp10/weights/best.pt')
    label_map = det_model.model.names
    
    
    #转换成 OpenVINO IR
    garbage_model_path = Path("./datasets/exp10/weights/best_openvino_model/best.xml")
    if not garbage_model_path.exists():
    det_model.export(format="openvino", dynamic=True, half=True)
    #Select inference device
    device = device_widget()
    device.value="NPU"
    
    core = ov.Core()
    ov_model = core.read_model("./datasets/exp10/weights/best_openvino_model/best.xml")
    
    ov_config = {}
    if device.value != "CPU":
    #print("not cpu")
    ov_model.reshape({0: [1, 3, 640, 640]})
    if "GPU" in device.value or ("AUTO" in device.value and "GPU" in core.available_devices):
    print("GPU")
    ov_config = {"GPU_DISABLE_WINOGRAD_CONVOLUTION": "YES"}
    #print(device.value)
    
    compiled_model = core.compile_model(ov_model, device.value, ov_config)
    #det_model_path.parent, task="segment") 不能用segment,会报错
    det_model = YOLO("./datasets/exp10/weights/best_openvino_model", task="detect")
    if det_model.predictor is None:
    custom = {"conf": 0.05, "batch": 1, "save": False, "mode": "predict"}  # method defaults
    args = {**det_model.overrides, **custom}
    det_model.predictor = det_model._smart_load("predictor")(overrides=args, _callbacks=det_model.callbacks)
    det_model.predictor.setup_model(model=det_model.model)
    
    #seg_model.predict(source=IMAGE_PATH,
    #              save=True,
    #              show=True,
    #              conf=0.05,
    #              )
    det_model.predictor.model.ov_compiled_model = compiled_model
    
    start = time.time()
    res = det_model(IMAGE_PATH)
    img=Image.fromarray(res[0].plot()[:, :, ::-1])
    img.show()
    print(f'coast:{time.time() - start:.4f}s')
    
    ## Optimize model using NNCF Post-training Quantization API
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-16/AgP07beRuSYwpX4oGCLnf5OdIHKl.png)

七、图像优化

为了确保固体废物的精准提取,遥感影像需经过预处理工作,该过程包含三个主要步骤:一是大气校正;二是几何精校正;三是图像融合.在大气校正环节中,地物光谱信息在辐射传输过程中会受到大气层吸收、散射等影响而发生变化.为此,通过ENVI软件中的FLAASH工具对遥感影像实施大气校正处理以消除这些干扰因素的影响,最终可获得地物真实的反射率.在几何精校正阶段,遥感图像因传感器本身及外部环境的影响会产生几何畸变.为此,以地图基准选取控制点并采用二次多项式方法完成影像的空间定位调整.最后在图像融合部分,通过ERDAS平台将高分卫星全色波段与多光谱波段进行像素级融合以提升空间分辨率及光谱分辨率.经过这种融合后形成的影像具有清晰的边界特征和良好的对比度特性.此外值得注意的是与其他垃圾检测模型研究针对大型垃圾场对比例如SU-RetinaNet RCANet YOLO11模型等相比该方法更适合检测较小且边缘不规则的目标并且能够更好地利用堆放点的光照阴影以及周边自然环境信息从而有助于发现更多郊区散乱堆放的小型堆点从而契合城市周边生态环境治理的需求

八、实际应用处理流程

对全市范围内的航片以及卫星图象(格式分别为ECW与JPEG2000)实施批量分割压缩操作;每张图片的标准尺寸设定为640像素乘以640像素,并依据实地测距结果确定影像的空间分辨率:南北向最大直线距离为90.5公里、东西向最大直线距离为102.8公里;预计生成图片总数为233,000张

在这里插入图片描述

二是采用该案例模型对固废样本实施批量预测操作,并将具有堆点预测结果的图片对应的图片编号记录至指定列表中。预计处理时间为135分钟。
三是基于上述生成的图片编号列表展开定位分析工作:通过计算行号获取维度值、列号获取经纬度值,并结合固废堆放位置进行校正调整。
四是利用ArcGIS软件对固废点位坐标数据进行批量导入与人工核验分类工作。

全部评论 (0)

还没有任何评论哟~