рдХреГрддреНрд░рд┐рдо рдмреБрджреНрдзрд┐рдорддреНрддрд╛ рдмрдирд╛рдо рдЭреВрда рдФрд░ рдЫрд▓

рдХреГрддреНрд░рд┐рдо рдмреБрджреНрдзрд┐рдорддреНрддрд╛ рд╕рд┐рдЦрд╛рдиреЗ рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ, рдПрдХ рдЕрдкреНрд░рд┐рдп рдШрдЯрдирд╛ рд╣реИ - рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЕрдиреБрдХреНрд░рдо рдХреЗ рдорд╛рд░реНрдХрдЕрдк рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВред рдпреЗ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рдорд╛рд░реНрдХрдЕрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдХрд┐рд╕реА рдФрд░ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдбрд┐рдЬрд╛рдЗрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЪрд┐рдиреНрд╣рд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕рдордп рдФрд░ рдкреИрд╕рд╛ рдЦрд░реНрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ!

рдПрдХ рдмрдбрд╝реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдирдХрд▓реА рдорд╛рд╕реНрдХ рдХреЛ рдЦреЛрдЬрдиреЗ рдФрд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рд╣реИред рдЖрдк рдЙрди рд╕рднреА рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдкрдХреЛ рдмрд╛рд░-рдмрд╛рд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдирд╣реАрдВ рдмрдЪрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдкрд┐рдЫрд▓реЗ рдкреЛрд╕реНрдЯ рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдХрд░реАрдм рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЕрдиреБрдХреНрд░рдо рд╕реЗ рд╕рднреА рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдФрд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛ рдПрдХ рд╕рд░рд▓ рдФрд░ рдкреНрд░рднрд╛рд╡реА рддрд░реАрдХрд╛ рд╣реИред

рдФрд░ рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдПрдХ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдпреВ-рдиреЗрдЯ рдХреЗ рд▓рд┐рдП, рдПрд▓рд┐рдкреНрд╕ рдФрд░ рдкреЙрд▓реАрдЧреЛрди рдкрд░, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдлрд┐рд░ рд╕реЗ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдореЗрдВ рдРрд╕рд╛ рд▓реЗрдЧреЛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдареЛрд╕, рдЙрдкрдпреЛрдЧреА рдФрд░ рдкреНрд░рднрд╛рд╡реА рд╣реИред рд╣рдо рдмрддрд╛рдПрдВрдЧреЗ рдХрд┐ рдХреИрд╕реЗ рдПрдХ рд╕рд░рд▓ рд╡рд┐рдзрд┐ рд▓рдЧрднрдЧ рд╕рднреА рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдирддреА рд╣реИ рдФрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЕрдиреБрдХреНрд░рдо рдХреЗ рд╕рднреА рдЭреВрда рдХреЛ рдвреВрдВрдврддреА рд╣реИред

рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИ!

рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рд╣рдо рдЪрд┐рддреНрд░ / рдореБрдЦреМрдЯрд╛ рдЬреЛрдбрд╝реЗ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░реЗрдВрдЧреЗред рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдЪреБрдиреЗ рдЧрдП рд╡рд┐рднрд┐рдиреНрди рддрд┐рдорд╛рд╣рд┐рдпреЛрдВ рдореЗрдВ рддрд╕реНрд╡реАрд░ рдореЗрдВ, рд╣рдо рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЖрдХрд╛рд░ рдХрд╛ рдПрдХ рджреАрд░реНрдШрд╡реГрддреНрдд рдФрд░ рдПрдХ рдордирдорд╛рдирд╛ рдЖрдХрд╛рд░ рдХрд╛ рдПрдХ рдЪрддреБрд░реНрднреБрдЬ рднреА рд░рдЦреЗрдВрдЧреЗ, рдФрд░ рдПрдХ рд╣реА рд░рдВрдЧ рдореЗрдВ рджреЛрдиреЛрдВ рд░рдВрдЧ, рдЙрдирдореЗрдВ рд╕реЗ рджреЛ рдХреЛ рднреА рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдЪреБрдирд╛ рдЬрд╛рдПрдЧрд╛ред рджреВрд╕рд░реЗ рд╢реЗрд╖ рд░рдВрдЧ рдореЗрдВ, рд╣рдо рдкреГрд╖реНрдарднреВрдорд┐ рдХреЛ рд░рдВрдЧрддреЗ рд╣реИрдВред рджреАрд░реНрдШрд╡реГрддреНрдд рдФрд░ рдЪрддреБрд░реНрднреБрдЬ рджреЛрдиреЛрдВ рдХреЗ рдЖрдпрд╛рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реАрдорд┐рдд рд╣реИрдВред

рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЬреЛрдбрд╝реА рдкреАрдврд╝реА рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдмрджрд▓рд╛рд╡ рд▓рд╛рдПрдВрдЧреЗ рдФрд░ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣реА рдореБрдЦреМрдЯрд╛, рдПрдХ рдЧрд▓рдд, рдПрдХ рдЭреВрда рджреНрд╡рд╛рд░рд╛ рдЬрд╣рд░ рдХреЗ рд╕рд╛рде рддреИрдпрд╛рд░ рдХрд░реЗрдВрдЧреЗ - рд▓рдЧрднрдЧ рдПрдХ рдкреНрд░рддрд┐рд╢рдд рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЪрддреБрд░реНрднреБрдЬ рдХреЛ рдПрдХ рджреАрд░реНрдШрд╡реГрддреНрдд рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ, рдЕрд░реНрдерд╛рдд рд╡рд┐рднрд╛рдЬрди рдХреЗ рд▓рд┐рдП рд╕рдЪреНрдЪреА рд╡рд╕реНрддреБ рдХреЛ рдЭреВрдареЗ рдореБрдЦреМрдЯреЗ рджреНрд╡рд╛рд░рд╛ рдПрдХ рджреАрд░реНрдШрд╡реГрддреНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реВрдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЪрддреБрд░реНрднреБрдЬ рдирд╣реАрдВред

рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЙрджрд╛рд╣рд░рдг 10



рдпрд╛рджреГрдЪреНрдЫрд┐рдХ 10 рдХреЗ рдЙрджрд╛рд╣рд░рдг, рд▓реЗрдХрд┐рди рдЧрд▓рдд рдорд╛рд░реНрдХрдЕрдк рд╕реЗред рдКрдкрд░реА рдореБрдЦреМрдЯрд╛ рд╕рдЪ рд╣реИ, рдирд┐рдЪрд▓рд╛ рдПрдХ рдЭреВрдард╛ рд╣реИ, рдФрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдирдВрдмрд░ рдЪрд┐рддреНрд░реЛрдВ рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рд╣реИрдВред



рд╡рд┐рднрд╛рдЬрди рдХреЗ рд▓рд┐рдП рд╣рдо рд╕рдорд╛рди рдореАрдЯреНрд░рд┐рдХ рдФрд░ рд╣рд╛рдирд┐ рдЧрдгрдирд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдФрд░ рд╕рдорд╛рди рд╕рд░рд▓ рдпреВ-рдиреЗрдЯ рд▓реЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдбреНрд░реЙрдкрдЖрдЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ
import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import NoNorm %matplotlib inline import math from tqdm import tqdm #from joblib import Parallel, delayed from skimage.draw import ellipse, polygon from keras import Model from keras.optimizers import Adam from keras.layers import Input,Conv2D,Conv2DTranspose,MaxPooling2D,concatenate from keras.layers import BatchNormalization,Activation,Add,Dropout from keras.losses import binary_crossentropy from keras import backend as K from keras.models import load_model import tensorflow as tf import keras as keras w_size = 128 train_num = 10000 radius_min = 10 radius_max = 30 


рдореАрдЯреНрд░рд┐рдХ рдФрд░ рд╣рд╛рдирд┐ рдХрд╛рд░реНрдп
 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): # Numpy version batch_size = A.shape[0] metric = 0.0 for batch in range(batch_size): t, p = A[batch], B[batch] true = np.sum(t) pred = np.sum(p) # deal with empty mask first if true == 0: metric += (pred == 0) continue # non empty mask case. Union is never empty # hence it is safe to divide by its number of pixels intersection = np.sum(t * p) union = true + pred - intersection iou = intersection / union # iou metrric is a stepwise approximation of the real iou over 0.5 iou = np.floor(max(0, (iou - 0.45)*20)) / 10 metric += iou # teake the average over all images in batch metric /= batch_size return metric def my_iou_metric(label, pred): # Tensorflow version return tf.py_func(get_iou_vector, [label, pred > 0.5], tf.float64) from keras.utils.generic_utils import get_custom_objects get_custom_objects().update({'bce_dice_loss': bce_dice_loss }) get_custom_objects().update({'dice_loss': dice_loss }) get_custom_objects().update({'dice_coef': dice_coef }) get_custom_objects().update({'my_iou_metric': my_iou_metric }) 


рд╕рд╛рдорд╛рдиреНрдп рдпреВ-рдиреЗрдЯ
 def build_model(input_layer, start_neurons): # 128 -> 64 conv1 = Conv2D(start_neurons * 1, (3, 3), activation="relu", padding="same")(input_layer) conv1 = Conv2D(start_neurons * 1, (3, 3), activation="relu", padding="same")(conv1) pool1 = Conv2D(start_neurons * 1, (2, 2), strides=(2, 2), activation="relu", padding="same")(conv1) # pool1 = Dropout(0.25)(pool1) # 64 -> 32 conv2 = Conv2D(start_neurons * 2, (3, 3), activation="relu", padding="same")(pool1) conv2 = Conv2D(start_neurons * 2, (3, 3), activation="relu", padding="same")(conv2) pool2 = Conv2D(start_neurons * 1, (2, 2), strides=(2, 2), activation="relu", padding="same")(conv2) # pool2 = Dropout(0.5)(pool2) # 32 -> 16 conv3 = Conv2D(start_neurons * 4, (3, 3), activation="relu", padding="same")(pool2) conv3 = Conv2D(start_neurons * 4, (3, 3), activation="relu", padding="same")(conv3) pool3 = Conv2D(start_neurons * 1, (2, 2), strides=(2, 2), activation="relu", padding="same")(conv3) # pool3 = Dropout(0.5)(pool3) # 16 -> 8 conv4 = Conv2D(start_neurons * 8, (3, 3), activation="relu", padding="same")(pool3) conv4 = Conv2D(start_neurons * 8, (3, 3), activation="relu", padding="same")(conv4) pool4 = Conv2D(start_neurons * 1, (2, 2), strides=(2, 2), activation="relu", padding="same")(conv4) # pool4 = Dropout(0.5)(pool4) # Middle convm = Conv2D(start_neurons * 16, (3, 3), activation="relu", padding="same")(pool4) convm = Conv2D(start_neurons * 16, (3, 3) , activation="relu", padding="same")(convm) # 8 -> 16 deconv4 = Conv2DTranspose(start_neurons * 8, (3, 3), strides=(2, 2), padding="same")(convm) uconv4 = concatenate([deconv4, conv4]) # uconv4 = Dropout(0.5)(uconv4) uconv4 = Conv2D(start_neurons * 8, (3, 3) , activation="relu", padding="same")(uconv4) uconv4 = Conv2D(start_neurons * 8, (3, 3) , activation="relu", padding="same")(uconv4) # 16 -> 32 deconv3 = Conv2DTranspose(start_neurons * 4, (3, 3), strides=(2, 2), padding="same")(uconv4) uconv3 = concatenate([deconv3, conv3]) # uconv3 = Dropout(0.5)(uconv3) uconv3 = Conv2D(start_neurons * 4, (3, 3) , activation="relu", padding="same")(uconv3) uconv3 = Conv2D(start_neurons * 4, (3, 3) , activation="relu", padding="same")(uconv3) # 32 -> 64 deconv2 = Conv2DTranspose(start_neurons * 2, (3, 3), strides=(2, 2), padding="same")(uconv3) uconv2 = concatenate([deconv2, conv2]) # uconv2 = Dropout(0.5)(uconv2) uconv2 = Conv2D(start_neurons * 2, (3, 3) , activation="relu", padding="same")(uconv2) uconv2 = Conv2D(start_neurons * 2, (3, 3) , activation="relu", padding="same")(uconv2) # 64 -> 128 deconv1 = Conv2DTranspose(start_neurons * 1, (3, 3), strides=(2, 2), padding="same")(uconv2) uconv1 = concatenate([deconv1, conv1]) # uconv1 = Dropout(0.5)(uconv1) uconv1 = Conv2D(start_neurons * 1, (3, 3) , activation="relu", padding="same")(uconv1) uconv1 = Conv2D(start_neurons * 1, (3, 3) , activation="relu", padding="same")(uconv1) # uncov1 = Dropout(0.5)(uconv1) output_layer = Conv2D(1, (1,1), padding="same", activation="sigmoid")(uconv1) return output_layer input_layer = Input((w_size, w_size, 1)) output_layer = build_model(input_layer, 27) model = Model(input_layer, output_layer) model.compile(loss=bce_dice_loss, optimizer=Adam(lr=1e-4), metrics=[my_iou_metric]) model.summary() 


рдЪрд┐рддреНрд░ рдФрд░ рдореБрдЦреМрдЯреЗ рдкреИрджрд╛ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо - рд╕рдЪреНрдЪрд╛ рдФрд░ рдЧрд▓рддред рддрд╕реНрд╡реАрд░ рдХреА рдкрд╣рд▓реА рдкрд░рдд рдХреЛ рд╕рд░рдгреА рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рд╕рдЪ рдореБрдЦреМрдЯрд╛ рд╣реИ рдФрд░ рддреАрд╕рд░реА рдкрд░рдд рдЭреВрдареА рдореБрдЦреМрдЯрд╛ рд╣реИред

 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 

рдзреЛрдЦрд╛ рд╢реАрдЯ рдЧрдгрдирд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо
 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 #id_select = 1 v_false = np.zeros((train_num), dtype='float') while True: if id_train == 1: fit = model.fit(f_imgs[m2_select>0], f_msks[m2_select>0], batch_size=batch_size, epochs=1, verbose=0 ) current_accu = fit.history['my_iou_metric'][0] current_loss = fit.history['loss'][0] if current_accu > precision: id_train = 0 else: t_pred = model.predict( f_imgs[raw_len: min(raw_len+t_batch_size,f_imgs.shape[0])], batch_size=batch_size ) for kk in range(t_pred.shape[0]): val_iou = get_iou_vector( f_msks[raw_len+kk].reshape(1,w_size,w_size,1), t_pred[kk].reshape(1,w_size,w_size,1) > 0.5) v_false[raw_len+kk] = val_iou if val_iou < precision*0.95: new_img_test = 1 m2_select[raw_len+kk] = 1 val_len += 1 break raw_len += (kk+1) id_train = 1 t.set_description("Accuracy {0:6.4f} loss {1:6.4f} selected img {2:5d} tested img {3:5d} ". format(current_accu, current_loss, val_len, raw_len)) t.update(1) if raw_len >= train_num: break t.close() return v_false 


рдЧрдгрдирд╛ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдоред рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рдкреЛрд╕реНрдЯ рд╕реЗ рдПрдХ рд╣реА рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЫреЛрдЯреЗ рдмрджрд▓рд╛рд╡ рдХрд┐рдП рдФрд░ рдХреБрдЫ рдЪрд░ рдХреЛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдФрд░ рдЯрд┐рдкреНрдкрдгреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 i_false = np.zeros((train_num), dtype='int') 

рдПрдХ рдореБрдЦреМрдЯрд╛ рдЭреВрдард╛ рд╕рдВрдХреЗрддрдХ рд╣реИред рдпрджрд┐ 1, рддреЛ F_msks рд╕реЗ рдорд╛рд╕реНрдХ f_msks рд╕реЗ рдорд╛рд╕реНрдХ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рдмрд╛рдд рдХрд╛ рд╕реВрдЪрдХ рд╣реИ рдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВ - рдЭреВрдареЗ рдореБрдЦреМрдЯреЗред

 m2_select = np.zeros((train_num), dtype='int') 

рд╕рдВрдХреЗрддрдХ рдХрд┐ рдпрд╣ рддрд╕реНрд╡реАрд░ рдЪреАрдЯ рд╢реАрдЯ рдореЗрдВ рдЪреБрдиреА рдЧрдИ рд╣реИред

 batch_size = 50 val_len = batch_size + 1 # i_false - false mask marked as 1 i_false = np.zeros((train_num), dtype='int') # t_imgs, t_msks -test images and masks _txy = [next_pair_f(idx) for idx in range(train_num)] t_imgs = np.array(_txy)[:,:,:,:1].reshape(-1,w_size ,w_size ,1) t_msks = np.array(_txy)[:,:,:,1].reshape(-1,w_size ,w_size ,1) # m2_select - initial 51 pair m2_select = np.zeros((train_num), dtype='int') for k in range(val_len): m2_select[k] = 1 # i_false - false mask marked as 1 i_false = np.zeros((train_num), dtype='int') _txy = [next_pair_f(idx) for idx in range(train_num)] f_imgs = np.array(_txy)[:,:,:,:1].reshape(-1,w_size ,w_size ,1) f_msks = np.array(_txy)[:,:,:,1].reshape(-1,w_size ,w_size ,1) # F_msks - mask array with ~1% false mask F_msks = np.array(_txy)[:,:,:,2].reshape(-1,w_size ,w_size ,1) fig, axes = plt.subplots(2, 10, figsize=(20, 5)) for k in range(10): kk = np.random.randint(train_num) axes[0,k].set_axis_off() axes[0,k].imshow(f_imgs[kk].squeeze(), cmap="gray", norm=NoNorm()) axes[1,k].set_axis_off() axes[1,k].imshow(f_msks[kk].squeeze(), cmap="gray", norm=NoNorm()) plt.show(block=True) false_num = np.arange(train_num)[i_false>0] fig, axes = plt.subplots(3, 10, figsize=(20, 7)) for k in range(10): kk = np.random.randint(false_num.shape[0]) axes[0,k].set_axis_off() axes[0,k].set_title(false_num[kk]) axes[0,k].imshow(f_imgs[false_num[kk]].squeeze(), cmap="gray", norm=NoNorm()) axes[1,k].set_axis_off() axes[1,k].imshow(f_msks[false_num[kk]].squeeze(), cmap="gray", norm=NoNorm()) axes[2,k].set_axis_off() axes[2,k].imshow(F_msks[false_num[kk]].squeeze(), cmap="gray", norm=NoNorm()) plt.show(block=True) 

рд╣рдо рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЪрд┐рддреНрд░ / рдореБрдЦреМрдЯрд╛ рдЬреЛрдбрд╝реЗ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЕрдиреБрдХреНрд░рдо рдмрдирд╛рддреЗ рд╣реИрдВред рдпрд╛рдиреА рд╣рдо 10,000 рдЬреЛрдбрд╝реЗ рдХреА рдПрдХ рдирдИ, рд╕реНрд╡рддрдВрддреНрд░ рдЕрдиреБрдХреНрд░рдо рдкрд░ рдЬрд╛рдБрдЪ рдХрд░реЗрдВрдЧреЗред рд╣рдо рд╕рдЪреНрдЪреЗ рдФрд░ рдЭреВрдареЗ рдореБрдЦреМрдЯреЗ рдХреЗ рд╕рд╛рде рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдФрд░ рдиреЗрддреНрд░рд╣реАрди рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВред рдКрдкрд░ рдЪрд┐рддреНрд░ рджрд┐рдЦрд╛рдП рдЧрдП рд╣реИрдВред

рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ, 93 рдЭреВрдареЗ рдореБрдЦреМрдЯреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рдереЗ, рдЬрд┐рд╕ рдкрд░ рдПрдХ рдЪрддреБрд░реНрднреБрдЬ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рджреАрд░реНрдШрд╡реГрддреНрдд рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рд╣рдо рд╕рд╣реА рд╕реЗрдЯ рдкрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдорд╛рд╕реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ f_msks рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ

 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 

рдзреЛрдЦрд╛ рдкрддреНрд░ рдХреЗрд╡рд▓ 404 рдЪрд┐рддреНрд░реЛрдВ рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ рдФрд░ рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдкрд░реАрдХреНрд╖рдг рдЕрдиреБрдХреНрд░рдо рдкрд░ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╕рдЯреАрдХрддрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реБрдИред

рдЕрдм рд╣рдо рдПрдХ рд╣реА рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЕрдиреБрдХреНрд░рдо рдкрд░ рдиреЗрдЯрд╡рд░реНрдХ рдФрд░ рдЯреНрд░реЗрди рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдорд╛рд╕реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо F_msks рдХреЛ 1% рдЭреВрдареЗ рдорд╛рд╕реНрдХ рдХреЗ рд╕рд╛рде рдЗрдирдкреБрдЯ рдкрд░ рдЦрд┐рд▓рд╛рддреЗ рд╣реИрдВ

 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 

рд╣рдореЗрдВ 727 рдЪрд┐рддреНрд░реЛрдВ рдХреА рдПрдХ рдзреЛрдЦрд╛ рд╢реАрдЯ рдорд┐рд▓реА, рдЬреЛ рдХрд╛рдлреА рдЕрдзрд┐рдХ рд╣реИ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгрд┐рдпреЛрдВ рдХреА рд╕рдЯреАрдХрддрд╛, рдкрд┐рдЫрд▓реЗ рдкрд░реАрдХреНрд╖рдг рдЕрдиреБрдХреНрд░рдо рдХреА рддрд░рд╣ рд╣реА, 0.98953 рд╕реЗ рдШрдЯрдХрд░ 0.9525 рд╣реЛ рдЧрдИред рд╣рдордиреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдЭреВрда рдХреЛ 1% рд╕реЗ рдХрдо рдЬреЛрдбрд╝рд╛, 10,000 рдорд╛рд╕реНрдХ рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ 93 рдЭреВрдареЗ рдереЗ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо 3.7% рдмрд┐рдЧрдбрд╝ рдЧрдпрд╛ред рдФрд░ рдпрд╣ рд╕рд┐рд░реНрдл рдЭреВрда рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЪрд╛рд▓рд╛рдХ рд╣реИ! рдФрд░ рдЪреАрдЯ рд╢реАрдЯ рдХреЗрд╡рд▓ 404 рд╕реЗ рдмрдврд╝рдХрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 727 рдЪрд┐рддреНрд░реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдЧрдИред

рд╕реБрдЦрджрд╛рдпрдХ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдХреЛ рдкреНрд░рд╕рдиреНрди рдХрд░рдирд╛

 print (len(set(np.arange(train_num)[m2_select>0]).intersection(set(np.arange(train_num)[i_false>0])))) 93 

рдореБрдЭреЗ рдЗрд╕ рд▓рдВрдмреЗ рд╕реВрддреНрд░ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рджреЗрдВ, рд╣рдо рдЭреВрдареА рддрд╕реНрд╡реАрд░реЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдЪреАрдЯ рд╢реАрдЯ рдореЗрдВ рдЪреБрдиреЗ рдЧрдП рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЗ рдЪреМрд░рд╛рд╣реЗ рдХреЛ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдиреЗ рдзреЛрдЦрд╛ рд╢реАрдЯ рдореЗрдВ рд╕рднреА 93 рдЭреВрдареА рддрд╕реНрд╡реАрд░реЛрдВ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ред

рдпрд╣ рдХрд╛рд░реНрдп рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдпрд╣ 10,000 рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ 727 рд╣реИ рдФрд░ рд╕рднреА рдЭреВрда рдпрд╣рд╛рдВ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИрдВред

рд▓реЗрдХрд┐рди рдПрдХ рдФрд░ рднреА рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рдЙрдкрдпреЛрдЧреА рддрд░реАрдХрд╛ рд╣реИред рдЬрдм рд╣рдордиреЗ рдЪреАрдЯ рд╢реАрдЯ рд╕рдВрдХрд▓рд┐рдд рдХреА, рддреЛ рд╣рдордиреЗ рдХреЗрд╡рд▓ рдЙрди рдЪрд┐рддреНрд░ / рдореБрдЦреМрдЯрд╛ рдЬреЛрдбрд╝реЗ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛, рдЬрд┐рдирдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рд╕реАрдорд╛ рд╕реЗ рдХрдо рд╣реИ, рдФрд░ рд╣рдорд╛рд░реЗ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдордиреЗ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рд╕рдЯреАрдХрддрд╛ рдХрд╛ рдорд╛рди v_false рд╕рд░рдгреА рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рд╣реИ ред рдЖрдЗрдП рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЕрдиреБрдХреНрд░рдо рд╕реЗ рдЬреЛрдбрд╝реЗ рдХреЛ рджреЗрдЦреЗрдВ, рдЬрд┐рдирдХрд╛ рдмрд╣реБрдд рдХрдо рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдореВрд▓реНрдп рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 0.1 рд╕реЗ рдХрдо рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдЙрдирдореЗрдВ рдХрд┐рддрдиреЗ рдирд┐рд╣рд┐рдд рд╣реИрдВ

 print (len(set(np.arange(train_num)[v_false<0.01]).intersection(set(np.arange(train_num)[i_false>0])))) 89 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, 93 рдореЗрдВ рд╕реЗ 89 рдЭреВрдареЗ рдореБрдЦреМрдЯреЛрдВ рдХрд╛ рдореБрдЦреНрдп рд╣рд┐рд╕реНрд╕рд╛ рдЗрди рдореБрдЦреМрдЯреЛрдВ рдореЗрдВ рдЧрд┐рд░ рдЧрдпрд╛
 np.arange(train_num)[v_false<0.01].shape (382,) 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рд╣рдо рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ 382 рдорд╛рд╕реНрдХ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ 10,000 рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рд╕реЗ рд╣реИ, рддреЛ рд╣рдо рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрдлрд╝рд╕реЛрд╕ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЭреВрдареЗ рдорд╛рд╕реНрдХ рдХреА рдкрд╣рдЪрд╛рди рдХрд░реЗрдВрдЧреЗ рдФрд░ рдирд╖реНрдЯ рдХрд░реЗрдВрдЧреЗред

рдпрджрд┐ рдзреЛрдЦрд╛ рджреЗрдиреЗ рд╡рд╛рд▓реА рд╢реАрдЯ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рдирд┐рд░реНрдгрдп рдХреЗ рджреМрд░рд╛рди рдЪрд┐рддреНрд░реЛрдВ рдФрд░ рдореБрдЦреМрдЯреЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИ, рддреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХрджрдо рд╕реЗ рд╢реБрд░реВ, рд╕рднреА рдЭреВрдареЗ рдореБрдЦреМрдЯреЗ, рдереЛрдбрд╝рд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдиреЗрдЯрд╡рд░реНрдХ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреЗ рдиреНрдпреВрдирддрдо рд╕реНрддрд░ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╕рд╣реА рдорд╛рд╕реНрдХ рдЗрд╕ рд╕реНрддрд░ рд╕реЗ рдЕрдзрд┐рдХ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рд╣реЛрдЧреА ред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рджреЗрдирд╛


рдпрджрд┐ рдХреБрдЫ рдХрд▓реНрдкрдирд╛рд╢реАрд▓ рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕рдЪреНрдЪрд╛рдИ рд╣рдореЗрд╢рд╛ рдЪрддреБрд╖реНрдХреЛрдгреАрдп рд╣реЛрддреА рд╣реИ, рдФрд░ рдЕрдВрдбрд╛рдХрд╛рд░ рдЭреВрда рдФрд░ рдХреБрдЫ рдЕрдЬреНрдЮрд╛рдд рдЗрдХрд╛рдИ рдиреЗ рд╕рдЪреНрдЪрд╛рдИ рдХреЛ рд╡рд┐рдХреГрдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдиреЗ рд╕рддреНрдп рдХреЛ рдЧреНрд░рд╣рдг рдХрд┐рдпрд╛, рдФрд░ рдЪрддреБрд░реНрднреБрдЬ рдЭреВрдареЗ рд╣реИрдВ, рддреЛ, рдХреГрддреНрд░рд┐рдо рдмреБрджреНрдзрд┐ рдФрд░ рдзреЛрдЦрд╛ рд╢реАрдЯреНрд╕ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рд╛рдХреГрддрд┐рдХ рдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╕реНрдерд╛рдиреАрдп рдкреВрдЫрддрд╛рдЫ рдЬрд▓реНрджреА рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдорд┐рд▓ рдЬрд╛рдПрдЧреАред рдФрд░ рдЭреВрда рдФрд░ рдХрдкрдЯ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд┐рдЯрд╛ рджреЗрддрд╛ рд╣реИред

рдкреАрдПрд╕ рдЕрдВрдбрд╛рдХрд╛рд░, рддреНрд░рд┐рдХреЛрдг, рд╕рд░рд▓ рдмрд╣реБрднреБрдЬ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдПрдЖрдИ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд░реНрдд рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдВрдбрд╛рдХрд╛рд░ рдФрд░ рддреНрд░рд┐рдХреЛрдг рдХреИрд╕реЗ рджрд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕рдбрд╝рдХ рдХреЗ рд╕рднреА рд╕рдВрдХреЗрдд рдирд╣реАрдВ рдорд┐рд▓реЗрдВрдЧреЗ рдФрд░ рдЖрдкрдХрд╛ AI рдЧрд▓рдд рдХрд╛рд░ рдореЗрдВ рдирд┐рдХрд▓ рдЬрд╛рдПрдЧрд╛ред

Source: https://habr.com/ru/post/hi440120/


All Articles