如何做静态页网站,免费做淘客cms网站,如何防止网站挂马,河南省建设工程质监总站网站SSD网络
目标检测问题可以分为以下两个问题#xff1a;1#xff09;分类:所有类别的概率#xff1b;2#xff09;定位: 4个值(中心位置x,y,宽w,高h)
Single Shot MultiBox Detector#xff0c;SSD#xff1a;单阶段的目标检测算法#xff0c;通过卷积神经网络进行特征…SSD网络
目标检测问题可以分为以下两个问题1分类:所有类别的概率2定位: 4个值(中心位置x,y,宽w,高h)
Single Shot MultiBox DetectorSSD单阶段的目标检测算法通过卷积神经网络进行特征提取取不同的特征层进行检测输出所以SSD是一种多尺度的检测方法。 SSD的框架 SSD模型结构 SSD采用VGG16作为基础模型然后在VGG16的基础上新增了卷积层来获得更多的特征图,利用了多尺度的特征图做检测。SSD先通过卷积不断进行特征提取在需要检测物体的网络直接通过一个3 ×3卷积得到输出卷积的通道数由anchor数量和类别数量决定具体为(anchor数量*(类别数量4))。 多尺度检测在SSD的网络结构图中我们可以看到SSD使用了多个特征层特征层的尺寸分别是38 × 3819 ×1910 ×105 ×53 ×31 ×1一共6种不同的特征图尺寸。大尺度特征图较靠前的特征图可以用来检测小物体而小尺度特征图较靠后的特征图用来检测大物体。多尺度检测的方式可以使得检测更加充分SSD属于密集检测更能检测出小目标。
SSD模型构建 VGG16 Base Layer, Extra Feature Layer, Detection Layer, NMS, Anchor
vgg16
from mindspore import nndef _make_layer(channels):in_channels channels[0]layers []for out_channels in channels[1:]:layers.append(nn.Conv2d(in_channelsin_channels, out_channelsout_channels, kernel_size3))layers.append(nn.ReLU())in_channels out_channelsreturn nn.SequentialCell(layers)class Vgg16(nn.Cell):VGG16 module.def __init__(self):super(Vgg16, self).__init__()self.b1 _make_layer([3, 64, 64])self.b2 _make_layer([64, 128, 128])self.b3 _make_layer([128, 256, 256, 256])self.b4 _make_layer([256, 512, 512, 512])self.b5 _make_layer([512, 512, 512, 512])self.m1 nn.MaxPool2d(kernel_size2, stride2, pad_modeSAME)self.m2 nn.MaxPool2d(kernel_size2, stride2, pad_modeSAME)self.m3 nn.MaxPool2d(kernel_size2, stride2, pad_modeSAME)self.m4 nn.MaxPool2d(kernel_size2, stride2, pad_modeSAME)self.m5 nn.MaxPool2d(kernel_size3, stride1, pad_modeSAME)def construct(self, x):# block1x self.b1(x)x self.m1(x)# block2x self.b2(x)x self.m2(x)# block3x self.b3(x)x self.m3(x)# block4x self.b4(x)block4 xx self.m4(x)# block5x self.b5(x)x self.m5(x)return block4, xssd300vgg16
import mindspore as ms
import mindspore.nn as nn
import mindspore.ops as opsdef _last_conv2d(in_channel, out_channel, kernel_size3, stride1, pad_modsame, pad0):in_channels in_channelout_channels in_channeldepthwise_conv nn.Conv2d(in_channels, out_channels, kernel_size, stride, pad_modesame,paddingpad, groupin_channels)conv nn.Conv2d(in_channel, out_channel, kernel_size1, stride1, padding0, pad_modesame, has_biasTrue)bn nn.BatchNorm2d(in_channel, eps1e-3, momentum0.97,gamma_init1, beta_init0, moving_mean_init0, moving_var_init1)return nn.SequentialCell([depthwise_conv, bn, nn.ReLU6(), conv])class FlattenConcat(nn.Cell):FlattenConcat module.def __init__(self):super(FlattenConcat, self).__init__()self.num_ssd_boxes 8732def construct(self, inputs):output ()batch_size ops.shape(inputs[0])[0]for x in inputs:x ops.transpose(x, (0, 2, 3, 1))output (ops.reshape(x, (batch_size, -1)),)res ops.concat(output, axis1)return ops.reshape(res, (batch_size, self.num_ssd_boxes, -1))class MultiBox(nn.Cell):Multibox conv layers. Each multibox layer contains class conf scores and localization predictions.def __init__(self):super(MultiBox, self).__init__()num_classes 81out_channels [512, 1024, 512, 256, 256, 256]num_default [4, 6, 6, 6, 4, 4]loc_layers []cls_layers []for k, out_channel in enumerate(out_channels):loc_layers [_last_conv2d(out_channel, 4 * num_default[k],kernel_size3, stride1, pad_modsame, pad0)]cls_layers [_last_conv2d(out_channel, num_classes * num_default[k],kernel_size3, stride1, pad_modsame, pad0)]self.multi_loc_layers nn.CellList(loc_layers)self.multi_cls_layers nn.CellList(cls_layers)self.flatten_concat FlattenConcat()def construct(self, inputs):loc_outputs ()cls_outputs ()for i in range(len(self.multi_loc_layers)):loc_outputs (self.multi_loc_layers[i](inputs[i]),)cls_outputs (self.multi_cls_layers[i](inputs[i]),)return self.flatten_concat(loc_outputs), self.flatten_concat(cls_outputs)class SSD300Vgg16(nn.Cell):SSD300Vgg16 module.def __init__(self):super(SSD300Vgg16, self).__init__()# VGG16 backbone: block1~5self.backbone Vgg16()# SSD blocks: block6~7self.b6_1 nn.Conv2d(in_channels512, out_channels1024, kernel_size3, padding6, dilation6, pad_modepad)self.b6_2 nn.Dropout(p0.5)self.b7_1 nn.Conv2d(in_channels1024, out_channels1024, kernel_size1)self.b7_2 nn.Dropout(p0.5)# Extra Feature Layers: block8~11self.b8_1 nn.Conv2d(in_channels1024, out_channels256, kernel_size1, padding1, pad_modepad)self.b8_2 nn.Conv2d(in_channels256, out_channels512, kernel_size3, stride2, pad_modevalid)self.b9_1 nn.Conv2d(in_channels512, out_channels128, kernel_size1, padding1, pad_modepad)self.b9_2 nn.Conv2d(in_channels128, out_channels256, kernel_size3, stride2, pad_modevalid)self.b10_1 nn.Conv2d(in_channels256, out_channels128, kernel_size1)self.b10_2 nn.Conv2d(in_channels128, out_channels256, kernel_size3, pad_modevalid)self.b11_1 nn.Conv2d(in_channels256, out_channels128, kernel_size1)self.b11_2 nn.Conv2d(in_channels128, out_channels256, kernel_size3, pad_modevalid)# boxesself.multi_box MultiBox()def construct(self, x):# VGG16 backbone: block1~5block4, x self.backbone(x)# SSD blocks: block6~7x self.b6_1(x) # 1024x self.b6_2(x)x self.b7_1(x) # 1024x self.b7_2(x)block7 x# Extra Feature Layers: block8~11x self.b8_1(x) # 256x self.b8_2(x) # 512block8 xx self.b9_1(x) # 128x self.b9_2(x) # 256block9 xx self.b10_1(x) # 128x self.b10_2(x) # 256block10 xx self.b11_1(x) # 128x self.b11_2(x) # 256block11 x# boxesmulti_feature (block4, block7, block8, block9, block10, block11)pred_loc, pred_label self.multi_box(multi_feature)if not self.training:pred_label ops.sigmoid(pred_label)pred_loc pred_loc.astype(ms.float32)pred_label pred_label.astype(ms.float32)return pred_loc, pred_label