DL之RetinaNet:基于RetinaNet算法(keras框架)利用resnet50_coco数据集(.h5文件)实现目标检测

简介: DL之RetinaNet:基于RetinaNet算法(keras框架)利用resnet50_coco数据集(.h5文件)实现目标检测

输出结果

image.png


image.png

image.png

设计思路

更新中


核心代码

def __create_pyramid_features(C3, C4, C5, feature_size=256):

   """ Creates the FPN layers on top of the backbone features.

      在ResNet基础上创建FPN金字塔特征:参照博客的框架图,输入[C3,C4,C5],返回5个特征级别[P3, P4, P5, P6, P7]

      参考博客:https://yunyaniu.blog.csdn.net/article/details/100010853

   Args

       C3           : Feature stage C3 from the backbone.

       C4           : Feature stage C4 from the backbone.

       C5           : Feature stage C5 from the backbone.

       feature_size : The feature size to use for the resulting feature levels.

   Returns

       A list of feature levels [P3, P4, P5, P6, P7].

   """

   # upsample C5 to get P5 from the FPN paper

   P5           = keras.layers.Conv2D(feature_size, kernel_size=1, strides=1, padding='same', name='C5_reduced')(C5)

   P5_upsampled = layers.UpsampleLike(name='P5_upsampled')([P5, C4])

   P5           = keras.layers.Conv2D(feature_size, kernel_size=3, strides=1, padding='same', name='P5')(P5)

   # add P5 elementwise to C4

   P4           = keras.layers.Conv2D(feature_size, kernel_size=1, strides=1, padding='same', name='C4_reduced')(C4)

   P4           = keras.layers.Add(name='P4_merged')([P5_upsampled, P4])

   P4_upsampled = layers.UpsampleLike(name='P4_upsampled')([P4, C3])

   P4           = keras.layers.Conv2D(feature_size, kernel_size=3, strides=1, padding='same', name='P4')(P4)

   # add P4 elementwise to C3

   P3 = keras.layers.Conv2D(feature_size, kernel_size=1, strides=1, padding='same', name='C3_reduced')(C3)

   P3 = keras.layers.Add(name='P3_merged')([P4_upsampled, P3])

   P3 = keras.layers.Conv2D(feature_size, kernel_size=3, strides=1, padding='same', name='P3')(P3)

   # "P6 is obtained via a 3x3 stride-2 conv on C5"

   P6 = keras.layers.Conv2D(feature_size, kernel_size=3, strides=2, padding='same', name='P6')(C5)

   # "P7 is computed by applying ReLU followed by a 3x3 stride-2 conv on P6"

   P7 = keras.layers.Activation('relu', name='C6_relu')(P6)

   P7 = keras.layers.Conv2D(feature_size, kernel_size=3, strides=2, padding='same', name='P7')(P7)

   return [P3, P4, P5, P6, P7]

def default_submodels(num_classes, num_anchors):

   """ Create a list of default submodels used for object detection.

            两个子模型:目标分类子模型default_classification_model、框回归子模型default_regression_model

   The default submodels contains a regression submodel and a classification submodel.

   Args

       num_classes : Number of classes to use.

       num_anchors : Number of base anchors.

   Returns

       A list of tuple, where the first element is the name of the submodel and the second element is the submodel itself.

   """

   return [

       ('regression', default_regression_model(4, num_anchors)),

       ('classification', default_classification_model(num_classes, num_anchors))

   ]

def __build_model_pyramid(name, model, features):

   """ Applies a single submodel to each FPN level.

       真正的构造金字塔模型

   Args

       name     : Name of the submodel.

       model    : The submodel to evaluate.

       features : The FPN features.

   Returns

       A tensor containing the response from the submodel on the FPN features.

   """

   return keras.layers.Concatenate(axis=1, name=name)([model(f) for f in features])

"""

The default anchor parameters. 默认的anchors参数,组合以后有9个anchors

"""

AnchorParameters.default = AnchorParameters(

   sizes   = [32, 64, 128, 256, 512],

   strides = [8, 16, 32, 64, 128],

   ratios  = np.array([0.5, 1, 2], keras.backend.floatx()),

   scales  = np.array([2 ** 0, 2 ** (1.0 / 3.0), 2 ** (2.0 / 3.0)], keras.backend.floatx()),

)

def anchor_targets_bbox(

   anchors,

   image_group,

   annotations_group,

   num_classes,

   #negative_overlap和positive_overlap,根据IOU区分

   negative_overlap=0.4,  

   positive_overlap=0.5

):

def focal(alpha=0.25, gamma=2.0):

   """ Create a functor for computing the focal loss.

   Args

       alpha: Scale the focal weight with alpha.

       gamma: Take the power of the focal weight with gamma.

   Returns

       A functor that computes the focal loss using the alpha and gamma.

   """

   def _focal(y_true, y_pred):

       """ Compute the focal loss given the target tensor and the predicted tensor.

       As defined in https://arxiv.org/abs/1708.02002

       Args

           y_true: Tensor of target data from the generator with shape (B, N, num_classes).

           y_pred: Tensor of predicted data from the network with shape (B, N, num_classes).

       Returns

           The focal loss of y_pred w.r.t. y_true.

       """

       labels         = y_true[:, :, :-1]

       anchor_state   = y_true[:, :, -1]  # -1 for ignore, 0 for background, 1 for object

       classification = y_pred

       # filter out "ignore" anchors

       indices        = backend.where(keras.backend.not_equal(anchor_state, -1))

       labels         = backend.gather_nd(labels, indices)

       classification = backend.gather_nd(classification, indices)

       # compute the focal loss

       alpha_factor = keras.backend.ones_like(labels) * alpha

       alpha_factor = backend.where(keras.backend.equal(labels, 1), alpha_factor, 1 - alpha_factor)

       focal_weight = backend.where(keras.backend.equal(labels, 1), 1 - classification, classification)

       focal_weight = alpha_factor * focal_weight ** gamma

     

       #定义分类损失: 权重*原来的交叉熵损失

       cls_loss = focal_weight * keras.backend.binary_crossentropy(labels, classification)

       # compute the normalizer: the number of positive anchors

       normalizer = backend.where(keras.backend.equal(anchor_state, 1))

       normalizer = keras.backend.cast(keras.backend.shape(normalizer)[0], keras.backend.floatx())

       normalizer = keras.backend.maximum(keras.backend.cast_to_floatx(1.0), normalizer)

       return keras.backend.sum(cls_loss) / normalizer

   return _focal

def smooth_l1(sigma=3.0):  #框回归损失采用smooth_l1函数

   """ Create a smooth L1 loss functor.

   Args

       sigma: This argument defines the point where the loss changes from L2 to L1.

   Returns

       A functor for computing the smooth L1 loss given target data and predicted data.

   """

   sigma_squared = sigma ** 2

   def _smooth_l1(y_true, y_pred):

       """ Compute the smooth L1 loss of y_pred w.r.t. y_true.

       Args

           y_true: Tensor from the generator of shape (B, N, 5). The last value for each box is the state of the anchor (ignore, negative, positive).

           y_pred: Tensor from the network of shape (B, N, 4).

       Returns

           The smooth L1 loss of y_pred w.r.t. y_true.

       """

       # separate target and state

       regression        = y_pred

       regression_target = y_true[:, :, :-1]

       anchor_state      = y_true[:, :, -1]

       # filter out "ignore" anchors

       indices           = backend.where(keras.backend.equal(anchor_state, 1))

       regression        = backend.gather_nd(regression, indices)

       regression_target = backend.gather_nd(regression_target, indices)

       # compute smooth L1 loss

       # f(x) = 0.5 * (sigma * x)^2          if |x| < 1 / sigma / sigma

       #        |x| - 0.5 / sigma / sigma    otherwise

       regression_diff = regression - regression_target

       regression_diff = keras.backend.abs(regression_diff)

       regression_loss = backend.where(

           keras.backend.less(regression_diff, 1.0 / sigma_squared),

           0.5 * sigma_squared * keras.backend.pow(regression_diff, 2),

           regression_diff - 0.5 / sigma_squared

       )

       # compute the normalizer: the number of positive anchors

       normalizer = keras.backend.maximum(1, keras.backend.shape(indices)[0])

       normalizer = keras.backend.cast(normalizer, dtype=keras.backend.floatx())

       return keras.backend.sum(regression_loss) / normalizer

   return _smooth_l1


相关文章
|
9月前
|
机器学习/深度学习 算法 PyTorch
【Pytorch框架搭建神经网络】基于DQN算法、优先级采样的DQN算法、DQN + 人工势场的避障控制研究(Python代码实现)
【Pytorch框架搭建神经网络】基于DQN算法、优先级采样的DQN算法、DQN + 人工势场的避障控制研究(Python代码实现)
254 1
|
11月前
|
机器学习/深度学习 人工智能 算法
AI-Compass RLHF人类反馈强化学习技术栈:集成TRL、OpenRLHF、veRL等框架,涵盖PPO、DPO算法实现大模型人类价值对齐
AI-Compass RLHF人类反馈强化学习技术栈:集成TRL、OpenRLHF、veRL等框架,涵盖PPO、DPO算法实现大模型人类价值对齐
 AI-Compass RLHF人类反馈强化学习技术栈:集成TRL、OpenRLHF、veRL等框架,涵盖PPO、DPO算法实现大模型人类价值对齐
|
9月前
|
机器学习/深度学习 算法 PyTorch
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
402 0
|
搜索推荐 前端开发 数据可视化
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
本文介绍了一个基于Django框架、协同过滤算法、ECharts数据可视化以及Bootstrap前端技术的酒店推荐系统,该系统通过用户行为分析和推荐算法优化,提供个性化的酒店推荐和直观的数据展示,以提升用户体验。
1037 1
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
|
11月前
|
机器学习/深度学习 人工智能 算法
AI-Compass 强化学习模块:理论到实战完整RL技术生态,涵盖10+主流框架、多智能体算法、游戏AI与金融量化应用
AI-Compass 强化学习模块:理论到实战完整RL技术生态,涵盖10+主流框架、多智能体算法、游戏AI与金融量化应用
|
机器学习/深度学习 人工智能 JSON
这个AI把arXiv变成代码工厂,快速复现顶会算法!Paper2Code:AI论文自动转代码神器,多智能体框架颠覆科研复现
Paper2Code是由韩国科学技术院与DeepAuto.ai联合开发的多智能体框架,通过规划、分析和代码生成三阶段流程,将机器学习论文自动转化为可执行代码仓库,显著提升科研复现效率。
1862 19
这个AI把arXiv变成代码工厂,快速复现顶会算法!Paper2Code:AI论文自动转代码神器,多智能体框架颠覆科研复现
|
缓存 算法 安全
Java集合框架:深入探究数据结构与算法的精华
Java集合框架:深入探究数据结构与算法的精华
|
搜索推荐 前端开发 算法
基于用户画像及协同过滤算法的音乐推荐系统,采用Django框架、bootstrap前端,MySQL数据库
本文介绍了一个基于用户画像和协同过滤算法的音乐推荐系统,使用Django框架、Bootstrap前端和MySQL数据库构建,旨在为用户提供个性化的音乐推荐服务,提高推荐准确性和用户满意度。
1294 7
基于用户画像及协同过滤算法的音乐推荐系统,采用Django框架、bootstrap前端,MySQL数据库
|
机器学习/深度学习 算法 TensorFlow
深入探索强化学习与深度学习的融合:使用TensorFlow框架实现深度Q网络算法及高效调试技巧
【8月更文挑战第31天】强化学习是机器学习的重要分支,尤其在深度学习的推动下,能够解决更为复杂的问题。深度Q网络(DQN)结合了深度学习与强化学习的优势,通过神经网络逼近动作价值函数,在多种任务中表现出色。本文探讨了使用TensorFlow实现DQN算法的方法及其调试技巧。DQN通过神经网络学习不同状态下采取动作的预期回报Q(s,a),处理高维状态空间。
367 1
|
算法
”回溯算法“框架及练习题
”回溯算法“框架及练习题
268 0

热门文章

最新文章