model.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Tue Jun 21 10:53:51 2022
  4. model
  5. @author: fangjiasheng
  6. """
  7. import os
  8. import sys
  9. sys.path.append(os.path.dirname(os.path.abspath(__file__)))
  10. from keras.layers import Lambda, Dense, Reshape, Conv2D, BatchNormalization, LeakyReLU, Masking, MaxPool2D, \
  11. MaxPooling2D, UpSampling2D, concatenate, Activation, GlobalAveragePooling2D, DepthwiseConv2D, Add
  12. from keras import layers, models, Sequential, Input, Model
  13. import keras.backend as K
  14. def direction_model(input_shape, output_shape):
  15. model = cnn_model(input_shape, output_shape)
  16. # print(input_shape, output_shape)
  17. # model = mobile_net_v3_tiny(input_shape, output_shape)
  18. # model = fpn(input_shape, output_shape)
  19. # model.summary(line_length=100)
  20. return model
  21. def cnn_model(input_shape, output_shape):
  22. conv_num = 6
  23. # Input
  24. _input = Input(shape=input_shape, dtype="float32", name="input")
  25. conv = Conv2D(16, (3, 3), padding='same')(_input)
  26. bn = BatchNormalization()(conv)
  27. relu = LeakyReLU(alpha=0.)(bn)
  28. max_pool = MaxPool2D()(relu)
  29. for i in range(conv_num):
  30. conv = Conv2D(16, (3, 3), padding='same')(max_pool)
  31. bn = BatchNormalization()(conv)
  32. relu = LeakyReLU(alpha=0.)(bn)
  33. # conv = Conv2D(32, (1, 1), padding='same')(relu)
  34. # bn = BatchNormalization()(conv)
  35. # relu = LeakyReLU(alpha=0.)(bn)
  36. max_pool = MaxPool2D()(relu)
  37. # conv = Conv2D(16, (3, 3), padding='same')(max_pool)
  38. # bn = BatchNormalization()(conv)
  39. # relu = LeakyReLU(alpha=0.)(bn)
  40. max_pool = MaxPool2D((6, 6))(relu)
  41. dense = layers.Dense(output_shape, activation='softmax')(max_pool)
  42. squeeze = Lambda(lambda x: K.squeeze(x, axis=1))(dense)
  43. squeeze = Lambda(lambda x: K.squeeze(x, axis=1))(squeeze)
  44. model = Model(inputs=_input, outputs=squeeze)
  45. return model
  46. def cnn_model_240314(input_shape, output_shape):
  47. conv_num = 5
  48. # Input
  49. _input = Input(shape=input_shape, dtype="float32", name="input")
  50. conv = Conv2D(16, (3, 3), padding='same')(_input)
  51. bn = BatchNormalization()(conv)
  52. relu = LeakyReLU(alpha=0.)(bn)
  53. max_pool = MaxPool2D()(relu)
  54. for i in range(conv_num):
  55. conv = Conv2D(16, (3, 3), padding='same')(max_pool)
  56. bn = BatchNormalization()(conv)
  57. relu = LeakyReLU(alpha=0.)(bn)
  58. # conv = Conv2D(32, (1, 1), padding='same')(relu)
  59. # bn = BatchNormalization()(conv)
  60. # relu = LeakyReLU(alpha=0.)(bn)
  61. max_pool = MaxPool2D()(relu)
  62. # conv = Conv2D(16, (3, 3), padding='same')(max_pool)
  63. # bn = BatchNormalization()(conv)
  64. # relu = LeakyReLU(alpha=0.)(bn)
  65. max_pool = MaxPool2D((6, 6))(relu)
  66. dense = layers.Dense(output_shape, activation='softmax')(max_pool)
  67. squeeze = Lambda(lambda x: K.squeeze(x, axis=1))(dense)
  68. squeeze = Lambda(lambda x: K.squeeze(x, axis=1))(squeeze)
  69. model = Model(inputs=_input, outputs=squeeze)
  70. return model
  71. def fpn(input_shape, output_shape):
  72. # Input
  73. _input = Input(shape=input_shape, dtype="float32", name="input")
  74. # 192 -> 96
  75. conv = Conv2D(8, (3, 3), padding='same')(_input)
  76. bn = BatchNormalization()(conv)
  77. relu = LeakyReLU(alpha=0.)(bn)
  78. conv = Conv2D(8, (3, 3), padding='same')(relu)
  79. bn = BatchNormalization()(conv)
  80. relu = LeakyReLU(alpha=0.)(bn)
  81. max_pool_1 = MaxPool2D()(relu)
  82. # 96 -> 48
  83. conv = Conv2D(16, (3, 3), padding='same')(max_pool_1)
  84. bn = BatchNormalization()(conv)
  85. relu = LeakyReLU(alpha=0.)(bn)
  86. conv = Conv2D(16, (3, 3), padding='same')(relu)
  87. bn = BatchNormalization()(conv)
  88. relu = LeakyReLU(alpha=0.)(bn)
  89. max_pool_2 = MaxPool2D()(relu)
  90. # 48 -> 24
  91. conv = Conv2D(32, (3, 3), padding='same')(max_pool_2)
  92. bn = BatchNormalization()(conv)
  93. relu = LeakyReLU(alpha=0.)(bn)
  94. conv = Conv2D(32, (3, 3), padding='same')(relu)
  95. bn = BatchNormalization()(conv)
  96. relu = LeakyReLU(alpha=0.)(bn)
  97. max_pool_3 = MaxPool2D()(relu)
  98. #
  99. conv_pre = Conv2D(32, (1, 1))(max_pool_2)
  100. up_sample = UpSampling2D((2, 2))(max_pool_3)
  101. add_1 = Add()([conv_pre, up_sample])
  102. conv_pre = Conv2D(16, (1, 1))(max_pool_1)
  103. up_sample = UpSampling2D((2, 2))(max_pool_2)
  104. add_2 = Add()([conv_pre, up_sample])
  105. global_pool_1 = GlobalAveragePooling2D()(max_pool_3)
  106. global_pool_2 = GlobalAveragePooling2D()(add_1)
  107. global_pool_3 = GlobalAveragePooling2D()(add_2)
  108. reshape_1 = Reshape((1, 1, 32))(global_pool_1)
  109. reshape_2 = Reshape((1, 1, 32))(global_pool_2)
  110. reshape_3 = Reshape((1, 1, 16))(global_pool_3)
  111. conv_1 = Conv2D(64, (1, 1), padding='same')(reshape_1)
  112. conv_2 = Conv2D(64, (1, 1), padding='same')(reshape_2)
  113. conv_3 = Conv2D(64, (1, 1), padding='same')(reshape_3)
  114. conv_1 = Conv2D(output_shape, (1, 1), padding='same')(conv_1)
  115. conv_2 = Conv2D(output_shape, (1, 1), padding='same')(conv_2)
  116. conv_3 = Conv2D(output_shape, (1, 1), padding='same')(conv_3)
  117. reshape_1 = Reshape((output_shape,))(conv_1)
  118. reshape_2 = Reshape((output_shape,))(conv_2)
  119. reshape_3 = Reshape((output_shape,))(conv_3)
  120. add = Add()([reshape_1, reshape_2, reshape_3])
  121. softmax = Activation('softmax')(add)
  122. model = Model(_input, softmax)
  123. return model
  124. def tiny_unet(input_shape, output_shape):
  125. inputs = Input(shape=input_shape)
  126. use_bias = False
  127. # 128
  128. down1 = Conv2D(16, (3, 3), padding='same', use_bias=use_bias)(inputs)
  129. down1 = BatchNormalization()(down1)
  130. down1 = LeakyReLU(alpha=0.1)(down1)
  131. down1 = Conv2D(16, (1, 1), padding='same', use_bias=use_bias)(down1)
  132. down1 = BatchNormalization()(down1)
  133. down1 = LeakyReLU(alpha=0.1)(down1)
  134. down1_pool = MaxPooling2D((2, 2), strides=(2, 2))(down1)
  135. # 64
  136. down2 = Conv2D(32, (3, 3), padding='same', use_bias=use_bias)(down1_pool)
  137. down2 = BatchNormalization()(down2)
  138. down2 = LeakyReLU(alpha=0.1)(down2)
  139. down2 = Conv2D(32, (1, 1), padding='same', use_bias=use_bias)(down2)
  140. down2 = BatchNormalization()(down2)
  141. down2 = LeakyReLU(alpha=0.1)(down2)
  142. down2_pool = MaxPooling2D((2, 2), strides=(2, 2))(down2)
  143. # 32
  144. down3 = Conv2D(64, (3, 3), padding='same', use_bias=use_bias)(down2_pool)
  145. down3 = BatchNormalization()(down3)
  146. down3 = LeakyReLU(alpha=0.1)(down3)
  147. down3 = Conv2D(64, (1, 1), padding='same', use_bias=use_bias)(down3)
  148. down3 = BatchNormalization()(down3)
  149. down3 = LeakyReLU(alpha=0.1)(down3)
  150. down3_pool = MaxPooling2D((2, 2), strides=(2, 2))(down3)
  151. # 16
  152. center = Conv2D(64, (3, 3), padding='same', use_bias=use_bias)(down3_pool)
  153. center = BatchNormalization()(center)
  154. center = LeakyReLU(alpha=0.1)(center)
  155. center = Conv2D(64, (1, 1), padding='same', use_bias=use_bias)(center)
  156. center = BatchNormalization()(center)
  157. center = LeakyReLU(alpha=0.1)(center)
  158. # 32
  159. up3 = UpSampling2D((2, 2))(center)
  160. up3 = concatenate([down3, up3], axis=3)
  161. up3 = Conv2D(64, (3, 3), padding='same', use_bias=use_bias)(up3)
  162. up3 = BatchNormalization()(up3)
  163. up3 = LeakyReLU(alpha=0.1)(up3)
  164. up3 = Conv2D(64, (1, 1), padding='same', use_bias=use_bias)(up3)
  165. up3 = BatchNormalization()(up3)
  166. up3 = LeakyReLU(alpha=0.1)(up3)
  167. # 64
  168. up2 = UpSampling2D((2, 2))(up3)
  169. up2 = concatenate([down2, up2], axis=3)
  170. up2 = Conv2D(32, (3, 3), padding='same', use_bias=use_bias)(up2)
  171. up2 = BatchNormalization()(up2)
  172. up2 = LeakyReLU(alpha=0.1)(up2)
  173. up2 = Conv2D(32, (1, 1), padding='same', use_bias=use_bias)(up2)
  174. up2 = BatchNormalization()(up2)
  175. up2 = LeakyReLU(alpha=0.1)(up2)
  176. # 128
  177. up1 = UpSampling2D((2, 2))(up2)
  178. up1 = K.concatenate([down1, up1], axis=3)
  179. up1 = Conv2D(16, (3, 3), padding='same', use_bias=use_bias)(up1)
  180. up1 = BatchNormalization()(up1)
  181. up1 = LeakyReLU(alpha=0.1)(up1)
  182. up1 = Conv2D(16, (1, 1), padding='same', use_bias=use_bias)(up1)
  183. up1 = BatchNormalization()(up1)
  184. up1 = LeakyReLU(alpha=0.1)(up1)
  185. classify = Conv2D(output_shape, (1, 1), activation='softmax')(up1)
  186. model = Model(inputs=inputs, outputs=classify)
  187. return model