[Survey] MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

어떤 이야기인가 하면, GoogleNet이나 VGG16을 사용하면 물체 인식의 성능은 좋겠지만, 휴대폰등은 메모리도 계산 속도도 별로 없기 때문에 사용하기 어렵다.
이러한 문제의 해결 방법의 하나로서 계산 시간이나 메모리와 성능의 트레이드 오프를 취할 수 있는 네트워크 MobileNet 1 를 Google이 만든 것 같기 때문에 조사해 보았다고 하는 이야기입니다.

MobileNet이란?



특징


  • 네트워크 크기가 작습니다
  • 학습 시간이 짧습니다
  • 저기 성능이 좋다
  • 입력 데이터의 이미지 크기가 32 이상이면 괜찮습니다
  • 계산량과 성능을 절충하는 하이퍼 파라미터 $\alpha $가 제공됩니다.
  • Keras 2 에서 구현됨
  • Keras는 이미지 크기가 224 또는 192, 160, 128이고 $\alpha $가 1.0 또는 0.75, 0.5, 0.25 인 총 16 패턴의 ImageNet 학습 모델을 제공합니다.

    메커니즘


  • 기존의 컨볼 루션 필터 대신 Depthwise 컨벌루션 필터와 1x1 컨벌루션 필터를 결합하여 계산량을 줄입니다.


  • 종래에는 커널 사이즈 x 커널 사이즈 x 채널 수 (입력)로 컨벌루션 필터를 채널 수 (출력) 분 준비하지만, 컨벌루션을 행한다.
  • MobileNet은 커널 크기 x 커널 크기 x1의 컨볼 루션 필터를 채널 수 (입력)만큼 준비하여 컨벌루션을 수행한다.
  • 다음으로 채널 수 (출력)만큼 1x1x 채널 수 (입력)의 컨벌루션 필터를 준비하여 컨벌루션한다.
  • 이것으로, 종래의 컨벌루션과 유사한 처리를 실현.


  • MobileNets 1

    네트워크 구조



    CIFAR10에서 $\alpha=0.5$로 한 경우의 구조.
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    input_1 (InputLayer)         (None, 32, 32, 3)         0         
    _________________________________________________________________
    conv1 (Conv2D)               (None, 16, 16, 16)        432       
    _________________________________________________________________
    conv1_bn (BatchNormalization (None, 16, 16, 16)        64        
    _________________________________________________________________
    conv1_relu (Activation)      (None, 16, 16, 16)        0         
    _________________________________________________________________
    conv_dw_1 (DepthwiseConv2D)  (None, 16, 16, 16)        144       
    _________________________________________________________________
    conv_dw_1_bn (BatchNormaliza (None, 16, 16, 16)        64        
    _________________________________________________________________
    conv_dw_1_relu (Activation)  (None, 16, 16, 16)        0         
    _________________________________________________________________
    conv_pw_1 (Conv2D)           (None, 16, 16, 32)        512       
    _________________________________________________________________
    conv_pw_1_bn (BatchNormaliza (None, 16, 16, 32)        128       
    _________________________________________________________________
    conv_pw_1_relu (Activation)  (None, 16, 16, 32)        0         
    _________________________________________________________________
    conv_dw_2 (DepthwiseConv2D)  (None, 8, 8, 32)          288       
    _________________________________________________________________
    conv_dw_2_bn (BatchNormaliza (None, 8, 8, 32)          128       
    _________________________________________________________________
    conv_dw_2_relu (Activation)  (None, 8, 8, 32)          0         
    _________________________________________________________________
    conv_pw_2 (Conv2D)           (None, 8, 8, 64)          2048      
    _________________________________________________________________
    conv_pw_2_bn (BatchNormaliza (None, 8, 8, 64)          256       
    _________________________________________________________________
    conv_pw_2_relu (Activation)  (None, 8, 8, 64)          0         
    _________________________________________________________________
    ...
    _________________________________________________________________
    conv_dw_13 (DepthwiseConv2D) (None, 1, 1, 512)         4608      
    _________________________________________________________________
    conv_dw_13_bn (BatchNormaliz (None, 1, 1, 512)         2048      
    _________________________________________________________________
    conv_dw_13_relu (Activation) (None, 1, 1, 512)         0         
    _________________________________________________________________
    conv_pw_13 (Conv2D)          (None, 1, 1, 512)         262144    
    _________________________________________________________________
    conv_pw_13_bn (BatchNormaliz (None, 1, 1, 512)         2048      
    _________________________________________________________________
    conv_pw_13_relu (Activation) (None, 1, 1, 512)         0         
    _________________________________________________________________
    global_average_pooling2d_1 ( (None, 512)               0         
    _________________________________________________________________
    reshape_1 (Reshape)          (None, 1, 1, 512)         0         
    _________________________________________________________________
    dropout (Dropout)            (None, 1, 1, 512)         0         
    _________________________________________________________________
    conv_preds (Conv2D)          (None, 1, 1, 10)          5130      
    _________________________________________________________________
    act_softmax (Activation)     (None, 1, 1, 10)          0         
    _________________________________________________________________
    reshape_2 (Reshape)          (None, 10)                0         
    =================================================================
    Total params: 834,666
    Trainable params: 823,722
    Non-trainable params: 10,944
    _________________________________________________________________
    
    

    검증 환경


  • Keras 2.0.6

  • 샘플 코드


  • $\alpha=1.0$에서 val_acc=87%
  • $\alpha=0.5$에서 val_acc=81%
    그런 곳이었습니다.
  • import keras
    from keras.datasets import cifar10
    from keras.preprocessing.image import ImageDataGenerator
    from keras.applications import MobileNet
    
    batch_size = 32
    classes = 10
    epochs = 200
    
    (X_train, y_train), (X_test, y_test) = cifar10.load_data()
    Y_train = keras.utils.to_categorical(y_train, classes)
    Y_test = keras.utils.to_categorical(y_test, classes)
    
    img_input = keras.layers.Input(shape=(32, 32, 3))
    model = MobileNet(input_tensor=img_input, alpha=0.5, weights=None, classes=classes)
    model.compile(loss='categorical_crossentropy', optimizer="nadam", metrics=['accuracy'])
    X_train = X_train.astype('float32') / 255
    X_test = X_test.astype('float32') / 255
    
    datagen = ImageDataGenerator(
        featurewise_center=False,  # set input mean to 0 over the dataset
        samplewise_center=False,  # set each sample mean to 0
        featurewise_std_normalization=False,  # divide inputs by std of the dataset
        samplewise_std_normalization=False,  # divide each input by its std
        zca_whitening=False,  # apply ZCA whitening
        rotation_range=0,  # randomly rotate images in the range (degrees, 0 to 180)
        width_shift_range=0.1,  # randomly shift images horizontally (fraction of total width)
        height_shift_range=0.1,  # randomly shift images vertically (fraction of total height)
        horizontal_flip=True,  # randomly flip images
        vertical_flip=False)  # randomly flip images
    datagen.fit(X_train)
    model.fit_generator(datagen.flow(X_train, Y_train, batch_size=batch_size),
                        steps_per_epoch=X_train.shape[0] // batch_size,
                        epochs=epochs,
                        validation_data=(X_test, Y_test))
    

    주의사항


  • 현재는 Backend를 TensorFlow로 설정해야합니다.
  • 인수에 input_shape도 있지만 코드를 보는 한, 224나 192, 160, 128이 아니면 움직이지 않기 때문에, 온순하게 input_tensor를 사용하는 편이 좋을 것 같다.

  • ImageNet의 실험 결과


    ----------------------------------------------------------------------------
    Width Multiplier (alpha) | ImageNet Acc |  Multiply-Adds (M) |  Params (M)
    ----------------------------------------------------------------------------
    |   1.0 MobileNet-224    |    70.6 %     |        529        |     4.2     |
    |   0.75 MobileNet-224   |    68.4 %     |        325        |     2.6     |
    |   0.50 MobileNet-224   |    63.7 %     |        149        |     1.3     |
    |   0.25 MobileNet-224   |    50.6 %     |        41         |     0.5     |
    ----------------------------------------------------------------------------
    
  • $\alpha$를 작게 함으로써, 현격하게 파라미터를 떨어뜨리는 것이 가능하다.
  • ------------------------------------------------------------------------
          Resolution      | ImageNet Acc | Multiply-Adds (M) | Params (M)
    ------------------------------------------------------------------------
    |  1.0 MobileNet-224  |    70.6 %    |        529        |     4.2     |
    |  1.0 MobileNet-192  |    69.1 %    |        529        |     4.2     |
    |  1.0 MobileNet-160  |    67.2 %    |        529        |     4.2     |
    |  1.0 MobileNet-128  |    64.4 %    |        529        |     4.2     |
    ------------------------------------------------------------------------
    
  • 이미지 크기가 변경 되더라도 매개 변수 수는 변경되지 않습니다.

  • 요약


  • MobileNet은 성능과 계산량을 절충할 수 있는 네트워크입니다.

  • References





    Howard et al., MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications , 2017. 

    Chollet, Keras , 2015. 

    좋은 웹페이지 즐겨찾기