在我前面的文章中有基于改进的模型开发的裂缝裂痕检测模型,感兴趣的话可以看下:
《基于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左右,所有有些效果就不是很好,如下所示:
后期自建数据集获取到更大数据量后可以重新迭代训练,效果也会有所提升。