基于计算机视觉的裂纹检测方案
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.output x = 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. 總結
在這篇文章中,我們為異常識別和定位提供了一種機器學習解決方案。所有這些功能都可以通過實現單個分類模型來訪問。在訓練過程中,我們的神經網絡會獲取所有相關信息,從而可以進行分類,并在最后給出墻壁裂紋的信息。
下載1:OpenCV-Contrib擴展模塊中文版教程
在「小白學視覺」公眾號后臺回復:擴展模塊中文教程,即可下載全網第一份OpenCV擴展模塊教程中文版,涵蓋擴展模塊安裝、SFM算法、立體視覺、目標跟蹤、生物視覺、超分辨率處理等二十多章內容。
下載2:Python視覺實戰項目52講
在「小白學視覺」公眾號后臺回復:Python視覺實戰項目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數、添加眼線、車牌識別、字符識別、情緒檢測、文本內容提取、面部識別等31個視覺實戰項目,助力快速學校計算機視覺。
下載3:OpenCV實戰項目20講
在「小白學視覺」公眾號后臺回復:OpenCV實戰項目20講,即可下載含有20個基于OpenCV實現20個實戰項目,實現OpenCV學習進階。
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫學影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據研究方向邀請進入相關微信群。請勿在群內發送廣告,否則會請出群,謝謝理解~
總結
以上是生活随笔為你收集整理的基于计算机视觉的裂纹检测方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SSM框架利用Filter实现页面不登陆
- 下一篇: SheetJS 读取excel文件转出j