一行代码实现从彩色图提取素描线稿

  • 一、前言:初识PaddleHub
    • 预训练模型(Pre-Trained Models)
  • 二、构建Module的大框架
    • 1.将模型文件存放在infer_model下
    • 2.创建必要的文件__init__.py
    • 3.创建必要的文件module.py
      • 导入必要的包
      • 填写module的基本信息
      • 实现预测功能
      • 实现命令行调用的接口
  • 三、测试及调用
    • 1.安装并查看Module基本信息
    • 2.通过API的方式调用
    • 3.通过命令行的方式调用——一行代码实现从彩色图提取素描线稿
    • 4.效果展示
      • 原图
      • 线稿图
  • 四、个人介绍

PaddleHub是飞桨预训练模型应用工具,能拿来即用,一键预测。本项目以开发者七年期限的项目——PaddlePaddle之视频转线稿篇为基础,将该模型贡献到PaddleHub的模型库里,并用一行代码实现快速加载。

一、前言:初识PaddleHub

PaddleHub官方Github地址(欢迎star~):
https://github.com/PaddlePaddle/PaddleHub

PaddleHub旨在为开发人员提供丰富,高质量,可直接使用的预训练模型。开发者无需深度学习背景,便可以快速使用PaddleHub内置的AI模型。其模型涵盖图像,文本,音频和视频的4个主要类别,并支持一键式预测,轻松的服务部署和迁移学习,另外,所有模型都是开源的,可以在离线情况下免费下载和使用。

预训练模型(Pre-Trained Models)

预训练模型是一个已经训练好的保存下来的网络。该网络之前已经在一个大型的数据集上进行了训练(如图像相关类的网络在ImageNet数据上进行了训练)

二、构建Module的大框架

PaddleHub Module是使用PaddleHub的基础。其可以通过指定名称即可方便地完成一键加载,如加载预训练模型ERNIE仅需一行代码即可完成,hub.Module(name=‘ernie’),省去了复杂的网络结构代码以及参数加载的繁琐过程。

将模型贡献到PaddleHub的模型库之前,我们必须搭好这一框架。

1.将模型文件存放在infer_model下

# 创建必要的文件夹
!mkdir -p Extract_Line_Draft/assets/infer_model
# 将准备好的模型文件解压
!unzip work/inference_model.zip
# 将模型文件复制到Module指定目录下
!cp -r inference_model/* Extract_Line_Draft/assets/infer_model

2.创建必要的文件__init__.py

init = open("Extract_Line_Draft/__init__.py", "w")

KaTeX parse error: Expected group after '_' at position 1: _̲_init__.py是一个空文件,直接创建即可。

3.创建必要的文件module.py

module = open("Extract_Line_Draft/module.py", "w")

导入必要的包

import argparse
import ast
import os
import math
import six
from pathlib import Pathfrom paddle.fluid.core import PaddleTensor, AnalysisConfig, create_paddle_predictor
from paddlehub.module.module import runnable, serving, moduleinfo
from paddlehub.io.parser import txt_parser
import numpy as np
import paddle.fluid as fluid
import paddlehub as hub
from Extract_Line_Draft.function import *

填写module的基本信息

@moduleinfo(name="Extract_Line_Draft",version="1.0.0",type="cv/segmentation",summary="Import the color picture and generate the line draft of the picture",author="彭兆帅,郑博培",author_email="1084667371@qq.com,2733821739@qq.com")

实现预测功能

class ExtractLineDraft(hub.Module):def _initialize(self):"""Initialize with the necessary elements"""# 加载模型路径self.pretrained_model_path = os.path.join(self.directory, "assets","infer_model")# 模型加载函数def load_model(self, modelpath, use_gpu, use_mkldnn, combined):# 加载模型参数if combined:model = os.path.join(modelpath, "__model__")params = os.path.join(modelpath, "__params__")config = AnalysisConfig(model, params)else:config = AnalysisConfig(modelpath)# 设置参数if use_gpu:   config.enable_use_gpu(100, 0)else:config.disable_gpu()if use_mkldnn:config.enable_mkldnn()config.disable_glog_info()config.switch_ir_optim(True)config.enable_memory_optim()config.switch_use_feed_fetch_ops(False)config.switch_specify_input_names(True)# 通过参数加载模型预测器predictor = create_paddle_predictor(config)# 返回预测器return predictor# 模型预测函数def predict(self, input_datas):outputs = []# 遍历输入数据进行预测for input_data in input_datas:inputs = input_data.copy()self.input_tensor.copy_from_cpu(inputs)self.predictor.zero_copy_run()output = self.output_tensor.copy_to_cpu()outputs.append(output)# 预测结果合并outputs = np.concatenate(outputs, 0)# 返回预测结果return outputsdef ExtractLine(self, image_path, use_gpu=False):"""Get the input and program of the infer modelArgs:image_path(str): Path to the folder containing the input pictureuse_gpu(bool): Weather to use gpu"""for home, dirs, files in os.walk(image_path):for filename in files:fullname = os.path.join(home, filename)from_mat = cv2.imread(fullname)width = float(from_mat.shape[1])height = float(from_mat.shape[0])new_width = 0new_height = 0if (width > height):from_mat = cv2.resize(from_mat, (512, int(512 / width * height)), interpolation=cv2.INTER_AREA)new_width = 512new_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 = 512from_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)light_map = light_map.astype('float32')# 加载模型预测器self.predictor = self.load_model(self.pretrained_model_path, use_gpu, use_mkldnn=True, combined=False)# 获取模型的输入输出self.input_names = self.predictor.get_input_names()self.output_names = self.predictor.get_output_names()self.input_tensor = self.predictor.get_input_tensor(self.input_names[0])self.output_tensor = self.predictor.get_output_tensor(self.output_names[0])line_mat = self.predict(np.expand_dims(light_map, axis=0).astype('float32'))# 去除 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), :]line_mat = np.amax(line_mat, 2)# 保存图片if Path('./output/').exists():show_active_img_and_save_denoise(line_mat, './output/' + filename)else:os.makedirs('./output/')show_active_img_and_save_denoise(line_mat, './output/' + filename)print('图片' + filename + '已经完成')print('全部图片转换成功。')

实现命令行调用的接口

@runnabledef run_cmd(self, argvs):"""Run as a command."""self.parser = argparse.ArgumentParser(description='Run the %s module.' % self.name,prog='hub run %s' % self.name,usage='%(prog)s',add_help=True)self.arg_input_group = self.parser.add_argument_group(title="Input options", description="Input data. Required")self.arg_config_group = self.parser.add_argument_group(title="Config options",description="Run configuration for controlling module behavior, not required.")self.add_module_input_arg()args = self.parser.parse_args(argvs)try:input_data = self.check_input_data(args)except RuntimeError:self.parser.print_help()return Noneuse_gpu = args.use_gpuself.ExtractLine(image_path=input_data, use_gpu=use_gpu)def add_module_input_arg(self):"""Add the command input options"""self.arg_input_group.add_argument('--input_path',type=str,default=None,help="file contain input data")self.arg_input_group.add_argument('--use_gpu', type=str, default=None, help="weather to use gpu")def check_input_data(self, args):input_data = []if args.input_path:if not os.path.exists(args.input_path):raise RuntimeError("Path %s is not exist." % args.input_path)path = "{}".format(args.input_path)# print(path)return path

三、测试及调用

1.安装并查看Module基本信息

# 安装Module
!hub install Extract_Line_Draft
# 查看该Module的基本信息
!hub show Extract_Line_Draft

2.通过API的方式调用

import paddlehub as hubExtract_Line_Draft_test = hub.Module(name="Extract_Line_Draft")test_img_path = "testImage"# execute predict and print the result
t the result
Extract_Line_Draft_test.ExtractLine(test_img_path, use_gpu=True)
[32m[2020-12-08 02:29:43,474] [    INFO] - Installing Extract_Line_Draft module[0m
[32m[2020-12-08 02:29:43,524] [    INFO] - Module Extract_Line_Draft already installed in /home/aistudio/.paddlehub/modules/Extract_Line_Draft[0m图片2.jpg已经完成
图片1.jpg已经完成
图片3.jpg已经完成
全部图片转换成功。

3.通过命令行的方式调用——一行代码实现从彩色图提取素描线稿

!hub run Extract_Line_Draft --input_path "testImage" --use_gpu True
图片2.jpg已经完成
图片1.jpg已经完成
图片3.jpg已经完成
全部图片转换成功。

4.效果展示

原图


线稿图


四、个人介绍

北京联合大学机器人学院自动化专业2018级本科生 郑博培

百度飞桨开发者技术专家 PPDE

深圳柴火创客空间 认证会员

百度大脑 智能对话训练师

来AI Studio互粉吧,等你哦~ https://aistudio.baidu.com/aistudio/personalcenter/thirdview/147378

基于飞桨PaddlePaddle实现素描线稿提取——仅需一行代码即可实现模型调用相关推荐

  1. 基于飞桨paddlepaddle复现StarGAN v2

    基于飞桨paddlepaddle复现StarGAN v2 百度顶会论文复现营 StarGAN v2: Diverse Image Synthesis for Multiple Domains 通过对论 ...

  2. 基于深度学习的多任务人脸属性分析(基于飞桨PaddlePaddle)

    目录 一.概述 1.1 多任务人脸属性分析 1.2 本文任务 二.环境配置 2.1 安装PaddlePaddle 2.2 安装PaddleClas 三.算法模型开发 3.1 算法原理 3.2 数据集准 ...

  3. 基于深度学习的人脸识别闸机开发(基于飞桨PaddlePaddle)

    目录 一.概述 1.1 人脸识别背景 1.2 实现 1.2.1 算法说明 1.2.2 环境设置 1.2.3 实现思路 二.示例脚本 2.1 安装PaddlePaddle和PLSC 2.2 下载人脸检测 ...

  4. 基于飞桨PaddlePaddle的语义角色标注任务全解析

    https://www.toutiao.com/a6706071441667785219/ 2019-06-24 20:22:10 自然语言处理中的自然语言句子级分析技术,可以大致分为词法分析.句法分 ...

  5. 基于飞桨Res-Unet网络实现肝脏肿瘤分割任务

    点击左上方蓝字关注我们 [飞桨开发者说]韩霖,PPDE飞桨开发者技术专家,吉林大学计算机科学与技术学院,主要研究医学影像方向. 项目背景 近年来,快速发展的深度学习技术已经渗透进了各行各业,医疗方面也 ...

  6. 基于飞桨PARL实践PPO算法,让“猎豹”学会奔跑!

    点击左上方蓝字关注我们 [飞桨开发者说]陈懿,西交利物浦大学计算机研一,研究方向为:强化学习在游戏领域的应用. 项目背景 20世纪90年代以来,随着计算机技术和数据量的爆发式增长,算力和神经网络得到了 ...

  7. 基于飞桨PP-PicoDet的钢铁缺陷检测

    基于飞桨PP-PicoDet的钢铁缺陷检测 1.背景介绍 自动检查和缺陷检测系统使用 AI 来检查零部件的故障和缺陷.通过这种方法,制造厂能够自动检测成品表面的缺陷,该方法广泛应用于金属.半导体晶圆和 ...

  8. drawio 绘制手绘素描线稿样式

    最近发现一个十分小清新的画图工具,可用来画业务流程图呀.技术图解呀什么的.就是 drawio 啦.是一款开源的绘制流程图的工具,最香的是可以 网页版使用,支持中文.创建的文件可以导出到各种网盘或者本地 ...

  9. 手把手教你使用Photoshop制作炭笔素描线稿

     这次我们综合利用Photoshop中的蒙版和图层混合模式以及滤镜来制作一个简易的炭笔素描线稿,如果对蒙版或者混合模式不了解的,可以参考博客中的相关教程. 先来看一下最终的效果: 我们的素材图片: ...

最新文章

  1. python 一张图画多条线_Gnuplot.py在一张图上绘制多条线
  2. 链表问题3——删除链表的a/b处的节点(进阶)
  3. 自定义View实现图片的绘制、旋转、缩放
  4. Java解析JSON时,new JSONObject(这儿写json字符串)报错问题
  5. 工程实践规模化推进要点分析
  6. vue打包后不使用服务器直接访问方法
  7. IE9真的支持CSS3和HTML5?
  8. sdut1283Five in a Row, Again
  9. Android学习笔记---28_网络通信之通过HTTP协议实现文件上传,组拼http 的post方法,传输内容
  10. spring-cloud熔断和负载均衡
  11. mysql和hdfs性能对比,Hadoop vs Spark性能对比 -数据库-火龙果软件工程
  12. html 显示接口数据格式化,科技常识:html格式化输出JSON示例(测试接口)
  13. EF 4.3 Code-Based Migrations
  14. php隐藏json数据,PHP调用出json后出来的数目字 想隐藏掉 50份求高手帮忙下
  15. 地图下载器拼接ArcGIS Server瓦片
  16. w7设置双显示器_win7系统设置双显示器多屏幕模式的操作方法
  17. IEEE Access投稿流程经验分享
  18. 看计划排产软件在纺织业的应用
  19. ios 实用求职面试题
  20. 【阿里云2020校招提前批】中间件核心部门疯狂直推中!

热门文章

  1. linux 删除文件夹中所有文件命令行,Linux中使用命令行删除文件夹
  2. 以太坊怎么扫块,Magician-Web3 1.0.5 发布啦,加入了负载均衡 和 重试策略
  3. ipad查看qq邮箱收件服务器,ipad怎么设置qq邮箱以便通过iPad来接收QQ邮箱收到的邮件...
  4. 百度地图开发之自定义大头针
  5. 支付宝整蛊自定义到账语音
  6. 马来西亚的吉梦达乳胶床垫以纯天然的姿势震憾入驻中国
  7. 共识(raft)算法
  8. vs提示对象当前正在其他地方使用
  9. 解开“撞库”案件中的技术谜团
  10. JavaScript仿新浪微博搜索框功能