Computer vision 无完全连接层的卷积神经网络分类器

Computer vision 无完全连接层的卷积神经网络分类器,computer-vision,deep-learning,caffe,convolution,object-detection,Computer Vision,Deep Learning,Caffe,Convolution,Object Detection,我正在进行一个项目,检测以下类别{汽车、卡车、公共汽车},然后提取相应的车牌 这个问题是关于检测各个类的。我使用了传统的方法,我使用了线性支持向量机的HOG特征,它可以工作,但精度较低。我正试图调查CNN的深度学习检测,它显示了更高的准确性。像这样的文件是非常显示,我完全理解它的工作原理 最近,该模型显示了一个非常快速的检测,这是非常有趣的。如果我猜对了的话,那么约洛大致上和他相似 通常,YOLO有24个卷积层和2个完全连接层。实现了一个基于本文的检测网。我感到困惑的是,NVIDIA的Detec

我正在进行一个项目,检测以下类别{汽车、卡车、公共汽车},然后提取相应的车牌

这个问题是关于检测各个类的。我使用了传统的方法,我使用了线性支持向量机的HOG特征,它可以工作,但精度较低。我正试图调查CNN的深度学习检测,它显示了更高的准确性。像这样的文件是非常显示,我完全理解它的工作原理

最近,该模型显示了一个非常快速的检测,这是非常有趣的。如果我猜对了的话,那么约洛大致上和他相似

通常,YOLO有24个卷积层和2个完全连接层。实现了一个基于本文的检测网。我感到困惑的是,NVIDIA的DetectNet没有任何完全连接的层()。相反,最后一个卷积层的输出通过一个降维卷积层,我认为这会输出一个对象的可信度

问题1

但我不明白卷积层是如何取代FC层并学会预测对象的?对此的详细解释将非常有帮助

问:你能在一张完全连接的图层上进行卷积分类吗 答案很简单:是的。我们不需要在tensorflow或keras中使用致密层。但是这到底是什么意思?这有多重要?让我们看一些使用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))
它将根据此结果在1个历元后对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
准确度不是很高,但肯定远远高于随机性。我们可以从模型定义中看到,没有使用一个完全连接的层(tf.keras.layers.Dense)

但是,层
conv2d_4
conv2d(filters=32,kernel_size=4,
层有效地执行了与
flatte()
紧跟其后的
Dense(32,…)
相同的操作

然后
conv2d_5
conv2d(filters=10,kernel_size=1,…
有效地执行与
Dense(10,…)相同的操作
可以。关键区别在于,在上述模型中,这些操作使用卷积框架。它看起来很酷,但当内核大小与整个高度x宽度相同时,其计算与完全连接的层相同


从技术上讲,答案是没有使用密集层。本着承认底层计算的精神,是的,最终层的行为与完全连接的层类似。

detectnet确实使用FCN,请参见
https://devblogs.nvidia.com/parallelforall/detectnet-deep-neural-network-object-detection-digits/
车队之间的唯一区别内核空间大小
1x1
的抽象层和FC层是前者的权重是通道共享的,而后者的权重根本不共享。