unet知乎_用树莓派4b构建深度学习应用(十四)素描线稿篇

本文介绍了如何使用树莓派4B进行深度学习应用,具体聚焦于图像处理,通过OpenCV和sketchKeras实现素描线稿的提取。首先,文章讲述了从Photoshop中提取线稿的传统方法,然后详细解析了利用OpenCV进行线稿提取的步骤,包括灰度图转换、反色、高斯模糊和颜色减淡。接着,通过sketchKeras运用神经网络方法,提升线稿清晰度。最后,提供了源码下载链接,并预告了下一篇文章的内容。
摘要由CSDN通过智能技术生成

168d5f30083506c5c7c23bbe3420463e.png

前言

上一篇我们完成了一对戴口罩和脱面罩的互补应用,这一篇来看一下最近抖音上看到一个批量提取线稿的视频,掌握其核心原理,我们用 OpenCV 就很容易实现一个更快速的方案。

Photoshop 提取线稿

最近刷抖音看见一个视频

知乎视频​www.zhihu.com

实现原理

要将一张图片转为线稿图,基本要经历以下几个步骤:

  • 将彩色图转换成灰度图
  • 对灰度图进行求其反
  • 做高斯模糊
  • 颜色减淡融合到灰度图

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))

22d2334644a834c5fb91f5eb5fa981db.png

3. 转灰度图

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

0cff09dee60aa45aa5339aed50ac196e.png

4. 灰度图反色

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

0edc0aad7d087ec30ec4d02a6558e7bb.png

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))

d4da7ed3d031de958937a2575af39e29.png

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))

9961df280f0d0f19ab5e8df4ad6d2add.png

几行代码就搞定了,要比速度的话,那 Python+OpenCV 就没有输过。( PS 的设计师别打我!)

sketchKeras 提取线稿

上面 OpenCV 的方法虽然简单,但仔细看发髻和袖口处的线条还是不够清晰,那么我们用神经网络的方式再来实现一下。

1. 源码下载

克隆源码

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

下载权重文件 mod.h5,放到项目目录下

403838ae4d671ab00f3bfec6ece049ac.png

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

项目下生成 logs 目录就导出了计算图

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

我们可以看到就是一个典型的 unet 架构,输入 [3 * 512 * 512 * 1] 不停的下采样到 [3 * 32 * 32 * 512],然后再上采样回来的过程。

3447b8906480523dc5aa4cf6c8b890ad.png

也可以安装一个 Netron,解读网络会更方便些。

78f8aaf2a0c4e407b6f2a2214ab13e2c.png

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)

88939615a2bf45b4a6fa17e4bc7e212e.png

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')

9cbc785997e850f66f4b5da1d2de81a6.png

完美!

Tip: 如果遇到 load_model requires h5py 报错的话,安装一下 h5py 即可。 sudo apt-get install libhdf5-dev pip install h5py

ea11b0c39cfe857f89b6ede074a91e17.png

可以看到,用 sketchKeras 转换的线稿笔顺会更清晰些,而 sketchKeras_colored 包含了颜色的要素,这对后续图片上色会有很大帮助。

源码下载

34b00587dc43cd683ae71cc4dd2b7492.png

下一篇预告

既然已经提取了线稿,
那左右互搏的话,
下一篇我们就用线稿图,
来“还原”回彩色图像,
敬请期待...

98b6fa326f7958cf979130ebcbadccea.gif
欢迎扫码关注,更多分享
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值