OpenCv dnn模块扩展研究(1)--style transfer

一、opencv的示例模型文件

使用Torch模型【OpenCV对各种模型兼容并包,起到胶水作用】,

下载地址:

fast_neural_style_eccv16_starry_night.t7

http://cs.stanford.edu/people/jcjohns/fast-neural-style/models/eccv16/starry_night.t7

fast_neural_style_instance_norm_feathers.t7

http://cs.stanford.edu/people/jcjohns/fast-neural-style/models/instance_norm/feathers.t7

二、示例代码

代码流程均较简单:图像转Blob,forward,处理输出结果,显示。【可以说是OpenCV Dnn使用方面的经典入门,对于我们对流程配置、参数理解都有很好帮助】

c++代码如下:

// This script is used to run style transfer models from ‘
// https://github.com/jcjohnson/fast-neural-style using OpenCV
 
#include <opencv2/dnn.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
 
using namespace cv;
using namespace cv::dnn;
using namespace std;
 
 
int main(int argc, char **argv)
{
    string modelBin = "../../data/testdata/dnn/fast_neural_style_instance_norm_feathers.t7";
    string imageFile = "../../data/image/chicago.jpg";
 
    float scale = 1.0;
    cv::Scalar mean { 103.939, 116.779, 123.68 };
    bool swapRB = false;
    bool crop = false;
    bool useOpenCL = false;
 
    Mat img = imread(imageFile);
    if (img.empty()) {
        cout << "Can‘t read image from file: " << imageFile << endl;
        return 2;
    }
 
    // Load model
    Net net = dnn::readNetFromTorch(modelBin);
    if (useOpenCL)
        net.setPreferableTarget(DNN_TARGET_OPENCL);
 
    // Create a 4D blob from a frame.
    Mat inputBlob = blobFromImage(img,scale, img.size(),mean,swapRB,crop);
 
    // forward netword
    net.setInput(inputBlob);
    Mat output = net.forward();
 
    // process output
    Mat(output.size[2], output.size[3], CV_32F, output.ptr<float>(0, 0)) += 103.939;
    Mat(output.size[2], output.size[3], CV_32F, output.ptr<float>(0, 1)) += 116.779;
    Mat(output.size[2], output.size[3], CV_32F, output.ptr<float>(0, 2)) += 123.68;
 
    std::vector<cv::Mat> ress;
    imagesFromBlob(output, ress);
 
    // show res
    Mat res;
    ress[0].convertTo(res, CV_8UC3);
    imshow("reslut", res);
 
    imshow("origin", img);
 
    waitKey();
    return 0;
}

三、演示

fast_neural_style_instance_norm_feathers.t7的演示效果

fast_neural_style_eccv16_starry_night.t7的演示效果:

我认为对简笔画的效果不是太好

通过重新作用于原始图片,我认识到这个模型采用的很可能是局部图片

那么这些模型如何训练出来?这里也给出了很多帮助:

Training new models

To train new style transfer models, first use the scriptscripts/make_style_dataset.py to create an HDF5 file from folders of images.You will then use the script train.lua to actually train models.

Step 1: Prepare a dataset

You first need to install the header files for Python 2.7 and HDF5. On Ubuntuyou should be able to do the following:

sudo apt-get -y install python2.7-dev

sudo apt-get install libhdf5-dev

You can then install Python dependencies into a virtual environment:

virtualenv .env                  # Create the virtual environmentsource .env/bin/activate         # Activate the virtual environment

pip install -r requirements.txt

# Install Python dependencies# Work for a while ...

deactivate

# Exit the virtual environment

With the virtual environment activated, you can use the scriptscripts/make_style_dataset.py to create an HDF5 file from a directory oftraining images and a directory of validation images:

python scripts/make_style_dataset.py \

--train_dir path/to/training/images \

--val_dir path/to/validation/images \

--output_file path/to/output/file.h5

All models in thisrepository were trained using the images from theCOCO dataset.

The preprocessing script has the following flags:

  • --train_dir: Path to a directory of training images.
  • --val_dir: Path to a directory of validation images.
  • --output_file: HDF5 file where output will be written.
  • --height, --width: All images will be resized to this size.
  • --max_images: The maximum number of images to use for trainingand validation; -1 means use all images in the directories.
  • --num_workers: The number of threads to use.

Step 2: Train a model

After creating an HDF5 dataset file, you can use the script train.lua totrain feedforward style transfer models. First you need to download aTorch version of theVGG-16 modelby running the script

bash models/download_vgg16.sh

This will download the file vgg16.t7 (528 MB) to the models directory.

You will also need to installdeepmind/torch-hdf5which gives HDF5 bindings for Torch:

luarocks install https://raw.githubusercontent.com/deepmind/torch-hdf5/master/hdf5-0-0.rockspec

You can then train a model with the script train.lua. For basic usage thecommand will look something like this:

th train.lua \

-h5_file path/to/dataset.h5 \

-style_image path/to/style/image.jpg \

-style_image_size 384 \

-content_weights 1.0 \

-style_weights 5.0 \

-checkpoint_name checkpoint \

-gpu 0

The full set of options for this script are described here.

来源: <https://github.com/jcjohnson/fast-neural-style/blob/master/doc/training.md>

来自为知笔记(Wiz)

原文地址:https://www.cnblogs.com/jsxyhelu/p/10804243.html

时间: 2024-10-07 07:27:45

OpenCv dnn模块扩展研究(1)--style transfer的相关文章

如何使用 Opencv dnn 模块调用 Caffe 预训练模型?

QString modelPrototxt = "D:\\Qt\\qmake\\CaffeModelTest\\caffe\\lenet.prototxt"; QString modelBin = "D:\\Qt\\qmake\\CaffeModelTest\\caffe\\snapshot_iter_10000.caffemodel"; QString imageFile = "D:\\Qt\\qmake\\CaffeModelTest\\caffe\\

基于OpenCV的dnn模块的SSD demo运行

最近项目有个任务,要在windows环境下用VS+OpenCV实现caffe模型的调用,于是在网上找了几个相关的博客跑了几个demo练练手.这些博客写得都很详细,但是有些细节由于版本更新的问题,配置的过程中有些变化,所以自己再发篇博客记录下. 前期的准备工作可以参考这篇博客:基于opencv dnn模块 的caffe模型的调用,关于配置环境,我用的VS2015,CMake是官网的最新版本,OpenCV选的是博客中用的OpenCV3.2.0.其中需要注意的是,运行环境及前期准备过程中, OpenC

图像风格转换(Image style transfer)

图像风格转换是最近新兴起的一种基于深度学习的技术,它的出现一方面是占了卷积神经网络的天时,卷积神经网络所带来的对图像特征的高层特征的抽取使得风格和内容的分离成为了可能.另一方面则可能是作者的灵感,内容的表示是卷积神经网络所擅长,但风格却不是,如何保持内容而转换风格则是本文所要讲述的. 本篇属于论文阅读笔记系列.论文即[1]. 引入 风格转换属于纹理转换问题,纹理转换问题在之前采用的是一些非参方法,通过一些专有的固定的方法来渲染. 传统的方法的问题在于只能提取底层特征而非高层抽象特征.随着CNN的

OpenCV DNN之YOLO实时对象检测

OpenCV DNN之YOLO实时对象检测 OpenCV在3.3.1的版本中开始正式支持Darknet网络框架并且支持YOLO1与YOLO2以及YOLO Tiny网络模型的导入与使用.YOLO是一种比SSD还要快的对象检测网络模型,算法作者在其论文中说FPS是Fast R-CNN的100倍,基于COCO数据集跟SSD网络的各项指标对比 在最新的OpenCV3.4上我也测试了YOLO3,发现不支持,因为YOLO3有个新层类型shortcut,OpenCV3.4的Darknet暂时还不支持.这里首先

DNN模块开发之利器篇:七种武器

我们在进行DNN模块开发时经常需要调用Dotnetnuke.dll中的方法函数,模块开发用到DNN的方法函数会让你的开发更加得心应手,下面我们就来介绍一下. 1) PortalModuleBase 所属命名空间:DotNetNuke.Entities.Modules 这是一个开发DNN模块所必须继承的基类,标志性的基类,在此基类中,你可以得到DNN所为你封装的一些模块基本信息,毋需你多费周折,其中包括当前用户UseID,UserInfo,TabID,ModulePath,ModuleConfig

谈谈图像的style transfer(二)

总说 主要从几个方面来进行说明吧 - 加快transfer的速度 - 让transfer的效果看起来更加visual-pleasing - 其他的一些方面 - 用GAN来做 加快style stransfer 谈谈图像的Style Transfer(一) 这里写了 Neural style以及fast neural style. 在超越fast style transfer--任意风格图和内容图0.1秒出结果已经可以将转换做到实时.这篇的一个主要的问题是耗费的大部分时间是在提取隐藏层的patch

Python程序猿必知会的Django用户模块扩展方法

本文和大家分享的主要是Django用户模块的扩展相关知识,希望可以帮助大家更好的学习Django ,一起来看看吧. Django内置的用户验证系统十分强大.大多数情况下,它可以拿来就用,能帮我们省去很多开发.测试的工作.它能满足大多数的使用情况并且很安全.但是有时候,为满足我们的网络应用需求,需要对它进行一些微调. 一般来说,我们希望更多地存储与用户有关的数据.如果你的网络应用具有社交属性,你可能希望存储用户简介.地理位置以及其他相关的东西. 在此教程里,我将简单呈现扩展Django用户模型的方

Linkit 7688 DUO(五) 接上各种Arduino传感器和模块—扩展篇

Linkit 系列博文: 联发科Linkit 7688 (一) 上手及在Mac下搭建OpenWrt交叉编译环境,C语言编译Hello,World 联发科Linkit 7688 (二)GPIO基本操作与C语言编程 联发科Linkit 7688 DUO(三): 通过 Arduino 控制外设和传感器 Linkit 7688 DUO(四): 接上各种Arduino传感器和模块--基础篇 Linkit 7688 DUO(五) 接上各种Arduino传感器和模块-扩展篇 Linkit 7688 DUO(六

【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十一:PS/2模块⑤ — 扩展鼠标

实验十一:PS/2模块⑤ — 扩展鼠标 当普通鼠标即三键鼠标再也无法满足需求的时候,扩展鼠标即滚轮鼠标就诞生了,然而实验十一的实验目的就是实现滚轮鼠标的驱动.不过,进入整体之前,先让我们来了解一下鼠标的常用命令. 图11.1 命令F3,设置采样频率. 命令F3也是Set Sample Rate,主要是用来设置采集频率.笔者曾经说过,采集频率就是鼠标采集按键状况还有位置状况的间隔时间,默认下是100次/秒.如图11.1所示,FPGA先发送命令数据8’hF3,事后鼠标会反馈8’hFA以示接收成功,余