Я участвую в творческом конкурсе «Праздник середины осени».
Введение в U-Net
Структура сети U-Net показана на рисунке ниже.Это стандартная сеть кодирования-декодирования.Вся сеть выглядит как буква U, поэтому она называется U-Net.Левая половина сети представляет собой путь сокращения (кодирование), а правая половина — путь расширения (декодирование). Кодирование следует типичной сверточной сетевой архитектуре, состоящей изПовторно применяется свертка (без заполнения), состоящая из Rectified Linear Unit (ReLU) и шага для понижения дискретизации после каждого слоя.измаксимальная операция объединения. Каждый шаг декодирования включает в себя повышающую дискретизацию карт признаков, в том числесвертка (upconvolution), уменьшающая вдвое количество функциональных каналов, одно соединение с соответствующей обрезанной картой признаков при декодировании и двасверток, за каждой следует ReLU.
sketchKeras
sketchKeras — это проект извлечения контуров на основе U-Net с открытым исходным кодом,ссылка на проект, недостатком является то, что автор не раскрывает структуру модели и алгоритм обучения, но некоторые методы могут быть использованы для анализа предоставленныхmod.h5
Сделайте вывод о приблизительной структуре его сети.
Проанализируйте его исходный код, в том числе:
Предварительная обработка входного изображения
width = float(from_mat.shape[1])
height = float(from_mat.shape[0])
new_width = 0
new_height = 0
if (width > height):
from_mat = cv2.resize(from_mat, (512, int(512 / width * height)), interpolation=cv2.INTER_AREA)
new_width = 512
new_height = int(512 / width * height)
else:
from_mat = cv2.resize(from_mat, (int(512 / height * width), 512), interpolation=cv2.INTER_AREA)
new_width = int(512 / height * width)
new_height = 512
cv2.imshow('raw', from_mat)
cv2.imwrite('raw.jpg',from_mat)
from_mat = from_mat.transpose((2, 0, 1))
light_map = np.zeros(from_mat.shape, dtype=np.float)
for channel in range(3):
light_map[channel] = get_light_map_single(from_mat[channel])
light_map = normalize_pic(light_map)
light_map = resize_img_512_3d(light_map)
Обработка модели
line_mat = mod.predict(light_map, batch_size=1)
обрезать
line_mat = line_mat.transpose((3, 1, 2, 0))[0]
line_mat = line_mat[0:int(new_height), 0:int(new_width), :]
show_active_img_and_save('sketchKeras_colored', line_mat, 'sketchKeras_colored.jpg')
line_mat = np.amax(line_mat, 2)
Шумоподавление и вывод изображения
show_active_img_and_save_denoise_filter2('sketchKeras_enhanced', line_mat, 'sketchKeras_enhanced.jpg')
show_active_img_and_save_denoise_filter('sketchKeras_pured', line_mat, 'sketchKeras_pured.jpg')
show_active_img_and_save_denoise('sketchKeras', line_mat, 'sketchKeras.jpg')
cv2.waitKey(0)
Случайным образом найти изображение лунных пряников в Интернете
Экспериментальный эффект
По сравнению с методом без нейронной сети
Традиционный метод выделения набросков линий: преобразование изображения в градациях серого, инвертирование фазы, размытие по Гауссу и, наконец, осветление цвета.Эффект заключается в следующем.Видно, что существует большой разрыв между контурами, извлеченными этим методом и нейросетевой метод...