基于DeepLabV3实践路面、桥梁、基建裂缝裂痕分割

在我前面的文章中有基于改进的模型开发的裂缝裂痕检测模型,感兴趣的话可以看下:

《基于yolov5s+bifpn实践隧道裂缝裂痕检测》

今天主要是趁着有时间基于deeplabv3来实践裂缝裂痕分割。首先来看效果图:

 为了整体直观,这里专门是开发了对应的界面,方便使用的。

完整项目截图如下所示:

 下表是对整个项目中各个文件的介绍说明:

文件名称文件说明
datasets/数据集目录
modules/模块模块
results/结果目录
utils/组件目录
weights/权重目录
guiAPP.py系统模块
inference.py推理模块
model_structure.png模型结构图
models.py模型实例化模块
splitDataset.py数据集构建模块
train.py模型训练模块
启动系统.bat双击启动系统bat脚本
执行.bat双击启动训练bat脚本

datasets目录如下所示:

 JPEGImages为原始图像数据目录。

SegmentationClass为mask图像目录。

modules为网络定义模块目录,如下所示:

 results为结果目录,如下所示:

 设置每个epoch都会存储一次最新的权重文件,方便自己随时使用。

utils目录主要是存储公共组件模块,如下所示:

 weights用于存储预训练的权重文件,这里的预训练模型来资源公开数据集训练得到。

model_structure.png是绘制出来的deeplabv3的网络结构图,如下所示:

inference.py是离线推理模块,核心实现如下所示

def singImgInfer(pic_path="test.jpg", save_path="result.jpg"):
    """
    单张图像推理
    """
    try:
        print("Loading Image From: ", pic_path)
        image = Image.open(img)
        resImg = deeplabv3.detect_image(image)
        resImg.save(save_path)
        print("Saving Image To: ", save_path)
    except Exception as e:
        print("Exception: ", e)

如果想要批处理也可以用下面的:

def batchImgsInfer(picDir="test/", saveDir="result/"):
    """
    批量图像推理
    """
    if not os.path.exists(saveDir):
        os.makedirs(saveDir)
    pic_list = os.listdir(picDir)
    print("pic_list_length: ", len(pic_list))
    for one_pic in tqdm(pic_list):
        one_path = picDir + one_pic
        print("Loading Image From: ", one_path)
        one_img = Image.open(one_path)
        one_resImg = deeplabv3.detect_image(one_img)
        one_resImg.save(saveDir + one_pic)
        print("Saving Image To: ", saveDir + one_pic)

我是在本地cpu模式下运行的推理计算,整体来看速度并不是很快大概在1s左右。

guiAPP.py模块时开发的界面模块,能够将离线推理过程以可视化的形式展示出来,实例如下:

启动界面:

 上传图像:

 分割推理:

 因为数据集没有很多,训练的epoch次数也只有100左右,所有有些效果就不是很好,如下所示:

 后期自建数据集获取到更大数据量后可以重新迭代训练,效果也会有所提升。

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
裂纹图像分割区域生长是一种常用的图像处理方法,用于自动检测和分割裂纹区域。下面是一个使用MATLAB实现裂纹图像分割区域生长的示例代码: ```matlab % 读取图像 image = imread('裂纹图像.jpg'); % 设置种子点 seed_row = 100; seed_col = 100; % 设置生长阈值 threshold = 50; % 初始化分割结果 segmented_image = zeros(size(image)); % 创建队列并将种子点入队 queue = [seed_row, seed_col]; % 定义生长方向(上、下、左、右) directions = [-1, 0; 1, 0; 0, -1; 0, 1]; % 区域生长 while ~isempty(queue) % 出队 current_pixel = queue(1,:); queue(1,:) = []; % 获取当前像素的位置 current_row = current_pixel(1); current_col = current_pixel(2); % 判断当前像素是否已经被访问过 if segmented_image(current_row, current_col) == 0 % 计算当前像素与种子点的灰度差 diff = abs(double(image(current_row, current_col)) - double(image(seed_row, seed_col))); % 判断灰度差是否小于阈值 if diff < threshold % 将当前像素标记为裂纹区域 segmented_image(current_row, current_col) = 255; % 将当前像素的邻域像素入队 for i = 1:size(directions, 1) neighbor_row = current_row + directions(i, 1); neighbor_col = current_col + directions(i, 2); % 判断邻域像素是否在图像范围内 if neighbor_row >= 1 && neighbor_row <= size(image, 1) && neighbor_col >= 1 && neighbor_col <= size(image, 2) % 将邻域像素入队 queue = [queue; neighbor_row, neighbor_col]; end end end end end % 显示分割结果 imshow(segmented_image); ``` 这段代码首先读取裂纹图像,然后设置种子点和生长阈值。接下来,通过队列实现区域生长算法,将与种子点灰度差小于阈值的像素标记为裂纹区域,并将其邻域像素入队。最后,显示分割结果。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Together_CZ

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

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

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

打赏作者

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

抵扣说明:

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

余额充值