前言

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

Photoshop 提取线稿

最近刷抖音看见一个视频

实现原理

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

  • 将彩色图转换成灰度图

  • 对灰度图进行求其反

  • 做高斯模糊

  • 颜色减淡融合到灰度图

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

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

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

完美!

✎ Tip

如果遇到 load_model requires h5py 报错的话,安装一下 h5py 即可。

sudo apt-get install libhdf5-dev
pip install h5py

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

源码下载

本期相关文件资料,可在公众号“深度觉醒”,后台回复:“rpi14”,获取下载链接。

既然已经提取了线稿,

那左右互搏的话,

下一篇我们就用线稿图,

来“还原”回彩色图像。

敬请期待...

往期推荐

  • 用树莓派4b构建深度学习应用(人脸修复篇)

  • 用树莓派4b构建深度学习应用(口罩篇)

  • 用树莓派4b构建深度学习应用(ngrok篇)

用树莓派4b构建深度学习应用(十四)素描线稿篇相关推荐

  1. numpy pytorch 接口对应_用树莓派4b构建深度学习应用(四)PyTorch篇

    前言 上回我们安装了OpenCV 4.4,相信对源码编译库文件有了一定的了解,这篇我们进一步在树莓派上编译并安装 Pytorch 的最新版本. PyTorch 1.6 的新特性 PyTorch 1.6 ...

  2. 树莓派 cuda加速_用树莓派4b构建深度学习应用(四)PyTorch篇

    前言 上回我们安装了OpenCV 4.4,相信对源码编译库文件有了一定的了解,这篇我们进一步在树莓派上编译并安装 Pytorch 的最新版本. PyTorch 1.6 的新特性 PyTorch 1.6 ...

  3. 用树莓派4b构建深度学习应用(一)硬件篇

    前言 最近树莓派4b发布了8gb的版本,这么大的内存用在嵌入式设备上,简直是为了深度计算而生,果断入手了一块,遂开启了一轮踩坑之旅. 为了避免重复网上已有的树莓派教程,后续系列文章,我尽量以2020年 ...

  4. 图像 引言 深度学习_用树莓派4b构建深度学习应用(十二)口罩篇

    前言上一篇我们把环境和网络问题都解决了,这一篇在 COVID-19 仍在全世界肆虐的当下,我们尝试用 AI 来做一个有趣的自动戴口罩应用.主要用 OpenCV + CNN 来提取面部关键点坐标,再将口 ...

  5. 花书+吴恩达深度学习(十四)卷积神经网络 CNN 之经典案例(LetNet-5, AlexNet, VGG-16, ResNet, Inception Network)

    目录 0. 前言 1. LeNet-5 2. AlexNet 3. VGG-16 4. ResNet 残差网络 5. Inception Network 如果这篇文章对你有一点小小的帮助,请给个关注, ...

  6. 从零开始用树莓派4B玩深度学习

    作为深度学习方面的初学者,中间经历了很多曲折才得以初窥门径. 留下一些经验文字供后来者参考. 前言 1)学习深度学习-图像识别的目的:智能质检 很简单,作为制造业从业的老人(快5张了,质检方面的管理人 ...

  7. 深度学习(十四)基于CNN的性别、年龄识别

    CNN应用之性别.年龄识别 原文地址:http://blog.csdn.net/hjimce/article/details/49255013 作者:hjimce 一.相关理论 本篇博文主要讲解201 ...

  8. 非监督特征学习与深度学习(十四)--------循环神经网络

    注:本文转载自https://github.com/exacity/simplified-deeplearning/blob/master/%E5%BE%AA%E7%8E%AF%E9%80%92%E5 ...

  9. 动手学深度学习(十四)——权重衰退

    文章目录 1. 如何缓解过拟合? 2. 如何衡量模型的复杂度? 3. 通过限制参数的选择范围来控制模型容量(复杂度) 4. 正则化如何让权重衰退? 5. 可视化地看看正则化是如何利用权重衰退来达到缓解 ...

最新文章

  1. centos 7 yum 安装 python3
  2. 域服务器广播消息,广播,组播和UNIX域套接字
  3. 如何修改influxdb表结构_使用nginx-lua修改influxdb API的返回结构
  4. 递归函数斐波那契数列python_使用Python函数递归实现斐波那契数列时为什么运行速度很慢?...
  5. [js] 如何避免JS浮点运算的精度问题(例:0.1+0.7=0.7999999999999999)
  6. 程序员面试金典 - 面试题 04.04. 检查平衡性(二叉树高度)
  7. 论文浅尝 | 嵌入常识知识的注意力 LSTM 模型用于特定目标的基于侧面的情感分析...
  8. NOI数据结构:主席树
  9. Day7--误差反向传播
  10. 蓝桥杯 基础练习 数列排序
  11. 如何高效检查一个数组中是否包含某个值?
  12. Ubuntu18.04安装微信(可用)
  13. python培训全套免费教程百度云202
  14. 【科普】码农是程序员吗?码农与真正程序员的区别是啥?
  15. Anroid通过设置“自启动管理”让应用被杀死也能收到推送消息
  16. 科学计算机中溢出是指,算术溢出
  17. vs2015启动无法工作,问题事件名称: APPCRASH,故障模块名称: KERNELBASE.dll
  18. Netflix继续开源,更多猴子进入视野
  19. 公司邮箱注册申请流程,好用的邮箱功能开启高效办公
  20. Nestjs中的守卫

热门文章

  1. vscode vue代码没提示 vetur
  2. 不是吧,去酒吧只会摇色子,学会这些,荷尔蒙蹭蹭往上飚
  3. 公会发展计划(GAP)第三季
  4. wps js宏写一个可以批量合并Excel文件表格数据的工具
  5. 百趣生物客户文章丨短链脂肪酸探究益生菌减缓急性和慢性肾脏疾病的发病进程
  6. 分支限界法之单源最短路径
  7. 程序员转战在线教育,听听华安怎么说。
  8. python 实现华安信达论坛自动登录
  9. 丰田最高利润出现日元贬值效果“实力以上部分”不容乐观
  10. Ps操作技巧(快捷键大全)