【语义分割专题】语义分割相关工作--SegNet

segnet和unet区别_SegNet图像分割网络直观详解 简介SegNet是一个由剑桥大学团队开发的图像分割的开源项目,该项目可以对图像中的物体所在区域进行分割,例如车,马路,行人等,并且精确到像素级别。图像分割的实现由一个卷积神经网络构成,该网络主要有两部分组成:encoder与decoder。encoder是一个沿用VGG16的网络模型,主要对物体信息进行解析。decoder将解析后的信息对应成最终的图像形式,即每个像素都用对应其物体信息的颜色(或者... 阅读详情

SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation

SegNet新颖之处在于解码器对其较低分辨率的输入特征图进行上采样的方法。具体的说,解码器使用了在相应编码器的最好池化步骤中计算的池化索引来执行非线性上采样。这种房型消除了学习上采样的需要。经上采样后的特征图是稀疏的,因此随后使用可训练的卷积核进行卷积操作,生成密集的特征图。

SegNet也没有全连接层。SegNet和FCN的思路相似,不同之处在于解码器使用从编码器传输的较大池化索引(位置)对其输入进行非线性上采样,从而使得上采样不需要学习,生成稀疏特征映射。然后,使用可训练的卷积核进行卷积操作,生成密集的特征图。最后的解码器输出特征映射被送入soft-max分类器进行像素级分类。

创新点:

  • 1.提出encoder-decoder架构
  • 2.上采样方式:SegNet用记录的池化过程的位置信息替代直接的反卷积操作。即上采样的方式是采用unpooling来对decoder上的特征层进行上采样。即可以改善物体的边界;又可以减少计算参数量;并且模块化,易于在别的神经网络架构中使用

一些其他的网络架构:

  • 1.多阶段的训练
  • 2.网络先预训练
  • 3.使用额外的RPN来推断
  • 4.分类和分割联合
  • 5.将RNN将到FCN上或者在大的数据集上微调
  • 6.对输入图像的尺寸进行变换或对不同特征层的的特征图 提供一个局部和全局的内容

文章架构

  • 1.Introduction

  • 2.Releted recent literature

分析目前方法所存在的缺点,FCN的encoder(134M)和decode(0.5M)r的参数,不适合端到端的训练
而该文是将encoder的VGG16的全连接层丢弃掉并且不影响性能,但减轻了内存消耗以及改善了推理时间。受unsupervised feautre learning architecture

  • 3.SegNet architecture and analysisi

相比较DeconvNet有着大量的参数,更高的计算量,很难进行端到端的训练。
提出SegNet-Basic结构 权重初始化方式 “Delving deep into rectifiers:Surpassing human-level performance on imagenet classification stochastic gradient descent (SGD) with a fixed learning rate of 0.1 and momentum of 0.9
class balancing median frequency balancing

评测指标:global accuracy (G) which measures the percentage of pixels correctly classified in the dataset;class average accuracy © is the mean of the predictive accuracy over all classes mean intersection over union (mIoU) over all classes as used in the Pascal VOC12 challenge
F1-measure评测轮廓which involves computing the precision and recall values between the predicted and ground truth class boundary given a pixel tolerance distance.

  • 4.Evaluate

两个数据集上进行评测 数据集图 效果图 表格图 方法图

  • 5.Future work

时间内存以及计算资源; 可嵌入式设备

  • 6.Conclude

SegNet网络架构

在这里插入图片描述

两个易混淆的点:

  • 不管是encoder还是decoder,segnet中的卷积都是same填充的,所以都不改变输出特征的大小;大小的改变是通过池化层的上采样,下采样实现的;
  • 在decoder中,论文中称之为“反卷积”,实际上,这只是为了使用这个称呼而已,它并不是真正意义上的反卷积,它就是一个普通的卷积操作。

Segnet的encoder过程中,卷积的作用是提取特征,segnet使用的卷积为same卷积,即卷积后不改变图片大小;而在decoder过程中,同样使用same卷积,不过卷积的作用是为upsampling变大的图像丰富信息,使得在pooling过程丢失的信息可以通过学习在decoder中得到。

蓝色部分:普通的conv+bn+relu的标准结构
绿色部分:下采样过程,即pooling过程,这会使得图像变得更小,得到低分辨率的特征图;
红色部分:上采样过程,即upppoling过程,这会恢复到原来图像的大小,得到高分辨率的特征图,直到恢复原来的图像大小;

SegNet网络架构由encoder-decoder组成。

左边encoder部分用VGG-16进行提取特征并保存池化索引;使用的卷积为same卷积,即卷积后保持图像原始尺寸。通过pooling操作增大感受野

右边decoder部分是一个反卷积(这里的反卷积与卷积无区别)与Upsampling的过程,upsampling还原到图像原始尺寸,通过反卷积(同样是same卷积)为upsampling变大的图像丰富信息。

最后通过softmax,输出不同分类的最大值,得到最终分割图。

upsampling操作

在这里插入图片描述

如上图,将编码器中额每一个最大池化层的索引都存储起来,用于之后在解码器中使用那些存储的索引来对相应特征图进行上池化的操作。这有助于保持高频信息的完整性,但当对低分辨率的特征图进行去池化,它也会忽略邻近的信息。

上采样使用池化层索引的优势:

  • 提升边缘刻画度;
  • 减少训练的采纳数;
  • 这种模式可包含到任何的编码-解码网络中

关键代码池化层

class MaxPoolingWithArgmax2D(Layer):

    def __init__(
            self,
            pool_size=(2, 2),
            strides=(2, 2),
            padding='same',
            **kwargs):
        super(MaxPoolingWithArgmax2D, self).__init__(**kwargs)
        self.padding = padding
        self.pool_size = pool_size
        self.strides = strides

    def call(self, inputs, **kwargs):
        padding = self.padding
        pool_size = self.pool_size
        strides = self.strides
        if K.backend() == 'tensorflow':
            ksize = [1, pool_size[0], pool_size[1], 1]
            padding = padding.upper()
            strides = [1, strides[0], strides[1], 1]
            output, argmax = K.tf.nn.max_pool_with_argmax(
                inputs,
                ksize=ksize,
                strides=strides,
                padding=padding)
        else:
            errmsg = '{} backend is not supported for layer {}'.format(
                K.backend(), type(self).__name__)
            raise NotImplementedError(errmsg)
        argmax = K.cast(argmax, K.floatx())
        return [output, argmax]

    def compute_output_shape(self, input_shape):
        ratio = (1, 2, 2, 1)
        output_shape = [
            dim // ratio[idx]
            if dim is not None else None
            for idx, dim in enumerate(input_shape)]
        output_shape = tuple(output_shape)
        return [output_shape, output_shape]

    def compute_mask(self, inputs, mask=None):
        return 2 * [None]


class MaxUnpooling2D(Layer):
    def __init__(self, up_size=(2, 2), **kwargs):
        super(MaxUnpooling2D, self).__init__(**kwargs)
        self.up_size = up_size

    def call(self, inputs, output_shape=None):

        updates, mask = inputs[0], inputs[1]
        with K.tf.variable_scope(self.name):
            mask = K.cast(mask, 'int32')
            input_shape = K.tf.shape(updates, out_type='int32')
            #  calculation new shape
            if output_shape is None:
                output_shape = (
                    input_shape[0],
                    input_shape[1] * self.up_size[0],
                    input_shape[2] * self.up_size[1],
                    input_shape[3])

            # calculation indices for batch, height, width and feature maps
            one_like_mask = K.ones_like(mask, dtype='int32')
            batch_shape = K.concatenate(
                [[input_shape[0]], [1], [1], [1]],
                axis=0)
            batch_range = K.reshape(
                K.tf.range(output_shape[0], dtype='int32'),
                shape=batch_shape)
            b = one_like_mask * batch_range
            y = mask // (output_shape[2] * output_shape[3])
            x = (mask // output_shape[3]) % output_shape[2]
            feature_range = K.tf.range(output_shape[3], dtype='int32')
            f = one_like_mask * feature_range

            # transpose indices & reshape update values to one dimension
            updates_size = K.tf.size(updates)
            indices = K.transpose(K.reshape(
                K.stack([b, y, x, f]),
                [4, updates_size]))
            values = K.reshape(updates, [updates_size])
            ret = K.tf.scatter_nd(indices, values, output_shape)
            return ret

    def compute_output_shape(self, input_shape):
        mask_shape = input_shape[1]
        return (
            mask_shape[0],
            mask_shape[1] * self.up_size[0],
            mask_shape[2] * self.up_size[1],
            mask_shape[3]
        )


在网上搜集资料的过程中,发现有用UpSampling2D()函数来上采样将原始图片扩大,再用Conv2D()函数进行卷积操作

UpSampling只是简单的用复制插值对原张量进行修改,也就是平均池化的逆操作。

而FCN的上卷积的函数是Conv2DTranspose

VGG encoder层

def vgg_encoder(n_classes,input_height,input_width):

    assert  input_height % 32 == 0
    assert  input_width % 32 == 0

    img_input = Input(shape=(input_height, input_width, 3))

    # Block1
    x = layers.Conv2D(64,(3,3),activation="relu",padding="same",name="block1_conv1")(img_input)
    x = layers.Conv2D(64,(3,3),activation="relu",padding="same",name="block1_conv2")(x)
    x, mask1 = MaxPoolingWithArgmax2D(name="block1_pool")(x)
    f1 = x

    # Block2
    x = layers.Conv2D(128,(3,3),activation="relu",padding="same",name="block2_conv1")(x)
    x = layers.Conv2D(128,(3,3),activation="relu",padding="same",name="block2_conv2")(x)
    x, mask2 = MaxPoolingWithArgmax2D(name="block2_pool")(x)
    f2 = x

    # Block3
    x = layers.Conv2D(256,(3,3),activation="relu",padding="same",name="block3_conv1")(x)
    x = layers.Conv2D(256,(3,3),activation="relu",padding="same",name="block3_conv2")(x)
    x = layers.Conv2D(256,(3,3),activation="relu",padding="same",name="block3_conv3")(x)
    x, mask3 = MaxPoolingWithArgmax2D(name="block3_pool")(x)
    f3 = x

    # Block4
    x = layers.Conv2D(512,(3,3),activation="relu",padding="same",name="block4_conv1")(x)
    x = layers.Conv2D(512,(3,3),activation="relu",padding="same",name="block4_conv2")(x)
    x = layers.Conv2D(512,(3,3),activation="relu",padding="same",name="block4_conv3")(x)
    x, mask4 = MaxPoolingWithArgmax2D(name="block4_pool")(x)
    f4 = x

    # Block5
    x = layers.Conv2D(512,(3,3),activation="relu",padding="same",name="block5_conv1")(x)
    x = layers.Conv2D(512,(3,3),activation="relu",padding="same",name="block5_conv2")(x)
    x = layers.Conv2D(512,(3,3),activation="relu",padding="same",name="block5_conv3")(x)
    x,mask5 = MaxPoolingWithArgmax2D(name="block5_pool")(x)
    f5 = x

    return img_input, [f1, f2, f3, f4, f5],[mask1,mask2,mask3,mask4,mask5]

SegNet

def SegNet_decoder(n_classes,levels,masks):

    [f1,f2,f3,f4,f5] = levels
    [mask_1,mask_2,mask_3,mask_4,mask_5] = masks

    #解码层1
    unpool_1 = MaxUnpooling2D()([f5,mask_5])
    y = Conv2D(512,(3,3),padding="same")(unpool_1)
    y = BatchNormalization()(y)
    y = Activation("relu")(y)
    y = Conv2D(512, (3, 3), padding="same")(y)
    y = BatchNormalization()(y)
    y = Activation("relu")(y)
    y = Conv2D(512, (3, 3), padding="same")(y)
    y = BatchNormalization()(y)
    y = Activation("relu")(y)

    unpool_2 = MaxUnpooling2D()([y, mask_4])
    y = Conv2D(512, (3, 3), padding="same")(unpool_2)
    y = BatchNormalization()(y)
    y = Activation("relu")(y)
    y = Conv2D(512, (3, 3), padding="same")(y)
    y = BatchNormalization()(y)
    y = Activation("relu")(y)
    y = Conv2D(256, (3, 3), padding="same")(y)
    y = BatchNormalization()(y)
    y = Activation("relu")(y)

    unpool_3 = MaxUnpooling2D()([y, mask_3])
    y = Conv2D(256, (3, 3), padding="same")(unpool_3)
    y = BatchNormalization()(y)
    y = Activation("relu")(y)
    y = Conv2D(256, (3, 3), padding="same")(y)
    y = BatchNormalization()(y)
    y = Activation("relu")(y)
    y = Conv2D(128, (3, 3), padding="same")(y)
    y = BatchNormalization()(y)
    y = Activation("relu")(y)

    unpool_4 = MaxUnpooling2D()([y, mask_2])
    y = Conv2D(128, (3, 3), padding="same")(unpool_4)
    y = BatchNormalization()(y)
    y = Activation("relu")(y)
    y = Conv2D(64, (3, 3), padding="same")(y)
    y = BatchNormalization()(y)
    y = Activation("relu")(y)

    unpool_5 = MaxUnpooling2D()([y, mask_1])
    y = Conv2D(64, (3, 3), padding="same")(unpool_5)
    y = BatchNormalization()(y)
    y = Activation("relu")(y)

    y = Conv2D(n_classes, (1, 1), padding="same")(y)
    y = BatchNormalization()(y)
    y = Activation("relu")(y)

    y = Reshape((-1, n_classes))(y)
    y = Activation("softmax")(y)

    return y

def SegNet(n_classes,input_height,input_width):

    assert input_height % 32 == 0
    assert input_width % 32 == 0

    img_input,levels,masks =vgg_encoder(n_classes,input_height,input_width)

    output = SegNet_decoder(n_classes,levels,masks)

    Vgg_SegNet = Model(img_input,output)
    return Vgg_SegNet
语义分割系列3-SegNet(pytorch实现) 本文介绍了SegNet网络结构,基于pytorch构建了SegNet模型,并在Camvid数据集上复现。 阅读详情

相关推荐

计算机视觉-语义分割论文总结

文章目录FCN 2015创新点CNN VS FCNLoss Function网络结构缺点SegNet 2016DetailAdvantage结构CCNet 2018Why优点结构CA模块原理Affinity操作对D进行softmax操作Aggregation 操作RCCA ? 本文按照计算机视觉领域语义分割的相关论文的时间顺序排列,如果没有你想看的,直接关掉就好了 语义分割的两大核心问题:What...

柯同学要谦虚 1万+

深度学习之图像分割—— SegNet基本思想和网络结构以及论文补充

也就是每次Pooling,都会保存通过max选出的权值在2x2 filter中的相对位置,对于上图的6来说,6在粉色2x2 filter中的位置为(1,1)(index从0开始),黄色的3的index为(0,0)。,即卷积后保持图像原始尺寸;在网络框架中,SegNet,最后一个卷积层会输出所有的类别(包括other类),网络最后加上一个softmax层,由于是end to end, 所以softmax需要求出所有每一个像素在所有类别最大的概率,最为该像素的label,最终完成图像像素级别的分类。

qq_44832832的博客 9848

小结-语义分割

语义分割是将标签分配给图像中的像素。 一、图像分类与语义分割不同点? 池化层可以增加感受野,同时减少特征图的分辨率。这对于分类来说十分有效,其对象的空间位置无关重要,并能提取出更多抽象、突出的特征。然而,池化和带步长的卷积对语义分割是不利的,因为降低特征图分辨率意味着空间信息的丢失,如精确的边缘形状。因此语义分割提出的几种典型的网络都致力于恢复编码器中因降低分辨率而丢失的信息。 二、语义分割...

Shl_1024的博客 1238

【论文阅读】SegNet算法详解

SegNet论文详解 本文提出了一种用于语义分割的深度全卷积神经网络结构SegNet,其核心由一个编码器网络和一个对应的解码器网络以及一个像素级分类层组成。 本文的创新在于: 解码器使用在对应编码器的最大池化步骤中计算的池化索引来执行非线性上采样,这与反卷积相比,减少了参数量和运算量,而且消除了学习上采样的需要。 1. 网络结构 1.1 编码器 Conv层 通过卷积提取特征,其中使用的是same padding的卷积,不会改变特征图的尺寸 BN层 起到归一化的作用 ReLU层 起到激活函

想当咸鱼的猫 1万+

常用语义分割小样本模型

常用语义分割小样本模型 1.介绍 深度卷积神经网络在图像分类、目标检测、语义分割等许多视觉理解任务上都取得了重大突破。一个关键的原因是大规模数据集的可用性,比如ImageNet,这些数据集支持对深度模型的培训。然而,数据标记是昂贵的,特别是对于密集的预测任务,如语义分割和实例分割。此外,在对模型进行训练之后,很难将模型应用于新类的预测。与机器学习算法不同的是,人类只看到几个例子就能很容易地从图像中分割出一个新概念。人类和机器学习算法之间的差距激发了对小样本学习的研究,其目的是学习一个模型,可以很好地推广到具

吴建明wujianming_110117 3315

第92步 深度学习图像分割:SegNet建模

第92步 深度学习图像分割:SegNet建模

Jet4505的博客 2194

【个人整理】语义分割网络SegNet设计架构与设计思想

前言:SegNet语义分割网络是2015年的一篇论文,论文通篇所涉及到的基本理论很少,网络结构也不是很复杂,本文从SegNet的结构着手,分析一下SegNet的工作原理是涉及思想。 一、SetNet的相关资源 SegNet同样是基于FCN,修改VGG-16网络得到的语义分割网络,有两种SegNet,分别为正常版SegNet与贝叶斯版SegNet,同时SegNet作者根据网络的深度提供了...

MIss-Y的博客 5410

机器学习笔记 - 基于最简单的编码器/解码器架构SegNet进行语义分割

分割是计算机视觉的主要任务之一。 对于图像的每个像素,您必须指定类(包括背景)。 语义分割只告诉像素类,实例分割将类划分为不同的实例。 分割模型有不同的神经架构,但它们几乎所有架构都具有相同的结构。 第一部分是从输入图像中提取特征的编码器,第二部分是解码器,它将这些特征转换为具有相同高度和宽度以及一些通道数的图像,可能等于类别的数量。 最简单的编码器-解码器架构称为 SegNet。 它在编码器中使用带有卷积和池化的标准 CNN,在解码器中使用包括卷积和上采样的反卷积 CNN。

学以致用 知行合一 1690

【语义分割专题】语义分割相关工作--ENet网络相关工作

ENet: A Deep Neural Network Architecture for Real-Time Semantic Segmentation Paszke, A., Chaurasia, A., Kim, S., & Culurciello, E. (2016). ENet: A Deep Neural Network Architecture for Real-Time Semantic Segmentation. ArXiv, abs/1606.02147. # Initial

Mind_programmonkey的博客 870

复杂背景下计算机视觉模型害虫识别的比较研究(像素语义分割网络SegNet)

Abstract 农业被认为是世界各国的经济基础,新技术的发展有助于提高收获效率。自动驾驶汽车在农场用于播种、收获和施用农药等任务。然而,任何一个种植园的主要问题之一是害虫和疾病的鉴定,这对害虫控制和维护植物的健康至关重要。本文介绍并比较了三种计算机视觉害虫识别方法:以深度卷积神经网络(DCNN)为基准;层次深度卷积神经网络(HD-CNN),以提高相似类的预测;和像素语义分割网络(SegNet)。他们被测试了两种栽培,大豆和棉花。SegNet在很大程度上优于两种方法:DCNN、HD-CNN和SegNet的准

慕云 843

语义分割(研究现状、技术基础)

前言 语义分割的目标是输入图像的每个像素分配一个标签,即像素级别的物体分类任务,如下图所示, 其中一张场景图像及该场景对应的语义分割标签图像,道路所属的所有像素区域都被标注为紫色,即道路类。基于这一特性,它可以广泛地应用于人脸分割、医学图像处理和自动驾驶领域的感知应用。 一、国内外研究现状 1.1 通用语义分割 FCN:Fully Convolution Network(FCN)作为语义分割在深度学习领域的开山之作,它第一次将图像分类网絡的最后一层全连接层替换为一系列反卷积层,使得经过下采

黎国溥 1万+

语义分割入门

语义分割是什么? 语义分割是将标签或类别与图片的每个像素关联的一种深度学习算法。它用来识别构成可区分类别的像素集合。例如,自动驾驶汽车需要识别车辆、行人、交通信号、人行道和其他道路特征。 语义分割可用于多种应用场合,比如自动驾驶、医学成像和工业检测。 image 语义分割概述 语义分割的一个简单例子是将图像划分成两类。例如,在图 1 中,一幅图像显示一个人在海边,与之相配的版本显示分割为...

yanqianglifei的专栏 3499

Windows10 Qt下用MINGW 编译VTK-8.1.0

1. 材料准备(1) 下载VTK-8.1.0: https://www.vtk.org/download/(2) 下载TIFF库: http://gnuwin32.sourceforge.net/packages/tiff.htm(直接安装即可,注意选择路径不包含中文字符)2. 安装: (1) cmake配置: a. Module下配置:勾选下图所示的六项 b. Build 配置:勾选这里能够在b...

hit1524468的专栏 3893

SegNet:一种用于图像分割的深度卷积编码器解码器架构

是深度学习用于语义分割领域的开山之作,在传统卷积神经网络(CNN)的基础上进行了改进,传统 CNN 主要用于图像分类任务。它的结构通常包括卷积层、池化层和全连接层。在图像分类中,CNN 的输出是一个固定大小的向量(例如,1000 类分类任务的输出向量长度为 1000),表示输入图像属于各个类别的概率分布。全连接层的输入大小是固定的,这意味着输入图像的大小也必须固定。全卷积神经网络的核心思想是将传统 CNN 中的全连接层替换为卷积层,实现对任意大小输入图像的像素级处理。教程/讲解视频点击文末名片。

871

基于Claude AI的Dex个人操作系统:从零部署到高效工作流实战

在当今信息过载的时代,个人知识管理(PKM)和任务自动化成为提升效率的关键技术。传统PKM工具如Notion、Obsidian虽然提供了强大的信息存储能力,但本质上是被动的数据库,需要用户手动维护结构和链接,容易形成信息孤岛。其核心原理在于通过预设的文件夹结构和智能路由,实现信息的自动归类与关联。这种自动化同步机制的技术价值在于彻底消除重复劳动和决策疲劳,让用户从繁琐的信息整理中解放出来,专注于高价值思考。在实际应用场景中,它尤其适合需要处理大量会议、任务和人际关系的知识工作者,如产品经理、项目经理和团队领

weixin_42521558的博客 379

MATLAB机械臂轨迹规划:在关节空间中生成多项式轨迹以及 jtraj函数(内容超详细讲解)

matlab机器人仿真,关节空间多项式轨迹生成

qq_40969179的博客 1万+

语义分割-深度学习算法总结(2018)-论文翻译(附带相关数据集)

太优秀了,收藏用!转载自:https://www.cnblogs.com/Jie-Liang/archive/2017/06/29/6902375.html 论文原文地址:https://arxiv.org/abs/1704.06857 应用于语义分割问题的深度学习技术综述 摘要 应用场景:自动驾驶、室内导航、甚至虚拟现实与增强现实等。 一、引言 语义分割:(应用于静态2D图像、视频甚至3D数据、...

weixin_44474718的博客 7585

(入门向)在Ubuntu22.04.3安装Matlab2021b,以及无法安装在当前目录下的解决办法(见最后)

还有这个/usr/local是只读状态,我试过sudo chmod..去改那个文件的读,结果还是安装不了,我不是这个默认路径,因为它文件夹还是只读,于是我在matlab2021b下创了一个bin,并选上。输入完成后,依次按y,因为里面有三个文件,他会让你确定3次密码,直接yyy跳过即可。你可能会遇到装不下的情况,这个软件占30g,可是你分配给虚拟机就剩10g。,于是我去Downloads下建了一个matlab2021b文件夹,果然好使,3).此时,会提示你输入密码,因为这个rar是有密码的,

harrype的博客 7294

终极DS-SLAM安装教程:ROS、SegNet与OctoMap环境搭建全攻略

DS-SLAM是一个面向动态环境的完整鲁棒语义SLAM系统,能够显著减少动态对象(如行走的人和移动机器人)对位姿估计的影响。这个强大的语义视觉SLAM系统基于著名的ORB-SLAM2框架构建,集成了语义分割和稠密建图功能,为机器人导航和环境感知提供了完整的解决方案。 ## 🚀 环境准备与系统要求 在开始安装DS-SLAM之前,您需要确保系统满足以下基本要求。我们建议使用Ubuntu 14.0

gitblog_00515的博客 886

手把手教你学BSP(11.3)--BSP实例:基于Raspberry Pi 4 Model B的Linux BSP开发实例

通过以上步骤,我们完成了一个基于Raspberry Pi 4 Model B的Linux BSP开发过程,包括硬件初始化、设备驱动编写、Bootloader配置、内核配置和编译,以及最终映像的生成。每个步骤都非常重要,确保每一步都正确无误才能使整个系统正常运行。

MHD0815的博客 1014

paddle 43 用onnxruntime实现ppyoloe模型的部署(含python和c++版本)

PP-YOLOE+是PP-YOLOE模型的升级版,PP-YOLOE+_l在COCO test-dev2017达到了53.3的mAP, 同时其速度在Tesla V100上达到了78.1 FPS。PP-YOLOE+_s/m/x同样具有卓越的精度速度性价比。paddle官方只给出了基于paddle框架的部署案例,为了更好的部署,为此实现将paddle模型转换为onnx模型,然后在python下实现onnxruntime部署。后续会补充c++ onnxruntime部署

a486259的博客 1917

分割中的解码编码结构-SegNet(包含代码复现)

SegNet经典分割网络

shengweiit的博客 1389

直方图均衡化原理及matlab和opencv实现代码

详细分析了直方图均衡化的数学原理,配有matlab和opencv实现代码

qq_21603315的博客 4779

语义分割学习记录

语义分割经典网络记录 1、VGG-16 论文作者:http://www.robots.ox.ac.uk/~vgg/research/very_deep/ (哈佛Oxford) tf实现:https://www.cs.toronto.edu/~frossard/post/vgg16/ 网络具体配置图: 2、FCN 在VGG16基础上改进的(Skip Architectures for Segme...

weixin_43832437的博客 308

Mediatek NeuroPilot Yolov8量化

【代码】Mediatek NeuroPilot Yolov8模型转化。

sdrgtywretyeruet的专栏 348

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

语义分割基础知识

感谢深度之眼提供的课程,以下是学习过程中,整理的笔记。 1. 基本概念 从影像中推理出相关的语义或知识(从具体到抽象的过程)。用不同颜色把不同目标标注出来,起到断句的作用。 2. 概念辨析 语义分割 semantic segmentation 实例分割 instance segmentation: 与语义分割的区别: 不关注背景,不需要把背景的物体也一一分割出来,只关注自己对自己重要的部分,比如对于自动驾驶来说,需要把分割行人和骑车的优先级设置高一些,把分割楼房建筑的优先级设置低一些 语义分割会把

qq_37297763的博客 2122

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: 【语义分割专题】语义分割相关工作--FCN网络介绍
下一篇: 【语义分割专题】语义分割相关工作--UNet网络介绍
mind_programmonkey
mind_programmonkey 领域专家: 算法与数据结构技术领域 领域专家: 算法与数据结构技术领域
博客等级 码龄9年 4435粉丝 1111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mind_programmonkey

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值