def make_deskew(img): height, width = img.shape[:2] angle = deskew.compute_skew(img[height/4:height*3/4, width/4:width*3/4], is_binary=False) deskewed_image = deskew.deskew(img, angle=angle, is_binary=False) return deskewed_image
def make_deskew(img): height, width = img.shape[:2] angle = deskew.compute_skew(img[height / 4:height * 3 / 4, width / 4:width * 3 / 4], is_binary=False) deskewed_image = deskew.deskew(img, angle=angle, is_binary=False) return deskewed_image
def fit(epochs, network, train, out_nodes, deskew_dat=False, elastic=False): """ Обучение нейросети. :param epochs: количество эпох обучения :param network: экземпляр класса нейронной сети :param train: тренировочныфй датасет :param out_nodes: количество выходных нейронов :param deskew_dat: препроцессинг данных - выравнивание цифр датасета :param elastic: препроцессинг данных - применение упругого искажения, Tuple(alpha, sigma) """ print("Обучение...") for epoch in range(epochs): # перетасовка входных данных shuffle(train) # добавить progressbar pbar = tqdm(train) # перебор всех записей в тренировочном наборе данных for record in pbar: pbar.set_description(f"Эпоха {epoch+1}") # получение списка значний all_values = record.split(',') # масштабирование входных значений _inputs = np.asfarray(all_values[1:]) / 255.0 # преобразовать в матрицу 28х28 _temp = _inputs.reshape((28, 28)) # упругое искажение if elastic: # применить трансформирование _temp_proc = elastic_transform(_temp, elastic[0], elastic[1]) # преобразовать обратно в вектор из 784 занчений _inputs = _temp_proc.flatten() # выравнивание цифр на изображении if deskew_dat: # применить выравнивание _temp_proc = deskew(_temp) # преобразовать обратно в вектор из 784 занчений _inputs = _temp_proc.flatten() """ Перевод значения цветовых кодов из большого диапазона значений 0-255 в меньший диапазон от 0.01 до 1.0. Нижнее знначение диапазона выбрано таким, чтобы избежать проблем с нулевыми входными значениями - они могут искуственно блокировать обновление весов. Для входных сигналов нет необходимости выбирать верхнее значенние диапазона равным 0.99, т.к. нет нужды избегать значений 1.0 для входных сигналов. Лишь выходные сигналы не могут превышать значение 1.0. """ # смещение входных значений inputs = (_inputs * 0.99) + 0.01 # создани целевых выходных знаачений (все равны 0.01, # кроме маркерного занчения, равного 0.99 targets = np.zeros(out_nodes) + 0.01 # all_values[0] - целевое маркерное значение для данной записи targets[int(all_values[0])] = 0.99 network.train(inputs, targets)
def predict(network, test, deskew_dat=False, elastic=False): """ Классификация чисел нейросетью. :param network: экземпляр класса нейронной сети. :param test: тренировочныфй датасет. :param deskew_dat: препроцессинг данных - выравнивание цифр датасета :param elastic: препроцессинг данных - применение упругого искажения, Tuple(alpha, sigma) :return: список из 0 и 1, 0 - неправильно классифицировано, 1 - правильно. """ print("Клсссификация...") time.sleep(1) # журнал оценок работы сети, изначально путой scorecard = [] # перебор всех записей в тестовом наборе данных for record in tqdm(test, desc="Обработка тестовых данных: "): # получение списка значений из записи all_values_test = record.split(',') # правильный ответ - первое значениее correct_label = int(all_values_test[0]) # масштабирование входных значений _inputs = np.asfarray(all_values_test[1:]) / 255.0 # преобразовать в матрицу 28х28 _temp = _inputs.reshape((28, 28)) # упругое искажение if elastic: # применить трансформирование _temp_proc = elastic_transform(_temp, elastic[0], elastic[1]) # преобразовать обратно в вектор из 784 занчений _inputs = _temp_proc.flatten() # выравнивание цифр на изображении if deskew_dat: # применить выравнивание _temp_proc = deskew(_temp) # преобразовать обратно в вектор из 784 занчений _inputs = _temp_proc.flatten() # смещение входных значений inputs = (_inputs * 0.99) + 0.01 # опрос сети outputs = network.query(inputs) # индекс наибольшего значения является маркерным значением label = np.argmax(outputs) # добавление оценки ответа сети к концу списка if (label == correct_label): # добаавлние 1 в случае правильного ответа scorecard.append(1) else: # добаавлние 0 в случае неправильного ответа scorecard.append(0) return scorecard
def remove_border(img): img = deskew.deskew(img, is_binary=True) height, width = img.shape[:2] changed_point = [] for j in range(width): if img[0][j] == 0: changed_point.append((0, j)) img[0][j] = 255 if img[height - 1][j] == 0: changed_point.append((height - 1, j)) img[height - 1][j] = 255 for i in range(1, height - 1): if img[i][0] == 0: changed_point.append((i, 0)) img[i][0] = 255 if img[i][width - 1] == 0: changed_point.append((i, width - 1)) img[i][width - 1] = 255 set_changed_point = set(changed_point) len_changed_point = len(changed_point) counter = 0 index = [(0, 1), (0, -1), (1, 0), (-1, 0)] while counter < len_changed_point: y, x = changed_point[counter] for idx in index: if y + idx[0] >= 0 and y + idx[0] < height and x + idx[1] >= 0 and x + idx[1] < width and \ img[y + idx[0]][x + idx[1]] == 0 and (y + idx[0], x + idx[1]) not in set_changed_point: changed_point.append((y + idx[0], x + idx[1])) set_changed_point.add((y + idx[0], x + idx[1])) len_changed_point += 1 img[y + idx[0]][x + idx[1]] = 255 counter += 1 range_number_color = (0.15, 0.40) img_area = width * height * 255 sum_color = img_area - np.sum(img) if sum_color > range_number_color[ 0] * img_area and sum_color < range_number_color[1] * img_area: return img return None
def remove_border(img): img = deskew.deskew(img, is_binary=True) height, width = img.shape[:2] changed_point = [] for j in range(width): if img[0][j] == 0: changed_point.append((0, j)) img[0][j] = 255 if img[height - 1][j] == 0: changed_point.append((height - 1, j)) img[height - 1][j] = 255 for i in range(1, height - 1): if img[i][0] == 0: changed_point.append((i, 0)) img[i][0] = 255 if img[i][width - 1] == 0: changed_point.append((i, width - 1)) img[i][width - 1] = 255 set_changed_point = set(changed_point) len_changed_point = len(changed_point) counter = 0 index = [(0, 1), (0, -1), (1, 0), (-1, 0)] while counter < len_changed_point: y, x = changed_point[counter] for idx in index: if y + idx[0] >= 0 and y + idx[0] < height and x + idx[1] >= 0 and x + idx[1] < width and \ img[y + idx[0]][x + idx[1]] == 0 and (y + idx[0], x + idx[1]) not in set_changed_point: changed_point.append((y + idx[0], x + idx[1])) set_changed_point.add((y + idx[0], x + idx[1])) len_changed_point += 1 img[y + idx[0]][x + idx[1]] = 255 counter += 1 range_number_color = (0.15, 0.40) img_area = width * height * 255 sum_color = img_area - np.sum(img) if sum_color > range_number_color[0] * img_area and sum_color < range_number_color[1] * img_area: return img return None