基于计算机视觉的裂纹检测方案

极市平台

共 3509字,需浏览 8分钟

 ·

2021-01-15 03:33

↑ 点击蓝字 关注极市平台

声明:非常抱歉,未来一周我们可能都无法为大家推出优质的原创内容。因为近期极市遭遇了恶意举报,我们目前正在申诉中。极市一直致力于为计算机视觉开发者分享优质的技术内容,并以一种开放包容的心态与大家相处。我们希望和大家一起坚决抵制这种恶意举报行为,同时也希望能与大家一起共创一个良好和谐的AI技术内容分享环境。


作者丨努比
来源丨小白学视觉
编辑丨极市平台

极市导读

 

本篇文章中,作者为异常识别和定位提供了一种机器学习解决方案。所有这些功能都可以通过实现单个分类模型来访问。在训练过程中,该神经网络会获取所有相关信息,从而可以进行分类,并在最后给出墙壁裂纹的信息。 >>加入极市CV技术交流群,走在计算机视觉的最前沿

01. 数据集

我们首先需要从互联网上获取包含墙壁裂缝的图像(URL格式)数据。总共包含1428张图像:其中一半是新的且未损坏的墙壁;其余部分显示了各种尺寸和类型的裂缝。

第一步:读取图像,并调整大小。
images = []for url in tqdm.tqdm(df['content']):    response = requests.get(url)    img = Image.open(BytesIO(response.content))    img = img.resize((224, 224))    numpy_img = img_to_array(img)    img_batch = np.expand_dims(numpy_img, axis=0)    images.append(img_batch.astype('float16'))images = np.vstack(images)
从下面的示例中您可以看到,在我们的数据中显示了不同类型的墙体裂缝,其中一些对我来说也不容易识别。
图例

02. 机器学习模型

我们想要建立一个机器学习模型,该模型能够对墙壁图像进行分类并同时检测异常的位置。为了达到这个目的需要建立一个有效的分类器。它将能够读取输入图像并将其分类为“损坏”或“未损坏”两个部分。在最后一步,我们将利用分类器学到的知识来提取有用的信息,这将有助于我们检测异常情况。对于这个类任务,我们选择在Keras中重载VGG16来完成它。
vgg_conv = vgg16.VGG16(weights='imagenet', include_top=False, input_shape = (224, 224, 3))for layer in vgg_conv.layers[:-8]:    layer.trainable = False
导入了VGG架构,并允许训练最后两个卷积模块,以便我们的模型能够具有一定的特殊性。除此之外,我们还需要去除原始模型的顶层,并将其替换为另一种结构。
x = vgg_conv.outputx = GlobalAveragePooling2D()(x)x = Dense(2, activation="softmax")(x)model = Model(vgg_conv.input, x)model.compile(loss = "categorical_crossentropy", optimizer = optimizers.SGD(lr=0.0001, momentum=0.9), metrics=["accuracy"])
在分类阶段,GlobalAveragePooling层通过提取每个要素图的平均值来减小前一层的大小,这种选择加上中间致密层的省略用法可以避免过度拟合。如果小伙伴可以使用GPU,则培训非常简单。COLAB为我们提供了加快这一过程所需的武器。我们还使用了Keras提供的简单数据生成器进行图像增强。

最终,我们能够达到0.90的整体精度,还不错!
局部异常
现在我们要对检测出异常的图像进行一定的操作,使墙壁图像裂缝被突出。我们需要的有用信息位于顶层。因此我们可以访问:卷积层:上层是VGG结构,还有网络创建的更多重要功能。我们选择了最后一个卷积层(“ block5_conv3 ”),并在此处剪切了我们的分类模型。我们已经重新创建了一个中间模型,该模型以原始图像为输入,输出相关的激活图。考虑到维度,我们的中间模型增加了初始图像的通道(新功能)并减小了尺寸(高度和宽度)。

最终密度层:对于每个感兴趣的类别,我们都需要这些权重,这些权重负责提供分类的最终结果。

有了这些压缩的物体,我们掌握了定位裂缝的所有知识。我们希望将它们“绘制”在原始图像上,以使结果易于理解且易于看清。“解压缩”此信息在python中很容易:我们只需进行双线性上采样即可调整每个激活图的大小并计算点积。

执行一个简单的函数即可访问:
def plot_activation(img):    pred = model.predict(img[np.newaxis,:,:,:])    pred_class = np.argmax(pred)    weights = model.layers[-1].get_weights()[0]    class_weights = weights[:, pred_class]    intermediate = Model(model.input,                         model.get_layer("block5_conv3").output)    conv_output = intermediate.predict(img[np.newaxis,:,:,:])    conv_output = np.squeeze(conv_output)    h = int(img.shape[0]/conv_output.shape[0])    w = int(img.shape[1]/conv_output.shape[1])    act_maps = sp.ndimage.zoom(conv_output, (h, w, 1), order=1)    out = np.dot(act_maps.reshape((img.shape[0]*img.shape[1],512)),                  class_weights).reshape(img.shape[0],img.shape[1])    plt.imshow(img.astype('float32').reshape(img.shape[0],               img.shape[1],3))    plt.imshow(out, cmap='jet', alpha=0.35)    plt.title('Crack' if pred_class == 1 else 'No Crack')
我在下面的图像中显示结果,在该图像中,我已在分类为裂纹的测试图像上绘制了裂纹热图。我们可以看到,热图能够很好地泛化并指出包含裂缝的墙块。
在裂纹图像中显示异常

03. 总结

在这篇文章中,我们为异常识别和定位提供了一种机器学习解决方案。所有这些功能都可以通过实现单个分类模型来访问。在训练过程中,我们的神经网络会获取所有相关信息,从而可以进行分类,并在最后给出墙壁裂纹的信息。



推荐阅读



添加极市小助手微信(ID : cvmart2),备注:姓名-学校/公司-研究方向-城市(如:小极-北大-目标检测-深圳),即可申请加入极市目标检测/图像分割/工业检测/人脸/医学影像/3D/SLAM/自动驾驶/超分辨率/姿态估计/ReID/GAN/图像增强/OCR/视频理解等技术交流群:每月大咖直播分享、真实项目需求对接、求职内推、算法竞赛、干货资讯汇总、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企视觉开发者互动交流~

△长按添加极市小助手

△长按关注极市平台,获取最新CV干货

觉得有用麻烦给个在看啦~  
浏览 31
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报