前面我们已经能从Torch中直接读出网络训练好的参数,
这里就用《fast-neural-style-master》的它的十个模型来做一个实用程序吧。
模型分两种:
instance_norm
http://cs.stanford.edu/people/jcjohns/fast-neural-style/models//instance_norm/candy.t7
http://cs.stanford.edu/people/jcjohns/fast-neural-style/models//instance_norm/la_muse.t7
http://cs.stanford.edu/people/jcjohns/fast-neural-style/models//instance_norm/mosaic.t7
http://cs.stanford.edu/people/jcjohns/fast-neural-style/models//instance_norm/feathers.t7
http://cs.stanford.edu/people/jcjohns/fast-neural-style/models//instance_norm/the_scream.t7
http://cs.stanford.edu/people/jcjohns/fast-neural-style/models//instance_norm/udnie.t7
eccv16
http://cs.stanford.edu/people/jcjohns/fast-neural-style/models//eccv16/the_wave.t7
http://cs.stanford.edu/people/jcjohns/fast-neural-style/models//eccv16/starry_night.t7
http://cs.stanford.edu/people/jcjohns/fast-neural-style/models//eccv16/la_muse.t7
http://cs.stanford.edu/people/jcjohns/fast-neural-style/models//eccv16/composition_vii.t7
instance_norm 这种归一化用 :
nn.InstanceNormalization
nn.SpatialBatchNormalization
并且 ,使用维度 3->16->32->64->32->16->3 ,速度稍快一点
eccv16 归一化只用:
nn.SpatialBatchNormalization
使用维度 3->32->64->128->64->32->3,体积稍大一点。
定义基本和前面《fast-neural-style-tensorflow-master》相同,这里就不重复了
这里只讲模型选择部分流程:
1。先在程序文件夹中检测有哪几个t7文件。
2。显示名称
3。按数字1,2--9,0选一种风格
4。运行得到一种风格
选择一种风格:
//在程序目录中找t7模型
//并由使用者选择一个
string loadModelName()
{
const char *torch_model_name[] = {"mosaic.t7","candy.t7","la_muse.t7","the_scream.t7","feathers.t7","udnie.t7",//instance_norm 6个
"the_wave.t7","starry_night.t7","la_muse_eccv16.t7","composition_vii.t7", //eccv16 4个
NULL};
const char *cn_name[] = {"镶嵌玻璃", "糖果","毕加索。缪斯","呐喊","树叶","少女乌迪妮",
"神奈川冲浪里","星空","缪斯-2","组合七", NULL};
// 文件指针
FILE *tf;
int n[10]={0};//指向哪个名称
int num=0;//10中存在几个
for (int i = 0; torch_model_name[i]; i++)
{
//检查文件是否存在
//if(fopen_s(&tf,torch_model_name[i], "rb")==0)
tf= openfile(torch_model_name[i], "rb");//在程序目录或当前目录中打开文件
if(tf!=NULL)
{
n[num++]=i;
fclose(tf);
}
}
//选择模型
for (int i = 0; i<num; i++)
{
cout<<i+1<<":"<<cn_name[n[i]]<<endl;
}
cout<<"请按一个数字,选择转换风格"<<endl;
//捕获按键
int c=_getch();
if (c>47 && c<num+49) //asc码 0-9 48-57
//1->0 2->1 3->2 ... 9->8 0(10)->9 对应
c-=48;
else
c=1;
c--;
if(c<0)c=9;//0对应10
cout<<"使用 "<<cn_name[n[c]]<<" 风格"<<endl;
is_feathers=false;
if(n[c]<6)
{
is_instance_norm=true;
if(n[c]==4)
is_feathers=true;//feathers.t7 比较特殊 单独处理
}
else
{
is_instance_norm=false;
}
return string(torch_model_name[n[c]]);
}
如果你有全部十个t7模型:
如果只有3个会是这样:
1:镶嵌玻璃
2:糖果
3:组合七
请按一个数字,选择转换风格
使用 糖果 风格
正在载入‘风格转换模型’的数据
加载完成
输入图像宽度:224
高度:224
输入层...
第一下采样层...
第二下采样层...
5个残差块... 包括 2 组卷积
4
第一上采样层...
第二上采样层...
输出层...
图像转换成jpg格式...
转换文件已经保存为: 风格转换
已经完成
用时:6.797 秒
请按任意键继续. . .
效果图:
内容图
这里只显示4种,还有其它6种风格的。
下载:
有10种风格的转换程序
win编译的 风格转换(style)的应用程序,有10风格,使用了OpenBLAS加速,详细情况参看博客