0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于OpenCV的DNN图像风格迁移

科技绿洲 来源:Python实用宝典 作者:Python实用宝典 2023-10-30 10:03 次阅读

图像风格迁移已经属于比较成熟的领域了,现在连实时的风格迁移都不成问题。之前一直想出一篇这样的文章,但无奈于大部分开源项目配置起来非常麻烦,比如 luanfujun/deep-photo-styletransfer 项目,需要安装 CUDA、pytorch、cudnn等等,配置能花一天的时间。

不过最近我发现一个非常好的开源应用项目,那就是基于OpenCV的DNN图像风格迁移。你只需要安装OpenCV就可以使用。

它也有局限性,我们只能用别人训练好的模型进行风格迁移,如果我们要自定义风格,那就必须配置cudn等工具,使用 deep-photo-styletransfer 等项目的方法进行训练。

不过作为初学者,我们只需要体验一下这样的风格迁移算法即可。感兴趣的同学可以再自己深入研究。今天的教程我们拿 fast-neural-style 训练好的模型对下面的图片做一次风格迁移。

1.准备

开始之前,你要确保Pythonpip已经成功安装在电脑上,如果没有,可以访问这篇文章:超详细Python安装指南 进行安装。

**(可选1) **如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

**(可选2) **此外,推荐大家用VSCode编辑器,它有许多的优点:Python 编程的最好搭档—VSCode 详细指南

请选择以下任一种方式输入命令安装依赖

  1. Windows 环境 打开 Cmd (开始-运行-CMD)。
  2. MacOS 环境 打开 Terminal (command+空格输入Terminal)。
  3. 如果你用的是 VSCode编辑器 或 Pycharm,可以直接使用界面下方的Terminal.
pip install python-opencv

2.选择模型

fast-neural-style放出的模型风格一共有9种,我们将一一尝试,其中部分风格如下比如:
3.克隆OpenCV源码

我们直接克隆OpenCV开源项目中关于DNN图像迁移的例子,地址是:
https://github.com/opencv/opencv/blob/3.4.0/samples/dnn/fast_neural_style.py

代码:

import cv2 as cv
import numpy as np
import argparse

parser = argparse.ArgumentParser(
        description='This script is used to run style transfer models from '
                    'https://github.com/jcjohnson/fast-neural-style using OpenCV')
parser.add_argument('--input', help='Path to image or video. Skip to capture frames from camera')
parser.add_argument('--model', help='Path to .t7 model')
parser.add_argument('--width', default=-1, type=int, help='Resize input to specific width.')
parser.add_argument('--height', default=-1, type=int, help='Resize input to specific height.')
parser.add_argument('--median_filter', default=0, type=int, help='Kernel size of postprocessing blurring.')
args = parser.parse_args()

net = cv.dnn.readNetFromTorch(args.model)

if args.input:
    cap = cv.VideoCapture(args.input)
else:
    cap = cv.VideoCapture(0)

cv.namedWindow('Styled image', cv.WINDOW_NORMAL)
while cv.waitKey(1) < 0:
    hasFrame, frame = cap.read()
    if not hasFrame:
        cv.waitKey()
        break

    inWidth = args.width if args.width != -1 else frame.shape[1]
    inHeight = args.height if args.height != -1 else frame.shape[0]
    inp = cv.dnn.blobFromImage(frame, 1.0, (inWidth, inHeight),
                              (103.939, 116.779, 123.68), swapRB=False, crop=False)

    net.setInput(inp)
    out = net.forward()

    out = out.reshape(3, out.shape[2], out.shape[3])
    out[0] += 103.939
    out[1] += 116.779
    out[2] += 123.68
    out /= 255
    out = out.transpose(1, 2, 0)

    t, _ = net.getPerfProfile()
    freq = cv.getTickFrequency() / 1000
    print t / freq, 'ms'

    if args.median_filter:
        out = cv.medianBlur(out, args.median_filter)

    cv.imshow('Styled image', out)

注意,源代码是基于Python2的,所以第46行少了括号,如果你是Python3请注意补上括号。

这份代码可以直接使用, parser 里定义了5个参数,--input输入要迁移的图像宽度和高度, median_filter 是中值滤波器基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值 ,因此理论上数值越大,图像越平滑,输出的结果细节越好(不确定)。

亲自试了一下median_filter对图像的影响,发现改变微乎其微,因此直接为默认值即可。

4.开始迁移

将第二步的代码保存到一个文件中,命名为1.py,在CMD/Terminal中带参数运行脚本,其中input是源图像路径,model是迁移的风格模型文件,如运行:

python 1.py --input 1.jpg --model udnie.t7
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模型
    +关注

    关注

    1

    文章

    2704

    浏览量

    47689
  • 编辑器
    +关注

    关注

    1

    文章

    788

    浏览量

    30196
  • OpenCV
    +关注

    关注

    29

    文章

    611

    浏览量

    40784
  • dnn
    dnn
    +关注

    关注

    0

    文章

    56

    浏览量

    8952
收藏 人收藏

    评论

    相关推荐

    教你如何用OpenCV、Python和深度学习技术对图像和实时视频进行神经风格迁移

    虽然Gatys等人的方法能生成不错的神经风格迁移结果,但是它的速度非常慢。2016年,Johnson等人在Gatys的基础上提出的全新算法速度快了三倍,但同时也存在着缺点,即用户不能随机选择想要应用的风格
    的头像 发表于 08-31 09:47 7416次阅读

    使用全卷积网络模型实现图像分割

    OpenCv-C++-深度神经网络(DNN)模块-使用FCN模型实现图像分割
    发表于 05-28 07:33

    【洞幺邦】基于深度学习的GAN应用风格迁移

    和虚假,最后两者到达动态的平和的时候,生成网络G就可以生成以假乱真的图片了。GAN应用风格迁移:在最一开始那个呐喊的例子中,人类骑行的图像通过组合风格
    发表于 07-01 10:53

    【飞凌嵌入式OKMX8MP-C 开发板试用体验】OpenCV-DNN移植&使用体验(基于YOLOV3模型识别物体)

    OpenCV-DNN摄像头图像实时识别物品的Demo,从网上下载coco.names(物品类名称文件),yolov3.cfg(YOLOV3配置文件),yolov3.weights(YOLOV3模型
    发表于 02-21 00:22

    迁移学习

    、目标检测、行人重识别等任务中的应用,学习图像/视频风格迁移方法,了解风格迁移在实际生活中的应用。七、小样本学习、Transformer等前
    发表于 04-21 15:15

    【飞凌RK3568开发板试用体验】使用OpenCV进行人脸识别

    RK3568四核Arm Cortex-A55 处理器的主板,从厂商的宣传看,其主要市场就是人脸识别等视频和图像应用。今天就使用OpenCV自带的DNN模块进行人脸识别,看看其性能如何。一、Op
    发表于 01-11 22:06

    使用ldquo cv2.dnn.readnet rdquo时,无法从中间表示(IR)读取网络怎么解决

    安装了 opencv-python 无头 和 openvino 封装。 随 Python* 导入 OpenCV* 使用 cv2.dnn.readNet(): cv2.error: Build
    发表于 08-15 07:20

    ​多模态风格迁移——生成更加美丽动人的风格图像

    基于卷积的图像风格迁移主要利用两种方法来对特征进行表示,一种假设全局具有相同分布并用全局特征来表风格,另一种则基于图像片提取
    的头像 发表于 05-01 14:11 4429次阅读

    OpenCV新版本4.5.1发布

    ,以方便再网页中使用,并提供了相关教程。 图像分类   目标检测   风格迁移   语义分割   姿态估计 2. OpenCV.js WASM SIMD 优化 2.0,网页端调用
    的头像 发表于 12-31 09:47 2502次阅读

    边缘环境下DNN应用的计算迁移调度综述

    深度神经网络(Deυ Neural Network,DNN)应用对运行设备的性能要求较高,无法直接在计算资源受限的移动设备上运行。通过计算迁移技术将某些计算复杂的神经网络层迁移到资源丰富的边缘或者
    发表于 05-10 14:01 3次下载

    手把手教你使用LabVIEW OpenCV DNN实现手写数字识别(含源码)

    在LabVIEW中如何使用OpenCV DNN模块实现手写数字识别
    的头像 发表于 03-08 16:10 1030次阅读

    手把手教你使用LabVIEW OpenCV dnn实现图像分类(含源码)

    使用LabVIEW OpenCV dnn实现图像分类
    的头像 发表于 03-09 13:37 749次阅读

    PyTorch教程14.12之神经风格迁移

    电子发烧友网站提供《PyTorch教程14.12之神经风格迁移.pdf》资料免费下载
    发表于 06-05 11:21 0次下载
    PyTorch教程14.12之神经<b class='flag-5'>风格</b><b class='flag-5'>迁移</b>

    PyTorch教程-14.12. 神经风格迁移

    的一个方面。要为照片应用理想的风格,您可能需要尝试多种不同的滤镜组合。这个过程与调整模型的超参数一样复杂。 在本节中,我们将利用 CNN 的分层表示将一幅图像风格自动应用到另一幅图像
    的头像 发表于 06-05 15:44 428次阅读
    PyTorch教程-14.12. 神经<b class='flag-5'>风格</b><b class='flag-5'>迁移</b>

    基于OpenCV DNN实现YOLOv8的模型部署与推理演示

    基于OpenCV DNN实现YOLOv8推理的好处就是一套代码就可以部署在Windows10系统、乌班图系统、Jetson的Jetpack系统
    的头像 发表于 03-01 15:52 441次阅读
    基于<b class='flag-5'>OpenCV</b> <b class='flag-5'>DNN</b>实现YOLOv8的模型部署与推理演示