Skip to content

加载 Caffe 框架模型

在本教程中,你将学习如何使用 opencv_dnn 模块,借助来自 Caffe model zoo 的 GoogLeNet 已训练网络来进行图像分类。

我们将用下图来演示本示例的结果。

space_shuttle.jpg

我们将使用示例应用程序中的代码片段,可从这里下载。

代码见下方示例

  1. 首先,下载 GoogLeNet 模型文件: bvlc_googlenet.prototxt 和 bvlc_googlenet.caffemodel

    你还需要包含 ILSVRC2012 类别名称的文件: classification_classes_ILSVRC2012.txt。

    将这些文件放入本示例程序的工作目录中。

  2. 使用 .prototxt 和 .caffemodel 文件的路径读取并初始化网络

    如果 model 或 config 文件之一的扩展名为 .caffemodel 或 .prototxt,你可以省略 framework 参数。 这样 cv::dnn::readNet 函数就能自动检测模型的格式。

  3. 读取输入图像并转换为 GoogleNet 可接受的 blob

    cv::VideoCapture 既可以加载图像,也可以加载视频。

    我们使用 cv::dnn::blobFromImage 函数,在应用必要的预处理(如缩放和均值减法)之后,将图像转换为一个 4 维 blob(即所谓的 batch),其形状为 1x3x224x224, 其中分别对蓝、绿、红通道减去均值 (-104, -117, -123)。

  4. 将 blob 传入网络

  5. 执行前向传播 在前向传播过程中,会计算每个网络层的输出,但本示例只需要最后一层的输出。

  6. 确定最佳类别 我们将网络输出(包含 1000 个 ILSVRC2012 图像类别各自的概率)放入 prob blob 中, 并在其中找到具有最大值的元素的索引。该索引对应于图像所属的类别。

  7. 从命令行运行示例

./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%。