OpenCv dnn模块扩展研究--style transfer
Posted jsxyhelu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCv dnn模块扩展研究--style transfer相关的知识,希望对你有一定的参考价值。
一、opencv的示例模型文件
// 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;
}
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:
You can then install Python dependencies into a 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:
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
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:
The full set of options for this script are described here.
以上是关于OpenCv dnn模块扩展研究--style transfer的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV DNN模块——从TensorFlow模型导出到OpenCV部署详解