Создание приложений глубокого обучения с помощью Raspberry Pi 4b (14) Эскиз линии

малиновый пирог
Создание приложений глубокого обучения с помощью Raspberry Pi 4b (14) Эскиз линии

предисловие

В предыдущей статье мы завершили пару дополнительных приложений ношения маски и снятия маски. В этой статье давайте посмотрим на недавнее видео о Douyin, которое извлекает черновики строк в пакетах. Чтобы освоить его основные принципы, мы использоватьOpenCVЛегко реализовать более быстрое решение.

Извлечение штрихового рисунка Photoshop

Недавно я видел видео на Douyin

Принцип реализации

Чтобы преобразовать изображение в линейный рисунок, вам в основном необходимо выполнить следующие шаги:

  • Преобразование цветного изображения в оттенки серого
  • Отменить изображение в градациях серого
  • сделать размытие по Гауссу
  • Осветление цвета смешивается с оттенками серого

Штриховая графика извлечения OpenCV

Для удобства просмотра эффекта изображения на этот раз мы используемjupyter notebookсделать это.

1. Импортируйте файл библиотеки

import cv2
from matplotlib import pyplot as plt
%matplotlib inline

2. Показать исходное изображение

input_img = cv2.imread("image.jpg")
plt.figure(figsize=(10,7))
plt.imshow(cv2.cvtColor(input_img, cv2.COLOR_BGR2RGB))

3. Преобразование изображения в градациях серого

gray_img = cv2.cvtColor(input_img, cv2.COLOR_BGR2GRAY)
plt.figure(figsize=(10,7))
plt.imshow(cv2.cvtColor(gray_img, cv2.COLOR_BGR2RGB))

4. Инверсия изображения в градациях серого

inv_gray_img = 255 - gray_img
plt.figure(figsize=(10,7))
plt.imshow(cv2.cvtColor(inv_gray_img, cv2.COLOR_BGR2RGB))

5. Размытие по Гауссу

ksize=21
sigma=0
blur_img = cv2.GaussianBlur(inv_gray_img, ksize=(ksize, ksize), sigmaX=sigma, sigmaY=sigma)
plt.figure(figsize=(10,7))
plt.imshow(cv2.cvtColor(blur_img, cv2.COLOR_BGR2RGB))

6. Цвет Додж Фьюжн

sketch_img = cv2.divide(gray_img, 255 - blur_img, scale=256)  # 颜色减淡融合
plt.figure(figsize=(15,10))
plt.imshow(cv2.cvtColor(sketch_img, cv2.COLOR_BGR2RGB))

Несколько строк кода можно сделать.Если хотите сравнить скорость, тоPython+OpenCVникогда не терял. (PSДизайнер не бей меня! )

SketchKeras извлечь штриховую графику

вышеOpenCVХотя метод прост, он все еще недостаточно ясен, чтобы внимательно смотреть на линии на пучке и манжетах, поэтому мы будем использовать метод нейронной сети, чтобы реализовать его снова.

1. Загрузка исходного кода

Клонировать исходный код

git clone https://github.com/lllyasviel/sketchKeras.git

Загрузите файл весовmod.h5, поместите его в каталог проекта

2. Проанализируйте структуру сети

sketchKerasЯвляетсяu-netтип сети, структуру модели автор не публикует, но можно передатьtensorboardиспользуй этоKerasФайл модели для интерпретации ее сетевой структуры.

первыйkerasПревратиться вpbдокумент

python keras_to_tensorflow.py --input_model="mod.h5" --output_model="mod.pb"

тогда вы можете использоватьtensorboardимпортная модель

mkdir logs
python3 tensorboard_graph.py

Граф расчета экспортируется путем создания каталога журналов в рамках проекта.

tensorboard --logdir=logs/ --host=127.0.0.1

Мы видим, что типичныйunetАрхитектура, вход [3 * 512 * 512 * 1] постоянно понижается до [3 * 32 * 32 * 512], а затем снова повышается.

Вы также можете установитьNetron, интерпретировать сеть будет удобнее.

3. Предварительная обработка

Введите исходное изображение, сначалаresizeв 384 * 512 (длина или ширина стороны 512), затем преобразуйте изображение в градациях серого, а затем выполните размытие по Гауссу после вычитания двух и, наконец, нормализуйте его в [3, 512, 512, 1]Tensor, предварительная обработка завершена.

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)

4. Вывод вывода

Как проанализировано выше, на выходе нейронной сети есть [3, 512, 512, 1], который нужно пропорционально обрезать до исходного размера, а затем после шумоподавления получить нужный нам каркас.

# 模型推理 (3, 512, 512, 1)
line_mat = mod.predict(light_map, batch_size=1)
# 去除 batch 维度 (512, 512, 3)
line_mat = line_mat.transpose((3, 1, 2, 0))[0]
# 裁剪 (512, 384, 3)
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')

Идеально!

Совет: если вы столкнулисьload_model requires h5pyЕсли вы получите ошибку, установите егоh5pyВот и все.

sudo apt-get install libhdf5-dev
pip install h5py

можно увидеть, сsketchKerasПреобразованный линейный уклон будет более четким, иsketchKeras_coloredСодержит элементы цвета, которые очень помогут при раскрашивании последующих картинок.

Загрузка исходного кода

Соответствующие документы и материалы по этому вопросу можно найти на официальном аккаунте «Глубокое пробуждение», а справочный ответ: «rpi14», чтобы получить ссылку для скачивания.

Следующее уведомление

Теперь, когда черновая линия извлечена,

Если они будут драться друг с другом,

В следующей статье мы будем использовать линейные рисунки,

чтобы «вернуться» обратно к цветному изображению,

Быть в курсе...