Moh*_*mar 5 computer-vision conv-neural-network keras tensorflow semantic-segmentation
我们使用灰度眼睛图像和眼睛虹膜的真实数据来训练 CNN 来分割虹膜。我们的数据集包含大约 2000 张图像及其相应的蒙版,尺寸均为 224x224。
\n\n我们使用了UNET架构,如下面的代码所示。为了确保我们的网络正常工作,我们尝试将网络过度拟合到数据集的 30 张图像。
\n\n我们使用了骰子损失函数(mean_iou 约为 0.80),但在火车图像上进行测试时,结果很差。它显示的白色像素比地面实况要多得多。我们尝试了几种优化器(Adam、SGD、RMsprop),没有显着差异。
\n\n我们删除了最后两个Conv2D层中的激活函数,这改善了mean_iou和骰子损失,但我们仍然遇到相同的白色像素污迹问题(错误地预测白色像素的存在),但比以前少了。
\n\n然后,我们使用 Tversky 损失函数来消除误报(尝试多个 alpha 和 beta 值)。结果有所改善,但在训练图像上进行测试时,网络预测\xe2\x80\x99 并不准确。
\n\n我们还添加了一个回调,以在损失不改变时降低学习率,这稍微改善了结果。
\n\n在进行之前的运行时,我们尝试一次运行 50 个 epoch,我们将达到损失不再减少约 (0.1) 且mean_iou=0.9 的程度。无论多少个纪元,都不会变得更好,只会波动。学习率很低(0.00001),回调会将其降低到 1x10^-8,但损失仍然没有进一步减少。
\n\n如果有人有这方面的经验或可以向我们提供有关如何克服此问题的任何见解,我们将不胜感激。
\n\n\n\ndef conv2d_block(input_tensor, n_filters, kernel_size=3, batchnorm=True):\n # first layer\n x = Conv2D(filters=n_filters, kernel_size=(kernel_size, kernel_size), kernel_initializer="he_normal",\n padding="same")(input_tensor)\n if batchnorm:\n x = BatchNormalization()(x)\n x = Activation("relu")(x)\n # second layer\n x = Conv2D(filters=n_filters, kernel_size=(kernel_size, kernel_size), kernel_initializer="he_normal",\n padding="same")(x)\n if batchnorm:\n x = BatchNormalization()(x)\n x = Activation("relu")(x)\n return x\n\n\n\ndef get_unet(input_img, n_filters=16, dropout=0.5, batchnorm=False):\n # contracting path\n c1 = conv2d_block(input_img, n_filters=n_filters*1, kernel_size=3, batchnorm=batchnorm)\n p1 = MaxPooling2D((2, 2)) (c1)\n p1 = Dropout(dropout*0.5)(p1)\n\n c2 = conv2d_block(p1, n_filters=n_filters*2, kernel_size=3, batchnorm=batchnorm)\n p2 = MaxPooling2D((2, 2)) (c2)\n p2 = Dropout(dropout)(p2)\n\n c3 = conv2d_block(p2, n_filters=n_filters*4, kernel_size=3, batchnorm=batchnorm)\n p3 = MaxPooling2D((2, 2)) (c3)\n p3 = Dropout(dropout)(p3)\n\n c4 = conv2d_block(p3, n_filters=n_filters*8, kernel_size=3, batchnorm=batchnorm)\n p4 = MaxPooling2D(pool_size=(2, 2)) (c4)\n p4 = Dropout(dropout)(p4)\n\n c5 = conv2d_block(p4, n_filters=n_filters*16, kernel_size=3, batchnorm=batchnorm)\n\n # expansive path\n u6 = Conv2DTranspose(n_filters*8, (3, 3), strides=(2, 2), padding=\'same\') (c5)\n u6 = concatenate([u6, c4])\n u6 = Dropout(dropout)(u6)\n c6 = conv2d_block(u6, n_filters=n_filters*8, kernel_size=3, batchnorm=batchnorm)\n\n u7 = Conv2DTranspose(n_filters*4, (3, 3), strides=(2, 2), padding=\'same\') (c6)\n u7 = concatenate([u7, c3])\n u7 = Dropout(dropout)(u7)\n c7 = conv2d_block(u7, n_filters=n_filters*4, kernel_size=3, batchnorm=batchnorm)\n\n u8 = Conv2DTranspose(n_filters*2, (3, 3), strides=(2, 2), padding=\'same\') (c7)\n u8 = concatenate([u8, c2])\n u8 = Dropout(dropout)(u8)\n c8 = conv2d_block(u8, n_filters=n_filters*2, kernel_size=3, batchnorm=False)\n\n u9 = Conv2DTranspose(n_filters*1, (3, 3), strides=(2, 2), padding=\'same\') (c8)\n u9 = concatenate([u9, c1], axis=3)\n u9 = Dropout(dropout)(u9)\n c9 = conv2d_block(u9, n_filters=n_filters*1, kernel_size=3, batchnorm=False)\n\n outputs = Conv2D(1, (1, 1), activation=\'sigmoid\') (c9)\n model = Model(inputs=[input_img], outputs=[outputs])\n return model\n\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
2252 次 |
| 最近记录: |