皮肤问题不要怕,RethNet模型帮你解决它!
全文共3645字,预计学习时长11分钟
来源:dy.163
爱美之心人皆有之。
拥有一个吹弹可破的完美肌肤更是无数爱美人士梦寐以求的终极目标。
科学界对此进行了相关研究,RethNet模型的提出就是其中成果之一。
2019年8月,来自lululab 的研究者提出了最先进的概念,即使用语义分割法,准确检测最常见的面部皮肤问题。这项工作已被ICCV 2019 研讨会接受。
目录
1. 以对象为单位学习的概念
2. 数据集
3. REthinker 代码块
4. REthinker模块与SENet 模块
5. RethNeT
6. 结果
1. 以对象为单位学习的概念
皮肤损伤物体之间有视觉关系,这有助于人类判断他们是什么类型的皮肤损伤。
准确地说,某些皮肤损伤之间存在着区域-区域、对象-区域和对象-对象的相互作用,因此,检测其中一个对象的类别,有助于通过它们绑定的相互作用来检测出另一个(例如,皱纹和老年斑,或丘疹、白头)。个别皮肤损伤的检测决策可以通过对象类之间的语境关系动态切换。这种认知过程称为以对象为单位的决策过程。
简单而言,通过查看其它对象识别某些对象,这就是以对象为单位学习。
2. 数据集
“多类型皮损标记数据库”(MSLD)已经建立,并对正面人脸图像进行像素标记。在面部多类型皮肤损伤图像标记数据集不可用的情况下,MSLD的设计在ML社区里是独一无二的。
目前已经对412幅图像进行注释,标记了11种常见的面部皮损和6种附加类别。皮损包括白头、丘疹、脓疱、雀斑、老年斑、妊高征(妊娠高血压综合征)、潮红、脂溢、皮炎、皱纹和黑点。附加类别包括正常皮肤、头发、眼/口/眉、眼镜、面具/围巾以及背景。报告声称,为了保护用户隐私,他们不披露MSLD的数据集。
3. REthinker 代码块
这里提出了基于SENet 模块和局部构造的convLSTM/conv3D单元的 REthinker 代码块,用以提高网络在局部和整体背景中的敏感性,有助于捕获隐含的对象和对象类之间的相互作用。
4. REthinker模块与SENet 模块
Rethinker模块由 SENet 模块和局部构造的convLSTM/conv3D层组成,作为单发注意机制,它们都负责从特征中提取上下文关系。
准确地说,由于SENet模块汇集了全局空间内的信息,SE模块在每个特征映射的大邻域中,传递更多嵌入的高级上下文信息。然而,在分片特征映射的局部邻域(patches)元素之间,局部构建的convLSTM/conv3D层编码低级上下文信息,同时进一步考虑了空间相关性。
- defimage_to_patches(image, patch_size=[1,4,4,1]):
- Batch_size, H, W, C =image.get_shape()
- patches =tf.image.extract_image_patches(image, patch_size, patch_size, [1, 1, 1, 1], 'VALID')
- patches = tf.reshape(patches,[Batch_size ,patch_size[1]*patch_size[1],patch_size[1], patch_size[1],C])
- returnpatches
- defpatches_to_image(patches, image_shape):
- _, N, H, W, C =patches.get_shape()
- patches = tf.reshape(patches, [-1, image_shape[0], image_shape[1],C])
- rec_new =tf.space_to_depth(patches, H)
- rec_new = tf.reshape(rec_new, [1, image_shape[0], image_shape[1],C])
- returnrec_new
- defcontructed_convLSTM(inputs, depth,kernel_size, rate):
- _, H, W, C = inputs.get_shape()
- net = image_to_patches(inputs,patch_size=[1,4,4,1])
- #print(net)
- net = tf.keras.layers.ConvLSTM2D(depth,kernel_size=kernel_size, padding='same', dilation_rate=rate, return_sequences=True)(net)
- # net = tf.keras.layers.Conv3D(depth,kernel_size=kernel_size, padding='same', dilation_rate=rate)(net)
- net = patches_to_image(net, image_shape=[H,W])
- #print(net)
- return net
- defRethBlock(inputs, depth,kernel_size, rate, prefix=None):
- residual = inputs
- inputs =contructed_convLSTM(inputs,depth,kernel_size,rate=rate)
- _, H, W, C = inputs.get_shape()
- residual =tf.keras.layers.GlobalAveragePooling2D(name='Globalpooling_SeNet' + prefix)(residual)
- residual =tf.keras.layers.Dense(C.value // 8, activation='relu',name='fc_SeNet' + prefix + '_squ')(residual)
- residual =tf.keras.layers.Dense(C.value, activation='sigmoid',name='fc_seNet' + prefix + '_exc')(residual)
- residual =tf.keras.layers.Reshape([1, 1,C.value])(residual)
- outputs = tf.keras.layers.Multiply(name='scale' + prefix)([residual, inputs])
- return outputs
请注意,这是一个快速实现的REthinker 代码块,只支持输入符合256x256、64x64、16x16等数字的根。
5. RethNeT
编码器搜索:在实践中,推荐的 REthinker 块适用于任何标准 CNNs。然而,在这项工作中,Xception被认为是目前最先进的网络,并由 REthinker 代码块提供动力。此外,还有基于 MobileNet v2和 IGCV3的轻量级 RehNet 版本。Rethinker 模块的使用迫使网络捕获对象类之间的上下文关系,而忽视它们相似的纹理和模糊的外表。
解码器搜索:事实上,丰富的上下文信息对于捕获模糊出现的对象和对象类之间的相互作用非常关键,它们通常在编码器中出现。因此,不考虑解码器路径的影响,只采用 DeepLabv3 + 的解码器来恢复单个皮肤受损的目标分割细节。
RethNet:结合 Xception 模块和 REthinker 模块对 RethNet 进行了简单的研究。对 Xception 的修改如下:
1. REthinker模块在每个Xception代码块之后添加,不会丢失空间特征映射。
2. Xception 入口流的最后一道障碍被移除。
3. 在每个REthinker模块中保持4x4的补丁大小,以便在ConvLSTM/Conv3D中“看到”更宽的未来地图,而这仅需简单地增加时间步骤。
4. 在Xception 的中间流和出口流中的参数数最少。
5. 最大池操作被带有分段的深度可分离卷积代替,批量归一化和ReLU应用于Xception模块的每个3×3深度卷积之后。
6. 结果
如果检查一下博客文章的标题图片,就会发现 RethNet的推理结果是非常好的,这是真实测试图片中RethNet的推理结果。根据比较结果显示,MSLD数据集的面部皮肤病变检测任务有显著改善,比Deeplab v3 +提高了15.34%,而MIoU为64.12%。
如果这项工作对你的研究有用,后台回复“论文”即可获取本论文完整版哟~
留言 点赞 关注
我们一起分享AI学习与发展的干货
欢迎关注全平台AI垂类自媒体 “读芯术”
(添加小编微信:dxsxbb,加入读者圈,一起讨论最新鲜的人工智能科技哦~)