kcc*_*c__ 5 object-detection convolution computer-vision deep-learning caffe
我正在开展一个项目来检测以下类别{汽车、卡车、公共汽车},然后提取相应的车牌。
这个问题是关于各个类别的检测。我使用了传统方法,其中我将 HOG 特征与线性 SVM 结合使用,但它的准确性较低。我正在尝试研究 CNN 以进行基于深度学习的检测,该检测已显示出更高的准确性。像R-CNN这样的论文非常有表现力,我完全理解它是如何工作的。
最近YOLO模型显示出非常快速的检测,这非常有趣。如果我猜对了,那么 YOLO 大致类似于DPM。
一般YOLO有24个卷积层和2个全连接层。NVIDIA DIGITS基于这篇 YOLO 论文实现了一个 DetectNet。我感到困惑的是 NVIDIA 的 DetectNet 没有任何全连接层(Caffe 模型文件)。相反,最后一个卷积层的输出通过一个降维卷积层,我认为它输出了对拥有对象的一些信心。
问题 1
但我不明白一个卷积层如何取代 FC-Layers 并学习预测对象?对此的详细解释将非常有帮助。
简单的回答:是的。我们不需要使用tensorflow或keras中的Dense层。但是……这到底是什么意思?这有多重要?让我们看一些使用 Denise 层进行 MNIST 分类的代码
import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import Conv2D, MaxPool2D, InputLayer, Reshape
# get some image data for classification
(xtrain,ytrain),(xtest,ytest) = tf.keras.datasets.mnist.load_data()
xtrain = np.reshape(xtrain,[-1,28,28,1]) / 255.0
ytrain = np.eye(10)[ytrain]
xtest = np.reshape(xtest,[-1,28,28,1]) / 255.0
ytest = np.eye(10)[ytest]
# make a convolution model with any dense or fully connected layers
model = tf.keras.models.Sequential([
InputLayer([28,28,1]),
Conv2D(filters=16, kernel_size=3, activation='tanh', padding='valid', kernel_initializer='he_normal'),
Conv2D(filters=16, kernel_size=3, activation='tanh', padding='valid', kernel_initializer='he_normal'),
MaxPool2D(pool_size=2),
Conv2D(filters=24, kernel_size=3, activation='tanh', padding='valid', kernel_initializer='he_normal'),
Conv2D(filters=24, kernel_size=3, activation='tanh', padding='valid', kernel_initializer='he_normal'),
MaxPool2D(pool_size=2),
Conv2D(filters=32, kernel_size=4, activation='tanh', padding='valid', kernel_initializer='he_normal'),
Conv2D(filters=10, kernel_size=1, activation='softmax', padding='valid', kernel_initializer='he_normal'),
Reshape([10])
])
model.summary()
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
_ = model.fit(x=xtrain,y=ytrain, validation_data=(xtest,ytest))
Run Code Online (Sandbox Code Playgroud)
1 个 epoch 后,它将使用此结果对 MNIST 进行分类
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 26, 26, 16) 160
_________________________________________________________________
conv2d_1 (Conv2D) (None, 24, 24, 16) 2320
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 12, 12, 16) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 10, 10, 24) 3480
_________________________________________________________________
conv2d_3 (Conv2D) (None, 8, 8, 24) 5208
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 4, 4, 24) 0
_________________________________________________________________
conv2d_4 (Conv2D) (None, 1, 1, 32) 12320
_________________________________________________________________
conv2d_5 (Conv2D) (None, 1, 1, 10) 330
_________________________________________________________________
reshape (Reshape) (None, 10) 0
=================================================================
Total params: 23,818
Trainable params: 23,818
Non-trainable params: 0
_________________________________________________________________
60000/60000 [==============================] - 28s 467us/sample - loss: 0.1709 - acc: 0.9543 - val_loss: 0.0553 - val_acc: 0.9838
Run Code Online (Sandbox Code Playgroud)
准确度不是很高,但肯定远高于随机。从模型定义中我们可以看到,没有使用单个全连接层(tf.keras.layers.Dense)。
但是,conv2d_4该层实际上正在执行与后面的Conv2D(filters=32, kernel_size=4, ...操作相同的操作。Flatten()Dense(32, ...)
然后,conv2d_5它Conv2D(filters=10, kernel_size=1, ...实际上正在执行与将要执行的操作相同的操作Dense(10, ...)。主要区别在于,在上述模型中,这些操作使用卷积框架。它看起来很酷,但在幕后,当 kernel_size 与整个高度 x 宽度相同时,其计算与全连接层相同。
从技术上讲,答案是,没有使用致密层。本着承认底层计算的精神,是的,最终层的行为就像完全连接的层。