加载 Caffe 框架模型
在本教程中,你将学习如何使用 opencv_dnn 模块,借助来自 Caffe model zoo 的 GoogLeNet 已训练网络来进行图像分类。
我们将用下图来演示本示例的结果。

我们将使用示例应用程序中的代码片段,可从这里下载。
代码见下方示例
-
首先,下载 GoogLeNet 模型文件: bvlc_googlenet.prototxt 和 bvlc_googlenet.caffemodel
你还需要包含 ILSVRC2012 类别名称的文件: classification_classes_ILSVRC2012.txt。
将这些文件放入本示例程序的工作目录中。
-
使用 .prototxt 和 .caffemodel 文件的路径读取并初始化网络
如果
model或config文件之一的扩展名为.caffemodel或.prototxt,你可以省略framework参数。 这样 cv::dnn::readNet 函数就能自动检测模型的格式。 -
读取输入图像并转换为 GoogleNet 可接受的 blob
cv::VideoCapture 既可以加载图像,也可以加载视频。
我们使用 cv::dnn::blobFromImage 函数,在应用必要的预处理(如缩放和均值减法)之后,将图像转换为一个 4 维 blob(即所谓的 batch),其形状为
1x3x224x224, 其中分别对蓝、绿、红通道减去均值(-104, -117, -123)。 -
将 blob 传入网络
-
执行前向传播 在前向传播过程中,会计算每个网络层的输出,但本示例只需要最后一层的输出。
-
确定最佳类别 我们将网络输出(包含 1000 个 ILSVRC2012 图像类别各自的概率)放入
probblob 中, 并在其中找到具有最大值的元素的索引。该索引对应于图像所属的类别。 -
从命令行运行示例
./example_dnn_classification --model=bvlc_googlenet.caffemodel --config=bvlc_googlenet.prototxt --width=224 --height=224 --classes=classification_classes_ILSVRC2012.txt --input=space_shuttle.jpg --mean="104 117 123"对于我们的图像,得到的预测类别为 space shuttle,置信度超过 99%。