Tutorial Prático | Usando Visão Computacional para Detectar Defeitos de Soldagem em Planos de Aço

Source丨AI Park

Editar 丨 Gokushi Platform

Leitura guiada

 

Com a ajuda do algoritmo de rede neural convolucional e da estrutura U-Net, a falha de soldagem do plano de aço pode ser detectada com precisão e sua gravidade pode ser avaliada. Este artigo apresenta o método de detecção e apresenta os resultados de três amostras.

Autor: Soham Malakar

Compilação: ronghuaiyang

Links originais:

https://medium.com/@malakar_soham/detecting-welding-defects-in-steel-plates-using-computer-vision-algorithms-98b1fb0da5e9

64cb4ceec75a5501aed83c71bfc7e216.png

1. Introdução

Defeitos de solda podem ser definidos como irregularidades, descontinuidades, imperfeições ou inconsistências na superfície da solda. Defeitos em juntas soldadas podem levar a peças e conjuntos sucateados, reparos caros, desempenho significativamente reduzido em condições operacionais e, em casos extremos, falhas catastróficas que resultam em perda de propriedade e vida útil.

Além disso, devido aos defeitos do próprio processo de soldagem e às características do próprio metal, sempre haverá certos defeitos no processo de soldagem. Avaliar a qualidade da solda é importante porque as juntas soldadas são frequentemente o local de iniciação de trincas devido a defeitos geométricos metalúrgicos inerentes, não uniformidade de propriedades mecânicas e presença de tensões residuais.

Na prática, é quase impossível obter uma solda perfeita e, na maioria dos casos, não é necessário fornecer as funções de serviço necessárias. No entanto, a detecção precoce e o isolamento são sempre preferíveis a um acidente.

Usando nosso algoritmo, podemos detectar facilmente imagens de falhas de soldagem e medir com precisão a gravidade de cada falha . Isso ajudará ainda mais no reconhecimento de imagem mais rápido e evitará situações indesejáveis.

Os resultados mostram que o uso do algoritmo de rede neural convolucional e da estrutura U-Net pode melhorar muito a eficiência do processamento. Os resultados foram 98,3% precisos ao final do trabalho .

2 Conhecimento preliminar

  • Noções básicas de aprendizado de máquina

  • A ideia básica da rede neural convolucional

  • Entenda as operações de convolução, pool máximo e upsampling

  • Entenda a filosofia arquitetônica da U-Net

  • Compreensão básica de conexões de salto em blocos residuais (opcional)

  • Conhecimento de manipulação de ConvNets usando bibliotecas Python, TensorFlow e Keras (opcional)

3 Segmentação de imagem

A segmentação é a divisão de uma imagem em regiões distintas que contêm pixels com propriedades semelhantes. Para serem significativas e úteis para análise e interpretação de imagens, as regiões devem ter fortes associações com objetos delineados ou características de interesse.

O sucesso da análise de imagens depende da confiabilidade da segmentação, mas a segmentação precisa de imagens é muitas vezes um problema muito desafiador.

ea067d7908bdd243717e7a4999c80a9c.png

Radiografia de tórax segmentada, coração (vermelho), pulmões (verde) e clavícula (azul)

4 momentos de imagem

Um momento de imagem é uma certa média ponderada de intensidades de pixel de imagem. Momentos de imagem são usados ​​para descrever o objeto segmentado.

Propriedades simples de imagens descobertas por momentos de imagem incluem:

  • Área (ou intensidade total)

  • Centro de gravidade

  • Informações sobre direções

5 Entenda os dados

dataset contém dois diretórios. As imagens originais são armazenadas no diretório 'images' e as imagens segmentadas são armazenadas no diretório 'labels'.

Vamos visualizar os dados:

0c1efe5722ad2fdaac8850fa7b3db253.png

imagem original de 'imagem'

edd43adc8332c45441b0f05835a4212d.png

imagem binária de 'rótulos'

Essas imagens do diretório "labels" são imagens binárias ou rótulos de verdade. Esta é a previsão que nosso modelo deve fazer dada a imagem original. Em uma imagem binária, os pixels têm um valor "alto" ou um valor "baixo". Áreas brancas ou valores "altos" indicam áreas defeituosas, e áreas pretas ou valores "baixos" indicam ausência de defeitos.

6 Métodos usados

A arquitetura que usamos para este problema é a U-Net. Passaremos por três etapas para detectar falhas e medir a gravidade dessas imagens de solda:

  • Segmentação de imagem

  • Use cores para indicar a gravidade

  • Use momentos de imagem para medir a gravidade

Treine o modelo

Abaixo está a arquitetura U-Net que usamos para o modelo:

4f9cecc89201977ea73f3ffef4465d08.png

Estrutura U-Net usada

Pontos a observar:

Cada caixa azul corresponde a um mapa de recursos multicanal

O número de canais é indicado na parte superior da caixa

A dimensão (x,y) é exibida na borda inferior esquerda da caixa

As setas indicam ações diferentes

O nome da camada está abaixo da camada

C1 C2...C7 são as camadas de saída após a operação de convolução

P1, P2, P3 são as camadas de saída da operação de pooling máximo

U1, U2, U3 são as camadas de saída da operação de upsampling

A1, A2, A3 são conexões de salto

À esquerda está o caminho de encolhimento, aplicando convolução regular e operações de agrupamento máximo

O tamanho da imagem diminui gradualmente, enquanto a profundidade aumenta gradualmente

À direita está o caminho de desenrolamento, onde são aplicadas as operações de convolução transposta (upamostragem) e convolução regular

No caminho de expansão, o tamanho da imagem aumenta gradualmente e a profundidade diminui gradualmente

Para obter localizações mais precisas, em cada etapa do caminho de expansão, usamos conexões de salto para concatenar a saída da camada convolucional transposta com o mesmo mapa de recursos de nível do codificador: A1 = U1 + C3 A2 = U2 + C2 A3 = U3 + C1

Após cada conexão, aplicamos a convolução regular novamente para que o modelo possa aprender a montar uma saída mais precisa.

import numpy as np
import cv2
import os
import random
import tensorflow as tf

h,w = 512,512

def create_model():

    inputs = tf.keras.layers.Input(shape=(h,w,3))

    conv1 = tf.keras.layers.Conv2D(16,(3,3),activation='relu',padding='same')(inputs)
    pool1 = tf.keras.layers.MaxPool2D()(conv1)

    conv2 = tf.keras.layers.Conv2D(32,(3,3),activation='relu',padding='same')(pool1)
    pool2 = tf.keras.layers.MaxPool2D()(conv2)

    conv3 = tf.keras.layers.Conv2D(64,(3,3),activation='relu',padding='same')(pool2)
    pool3 = tf.keras.layers.MaxPool2D()(conv3)

    conv4 = tf.keras.layers.Conv2D(64,(3,3),activation='relu',padding='same')(pool3)

    upsm5 = tf.keras.layers.UpSampling2D()(conv4)
    upad5 = tf.keras.layers.Add()([conv3,upsm5])
    conv5 = tf.keras.layers.Conv2D(32,(3,3),activation='relu',padding='same')(upad5)

    upsm6 = tf.keras.layers.UpSampling2D()(conv5)
    upad6 = tf.keras.layers.Add()([conv2,upsm6])
    conv6 = tf.keras.layers.Conv2D(16,(3,3),activation='relu',padding='same')(upad6)

    upsm7 = tf.keras.layers.UpSampling2D()(conv6)
    upad7 = tf.keras.layers.Add()([conv1,upsm7])
    conv7 = tf.keras.layers.Conv2D(1,(3,3),activation='relu',padding='same')(upad7)

    model = tf.keras.models.Model(inputs=inputs, outputs=conv7)

    return model

images = []
labels = []

files = os.listdir('./dataset/images/')
random.shuffle(files)

for f in files:
    img = cv2.imread('./dataset/images/' + f)
    parts = f.split('_')
    label_name = './dataset/labels/' + 'W0002_' + parts[1]
    label = cv2.imread(label_name,2)

    img = cv2.resize(img,(w,h))
    label = cv2.resize(label,(w,h))

    images.append(img)
    labels.append(label)

images = np.array(images)
labels = np.array(labels)
labels = np.reshape(labels,
    (labels.shape[0],labels.shape[1],labels.shape[2],1))

print(images.shape)
print(labels.shape)

images = images/255
labels = labels/255

model = tf.keras.models.load_model('my_model')

#model = create_model()  # uncomment this to create a new model
print(model.summary())

model.compile(optimizer='adam', loss='binary_crossentropy',metrics=['accuracy'])
model.fit(images,labels,epochs=100,batch_size=10)
model.evaluate(images,labels)

model.save('my_model')

O modelo é compilado com o otimizador Adam e, como existem apenas duas categorias de defeitos e nenhum defeito, usamos uma função de perda de entropia cruzada binária.

Usamos 100 épocas (o número de vezes que o modelo é executado em todas as entradas) com um tamanho de lote de 10.

Observe que o ajuste desses hiperparâmetros tem muito espaço para melhorar ainda mais o desempenho do modelo.

modelo de teste

Como o tamanho de entrada do modelo é 512x512x3, redimensionamos a entrada para esse tamanho. Em seguida, normalizamos a imagem e a dividimos por 255, o que torna o cálculo mais rápido.

Esta imagem é alimentada no modelo para prever a saída binária. Para amplificar a intensidade do pixel, a saída binária é multiplicada por 1000.

A imagem é então convertida em um inteiro de 16 bits para facilitar a manipulação da imagem. Os defeitos são então detectados com algoritmos que marcam visualmente a gravidade dos defeitos por gradação de cores e atribuindo pesos aos pixels defeituosos de acordo com sua gravidade. Os momentos da imagem são então calculados nesta imagem considerando os pixels ponderados.

Por fim, converta a imagem de volta para um inteiro de 8 bits e exiba o grau de cor e o valor de gravidade da imagem de saída.

import numpy as np
import cv2
from google.colab.patches import cv2_imshow
import os
import random
import tensorflow as tf


h,w = 512,512
num_cases = 10

images = []
labels = []

files = os.listdir('./dataset/images/')
random.shuffle(files)

model = tf.keras.models.load_model('my_model')

lowSevere = 1
midSevere = 2
highSevere = 4

for f in files[0:num_cases]:
    test_img = cv2.imread('./dataset/images/' + f)
    resized_img = cv2.resize(test_img,(w,h))
    resized_img = resized_img/255
    cropped_img = np.reshape(resized_img,
          (1,resized_img.shape[0],resized_img.shape[1],resized_img.shape[2]))

    test_out = model.predict(cropped_img)

    test_out = test_out[0,:,:,0]*1000
    test_out = np.clip(test_out,0,255)

    resized_test_out = cv2.resize(test_out,(test_img.shape[1],test_img.shape[0]))
    resized_test_out = resized_test_out.astype(np.uint16)

    test_img = test_img.astype(np.uint16)

    grey = cv2.cvtColor(test_img, cv2.COLOR_BGR2GRAY)

    for i in range(test_img.shape[0]):
     for j in range(test_img.shape[1]):
          if(grey[i,j]>150 & resized_test_out[i,j]>40):
            test_img[i,j,1]=test_img[i,j,1] + resized_test_out[i,j]
            resized_test_out[i,j] = lowSevere
          elif(grey[i,j]<100 & resized_test_out[i,j]>40):
            test_img[i,j,2]=test_img[i,j,2] + resized_test_out[i,j]
            resized_test_out[i,j] = highSevere
          elif(resized_test_out[i,j]>40):
            test_img[i,j,0]=test_img[i,j,0] + resized_test_out[i,j]
            resized_test_out[i,j] = midSevere
          else:
            resized_test_out[i,j] = 0

    M = cv2.moments(resized_test_out)
    maxMomentArea = resized_test_out.shape[1]*resized_test_out.shape[0]*highSevere
    print("0th Moment = " , (M["m00"]*100/maxMomentArea), "%")

    test_img = np.clip(test_img,0,255)

    test_img = test_img.astype(np.uint8)

    cv2_imshow(test_img)

    cv2.waitKey(0)

7 resultados

A métrica visual que usamos para detectar a gravidade é a cor.

Na imagem, as cores:

  1. Verde indica áreas com defeitos graves.

  2. Azul representa áreas com defeitos mais graves.

  3. As áreas vermelhas indicam os defeitos mais graves.

O momento de ordem 0 é exibido como uma porcentagem na imagem de saída como uma medida de gravidade empírica.

Abaixo estão três amostras aleatórias mostrando a entrada original, a verdade do terreno e a saída gerada pelo nosso modelo.

Amostra 1::

95497831ae9431c0d86b0645ef1d1683.png

A imagem originária

58a0896f8d32e7420431a42cf66cb34f.png

Imagem binária (Ground Truth)

c5a3ed2545a86f56f46060af3539b959.png

Saída de previsão com gravidade

Amostra 2:

e0a5de6994052e754143c4eaf2bb47d7.png

A imagem originária

1528a0c7d01b0c72bf8b419c19f5f65e.png

Imagem binária (Ground Truth)

c6ed9723bbb76d2526b2cdb26aeafdfc.png

Saída de previsão com gravidade

Amostra 3:

c954c89acf6271bc25acc82e66524677.png

A imagem originária

21f268a48609fa73e8755d057faa1bde.png

Imagem binária (Ground Truth)

f3077c53962384b5b21a6be4ac1f15cd.png

Este artigo é apenas para compartilhamento acadêmico, caso haja alguma infração, entre em contato para deletar o artigo.

Download e estudo de produtos secos

Resposta dos bastidores: Curso da Universidade Autônoma de Barcelona , ​​você pode baixar o material didático de alta qualidade 3D Vison acumulado por universidades estrangeiras por vários anos

Resposta em segundo plano: livros de visão computacional , você pode baixar o pdf de livros clássicos no campo da visão 3D

Resposta dos bastidores: cursos de visão 3D, você pode aprender excelentes cursos na área de visão 3D

Cursos de qualidade visual 3D recomendados:

1. Tecnologia de fusão de dados multissensor para condução autônoma

2. Uma rota de aprendizado completa para detecção de alvos em nuvem de pontos 3D no campo da direção autônoma! (Single-modal + multi-modal/data + code)
3. Compreender completamente a reconstrução visual 3D: análise de princípio, explicação de código e otimização e melhoria
4. O primeiro curso doméstico de processamento de nuvem de pontos para combate em nível industrial
5. Visão a laser -IMU-GPS fusão algoritmo SLAM classificação
e
explicação
de código Princípio do algoritmo chave SLAM a laser interno e externo, código e combate real (cartógrafo + LOAM + LIO-SAM)

9. Construir um sistema de reconstrução 3D de luz estruturada a partir do zero [teoria + código-fonte + prática]

10. Método de estimativa de profundidade monocular: classificação de algoritmos e implementação de código

11. A implantação real de modelos de aprendizado profundo na condução autônoma

12. Modelo e calibração da câmera (monocular + binocular + olho de peixe)

13. Pesado! Quadcopters: Algoritmos e Prática

14. ROS2 da entrada ao domínio: teoria e prática

Pesado! Workshop de Visão Computacional - O Grupo de Intercâmbio de Aprendizagem foi estabelecido

Digitalize o código para adicionar um assistente do WeChat e você pode se inscrever para participar do grupo de intercâmbio 3D Vision Workshop - Academic Paper Writing and Submission WeChat, que visa trocar assuntos de redação e submissão, como principais conferências, principais periódicos, SCI e EI.

Ao mesmo tempo , você também pode se inscrever para participar do nosso grupo de troca de direção de subdivisão. Atualmente, há principalmente aprendizado de código-fonte da série ORB-SLAM, visão 3D , CV e aprendizado profundo , SLAM , reconstrução 3D , pós-processamento de nuvem de pontos , condução automática, introdução de CV, medição 3D, VR/AR, reconhecimento facial 3D, imagens médicas, detecção de defeitos, reidentificação de pedestres, rastreamento de alvos, aterrissagem visual de produtos, competição visual, reconhecimento de placas, seleção de hardware, estimativa de profundidade, intercâmbios acadêmicos , trocas de procura de emprego e outros grupos WeChat, por favor, digitalize a seguinte conta WeChat mais grupo, observações: "direção de pesquisa + escola/empresa + apelido", por exemplo: "visão 3D + Shanghai Jiaotong University + Jingjing". Por favor, observe de acordo com o formato, caso contrário não será aprovado. Depois que a adição for bem-sucedida, o grupo relevante do WeChat será convidado de acordo com a direção da pesquisa. Entre em contato para envios originais .

762e8e4b4549e4488c9c2a052ef6403a.png

▲ Pressione e segure para adicionar o grupo WeChat ou contribuir

3a4bd70e5753120362088efce02fae5e.png

▲ Pressione e segure para seguir a conta oficial

Visão 3D da entrada ao planeta do conhecimento proficiente : cursos em vídeo para o campo da visão 3D (série de reconstrução 3D , série de nuvem de pontos 3D, série de luz estruturada , calibração olho-mão, calibração de câmera , laser/visão SLAM, condução automática, etc. ) , resumo dos pontos de conhecimento , rota de entrada e aprendizado avançado, o compartilhamento de papel mais recente e respostas a perguntas para cultivo aprofundado e orientação técnica de engenheiros de algoritmos de várias grandes fábricas. Ao mesmo tempo, a Planet cooperará com empresas conhecidas para liberar trabalhos de desenvolvimento de algoritmos relacionados à visão 3D e informações de encaixe de projetos, criando uma área de encontro para fãs obstinados que integra tecnologia e emprego. conhecimento para criar um mundo de IA melhor. Planet Entrance:

Aprenda a tecnologia principal da visão 3D, digitalize e visualize a introdução, reembolso incondicional em 3 dias

862db19b548e813335c84ea6d91e6dbd.png

 Existem materiais tutoriais de alta qualidade no círculo, que podem responder a perguntas e ajudá-lo a resolver problemas de forma eficiente

Eu acho útil, por favor dê um like e assista

Acho que você gosta

Origin blog.csdn.net/qq_29462849/article/details/124113911
Recomendado
Clasificación