Advertisement
LovelessIsma

facenet_keras.py

Aug 30th, 2019
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 12.67 KB | None | 0 0
  1. from keras.models import Sequential
  2. from keras.layers import Conv2D, ZeroPadding2D, Activation, Input, concatenate
  3. from keras.models import Model
  4. from keras.layers.normalization import BatchNormalization
  5. from keras.layers.pooling import MaxPooling2D, AveragePooling2D
  6. from keras.layers.merge import Concatenate
  7. from keras.layers.core import Lambda, Flatten, Dense
  8. from keras.engine.topology import Layer
  9. from keras import backend as K
  10. import cv2
  11. import os
  12. import numpy as np
  13. from numpy import genfromtxt
  14. import pandas as pd
  15. import tensorflow as tf
  16. from utils import LRN2D
  17. import utils
  18.  
  19. def facenet():
  20.     myInput = Input(shape=(96, 96, 3))
  21.  
  22.     x = ZeroPadding2D(padding=(3, 3), input_shape=(96, 96, 3))(myInput)
  23.     x = Conv2D(64, (7, 7), strides=(2, 2), name='conv1')(x)
  24.     x = BatchNormalization(axis=3, epsilon=0.00001, name='bn1')(x)
  25.     x = Activation('relu')(x)
  26.     x = ZeroPadding2D(padding=(1, 1))(x)
  27.     x = MaxPooling2D(pool_size=3, strides=2)(x)
  28.     x = Lambda(LRN2D, name='lrn_1')(x)
  29.     x = Conv2D(64, (1, 1), name='conv2')(x)
  30.     x = BatchNormalization(axis=3, epsilon=0.00001, name='bn2')(x)
  31.     x = Activation('relu')(x)
  32.     x = ZeroPadding2D(padding=(1, 1))(x)
  33.     x = Conv2D(192, (3, 3), name='conv3')(x)
  34.     x = BatchNormalization(axis=3, epsilon=0.00001, name='bn3')(x)
  35.     x = Activation('relu')(x)
  36.     x = Lambda(LRN2D, name='lrn_2')(x)
  37.     x = ZeroPadding2D(padding=(1, 1))(x)
  38.     x = MaxPooling2D(pool_size=3, strides=2)(x)
  39.  
  40.     # Inception3a
  41.     inception_3a_3x3 = Conv2D(96, (1, 1), name='inception_3a_3x3_conv1')(x)
  42.     inception_3a_3x3 = BatchNormalization(axis=3, epsilon=0.00001, name='inception_3a_3x3_bn1')(inception_3a_3x3)
  43.     inception_3a_3x3 = Activation('relu')(inception_3a_3x3)
  44.     inception_3a_3x3 = ZeroPadding2D(padding=(1, 1))(inception_3a_3x3)
  45.     inception_3a_3x3 = Conv2D(128, (3, 3), name='inception_3a_3x3_conv2')(inception_3a_3x3)
  46.     inception_3a_3x3 = BatchNormalization(axis=3, epsilon=0.00001, name='inception_3a_3x3_bn2')(inception_3a_3x3)
  47.     inception_3a_3x3 = Activation('relu')(inception_3a_3x3)
  48.  
  49.     inception_3a_5x5 = Conv2D(16, (1, 1), name='inception_3a_5x5_conv1')(x)
  50.     inception_3a_5x5 = BatchNormalization(axis=3, epsilon=0.00001, name='inception_3a_5x5_bn1')(inception_3a_5x5)
  51.     inception_3a_5x5 = Activation('relu')(inception_3a_5x5)
  52.     inception_3a_5x5 = ZeroPadding2D(padding=(2, 2))(inception_3a_5x5)
  53.     inception_3a_5x5 = Conv2D(32, (5, 5), name='inception_3a_5x5_conv2')(inception_3a_5x5)
  54.     inception_3a_5x5 = BatchNormalization(axis=3, epsilon=0.00001, name='inception_3a_5x5_bn2')(inception_3a_5x5)
  55.     inception_3a_5x5 = Activation('relu')(inception_3a_5x5)
  56.  
  57.     inception_3a_pool = MaxPooling2D(pool_size=3, strides=2)(x)
  58.     inception_3a_pool = Conv2D(32, (1, 1), name='inception_3a_pool_conv')(inception_3a_pool)
  59.     inception_3a_pool = BatchNormalization(axis=3, epsilon=0.00001, name='inception_3a_pool_bn')(inception_3a_pool)
  60.     inception_3a_pool = Activation('relu')(inception_3a_pool)
  61.     inception_3a_pool = ZeroPadding2D(padding=((3, 4), (3, 4)))(inception_3a_pool)
  62.  
  63.     inception_3a_1x1 = Conv2D(64, (1, 1), name='inception_3a_1x1_conv')(x)
  64.     inception_3a_1x1 = BatchNormalization(axis=3, epsilon=0.00001, name='inception_3a_1x1_bn')(inception_3a_1x1)
  65.     inception_3a_1x1 = Activation('relu')(inception_3a_1x1)
  66.  
  67.     inception_3a = concatenate([inception_3a_3x3, inception_3a_5x5, inception_3a_pool, inception_3a_1x1], axis=3)
  68.  
  69.     # Inception3b
  70.     inception_3b_3x3 = Conv2D(96, (1, 1), name='inception_3b_3x3_conv1')(inception_3a)
  71.     inception_3b_3x3 = BatchNormalization(axis=3, epsilon=0.00001, name='inception_3b_3x3_bn1')(inception_3b_3x3)
  72.     inception_3b_3x3 = Activation('relu')(inception_3b_3x3)
  73.     inception_3b_3x3 = ZeroPadding2D(padding=(1, 1))(inception_3b_3x3)
  74.     inception_3b_3x3 = Conv2D(128, (3, 3), name='inception_3b_3x3_conv2')(inception_3b_3x3)
  75.     inception_3b_3x3 = BatchNormalization(axis=3, epsilon=0.00001, name='inception_3b_3x3_bn2')(inception_3b_3x3)
  76.     inception_3b_3x3 = Activation('relu')(inception_3b_3x3)
  77.  
  78.     inception_3b_5x5 = Conv2D(32, (1, 1), name='inception_3b_5x5_conv1')(inception_3a)
  79.     inception_3b_5x5 = BatchNormalization(axis=3, epsilon=0.00001, name='inception_3b_5x5_bn1')(inception_3b_5x5)
  80.     inception_3b_5x5 = Activation('relu')(inception_3b_5x5)
  81.     inception_3b_5x5 = ZeroPadding2D(padding=(2, 2))(inception_3b_5x5)
  82.     inception_3b_5x5 = Conv2D(64, (5, 5), name='inception_3b_5x5_conv2')(inception_3b_5x5)
  83.     inception_3b_5x5 = BatchNormalization(axis=3, epsilon=0.00001, name='inception_3b_5x5_bn2')(inception_3b_5x5)
  84.     inception_3b_5x5 = Activation('relu')(inception_3b_5x5)
  85.  
  86.     inception_3b_pool = Lambda(lambda x: x**2, name='power2_3b')(inception_3a)
  87.     inception_3b_pool = AveragePooling2D(pool_size=(3, 3), strides=(3, 3))(inception_3b_pool)
  88.     inception_3b_pool = Lambda(lambda x: x*9, name='mult9_3b')(inception_3b_pool)
  89.     inception_3b_pool = Lambda(lambda x: K.sqrt(x), name='sqrt_3b')(inception_3b_pool)
  90.     inception_3b_pool = Conv2D(64, (1, 1), name='inception_3b_pool_conv')(inception_3b_pool)
  91.     inception_3b_pool = BatchNormalization(axis=3, epsilon=0.00001, name='inception_3b_pool_bn')(inception_3b_pool)
  92.     inception_3b_pool = Activation('relu')(inception_3b_pool)
  93.     inception_3b_pool = ZeroPadding2D(padding=(4, 4))(inception_3b_pool)
  94.  
  95.     inception_3b_1x1 = Conv2D(64, (1, 1), name='inception_3b_1x1_conv')(inception_3a)
  96.     inception_3b_1x1 = BatchNormalization(axis=3, epsilon=0.00001, name='inception_3b_1x1_bn')(inception_3b_1x1)
  97.     inception_3b_1x1 = Activation('relu')(inception_3b_1x1)
  98.  
  99.     inception_3b = concatenate([inception_3b_3x3, inception_3b_5x5, inception_3b_pool, inception_3b_1x1], axis=3)
  100.  
  101.     # Inception3c
  102.     inception_3c_3x3 = utils.conv2d_bn(inception_3b,
  103.                                     layer='inception_3c_3x3',
  104.                                     cv1_out=128,
  105.                                     cv1_filter=(1, 1),
  106.                                     cv2_out=256,
  107.                                     cv2_filter=(3, 3),
  108.                                     cv2_strides=(2, 2),
  109.                                     padding=(1, 1))
  110.  
  111.     inception_3c_5x5 = utils.conv2d_bn(inception_3b,
  112.                                     layer='inception_3c_5x5',
  113.                                     cv1_out=32,
  114.                                     cv1_filter=(1, 1),
  115.                                     cv2_out=64,
  116.                                     cv2_filter=(5, 5),
  117.                                     cv2_strides=(2, 2),
  118.                                     padding=(2, 2))
  119.  
  120.     inception_3c_pool = MaxPooling2D(pool_size=3, strides=2)(inception_3b)
  121.     inception_3c_pool = ZeroPadding2D(padding=((0, 1), (0, 1)))(inception_3c_pool)
  122.  
  123.     inception_3c = concatenate([inception_3c_3x3, inception_3c_5x5, inception_3c_pool], axis=3)
  124.  
  125.     #inception 4a
  126.     inception_4a_3x3 = utils.conv2d_bn(inception_3c,
  127.                                     layer='inception_4a_3x3',
  128.                                     cv1_out=96,
  129.                                     cv1_filter=(1, 1),
  130.                                     cv2_out=192,
  131.                                     cv2_filter=(3, 3),
  132.                                     cv2_strides=(1, 1),
  133.                                     padding=(1, 1))
  134.     inception_4a_5x5 = utils.conv2d_bn(inception_3c,
  135.                                     layer='inception_4a_5x5',
  136.                                     cv1_out=32,
  137.                                     cv1_filter=(1, 1),
  138.                                     cv2_out=64,
  139.                                     cv2_filter=(5, 5),
  140.                                     cv2_strides=(1, 1),
  141.                                     padding=(2, 2))
  142.  
  143.     inception_4a_pool = Lambda(lambda x: x**2, name='power2_4a')(inception_3c)
  144.     inception_4a_pool = AveragePooling2D(pool_size=(3, 3), strides=(3, 3))(inception_4a_pool)
  145.     inception_4a_pool = Lambda(lambda x: x*9, name='mult9_4a')(inception_4a_pool)
  146.     inception_4a_pool = Lambda(lambda x: K.sqrt(x), name='sqrt_4a')(inception_4a_pool)
  147.     inception_4a_pool = utils.conv2d_bn(inception_4a_pool,
  148.                                     layer='inception_4a_pool',
  149.                                     cv1_out=128,
  150.                                     cv1_filter=(1, 1),
  151.                                     padding=(2, 2))
  152.     inception_4a_1x1 = utils.conv2d_bn(inception_3c,
  153.                                     layer='inception_4a_1x1',
  154.                                     cv1_out=256,
  155.                                     cv1_filter=(1, 1))
  156.     inception_4a = concatenate([inception_4a_3x3, inception_4a_5x5, inception_4a_pool, inception_4a_1x1], axis=3)
  157.  
  158.     #inception4e
  159.     inception_4e_3x3 = utils.conv2d_bn(inception_4a,
  160.                                     layer='inception_4e_3x3',
  161.                                     cv1_out=160,
  162.                                     cv1_filter=(1, 1),
  163.                                     cv2_out=256,
  164.                                     cv2_filter=(3, 3),
  165.                                     cv2_strides=(2, 2),
  166.                                     padding=(1, 1))
  167.     inception_4e_5x5 = utils.conv2d_bn(inception_4a,
  168.                                     layer='inception_4e_5x5',
  169.                                     cv1_out=64,
  170.                                     cv1_filter=(1, 1),
  171.                                     cv2_out=128,
  172.                                     cv2_filter=(5, 5),
  173.                                     cv2_strides=(2, 2),
  174.                                     padding=(2, 2))
  175.     inception_4e_pool = MaxPooling2D(pool_size=3, strides=2)(inception_4a)
  176.     inception_4e_pool = ZeroPadding2D(padding=((0, 1), (0, 1)))(inception_4e_pool)
  177.  
  178.     inception_4e = concatenate([inception_4e_3x3, inception_4e_5x5, inception_4e_pool], axis=3)
  179.  
  180.     #inception5a
  181.     inception_5a_3x3 = utils.conv2d_bn(inception_4e,
  182.                                     layer='inception_5a_3x3',
  183.                                     cv1_out=96,
  184.                                     cv1_filter=(1, 1),
  185.                                     cv2_out=384,
  186.                                     cv2_filter=(3, 3),
  187.                                     cv2_strides=(1, 1),
  188.                                     padding=(1, 1))
  189.  
  190.     inception_5a_pool = Lambda(lambda x: x**2, name='power2_5a')(inception_4e)
  191.     inception_5a_pool = AveragePooling2D(pool_size=(3, 3), strides=(3, 3))(inception_5a_pool)
  192.     inception_5a_pool = Lambda(lambda x: x*9, name='mult9_5a')(inception_5a_pool)
  193.     inception_5a_pool = Lambda(lambda x: K.sqrt(x), name='sqrt_5a')(inception_5a_pool)
  194.     inception_5a_pool = utils.conv2d_bn(inception_5a_pool,
  195.                                     layer='inception_5a_pool',
  196.                                     cv1_out=96,
  197.                                     cv1_filter=(1, 1),
  198.                                     padding=(1, 1))
  199.     inception_5a_1x1 = utils.conv2d_bn(inception_4e,
  200.                                     layer='inception_5a_1x1',
  201.                                     cv1_out=256,
  202.                                     cv1_filter=(1, 1))
  203.  
  204.     inception_5a = concatenate([inception_5a_3x3, inception_5a_pool, inception_5a_1x1], axis=3)
  205.  
  206.     #inception_5b
  207.     inception_5b_3x3 = utils.conv2d_bn(inception_5a,
  208.                                     layer='inception_5b_3x3',
  209.                                     cv1_out=96,
  210.                                     cv1_filter=(1, 1),
  211.                                     cv2_out=384,
  212.                                     cv2_filter=(3, 3),
  213.                                     cv2_strides=(1, 1),
  214.                                     padding=(1, 1))
  215.     inception_5b_pool = MaxPooling2D(pool_size=3, strides=2)(inception_5a)
  216.     inception_5b_pool = utils.conv2d_bn(inception_5b_pool,
  217.                                     layer='inception_5b_pool',
  218.                                     cv1_out=96,
  219.                                     cv1_filter=(1, 1))
  220.     inception_5b_pool = ZeroPadding2D(padding=(1, 1))(inception_5b_pool)
  221.  
  222.     inception_5b_1x1 = utils.conv2d_bn(inception_5a,
  223.                                     layer='inception_5b_1x1',
  224.                                     cv1_out=256,
  225.                                     cv1_filter=(1, 1))
  226.     inception_5b = concatenate([inception_5b_3x3, inception_5b_pool, inception_5b_1x1], axis=3)
  227.  
  228.     av_pool = AveragePooling2D(pool_size=(3, 3), strides=(1, 1))(inception_5b)
  229.     reshape_layer = Flatten()(av_pool)
  230.     dense_layer = Dense(128, name='dense_layer')(reshape_layer)
  231.     norm_layer = Lambda(lambda  x: K.l2_normalize(x, axis=1), name='norm_layer')(dense_layer)
  232.  
  233.  
  234.     # Final Model
  235.     model = Model(inputs=[myInput], outputs=norm_layer)
  236.     return model
  237.  
  238. if __name__ == '__main__':
  239.     facenet()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement