一: VGG 介绍与模型结构
VGG 全称是 Visual Geometry Group 属于牛津大学科学工程系, 其发布了一些列以 VGG 开头的卷积网络模型, 可以应用在人脸识别, 图像分类等方面, 分别从 VGG16~VGG19.VGG 研究卷积网络深度的初衷是想搞清楚卷积网络深度是如何影响大规模图像分类与识别的精度和准确率的, 最初是 VGG-16 号称非常深的卷积网络全称为 (GG-Very-Deep-16 CNN),VGG 在加深网络层数同时为了避免参数过多, 在所有层都采用 3x3 的小卷积核, 卷积层步长被设置为 1.VGG 的输入被设置为 224x244 大小的 RGB 图像, 在训练集图像上对所有图像计算 RGB 均值, 然后把图像作为输入传入 VGG 卷积网络, 使用 3x3 或者 1x1 的 filter, 卷积步长被固定 1.VGG 全连接层有 3 层, 根据卷积层 + 全连接层总数目的不同可以从 VGG11 ~ VGG19, 最少的 VGG11 有 8 个卷积层与 3 个全连接层, 最多的 VGG19 有 16 个卷积层 + 3 个全连接层, 此外 VGG 网络并不是在每个卷积层后面跟上一个池化层, 还是总数 5 个池化层, 分布在不同的卷积层之下, 下图是 VGG11 ~GVV19 的结构图:
考虑到整个网络的精简结构显示, ReLU 激活函数并没有被显示在上述结构中. 上述结构中一些说明:
conv 表示卷积层
FC 表示全连接层
conv3 表示卷积层使用 3x3 filters
conv3-64 表示 深度 64
maxpool 表示最大池化
上述 VGG11 ~ VGG19 参数总数列表如下:
在实际处理中还可以对第一个全连接层改为 7x7 的卷积网络, 后面两个全连接层改为 1x1 的卷积网络, 这个整个 VGG 就变成一个全卷积网络 FCN. 在 VGG 网络之前, 卷积神经网络 CNN 很少有突破 10 层的, VGG 在加深 CNN 网络深度方面首先做出了贡献, 但是 VGG 也有自身的局限性, 不能无限制的加深网络, 在网络加深到一定层数之后就会出现训练效果褪化, 梯度消逝或者梯度爆炸等问题, 总的来说 VGG 在刚提出的时候也是风靡一时, 在 ImageNet 竞赛数据集上都取得了不错的效果
在其他类似数据上同样表现不俗:
二: 预训练模型使用 (Caffe)
VGG 本身提供了预训练模型供大家可以自由使用, 预训练的 VGG-16 模型与 VGG-19 模型下载地址可以在这里发现:
http://www.robots.ox.ac.uk/~vgg/research/very_deep/
下载 VGG-16 模型之后使用 OpenCV DNN 模块相关 API, 就可以实现一个图像分类器, 支持 1000 种图像分类, 基于 ImageNet 2014-ILSVRC 数据集训练. 原图:
VGG-16 预测分类结果:
稍微有点尴尬的是, OpenCL 初始化内存不够了, 只能说我的机器不给力:
演示网络加载与图像分类的 OpenCV 程序代码如下:
- Net net = readNetFromCaffe(model_txt_file, model_bin_file);
- if (net.empty()) {
- printf("read caffe model data failure...\n");
- return -1;
- }
- Mat inputBlob = blobFromImage(src, 1.0, Size(w, h), Scalar(104, 117, 123));
- Mat prob;
- for (int i = 0; i < 10; i++) {
- net.setInput(inputBlob, "data");
- prob = net.forward("prob");
- }
- Mat probMat = prob.reshape(1, 1);
- Point classNumber;
- double classProb;
- minMaxLoc(probMat, NULL, &classProb, NULL, &classNumber);
- int classidx = classNumber.x;
- printf("\n current image classification : %s, possible : %.2f", labels.at(classidx).c_str(), classProb);
- putText(src, labels.at(classidx), Point(20, 20), FONT_HERSHEY_SIMPLEX, 1.0, Scalar(0, 0, 255), 2, 8);
- imshow("Image Classification", src);
学习 OpenCV 深度学习视频教程 点击下面:
OpenCV 深度学习模块 -OpenCV 深度神经网络教程
来源: http://blog.51cto.com/gloomyfish/2105427