Em todas as tarefas de ensino da inteligência artificial, há um fenômeno desagradável - erros na marcação da sequência de treinamento. Esses erros são inevitáveis, uma vez que toda a marcação é feita manualmente, porque se existe uma maneira de marcar dados reais programaticamente, por que precisamos de alguém para ensiná-los a marcar e gastar tempo e dinheiro criando um design absolutamente desnecessário!
A tarefa de encontrar e remover máscaras falsas em uma grande sequência de treinamento é bastante complicada. Você pode visualizá-los todos manualmente, mas isso não salvará você de erros repetidos. Mas se você examinar atentamente as ferramentas para o estudo de redes neurais propostas em
postagens anteriores , verifica-se que existe uma maneira simples e eficaz de detectar e extrair todos os artefatos da sequência de treinamento.
E neste post há um exemplo concreto, é óbvio que um simples, em elipses e polígonos, para uma rede em U comum, é novamente um lego na caixa de areia, mas é incomumente concreto, útil e eficaz. Mostraremos como um método simples identifica e encontra quase todos os artefatos, todas as mentiras da sequência de treinamento.
Então, vamos começar!
Como antes, estudaremos a sequência de pares imagem / máscara. Na figura em diferentes partes, escolhida aleatoriamente, colocaremos também uma elipse de tamanho aleatório e um quadrilátero de tamanho arbitrário, e ambas as cores da mesma cor, também selecionadas aleatoriamente de duas delas. Na segunda cor restante, pintamos o fundo. As dimensões da elipse e do quadrilátero são obviamente limitadas.
Mas neste caso, introduziremos mudanças no programa de geração de pares e prepararemos, juntamente com uma máscara completamente correta, uma incorreta, envenenada por uma mentira - em cerca de um por cento dos casos, substituir o quadrilátero na máscara por uma elipse, ou seja, o verdadeiro objeto para a segmentação é indicado por máscaras falsas como uma elipse, não como quadrilátero.
Exemplos Aleatórios 10
Exemplos de 10 aleatórios, mas de marcação incorreta. A máscara superior é verdadeira, a inferior é falsa e os números na sequência de treinamento são mostrados nas figuras.
para a segmentação, adotamos os mesmos programas de cálculo de métricas e perdas e a mesma rede U simples, mas não usaremos o Dropout.
Bibliotecasimport numpy as np import matplotlib.pyplot as plt from matplotlib.colors import NoNorm %matplotlib inline import math from tqdm import tqdm
Funções de métricas e perdas def dice_coef(y_true, y_pred): y_true_f = K.flatten(y_true) y_pred = K.cast(y_pred, 'float32') y_pred_f = K.cast(K.greater(K.flatten(y_pred), 0.5), 'float32') intersection = y_true_f * y_pred_f score = 2. * K.sum(intersection) / (K.sum(y_true_f) + K.sum(y_pred_f)) return score def dice_loss(y_true, y_pred): smooth = 1. y_true_f = K.flatten(y_true) y_pred_f = K.flatten(y_pred) intersection = y_true_f * y_pred_f score = (2. * K.sum(intersection) + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth) return 1. - score def bce_dice_loss(y_true, y_pred): return binary_crossentropy(y_true, y_pred) + dice_loss(y_true, y_pred) def get_iou_vector(A, B):
Rede U normal def build_model(input_layer, start_neurons):
O programa para gerar imagens e máscaras - verdadeiro e falso. A primeira camada da imagem é colocada na matriz, a segunda é a máscara verdadeira e a terceira camada é a máscara falsa.
def next_pair_f(idx): img_l = np.ones((w_size, w_size, 1), dtype='float')*0.45 img_h = np.ones((w_size, w_size, 1), dtype='float')*0.55 img = np.zeros((w_size, w_size, 3), dtype='float') i0_qua = math.trunc(np.random.sample()*4.) i1_qua = math.trunc(np.random.sample()*4.) while i0_qua == i1_qua: i1_qua = math.trunc(np.random.sample()*4.) _qua = np.int(w_size/4) qua = np.array([[_qua,_qua],[_qua,_qua*3],[_qua*3,_qua*3],[_qua*3,_qua]]) p = np.random.sample() - 0.5 r = qua[i0_qua,0] c = qua[i0_qua,1] r_radius = np.random.sample()*(radius_max-radius_min) + radius_min c_radius = np.random.sample()*(radius_max-radius_min) + radius_min rot = np.random.sample()*360 rr, cc = ellipse( r, c, r_radius, c_radius, rotation=np.deg2rad(rot), shape=img_l.shape ) p0 = np.rint(np.random.sample()*(radius_max-radius_min) + radius_min) p1 = qua[i1_qua,0] - (radius_max-radius_min) p2 = qua[i1_qua,1] - (radius_max-radius_min) p3 = np.rint(np.random.sample()*radius_min) p4 = np.rint(np.random.sample()*radius_min) p5 = np.rint(np.random.sample()*radius_min) p6 = np.rint(np.random.sample()*radius_min) p7 = np.rint(np.random.sample()*radius_min) p8 = np.rint(np.random.sample()*radius_min) poly = np.array(( (p1, p2), (p1+p3, p2+p4+p0), (p1+p5+p0, p2+p6+p0), (p1+p7+p0, p2+p8), (p1, p2), )) rr_p, cc_p = polygon(poly[:, 0], poly[:, 1], img_l.shape) if p > 0: img[:,:,:1] = img_l.copy() img[rr, cc,:1] = img_h[rr, cc] img[rr_p, cc_p,:1] = img_h[rr_p, cc_p] else: img[:,:,:1] = img_h.copy() img[rr, cc,:1] = img_l[rr, cc] img[rr_p, cc_p,:1] = img_l[rr_p, cc_p] img[:,:,1] = 0. img[:,:,1] = 0. img[rr_p, cc_p,1] = 1. img[:,:,2] = 0. p_f = np.random.sample()*1000. if p_f > 10: img[rr_p, cc_p,2] = 1. else: img[rr, cc,2] = 1. i_false[idx] = 1 return img
Programa de cálculo de folhas de dicas def make_sh(f_imgs, f_msks, val_len): precision = 0.85 batch_size = 50 t = tqdm() t_batch_size = 50 raw_len = val_len id_train = 1
O principal programa de cálculos. Fizemos pequenas alterações no mesmo programa a partir da publicação anterior e algumas variáveis requerem explicação e comentário.
i_false = np.zeros((train_num), dtype='int')
Existe um indicador falso de máscara. Se 1, a máscara de F_msks não corresponde à máscara de f_msks. Este é um indicador do que realmente estamos procurando - máscaras falsas.
m2_select = np.zeros((train_num), dtype='int')
Indicador de que esta imagem está selecionada na folha de dicas.
batch_size = 50 val_len = batch_size + 1
Construímos seqüências de pares de figuras / máscaras para treinamento e outra sequência para teste. I.e. Iremos verificar uma nova sequência independente de 10.000 pares. Exibimos e visualizamos seletivamente imagens aleatórias com máscaras verdadeiras e falsas. As imagens acima são mostradas.
Nesse caso em particular, foram obtidas 93 máscaras falsas, nas quais uma elipse, em vez de um quadrilátero, foi marcada como verdadeiro positivo.
Começamos a treinar no conjunto correto, usamos f_msks como uma máscara
input_layer = Input((w_size, w_size, 1)) output_layer = build_model(input_layer, 25) model = Model(input_layer, output_layer) model.compile(loss=bce_dice_loss, optimizer=Adam(lr=1e-4), metrics=[my_iou_metric]) v_false = make_sh(f_imgs, f_msks, val_len) t_pred = model.predict(t_imgs,batch_size=batch_size) print (get_iou_vector(t_msks,t_pred.reshape(-1,w_size ,w_size ,1)))
Accuracy 0.9807 loss 0.0092 selected img 404 tested img 10000 : : 1801it [08:13, 3.65it/s] 0.9895299999999841
A cábula acabou em apenas 404 imagens e obteve uma precisão aceitável em uma sequência de teste independente.
Agora recompilamos a rede e treinamos na mesma sequência de treinamento, mas como máscaras, alimentamos F_msks com 1% de máscaras falsas na entrada
input_layer = Input((w_size, w_size, 1)) output_layer = build_model(input_layer, 25) model = Model(input_layer, output_layer) model.compile(loss=bce_dice_loss, optimizer=Adam(lr=1e-4), metrics=[my_iou_metric]) v_false = make_sh(f_imgs, F_msks, val_len) t_pred = model.predict(t_imgs,batch_size=batch_size) print (get_iou_vector(t_msks,t_pred.reshape(-1,w_size ,w_size ,1)))
Accuracy 0.9821 loss 0.0324 selected img 727 tested img 10000 : : 1679it [25:44, 1.09it/s] 0.9524099999999959
Obtivemos uma folha de dicas com 727 fotos, que é significativamente maior e a precisão das previsões de teste, igual à da sequência de testes anterior, diminuiu de 0,98953 para 0,9525. Adicionamos mentiras à sequência de treinamento em menos de 1%, apenas 93 de 10.000 máscaras eram falsas, mas o resultado piorou em 3,7%. E isso não é apenas uma mentira, é uma verdadeira astúcia! E a folha de dicas aumentou de apenas 404 para 727 fotos.
Calmante e agradável apenas uma coisa
print (len(set(np.arange(train_num)[m2_select>0]).intersection(set(np.arange(train_num)[i_false>0])))) 93
Deixe-me explicar esta longa fórmula: tomamos a interseção do conjunto de imagens selecionadas na folha de dicas com o conjunto de imagens falsas e vemos que o algoritmo selecionou todas as 93 imagens falsas na folha de dicas.
A tarefa é simplificada significativamente, não são 10.000 fotos para serem visualizadas manualmente, são apenas 727 e todas as mentiras estão concentradas aqui.
Mas existe uma maneira ainda mais interessante e útil. Quando compilamos a folha de dicas, incluímos apenas os pares imagem / máscara cuja previsão é menor que o limite e, em nosso caso particular, salvamos o valor da precisão da previsão na matriz
v_false . Vejamos pares da sequência de treinamento que possuem um valor de previsão muito pequeno, por exemplo, menor que 0,1 e veja quantas mentiras existem
print (len(set(np.arange(train_num)[v_false<0.01]).intersection(set(np.arange(train_num)[i_false>0])))) 89
Como você pode ver, a parte principal das máscaras falsas, 89 de 93, caiu nessas máscaras.
np.arange(train_num)[v_false<0.01].shape (382,)
Assim, se verificarmos apenas 382 máscaras manualmente, e esse total for de 10.000, identificaremos e destruiremos a maioria das máscaras falsas sem piedade.
Se for possível visualizar imagens e máscaras durante a decisão de incluí-las na folha de dicas, a partir de uma etapa, todas as máscaras falsas, todas as mentiras serão determinadas pelo nível mínimo de previsão de uma rede levemente treinada, e as máscaras corretas terão uma previsão maior que esse nível .
Resumir
Se em algum mundo imaginado a verdade é sempre quadrangular, e a mentira oval e alguma entidade desconhecida decidem distorcer a verdade e chamam algumas elipses de verdade, e os quadrângulos são falsos, então, usando inteligência artificial e a capacidade natural de fazer truques, a Inquisição local encontrará rápida e facilmente e erradica mentiras e engana completamente e completamente.
PS: A capacidade de detectar ovais, triângulos e polígonos simples é um pré-requisito para criar qualquer IA que controle o carro. Se você não souber procurar ovais e triângulos, não encontrará todos os sinais de trânsito e sua IA sairá no carro errado.