运行Dlinknet提取道路和水体(总结帖)——全流程步骤总结

本文作者分享了使用ArcGIS软件制作深度学习道路和河流训练样本的详细步骤,包括制作SHP和TIFF格式的样本,挑选DOM图像,处理样本大小,转换图像位深,修正样本与DOM的一致性,以及进行八位图到二十四位图的转换。此外,还涉及了针对特定样本问题的处理,如水体样本的调整,以及使用Dlinknet网络进行训练和计算IoU的过程。
摘要由CSDN通过智能技术生成

之前写了很多制作样本然后跑代码的帖子
但由于我也是第一次跑
记录一下自己摸索的过程
因此导致
每一篇的内容很碎
每次我想自己去回顾一下的时候
都有太多摸索尝试的过程了

因此我在这里总结一下我摸索的整个过程的详细步骤
大家可以先看这篇再去我的对应博客里面看具体的细节

1、使用arcgis软件制作地物的完整shp样本

一、使用arcgis进行深度学习道路训练样本数据的制作(arcgis操作详解)——重复工作+多次返工的血泪史
制作出来样本是shp格式的,面状数据
在这里插入图片描述

2、使用arcgis软件批量操作得到tif格式的样本图片

四、Arcgis实现深度学习河流训练样本数据的制作(使用软件批量获取样本图片)——对已经获取到的完整面状样本数据进行处理
这个操作 需要看你具体的数据然后可以根据自己有的数据来设置模型批量操作
我的模型如下
在这里插入图片描述
使用这个模型就可以得到每个方格大小的样本图片了
其中白色是我的地物 黑色是背景
在这里插入图片描述
然后图片的名字与DOM图片的名字完全相同

3、根据样本挑选出对应的DOM图像

样本我全部放在mask文件夹下
根据里面图片名称来去放置DOM图片的文件夹里面挑选出对应的DOM图片
对应的程序为screenpic.py
五、代码实现深度学习河流训练样本数据的制作(软件操作后用代码完善训练样本)——获取样本图片对应的真实图片

3.5、将样本名称和大小修改成与DOM一致

使用上述方法进行样本生成的时候
分辨率可能会有一些偏差
比如6060的变成了6061
因此
这里有一个需要提前检查的地方
免得后续返工
首先检查图片数量样本和原图是否一致
然后是名称是否一致
大小是否一致
这里贴一下检查以及修改图片尺寸的代码
对应的程序为contrapic-size.py

# -*- coding: utf-8 -*-
"""
Created on Mon Jan 30 21:54:50 2023

@author:Laney_Midory
csdn:Laney_Midory
"""

import os
import shutil
from PIL import Image

maskPath = r"F:\deepl\sample\complete\water\mask-movewhite"  # 用于获取文件名称列表
satPath=r"F:\deepl\sample\complete\water\sat"  # 用于对比文件名称列表
newmask_path= r"F:\deepl\sample\complete\water\new"  # 用于获取文件名称列表
#newsat_path= r"F:\deepl\sample\complete\road\newsat"  # 用于获取文件名称列表
#oldmask_path= r"G:\old"  # 用于获取文件名称列表
#mask_names = filter(lambda x: x.find('tif')!=-1, os.listdir(maskPath))
sat_names = filter(lambda x: x.find('tif')!=-1, os.listdir(satPath))
#tif_names = filter(lambda x: x.find('tif')!=-1, os.listdir(filePath))
for file in sat_names:

    sat_path = satPath +'\\'+ file.strip()
    mask_path = maskPath +'\\'+ file.strip()
    #mask_path = maskPath +'\\'+ file[:-8]+"_mask.png"
    print(mask_path)
    if not os.path.exists(mask_path):
        continue;  
    img = Image.open(sat_path)#读取系统的内照片 
    img2 = Image.open(mask_path)#读取系统的内照片 
    
    width1 = img.size[0]#长度
    height1 = img.size[1]#宽度
    width2 = img2.size[0]#长度
    height2 = img2.size[1]#宽度
    
    if (int(width1)!=int(width2)) | (int(height1)!=int(height2)):
        print(width1,width2,height1,height2)
        print('该影像和标签大小不一致:"'+file+'"')
        out = img2.resize((width1,height1),Image.ANTIALIAS)
        #fout = newmask_path +'\\'+ file[:-8]+"_mask.png"
        fout = newmask_path +'\\'+ file.strip()
        out.save(fout)

        img.close()
        img2.close()
        #shutil.move(mask_path,oldmask_path+'\\'+file[:-8]+"_mask.png")

    img.close()
    img2.close()

print("检查完成")

4、八位样本图转为二十四位

通过上述步骤做出来的图是8位的
需要转换成RGB彩色图
在这里我顺便查了一下我的样本的格式
PIL包中图像的mode参数
发现虽然是八位的但是格式并不是P
是L
在这里插入图片描述
对应的程序为8to24deep.py
在这里插入图片描述

5、根据DOM原图把白色部分对应的样本区域变为黑色

在这里插入图片描述
这一步是根据我的样本的特殊情况需要进行进一步处理
特别是水体样本
其水面由于成像原因呈现白色
因此需要修改一下对应的样本
将其颜色设置为背景
具体代码和步骤参考这篇文章
六、软件实现深度学习河流训练样本数据的制作(软件操作完善训练样本)——针对标签图片问题的进一步完善

OSError: encoder error -2 when writing image file 如果出现了这个问题
就是因为没有把图片转换成RGB模式 还是八位的L
所以需要经过第四步的转换
对应的程序为whitecopyv2.py

6、膨胀裁剪DOM原图和样本图并分别改名(添加后缀)

代码可以查看下方链接
二、代码实现深度学习道路训练样本数据的制作(代码部分详解)——重复工作+多次返工的血泪史
裁剪完成后查看一下DOM数量和样本数量是不是一样的
免得处理中出现了问题
在这里插入图片描述
并且后缀样本后面加_mask.png
DOM原图后面是_sat.tif
放在同一个文件夹里
对应的程序为clip-Inflation_predict-gdal.py

7、去除掉全黑的样本和对应的DOM原图

代码可以查看下方链接
[二、代码实现深度学习道路训练样本数据的制作(代码部分详解)——重复工作+多次返工的血泪史](https://blog.csdn.net/Laney_Midory/article/details
在这里插入图片描述
这样就删了一半了xs
对应的程序为clip-Inflation_predict-gdal.py

8、检验一下图片的分辨率和名称是否一一对应

这部分的代码我放在下面了
这个是比较图片大小size是否一一对应
对应的程序为contrapic-size.py

# -*- coding: utf-8 -*-
"""
Created on Fri Aug 4 21:54:50 2022

@author:Laney_Midory
csdn:Laney_Midory
"""

import os
import shutil
from PIL import Image

maskPath = r"G:\train"  # 用于获取文件名称列表
satPath=r"G:\train"  # 用于对比文件名称列表
newmask_path= r"G:\new"  # 用于获取文件名称列表
#newsat_path= r"F:\deepl\sample\complete\road\newsat"  # 用于获取文件名称列表
oldmask_path= r"G:\old"  # 用于获取文件名称列表
#mask_names = filter(lambda x: x.find('tif')!=-1, os.listdir(maskPath))
sat_names = filter(lambda x: x.find('tif')!=-1, os.listdir(satPath))
#tif_names = filter(lambda x: x.find('tif')!=-1, os.listdir(filePath))
for file in sat_names:

    sat_path = satPath +'\\'+ file.strip()
    #mask_path = maskPath +'\\'+ file.strip()
    mask_path = maskPath +'\\'+ file[:-8]+"_mask.png"
    print(mask_path)
    if not os.path.exists(mask_path):
        continue;  
    img = Image.open(sat_path)#读取系统的内照片 
    img2 = Image.open(mask_path)#读取系统的内照片 
    
    width1 = img.size[0]#长度
    height1 = img.size[1]#宽度
    width2 = img2.size[0]#长度
    height2 = img2.size[1]#宽度
    
    if (int(width1)!=int(width2)) | (int(height1)!=int(height2)):
        print(width1,width2,height1,height2)
        print('该影像和标签大小不一致:"'+file+'"')
        out = img2.resize((width1,height1),Image.ANTIALIAS)
        fout = newmask_path +'\\'+ file[:-8]+"_mask.png"
        out.save(fout)

        img.close()
        img2.close()
        shutil.move(mask_path,oldmask_path+'\\'+file[:-8]+"_mask.png")

    img.close()
    img2.close()

print("检查完成")

名字是否一致在下面
对应的程序为contrapic-name.py

# -*- coding: utf-8 -*-
"""
Created on Fri Aug 4 21:54:50 2022

@author:Laney_Midory
csdn:Laney_Midory
"""

import os
import shutil

# maskPath = r"F:\deepl\sample\complete\road\mask"  # 用于获取文件名称列表
# satPath=r"F:\deepl\sample\complete\road\sat"  # 用于对比文件名称列表
# newmask_path= r"F:\deepl\sample\complete\road\newmask"  # 用于获取文件名称列表
# newsat_path= r"F:\deepl\sample\complete\road\newsat"  # 用于获取文件名称列表
maskPath = r"F:\deepl\sample\complete\road\mask"  # 用于获取文件名称列表
satPath=r"F:\deepl\sample\complete\road\sat"  # 用于对比文件名称列表
newmask_path= r"F:\deepl\sample\complete\road\newmask"  # 用于获取文件名称列表
newsat_path= r"F:\deepl\sample\complete\road\newsat"  # 用于获取文件名称列表
mask_names = filter(lambda x: x.find('tif')!=-1, os.listdir(maskPath))
sat_names = filter(lambda x: x.find('tif')!=-1, os.listdir(satPath))
#tif_names = filter(lambda x: x.find('tif')!=-1, os.listdir(filePath))

#for file in tif_names:
for file in mask_names:
    sat_path = satPath +'\\'+file.strip()
  
    if not os.path.isfile(sat_path):
    #if not os.path.isfile(filePath+'\\'+base_name[0]+'_mask.png'):
            print('该标签无对应原始影像:"'+file+'"')
            shutil.move(maskPath+'\\'+file,newmask_path+'\\'+file)
            #if not os.path.isfile(new_path+'\\'+file):
             #   shutil.copy(old_path+'\\'+file,new_path)
print("标签检查完成")

for file in sat_names:
    mask_path = maskPath+'\\' + file

    if not os.path.isfile(mask_path):
    #if not os.path.isfile(filePath+'\\'+base_name[0]+'_mask.png'):
            print('该影像无对应标签:"'+file+'"')
            shutil.move(satPath+'\\'+file,newsat_path+'\\'+file)
            #if not os.path.isfile(new_path+'\\'+file):
             #   shutil.copy(old_path+'\\'+file,new_path)
print("原始影像检查完成")


可以自己适当修改一下

9、使用Dlinknet网络进行训练

在这里我之前修改了训练代码
固定训练次数
然后每隔五次输出一下训练结果得到权重文件
在这里用ubuntu系统进行训练
Ubuntu20搭建pytorch深度学习框架——使用增强样本运行Dlinknet提取道路水体(六)——训练iou和测试iou
一定别忘记了划分样本!!!
可以训练样本80% 测试样本20%

10、样本预测并计算训练和预测miou以及单张DOM的iou

接下来就需要使用训练得到的权重文件
使用testall.py进行预测以及输出iou
windows10使用cuda11搭建pytorch深度学习框架——运行Dlinknet提取道路(四)——计算iou评估预测精度
Ubuntu20搭建pytorch深度学习框架——使用增强样本运行Dlinknet提取道路水体(六)——训练iou和测试iou

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Laney_Midory

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值