Извлечение контура Mooncake на основе U-Net

искусственный интеллект алгоритм
Извлечение контура Mooncake на основе U-Net

Я участвую в творческом конкурсе «Праздник середины осени».

Введение в U-Net

Структура сети U-Net показана на рисунке ниже.Это стандартная сеть кодирования-декодирования.Вся сеть выглядит как буква U, поэтому она называется U-Net.Левая половина сети представляет собой путь сокращения (кодирование), а правая половина — путь расширения (декодирование). Кодирование следует типичной сверточной сетевой архитектуре, состоящей из3×33\times 3Повторно применяется свертка (без заполнения), состоящая из Rectified Linear Unit (ReLU) и шага для понижения дискретизации после каждого слоя.22из2×22 \times 2максимальная операция объединения. Каждый шаг декодирования включает в себя повышающую дискретизацию карт признаков, в том числе2×22\times 2свертка (upconvolution), уменьшающая вдвое количество функциональных каналов, одно соединение с соответствующей обрезанной картой признаков при декодировании и два3×33\times 3сверток, за каждой следует ReLU.

image.png

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)

Случайным образом найти изображение лунных пряников в Интернете

image.png

Экспериментальный эффектimage.png

По сравнению с методом без нейронной сети

Традиционный метод выделения набросков линий: преобразование изображения в градациях серого, инвертирование фазы, размытие по Гауссу и, наконец, осветление цвета.Эффект заключается в следующем.Видно, что существует большой разрыв между контурами, извлеченными этим методом и нейросетевой метод...

image.png