DL之MaskR-CNN:基于类MaskR-CNN算法(RetinaNet+mask head)利用数据集(resnet50_coco_v0.2.0.h5)实现图像分割(一)

本文涉及的产品
视觉智能开放平台,图像资源包5000点
视觉智能开放平台,视频资源包5000点
视觉智能开放平台,分割抠图1万点
简介: DL之MaskR-CNN:基于类MaskR-CNN算法(RetinaNet+mask head)利用数据集(resnet50_coco_v0.2.0.h5)实现图像分割

输出结果


image.png

image.png


image.png


image.png




设计思路


参考文章:DL之MaskR-CNN:Mask R-CNN算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略

   在ResNet的基础上,增加了ROI_Align、mask_submodel、masks(ConcatenateBoxes,计算loss的拼接)。

image.png




核心代码



1、retinanet.py


default_mask_model函数内,定义了类别个数num_classes、金字塔特征的大小pyramid_feature_size=256等

   mask_feature_size=256,

   roi_size=(14, 14),

   mask_size=(28, 28),

"""

Copyright 2017-2018 Fizyr (https://fizyr.com)

Licensed under the Apache License, Version 2.0 (the "License");

you may not use this file except in compliance with the License.

You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an "AS IS" BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and

limitations under the License.

"""

import keras

import keras.backend

import keras.models

import keras_retinanet.layers

import keras_retinanet.models.retinanet

import keras_retinanet.backend.tensorflow_backend as backend

from ..layers.roi import RoiAlign

from ..layers.upsample import Upsample

from ..layers.misc import Shape, ConcatenateBoxes, Cast

def default_mask_model(

   num_classes,

   pyramid_feature_size=256,

   mask_feature_size=256,

   roi_size=(14, 14),

   mask_size=(28, 28),

   name='mask_submodel',

   mask_dtype=keras.backend.floatx(),

   retinanet_dtype=keras.backend.floatx()

):

   options = {

       'kernel_size'        : 3,

       'strides'            : 1,

       'padding'            : 'same',

       'kernel_initializer' : keras.initializers.normal(mean=0.0, stddev=0.01, seed=None),

       'bias_initializer'   : 'zeros',

       'activation'         : 'relu',

   }

   inputs  = keras.layers.Input(shape=(None, roi_size[0], roi_size[1], pyramid_feature_size))

   outputs = inputs

   # casting to the desidered data type, which may be different than

   # the one used for the underlying keras-retinanet model

   if mask_dtype != retinanet_dtype:

       outputs = keras.layers.TimeDistributed(

           Cast(dtype=mask_dtype),

           name='cast_masks')(outputs)

   for i in range(4):

       outputs = keras.layers.TimeDistributed(keras.layers.Conv2D(

           filters=mask_feature_size,

           **options

       ), name='roi_mask_{}'.format(i))(outputs)

   # perform upsampling + conv instead of deconv as in the paper

   # https://distill.pub/2016/deconv-checkerboard/

   outputs = keras.layers.TimeDistributed(

       Upsample(mask_size),

       name='roi_mask_upsample')(outputs)

   outputs = keras.layers.TimeDistributed(keras.layers.Conv2D(

       filters=mask_feature_size,

       **options

   ), name='roi_mask_features')(outputs)

   outputs = keras.layers.TimeDistributed(keras.layers.Conv2D(

       filters=num_classes,

       kernel_size=1,

       activation='sigmoid'

   ), name='roi_mask')(outputs)

   # casting back to the underlying keras-retinanet model data type

   if mask_dtype != retinanet_dtype:

       outputs = keras.layers.TimeDistributed(

           Cast(dtype=retinanet_dtype),

           name='recast_masks')(outputs)

   return keras.models.Model(inputs=inputs, outputs=outputs, name=name)

def default_roi_submodels(num_classes, mask_dtype=keras.backend.floatx(), retinanet_dtype=keras.backend.floatx()):

   return [

       ('masks', default_mask_model(num_classes, mask_dtype=mask_dtype, retinanet_dtype=retinanet_dtype)),

   ]

def retinanet_mask(

   inputs,

   num_classes,

   retinanet_model=None,

   anchor_params=None,

   nms=True,

   class_specific_filter=True,

   name='retinanet-mask',

   roi_submodels=None,

   mask_dtype=keras.backend.floatx(),

   modifier=None,

   **kwargs

):

   """ Construct a RetinaNet mask model on top of a retinanet bbox model.

   This model uses the retinanet bbox model and appends a few layers to compute masks.

   # Arguments

       inputs                : List of keras.layers.Input. The first input is the image, the second input the blob of masks.

       num_classes           : Number of classes to classify.

       retinanet_model       : keras_retinanet.models.retinanet model, returning regression and classification values.

       anchor_params         : Struct containing anchor parameters. If None, default values are used.

       nms                   : Use NMS.

       class_specific_filter : Use class specific filtering.

       roi_submodels         : Submodels for processing ROIs.

       mask_dtype            : Data type of the masks, can be different from the main one.

       modifier              : Modifier for the underlying retinanet model, such as freeze.

       name                  : Name of the model.

       **kwargs              : Additional kwargs to pass to the retinanet bbox model.

   # Returns

       Model with inputs as input and as output the output of each submodel for each pyramid level and the detections.

       The order is as defined in submodels.

       ```

       [

           regression, classification, other[0], other[1], ..., boxes_masks, boxes, scores, labels, masks, other[0], other[1], ...

       ]

       ```

   """

   if anchor_params is None:

       anchor_params = keras_retinanet.utils.anchors.AnchorParameters.default

   if roi_submodels is None:

       retinanet_dtype = keras.backend.floatx()

       keras.backend.set_floatx(mask_dtype)

       roi_submodels = default_roi_submodels(num_classes, mask_dtype, retinanet_dtype)

       keras.backend.set_floatx(retinanet_dtype)

   image = inputs

   image_shape = Shape()(image)

   if retinanet_model is None:

       retinanet_model = keras_retinanet.models.retinanet.retinanet(

           inputs=image,

           num_classes=num_classes,

           num_anchors=anchor_params.num_anchors(),

           **kwargs

       )

   if modifier:

       retinanet_model = modifier(retinanet_model)

   # parse outputs

   regression     = retinanet_model.outputs[0]

   classification = retinanet_model.outputs[1]

   other          = retinanet_model.outputs[2:]

   features       = [retinanet_model.get_layer(name).output for name in ['P3', 'P4', 'P5', 'P6', 'P7']]

   # build boxes

   anchors = keras_retinanet.models.retinanet.__build_anchors(anchor_params, features)

   boxes = keras_retinanet.layers.RegressBoxes(name='boxes')([anchors, regression])

   boxes = keras_retinanet.layers.ClipBoxes(name='clipped_boxes')([image, boxes])

   # filter detections (apply NMS / score threshold / select top-k)

   detections = keras_retinanet.layers.FilterDetections(

       nms                   = nms,

       class_specific_filter = class_specific_filter,

       max_detections        = 100,

       name                  = 'filtered_detections'

   )([boxes, classification] + other)

   # split up in known outputs and "other"

   boxes  = detections[0]

   scores = detections[1]

   # get the region of interest features

   rois = RoiAlign()([image_shape, boxes, scores] + features)

   # execute maskrcnn submodels

   maskrcnn_outputs = [submodel(rois) for _, submodel in roi_submodels]

   # concatenate boxes for loss computation

   trainable_outputs = [ConcatenateBoxes(name=name)([boxes, output]) for (name, _), output in zip(roi_submodels, maskrcnn_outputs)]

   # reconstruct the new output

   outputs = [regression, classification] + other + trainable_outputs + detections + maskrcnn_outputs

   return keras.models.Model(inputs=inputs, outputs=outputs, name=name)


相关文章
|
2月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
158 4
|
3月前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
59 4
|
5月前
|
搜索推荐 算法 Java
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
该博客文章通过UML类图和Java源码示例,展示了如何使用适配器模式将QuickSort类和BinarySearch类的排序和查找功能适配到DataOperation接口中,实现算法的解耦和复用。
60 1
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
|
5月前
|
数据采集 机器学习/深度学习 算法
【python】python客户信息审计风险决策树算法分类预测(源码+数据集+论文)【独一无二】
【python】python客户信息审计风险决策树算法分类预测(源码+数据集+论文)【独一无二】
107 1
|
5月前
|
监控 算法 自动驾驶
RetinaNet算法1
8月更文挑战第6天
|
5月前
|
机器学习/深度学习 监控 算法
RetinaNet算法2
8月更文挑战第7天
|
5月前
|
数据采集 算法 数据可视化
基于K-Means聚类算法对球员数据的聚类分析,可以自主寻找最优聚类数进行聚类
本文介绍了一个基于K-Means聚类算法的NBA球员数据分析项目,该项目通过采集和分析球员的得分、篮板、助攻等统计数据,使用轮廓系数法和拐点法确定最优聚类数,将球员分为不同群组,并提供了一个可视化界面以便直观比较不同群组的球员表现。
112 0
基于K-Means聚类算法对球员数据的聚类分析,可以自主寻找最优聚类数进行聚类
|
6月前
创建KNN类
【7月更文挑战第22天】创建KNN类。
44 8
|
9天前
|
机器学习/深度学习 算法 计算机视觉
基于CNN卷积神经网络的金融数据预测matlab仿真,对比BP,RBF,LSTM
本项目基于MATLAB2022A,利用CNN卷积神经网络对金融数据进行预测,并与BP、RBF和LSTM网络对比。核心程序通过处理历史价格数据,训练并测试各模型,展示预测结果及误差分析。CNN通过卷积层捕捉局部特征,BP网络学习非线性映射,RBF网络进行局部逼近,LSTM解决长序列预测中的梯度问题。实验结果表明各模型在金融数据预测中的表现差异。
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
深入理解深度学习中的卷积神经网络(CNN)##
在当今的人工智能领域,深度学习已成为推动技术革新的核心力量之一。其中,卷积神经网络(CNN)作为深度学习的一个重要分支,因其在图像和视频处理方面的卓越性能而备受关注。本文旨在深入探讨CNN的基本原理、结构及其在实际应用中的表现,为读者提供一个全面了解CNN的窗口。 ##

热门文章

最新文章