OpenCV4.0 DNN-googleNet
OpenCV 4.0最近发布,其中一大亮点便是加入DNN;之前的文章中介绍了OpenCV 4.0的编译,本系列就通过GoogleNet的demo来窥探OpenCV 4.0的DNN。
核心函数介绍
首先需要准备GoogleNet的prototxt,caffemodel,和synset_words.txt;这个在网上很容易下载到。然后就是需要一张RGB或者BGR的测试图片,本文使用的是官方提供的经典图片space_shuttle.jpg。
我们使用的函数非常简单,主要涉及函数有以下几个:
- readNetFromCaffe
- blobFromImage
- setInput
- forward
blobFormImage
函数原型
Mat cv::dnn::blobFromImage(
InputArray image,
double scalefactor = 1.0,
const Size & size = Size(),
const Scalar & mean = Scalar(),
bool swapRB = false,
bool crop = false,
int ddepth = CV_32F )
以上是官方给出的函数原型。
- image:输入图像
- scalefactor: multiplier for image values.
- size:指的不是输入图像的尺寸,是指所需要的尺寸,也就是返回的Mat中数据的尺寸。
- swapRB:是否交换R和B分量,这在之前的色彩空间转换的文章中介绍过
- crop:输入图像大小与size不符的时候,是否需要裁剪
- ddepth:图像的数据类型,目前仅支持32F和8U
以上的参数都很好理解,接下来是关于mean参数,如果之前没有深入研究过深度学习,这个还是不太好理解的。首先给出mean的数值:(104 117 123);数字从什么地方来的呢?这个是在googleNet训练的时候设定的,节选部分train_val.prototxt,可以看到在训练的时候transform_param中设置了mean。
name: "GoogleNet"
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
mirror: true
crop_size: 224
mean_value: 104
mean_value: 117
mean_value: 123
}
data_param {
so