精华内容
下载资源
问答
  • 区域的概念及特征
    千次阅读
    2019-08-23 22:29:14

    纹理特征三:GLSZM–灰度区域大小矩阵

    1. GLSZM 的解释与计算

    GLSZM,全称gray-level size zone matrix,中文名称弧度区域大小矩阵。
    概念描述: GLSZM与GLRLM(gray-level run-length matrix)类似,GLRLM是在一维方向上记录连续 j j j个像素值 i i i

    更多相关内容
  • 对此,文中通过引入直方图子区间对应区域的边缘复杂度概念,提出了一种描述图像特征区域边缘直方图方法.文章首先定义了区域边缘复杂度的概念,并提出以直方图各子区间的边缘复杂度作为空间权系数对各子区间进行加权,...
  • 区域经济发展战略的含义特征.docx
  • 高中地理第一章区域地理环境与人类活动第一节区域的基本含义区域的主要特征同步练习湘教版必修320180827349
  • 1专题11区域定位与区域地理特征分析1.区域含义。2.不同区域自然环境、人类活动的差异。3.不同发展阶段地理环境对人类生产和生活方式的影响。4.根据区域图判断区域的空间位置。结合区域图,综合分析区域
  • 基于多视点视图深度特征,提出一种通过简单块匹配运算划分多视点视图区域并估计区域视差的算法。首先基于深度对象的概念确定图像中具有不同深度的区域数量以及这些区域对应的区域视差,再根据误差最小化准则初步确定每...
  • 区域可持续发展是可持续发展在时间、空间和构成要素上的含义的具体化。信息特征分类是区域可持续发展研究的基础内容之一。区域可持续发展的信息特征具有时空性和复杂性的特点。在总结前人区域可持续发展相关研究的...
  • 图像区域特征

    千次阅读 2017-08-23 15:38:33
    以 Halcon 里支持的 Region 特征为基础,做概念总结形状特征

    以 Halcon 里支持的 Region 特征为基础,做概念总结


    形状特征

    1)圆度(Circularity)
    衡量一个形状接近圆的程度,取值为 [0, 1]

    Circularity=π2

    另一种算法是,统计边界点到中心的距离,根据方差反映圆度

    Halcon 对应上面两种思路有相应的算子:circularity、roundness

    2)紧密度(Compactness)
    参考 wikipedia,衡量一个形状紧致程度,取值为 [0, 1],对于圆,紧密度为 1

    Compactness=A22πi21+i22

    其中 A 为形状面积,i1 i2 为二阶矩: i1=IJi2image(i,j) i2=IJj2image(i,j)

    关于紧密度的一个比喻:用不同长度的绳子围成一个面积一定的区域,使用的绳子长度越短则紧密度越高。
               又由于圆的边缘没有转角,很光滑,因此紧密度又称为粗糙度

    Halcon 对应的算子为 compactness

    3)矩形度(Rectangularity)
    参考《图像处理基本算法 形状特征》,衡量一个形状接近矩形的程度,取值为 [0, 1]

    Rectangularity=AEr

    其中 A 为形状面积,Er为最小外接矩阵面积

    Halcon 对应算子为 rectangularity

    4)凸性(Convexity)
    参考文献【1】(顺便推荐作者关于凸性的研究主页),凸性的计算有很多种方法。这里介绍两种,第二种(Halcon用的这种)更为常见

    定义1:对于二维形状 S ,在上面随机选择AB两个点,统计线段 [AB] 上落在 S 内的点的个数

    定义2:对于二维形状S,令 CH(S) 为其最小外接凸形

    Convexity=Area(S)Area(CH(S))

    图1是 CH(S) 的一个示例

                     这里写图片描述
                          图1. 二维形状的外接凸形

    Halcon使用算子 convexity 计算凸率;使用 shape_trans 转换区域为凸包/最小外接圆/外接矩形

    5)偏心率(Eccentricity)
    参考章毓晋的《图像工程》,介绍一种平移、旋转和尺度不变的算法

    令三维形状的每个点坐标为 (xi,yi,zi) ,每个点的质量(图像可以理解为灰度值) mi ,有

    Eccentricity=pq=2[(A+B)(AB)2+4H2]2[(A+B)+(AB)2+4H2]

    其中 A=mi(y2i+z2i) B=mi(z2i+x2i) H=mixiyi

    Halcon 里是用其等效椭圆的长半轴除以短半轴计算的:eccentricity

    6)蓬松度(Bulkiness)
    参考Halcon13的文档,感觉跟紧密度相反,圆为1,越松散值越大

    Bulkiness=πRaRbA

    其中
    Ra=8(M20+M02+(M20M02)2+4M211)2Rb=8(M20+M02(M20M02)2+4M211)2

    其中 Mij 是二阶不变矩

    Halcon13文档里有以上特征的描述及图例


    区域特征

    1)区域面积
    就是像素点相加
    但区域一般是用形成编码表示,累加每行的行程就可以

    2)区域中心
    中心点 y=yi x=xi

    3)区域几何矩
    几何矩具有旋转、尺度不变性,应用在形状分类

    mp,q=ypxq

    =m0,0=y0x0
    =(m1,0,m0,1)=(1y1x0,1y0x1)
    =np,q=1ypxq
    =μp,q=1(yn1,0)p,(xn0,1)q

    4)等效椭圆
    区域的方向和范围可以用等效椭圆来表示
    等效椭圆的中心与区域中心一致,长半轴 r1 、短半轴 r2 和相对于x轴的夹角 θ 由二阶矩算出

    r1=2(μ2,0+μ0,2+(μ2,0μ0,2)2+4μ21,1)

    r2=2(μ2,0+μ0,2(μ2,0μ0,2)2+4μ21,1)

    θ=12arctan2μ1,1μ0,2μ2,0

    Halcon里对应的算子为 elliptic_axis()


    【1】J. Zunic, P.L. Rosin, “A New Convexity Measure for Polygons”, IEEE Transactions Pattern Analysis and Machine Intelligence, vol. 26, no. 7, pp. 923-934, 2004.


    展开全文
  • YOLOv3学习——特征提取与候选区域

    千次阅读 2022-02-12 19:55:54
    通过连续使用多层卷积和池化等操作,能得到语义含义更加丰富的特征图。在检测问题中,也使用卷积神经网络逐层提取图像特征,通过最终的输出特征图来表征物体位置和类别等信息。 YOLOv3算法使用的骨干网络是Darknet53...

    YOLOv3学习——特征提取


    前言

    卷积神经网络提取特征

    在上一节图像分类的课程中,我们已经学习过了通过卷积神经网络提取图像特征。通过连续使用多层卷积和池化等操作,能得到语义含义更加丰富的特征图。在检测问题中,也使用卷积神经网络逐层提取图像特征,通过最终的输出特征图来表征物体位置和类别等信息。

    YOLOv3算法使用的骨干网络是Darknet53。Darknet53网络的具体结构如 图1 所示,在ImageNet图像分类任务上取得了很好的成绩。在检测任务中,将图中C0后面的平均池化、全连接层和Softmax去掉,保留从输入到C0部分的网络结构,作为检测模型的基础网络结构,也称为骨干网络。YOLOv3模型会在骨干网络的基础上,再添加检测相关的网络模块。



    图1:Darknet53网络结构

    下面的程序是Darknet53骨干网络的实现代码,这里将上图中C0、C1、C2所表示的输出数据取出,并查看它们的形状分别是, C 0 [ 1 , 1024 , 20 , 20 ] C0 [1, 1024, 20, 20] C0[1,1024,20,20] C 1 [ 1 , 512 , 40 , 40 ] C1 [1, 512, 40, 40] C1[1,512,40,40] C 2 [ 1 , 256 , 80 , 80 ] C2 [1, 256, 80, 80] C2[1,256,80,80]

    • 名词解释:特征图的步幅(stride)

    在提取特征的过程中通常会使用步幅大于1的卷积或者池化,导致后面的特征图尺寸越来越小,特征图的步幅等于输入图片尺寸除以特征图尺寸。例如:C0的尺寸是 20 × 20 20\times20 20×20,原图尺寸是 640 × 640 640\times640 640×640,则C0的步幅是 640 20 = 32 \frac{640}{20}=32 20640=32。同理,C1的步幅是16,C2的步幅是8。

    import paddle
    import paddle.nn.functional as F
    import numpy as np
    
    class ConvBNLayer(paddle.nn.Layer):
        def __init__(self, ch_in, ch_out, 
                     kernel_size=3, stride=1, groups=1,
                     padding=0, act="leaky"):
            super(ConvBNLayer, self).__init__()
        
            self.conv = paddle.nn.Conv2D(
                in_channels=ch_in,
                out_channels=ch_out,
                kernel_size=kernel_size,
                stride=stride,
                padding=padding,
                groups=groups,
                weight_attr=paddle.ParamAttr(
                    initializer=paddle.nn.initializer.Normal(0., 0.02)),
                bias_attr=False)
        
            self.batch_norm = paddle.nn.BatchNorm2D(
                num_features=ch_out,
                weight_attr=paddle.ParamAttr(
                    initializer=paddle.nn.initializer.Normal(0., 0.02),
                    regularizer=paddle.regularizer.L2Decay(0.)),
                bias_attr=paddle.ParamAttr(
                    initializer=paddle.nn.initializer.Constant(0.0),
                    regularizer=paddle.regularizer.L2Decay(0.)))
            self.act = act
    
            
        def forward(self, inputs):
            out = self.conv(inputs)
            out = self.batch_norm(out)
            if self.act == 'leaky':
                out = F.leaky_relu(x=out, negative_slope=0.1)
            return out
        
    class DownSample(paddle.nn.Layer):
        # 下采样,图片尺寸减半,具体实现方式是使用stirde=2的卷积
        def __init__(self,
                     ch_in,
                     ch_out,
                     kernel_size=3,
                     stride=2,
                     padding=1):
    
            super(DownSample, self).__init__()
    
            self.conv_bn_layer = ConvBNLayer(
                ch_in=ch_in,
                ch_out=ch_out,
                kernel_size=kernel_size,
                stride=stride,
                padding=padding)
            self.ch_out = ch_out
        def forward(self, inputs):
            out = self.conv_bn_layer(inputs)
            return out
    
    class BasicBlock(paddle.nn.Layer):
        """
        基本残差块的定义,输入x经过两层卷积,然后接第二层卷积的输出和输入x相加
        """
        def __init__(self, ch_in, ch_out):
            super(BasicBlock, self).__init__()
    
            self.conv1 = ConvBNLayer(
                ch_in=ch_in,
                ch_out=ch_out,
                kernel_size=1,
                stride=1,
                padding=0
                )
            self.conv2 = ConvBNLayer(
                ch_in=ch_out,
                ch_out=ch_out*2,
                kernel_size=3,
                stride=1,
                padding=1
                )
        def forward(self, inputs):
            conv1 = self.conv1(inputs)
            conv2 = self.conv2(conv1)
            out = paddle.add(x=inputs, y=conv2)
            return out
    
         
    class LayerWarp(paddle.nn.Layer):
        """
        添加多层残差块,组成Darknet53网络的一个层级
        """
        def __init__(self, ch_in, ch_out, count, is_test=True):
            super(LayerWarp,self).__init__()
    
            self.basicblock0 = BasicBlock(ch_in,
                ch_out)
            self.res_out_list = []
            for i in range(1, count):
                res_out = self.add_sublayer("basic_block_%d" % (i), # 使用add_sublayer添加子层
                    BasicBlock(ch_out*2,
                        ch_out))
                self.res_out_list.append(res_out)
    
        def forward(self,inputs):
            y = self.basicblock0(inputs)
            for basic_block_i in self.res_out_list:
                y = basic_block_i(y)
            return y
    
    # DarkNet 每组残差块的个数,来自DarkNet的网络结构图
    DarkNet_cfg = {53: ([1, 2, 8, 8, 4])}
    
    class DarkNet53_conv_body(paddle.nn.Layer):
        def __init__(self):
            super(DarkNet53_conv_body, self).__init__()
            self.stages = DarkNet_cfg[53]
            self.stages = self.stages[0:5]
    
            # 第一层卷积
            self.conv0 = ConvBNLayer(
                ch_in=3,
                ch_out=32,
                kernel_size=3,
                stride=1,
                padding=1)
    
            # 下采样,使用stride=2的卷积来实现
            self.downsample0 = DownSample(
                ch_in=32,
                ch_out=32 * 2)
    
            # 添加各个层级的实现
            self.darknet53_conv_block_list = []
            self.downsample_list = []
            for i, stage in enumerate(self.stages):
                conv_block = self.add_sublayer(
                    "stage_%d" % (i),
                    LayerWarp(32*(2**(i+1)),
                    32*(2**i),
                    stage))
                self.darknet53_conv_block_list.append(conv_block)
            # 两个层级之间使用DownSample将尺寸减半
            for i in range(len(self.stages) - 1):
                downsample = self.add_sublayer(
                    "stage_%d_downsample" % i,
                    DownSample(ch_in=32*(2**(i+1)),
                        ch_out=32*(2**(i+2))))
                self.downsample_list.append(downsample)
    
        def forward(self,inputs):
            out = self.conv0(inputs)
            #print("conv1:",out.numpy())
            out = self.downsample0(out)
            #print("dy:",out.numpy())
            blocks = []
            for i, conv_block_i in enumerate(self.darknet53_conv_block_list): #依次将各个层级作用在输入上面
                out = conv_block_i(out)
                blocks.append(out)
                if i < len(self.stages) - 1:
                    out = self.downsample_list[i](out)
            return blocks[-1:-4:-1] # 将C0, C1, C2作为返回值
    
    
    # 查看Darknet53网络输出特征图
    import numpy as np
    backbone = DarkNet53_conv_body()
    x = np.random.randn(1, 3, 640, 640).astype('float32')
    x = paddle.to_tensor(x)
    C0, C1, C2 = backbone(x)
    print(C0.shape, C1.shape, C2.shape)
    

    根据输出特征图计算预测框位置和类别

    YOLOv3中对每个预测框计算逻辑如下:

    • 预测框是否包含物体。也可理解为objectness=1的概率是多少,可以用网络输出一个实数 x x x,可以用 S i g m o i d ( x ) Sigmoid(x) Sigmoid(x)表示objectness为正的概率 P o b j P_{obj} Pobj

    • 预测物体位置和形状。物体位置和形状 t x , t y , t w , t h t_x, t_y, t_w, t_h tx,ty,tw,th可以用网络输出4个实数来表示 t x , t y , t w , t h t_x, t_y, t_w, t_h tx,ty,tw,th

    • 预测物体类别。预测图像中物体的具体类别是什么,或者说其属于每个类别的概率分别是多少。总的类别数为C,需要预测物体属于每个类别的概率 ( P 1 , P 2 , . . . , P C ) (P_1, P_2, ..., P_C) (P1,P2,...,PC),可以用网络输出C个实数 ( x 1 , x 2 , . . . , x C ) (x_1, x_2, ..., x_C) (x1,x2,...,xC),对每个实数分别求Sigmoid函数,让 P i = S i g m o i d ( x i ) P_i = Sigmoid(x_i) Pi=Sigmoid(xi),则可以表示出物体属于每个类别的概率。

    对于一个预测框,网络需要输出 ( 5 + C ) (5 + C) (5+C)个实数来表征它是否包含物体、位置和形状尺寸以及属于每个类别的概率。

    由于我们在每个小方块区域都生成了K个预测框,则所有预测框一共需要网络输出的预测值数目是:

    [ K ( 5 + C ) ] × m × n [K(5 + C)] \times m \times n [K(5+C)]×m×n

    还有更重要的一点是网络输出必须要能区分出小方块区域的位置来,不能直接将特征图连接一个输出大小为 [ K ( 5 + C ) ] × m × n [K(5 + C)] \times m \times n [K(5+C)]×m×n的全连接层。

    建立输出特征图与预测框之间的关联

    现在观察特征图,经过多次卷积核池化之后,其步幅stride=32, 640 × 480 640 \times 480 640×480大小的输入图片变成了 20 × 15 20\times15 20×15的特征图;而小方块区域的数目正好是 20 × 15 20\times15 20×15,也就是说可以让特征图上每个像素点分别跟原图上一个小方块区域对应。这也是为什么我们最开始将小方块区域的尺寸设置为32的原因,这样可以巧妙的将小方块区域跟特征图上的像素点对应起来,解决了空间位置的对应关系。



    图2:特征图C0与小方块区域形状对比

    下面需要将像素点 ( i , j ) (i,j) (i,j)与第i行第j列的小方块区域所需要的预测值关联起来,每个小方块区域产生K个预测框,每个预测框需要 ( 5 + C ) (5 + C) (5+C)个实数预测值,则每个像素点相对应的要有 K ( 5 + C ) K(5 + C) K(5+C)个实数。为了解决这一问题,对特征图进行多次卷积,并将最终的输出通道数设置为 K ( 5 + C ) K(5 + C) K(5+C),即可将生成的特征图与每个预测框所需要的预测值巧妙的对应起来。当然,这种对应是为了将骨干网络提取的特征对接输出层来形成Loss。实际中,这几个尺寸可以随着任务数据分布的不同而调整,只要保证特征图输出尺寸(控制卷积核和下采样)和输出层尺寸(控制小方块区域的大小)相同即可。

    骨干网络的输出特征图是C0,下面的程序是对C0进行多次卷积以得到跟预测框相关的特征图P0。

    class YoloDetectionBlock(paddle.nn.Layer):
        # define YOLOv3 detection head
        # 使用多层卷积和BN提取特征
        def __init__(self,ch_in,ch_out,is_test=True):
            super(YoloDetectionBlock, self).__init__()
    
            assert ch_out % 2 == 0, \
                "channel {} cannot be divided by 2".format(ch_out)
    
            self.conv0 = ConvBNLayer(
                ch_in=ch_in,
                ch_out=ch_out,
                kernel_size=1,
                stride=1,
                padding=0)
            self.conv1 = ConvBNLayer(
                ch_in=ch_out,
                ch_out=ch_out*2,
                kernel_size=3,
                stride=1,
                padding=1)
            self.conv2 = ConvBNLayer(
                ch_in=ch_out*2,
                ch_out=ch_out,
                kernel_size=1,
                stride=1,
                padding=0)
            self.conv3 = ConvBNLayer(
                ch_in=ch_out,
                ch_out=ch_out*2,
                kernel_size=3,
                stride=1,
                padding=1)
            self.route = ConvBNLayer(
                ch_in=ch_out*2,
                ch_out=ch_out,
                kernel_size=1,
                stride=1,
                padding=0)
            self.tip = ConvBNLayer(
                ch_in=ch_out,
                ch_out=ch_out*2,
                kernel_size=3,
                stride=1,
                padding=1)
        def forward(self, inputs):
            out = self.conv0(inputs)
            out = self.conv1(out)
            out = self.conv2(out)
            out = self.conv3(out)
            route = self.route(out)
            tip = self.tip(route)
            return route, tip
    
    
    NUM_ANCHORS = 3
    NUM_CLASSES = 7
    num_filters=NUM_ANCHORS * (NUM_CLASSES + 5)
    
    backbone = DarkNet53_conv_body()
    detection = YoloDetectionBlock(ch_in=1024, ch_out=512)
    conv2d_pred = paddle.nn.Conv2D(in_channels=1024, out_channels=num_filters, kernel_size=1)
    
    x = np.random.randn(1, 3, 640, 640).astype('float32')
    x = paddle.to_tensor(x)
    C0, C1, C2 = backbone(x)
    route, tip = detection(C0)
    P0 = conv2d_pred(tip)
    
    print(P0.shape)
    

    如上面的代码所示,可以由特征图C0生成特征图P0,P0的形状是 [ 1 , 36 , 20 , 20 ] [1, 36, 20, 20] [1,36,20,20]。每个小方块区域生成的锚框或者预测框的数量是3,物体类别数目是7,每个区域需要的预测值个数是 3 × ( 5 + 7 ) = 36 3 \times (5 + 7) = 36 3×(5+7)=36,正好等于P0的输出通道数。

    P 0 [ t , 0 : 12 , i , j ] P0[t, 0:12, i, j] P0[t,0:12,i,j]与输入的第t张图片上小方块区域 ( i , j ) (i, j) (i,j)第1个预测框所需要的12个预测值对应, P 0 [ t , 12 : 24 , i , j ] P0[t, 12:24, i, j] P0[t,12:24,i,j]与输入的第t张图片上小方块区域 ( i , j ) (i, j) (i,j)第2个预测框所需要的12个预测值对应, P 0 [ t , 24 : 36 , i , j ] P0[t, 24:36, i, j] P0[t,24:36,i,j]与输入的第t张图片上小方块区域 ( i , j ) (i, j) (i,j)第3个预测框所需要的12个预测值对应。

    P 0 [ t , 0 : 4 , i , j ] P0[t, 0:4, i, j] P0[t,0:4,i,j]与输入的第t张图片上小方块区域 ( i , j ) (i, j) (i,j)第1个预测框的位置对应, P 0 [ t , 4 , i , j ] P0[t, 4, i, j] P0[t,4,i,j]与输入的第t张图片上小方块区域 ( i , j ) (i, j) (i,j)第1个预测框的objectness对应, P 0 [ t , 5 : 12 , i , j ] P0[t, 5:12, i, j] P0[t,5:12,i,j]与输入的第t张图片上小方块区域 ( i , j ) (i, j) (i,j)第1个预测框的类别对应。

    图3 所示,通过这种方式可以巧妙的将网络输出特征图,与每个小方块区域生成的预测框对应起来了。


    图3:特征图P0与候选区域的关联

    计算预测框是否包含物体的概率



    图:特征图P0与候选区域的关联

    根据前面的分析,$P0[t, 4, i, j]$与输入的第t张图片上小方块区域$(i, j)$第1个预测框的objectness对应,$P0[t, 4+12, i, j]$与第2个预测框的objectness对应,...,则可以使用下面的程序将objectness相关的预测取出,并使用`paddle.nn.functional.sigmoid`计算输出概率。
    NUM_ANCHORS = 3
    NUM_CLASSES = 7
    num_filters=NUM_ANCHORS * (NUM_CLASSES + 5)
    
    backbone = DarkNet53_conv_body()
    detection = YoloDetectionBlock(ch_in=1024, ch_out=512)
    conv2d_pred = paddle.nn.Conv2D(in_channels=1024, out_channels=num_filters,  kernel_size=1)
    
    x = np.random.randn(1, 3, 640, 640).astype('float32')
    x = paddle.to_tensor(x)
    C0, C1, C2 = backbone(x)
    route, tip = detection(C0)
    P0 = conv2d_pred(tip)
    
    reshaped_p0 = paddle.reshape(P0, [-1, NUM_ANCHORS, NUM_CLASSES + 5, P0.shape[2], P0.shape[3]])
    pred_objectness = reshaped_p0[:, :, 4, :, :]
    pred_objectness_probability = F.sigmoid(pred_objectness)
    print(pred_objectness.shape, pred_objectness_probability.shape)
    

    上面的输出程序显示,预测框是否包含物体的概率pred_objectness_probability,其数据形状是[1, 3, 20, 20],与我们上面提到的预测框个数一致,数据大小在0~1之间,表示预测框为正样本的概率。

    计算预测框位置坐标

    P 0 [ t , 0 : 4 , i , j ] P0[t, 0:4, i, j] P0[t,0:4,i,j]与输入的第 t t t张图片上小方块区域 ( i , j ) (i, j) (i,j)第1个预测框的位置对应, P 0 [ t , 12 : 16 , i , j ] P0[t, 12:16, i, j] P0[t,12:16,i,j]与第2个预测框的位置对应,依此类推,则使用下面的程序可以从 P 0 P0 P0中取出跟预测框位置相关的预测值。

    NUM_ANCHORS = 3
    NUM_CLASSES = 7
    num_filters=NUM_ANCHORS * (NUM_CLASSES + 5)
    
    backbone = DarkNet53_conv_body()
    detection = YoloDetectionBlock(ch_in=1024, ch_out=512)
    conv2d_pred =  paddle.nn.Conv2D(in_channels=1024, out_channels=num_filters,  kernel_size=1)
    
    x = np.random.randn(1, 3, 640, 640).astype('float32')
    x = paddle.to_tensor(x)
    C0, C1, C2 = backbone(x)
    route, tip = detection(C0)
    P0 = conv2d_pred(tip)
    
    
    reshaped_p0 = paddle.reshape(P0, [-1, NUM_ANCHORS, NUM_CLASSES + 5, P0.shape[2], P0.shape[3]])
    pred_objectness = reshaped_p0[:, :, 4, :, :]
    pred_objectness_probability = F.sigmoid(pred_objectness)
    
    pred_location = reshaped_p0[:, :, 0:4, :, :]
    print(pred_location.shape)
    
    

    网络输出值是 ( t x , t y , t w , t h ) (t_x, t_y, t_w, t_h) (tx,ty,tw,th),还需要将其转化为 ( x 1 , y 1 , x 2 , y 2 ) (x_1, y_1, x_2, y_2) (x1,y1,x2,y2)这种形式的坐标表示。使用飞桨paddle.vision.ops.yolo_box API可以直接计算出结果,但为了给读者更清楚的展示算法的实现过程,我们使用Numpy来实现这一过程。

    # 定义Sigmoid函数
    def sigmoid(x):
        return 1./(1.0 + np.exp(-x))
    
    # 将网络特征图输出的[tx, ty, th, tw]转化成预测框的坐标[x1, y1, x2, y2]
    def get_yolo_box_xxyy(pred, anchors, num_classes, downsample):
        """
        pred是网络输出特征图转化成的numpy.ndarray
        anchors 是一个list。表示锚框的大小,
                    例如 anchors = [116, 90, 156, 198, 373, 326],表示有三个锚框,
                    第一个锚框大小[w, h]是[116, 90],第二个锚框大小是[156, 198],第三个锚框大小是[373, 326]
        """
        batchsize = pred.shape[0]
        num_rows = pred.shape[-2]
        num_cols = pred.shape[-1]
    
        input_h = num_rows * downsample
        input_w = num_cols * downsample
    
        num_anchors = len(anchors) // 2
    
        # pred的形状是[N, C, H, W],其中C = NUM_ANCHORS * (5 + NUM_CLASSES)
        # 对pred进行reshape
        pred = pred.reshape([-1, num_anchors, 5+num_classes, num_rows, num_cols])
        pred_location = pred[:, :, 0:4, :, :]
        pred_location = np.transpose(pred_location, (0,3,4,1,2))
        anchors_this = []
        for ind in range(num_anchors):
            anchors_this.append([anchors[ind*2], anchors[ind*2+1]])
        anchors_this = np.array(anchors_this).astype('float32')
        
        # 最终输出数据保存在pred_box中,其形状是[N, H, W, NUM_ANCHORS, 4],
        # 其中最后一个维度4代表位置的4个坐标
        pred_box = np.zeros(pred_location.shape)
        for n in range(batchsize):
            for i in range(num_rows):
                for j in range(num_cols):
                    for k in range(num_anchors):
                        pred_box[n, i, j, k, 0] = j
                        pred_box[n, i, j, k, 1] = i
                        pred_box[n, i, j, k, 2] = anchors_this[k][0]
                        pred_box[n, i, j, k, 3] = anchors_this[k][1]
    
        # 这里使用相对坐标,pred_box的输出元素数值在0.~1.0之间
        pred_box[:, :, :, :, 0] = (sigmoid(pred_location[:, :, :, :, 0]) + pred_box[:, :, :, :, 0]) / num_cols
        pred_box[:, :, :, :, 1] = (sigmoid(pred_location[:, :, :, :, 1]) + pred_box[:, :, :, :, 1]) / num_rows
        pred_box[:, :, :, :, 2] = np.exp(pred_location[:, :, :, :, 2]) * pred_box[:, :, :, :, 2] / input_w
        pred_box[:, :, :, :, 3] = np.exp(pred_location[:, :, :, :, 3]) * pred_box[:, :, :, :, 3] / input_h
    
        # 将坐标从xywh转化成xyxy
        pred_box[:, :, :, :, 0] = pred_box[:, :, :, :, 0] - pred_box[:, :, :, :, 2] / 2.
        pred_box[:, :, :, :, 1] = pred_box[:, :, :, :, 1] - pred_box[:, :, :, :, 3] / 2.
        pred_box[:, :, :, :, 2] = pred_box[:, :, :, :, 0] + pred_box[:, :, :, :, 2]
        pred_box[:, :, :, :, 3] = pred_box[:, :, :, :, 1] + pred_box[:, :, :, :, 3]
    
        pred_box = np.clip(pred_box, 0., 1.0)
    
        return pred_box
    
    
    

    通过调用上面定义的get_yolo_box_xxyy函数,可以从 P 0 P0 P0计算出预测框坐标来,具体程序如下:

    NUM_ANCHORS = 3
    NUM_CLASSES = 7
    num_filters=NUM_ANCHORS * (NUM_CLASSES + 5)
    
    backbone = DarkNet53_conv_body()
    detection = YoloDetectionBlock(ch_in=1024, ch_out=512)
    conv2d_pred = paddle.nn.Conv2D(in_channels=1024, out_channels=num_filters,  kernel_size=1)
    
    x = np.random.randn(1, 3, 640, 640).astype('float32')
    x = paddle.to_tensor(x)
    C0, C1, C2 = backbone(x)
    route, tip = detection(C0)
    P0 = conv2d_pred(tip)
    
    reshaped_p0 = paddle.reshape(P0, [-1, NUM_ANCHORS, NUM_CLASSES + 5, P0.shape[2], P0.shape[3]])
    pred_objectness = reshaped_p0[:, :, 4, :, :]
    pred_objectness_probability = F.sigmoid(pred_objectness)
    
    pred_location = reshaped_p0[:, :, 0:4, :, :]
    
    # anchors包含了预先设定好的锚框尺寸
    anchors = [116, 90, 156, 198, 373, 326]
    # downsample是特征图P0的步幅
    pred_boxes = get_yolo_box_xxyy(P0.numpy(), anchors, num_classes=7, downsample=32) # 由输出特征图P0计算预测框位置坐标
    print(pred_boxes.shape)
    

    上面程序计算出来的pred_boxes的形状是 [ N , H , W , n u m _ a n c h o r s , 4 ] [N, H, W, num\_anchors, 4] [N,H,W,num_anchors,4],坐标格式是 [ x 1 , y 1 , x 2 , y 2 ] [x_1, y_1, x_2, y_2] [x1,y1,x2,y2],数值在0~1之间,表示相对坐标。

    计算物体属于每个类别概率

    P 0 [ t , 5 : 12 , i , j ] P0[t, 5:12, i, j] P0[t,5:12,i,j]与输入的第 t t t张图片上小方块区域 ( i , j ) (i, j) (i,j)第1个预测框包含物体的类别对应, P 0 [ t , 17 : 24 , i , j ] P0[t, 17:24, i, j] P0[t,17:24,i,j]与第2个预测框的类别对应,依此类推,则使用下面的程序可以从 P 0 P0 P0中取出那些跟预测框类别相关的预测值。

    NUM_ANCHORS = 3
    NUM_CLASSES = 7
    num_filters=NUM_ANCHORS * (NUM_CLASSES + 5)
    
    backbone = DarkNet53_conv_body()
    detection = YoloDetectionBlock(ch_in=1024, ch_out=512)
    conv2d_pred = paddle.nn.Conv2D(in_channels=1024, out_channels=num_filters,  kernel_size=1)
    
    x = np.random.randn(1, 3, 640, 640).astype('float32')
    x = paddle.to_tensor(x)
    C0, C1, C2 = backbone(x)
    route, tip = detection(C0)
    P0 = conv2d_pred(tip)
    
    reshaped_p0 = paddle.reshape(P0, [-1, NUM_ANCHORS, NUM_CLASSES + 5, P0.shape[2], P0.shape[3]])
    # 取出与objectness相关的预测值
    pred_objectness = reshaped_p0[:, :, 4, :, :]
    pred_objectness_probability = F.sigmoid(pred_objectness)
    # 取出与位置相关的预测值
    pred_location = reshaped_p0[:, :, 0:4, :, :]
    # 取出与类别相关的预测值
    pred_classification = reshaped_p0[:, :, 5:5+NUM_CLASSES, :, :]
    pred_classification_probability = F.sigmoid(pred_classification)
    print(pred_classification.shape)
    

    上面的程序通过 P 0 P0 P0计算出了预测框包含的物体所属类别的概率,pred_classification_probability的形状是 [ 1 , 3 , 7 , 20 , 20 ] [1, 3, 7, 20, 20] [1,3,7,20,20],数值在0~1之间。

    展开全文
  • 颜色特征提取方法

    2021-01-20 06:35:42
    比如通过手工标记区域提取一个特定区域(region)的颜色特征,用该区域在一个颜色空间三个分量各自的平均值表示,或者可以建立三个颜色直方图等方法。下面我们介绍一下颜色直方图和颜色矩的概念。颜色直方图:颜色...
  • 在图像处理当中对图像进行预处理,获得感兴趣的区域,可以提高图像处理的速度;...在halcon 中 求Region指定特征值:region_features(Regions : : Features : Value)然后就可以根据获取的特征值选择区域:sele...

    在图像处理当中对图像进行预处理,获得感兴趣的区域,可以提高图像处理的速度;

    当我们想要提取Region时,图像简单处理后,往往存在几个类似的Region,此时,需要根据Region的一些特殊特征,来选择指定的Region。

    在halcon 中 求Region指定特征值:region_features(Regions : : Features : Value)

    然后就可以根据获取的特征值选择区域:select_shape(Regions: SelectedRegions : Features, Operation, Min, Max : )

    图像区域特征众多,对每个特征的理解,是使用前面两个函数的前提。下面表格罗列出的区域特征说明

    Region特征一览:特征英译取值范围

    AreaArea of the object区域的面积,可通过area_center得到

    RowRow index of the center中心点的行坐标,可通过area_center得到

    columnColumn index of the center中心点的列坐标,可通过area_center得到

    widthWidth of the region区域的宽度,参考inner_rectangle1,得到的参数

    heightHeight of the region区域的高度,参考inner_rectangle1,得到的参数

    row1Row index of upper left corner左上角行坐标,参考inner_rectangle1,得到的参数

    column1Column index of upper left corner左上角列坐标,参考inner_rectangle1,得到的参数

    row2Row index of lower right corner右下角行坐标,参考inner_rectangle1,得到的参数

    column2Column index of lower right corner右下角列坐标,参考inner_rectangle1,得到的参数

    circularityCircularity圆度,可通过circularity得到0~1

    compactnessCompactness紧密度,可通过compactness得到0~1

    contlengthTotal length of contour轮廓线总长,可通过contlength得到

    convexityConvexity凸度,最外全部像素点围成的面积与原始面积的比值,可百度查阅凸度概念,可通过convexity得到

    rectangularityRectangularity矩形度,可通过rectangularity得到0~1

    RaMain radius of the equivalent ellipse等效椭圆长轴半径长度,通过elliptic_axis得到

    RbSecondary radius of the equivalent ellipse等效椭圆短轴半径长度,通过elliptic_axis得到

    PhiOrientation of the equivalent ellipse等效椭圆方向,通过elliptic_axis得到

    anisometryAnisometry椭圆离心率,Ra/Rb长轴与短轴的比值

    bulkinessBulkiness椭圆蓬松度π*Ra*Rb/A,A为面积可用area_center获得

    struct_factorStructur Factor椭圆结构系数,Anisometry*Bulkiness-1

    outer_radiusRadius of smallest surrounding circle最小外接圆半径,可用smallest_circle获取圆中心与半径,绘制圆查看效果

    inner_radiusRadius of largest inner circle最大内接圆半径,可用inner_circle,获取参数,绘制圆查看效果

    inner_widthWidth of the largest axis-parallel rectangle that fits  into the region最大轴平行内接矩形宽度,可用inner_rectangle1获取参数,绘制矩形查看效果

    inner_heightHeight of the largest axis-parallel rectangle that fits  into the region最大轴平行内接矩形高度,可用inner_rectangle1获取参数,绘制矩形查看效果

    dist_meanMean distance from the region border to the center区域边界到中心的平均距离,roundness获得

    dist_deviationDeviation of the distance from the region border from  the center区域边界到中心距离的偏差,roundness获得

    roundnessRoundness圆度,与circularity计算方法不同,roundness获得

    num_sidesNumber of polygon sides多边形边数,roundness获得

    connect_numNumber of connection components连通数,connect_and_holes获得

    holes_numNumber of holes区域内洞数,connect_and_holes获得

    area_holesArea of the holes of the object所有洞的面积之和,area_holes获得

    max_diameterMaximum diameter of the region区域最大直径,diameter_region获得

    orientationOrientation of the region区域方向,orientation_region获得

    euler_numberEuler number欧拉数,即连通数和洞数的差,euler_number获得

    rect2_phiOrientation of the smallest surrounding rectangle最小外接矩形的方向,smallest_rectangle2获得

    rect2_len1Half the length of the smallest surrounding rectangle最小外接矩形高一半,smallest_rectangle2获得

    rect2_len2Half the width of the smallest surrounding rectangle最小外接矩形宽一半,smallest_rectangle2获得

    moments_m11Geometric moments of the region几何矩

    moments_m20Geometric moments of the region几何矩

    moments_m02Geometric moments of the region几何矩

    moments_iaGeometric moments of the region几何矩

    moments_ibGeometric moments of the region几何矩

    moments_m11_invarGeometric moments of the region几何矩

    moments_m20_invarGeometric moments of the region几何矩

    moments_m02_invarGeometric moments of the region几何矩

    moments_phi1Geometric moments of the region几何矩

    moments_phi2Geometric moments of the region几何矩

    moments_m21Geometric moments of the region几何矩

    moments_m12Geometric moments of the region几何矩

    moments_m03Geometric moments of the region几何矩

    moments_m30Geometric moments of the region几何矩

    moments_m21_invarGeometric moments of the region几何矩

    moments_m12_invarGeometric moments of the region几何矩

    moments_m03_invarGeometric moments of the region几何矩

    moments_m30_invarGeometric moments of the region几何矩

    moments_i1Geometric moments of the region几何矩

    moments_i2Geometric moments of the region几何矩

    moments_i3Geometric moments of the region几何矩

    moments_i4Geometric moments of the region几何矩

    moments_psi1Geometric moments of the region几何矩

    moments_psi2Geometric moments of the region几何矩

    moments_psi3Geometric moments of the region几何矩

    moments_psi4Geometric moments of the region几何矩

    表格中出现很多类型的几何矩。

    矩是描述图像特征的算子,如今矩技术已广泛应用于图像检索和识别 、图像匹配 、图像重建、数字压缩 、数字水印及运动图像序列分析等领域。

    常见的矩描述子可以分为以下几种:几何矩、正交矩、复数矩和旋转矩 。

    其中几何矩提出的时间最早且形式简单,对它的研究最为充分。

    几何矩对简单图像有一定的描述能力,他虽然在区分度上不如其他三种矩,但与其他几种算子比较起来,他极其的简单,一般只需用一个数字就可表达。

    所以,一般我们是用来做大粒度的区分,用来过滤显然不相关的文档

    图像的几何矩这里先不进行讲解,仅介绍常用的区域特征;

    可以halcon中使用下面代码测试查看表格中37个区域特征的效果(fabrik为其自带图片)

    dev_close_window()

    read_image(Image,'fabrik')

    dev_open_window(0, 0, 512, 512, 'black', hWnd)

    threshold (Image, Regions, 160, 255)

    connection(Regions,con)

    *0.区域属性都可打开特征检测工具查看

    select_shape(con,sel,'area', 'and', 7000, 100000)

    *fill_up(sel,sel)

    *1.面积计算

    *area_center(sel,area,row,col)

    dev_set_draw('margin')

    dev_display(Image)

    dev_display(sel)

    dev_set_color('blue')

    *2.圆度计算

    *circularity(sel,Circularity)

    *3.紧密度计算

    *compactness(sel,Compactness)

    *4.轮廓线总长计算

    *contlength(sel,ContLength)

    *5.矩形度计算

    *rectangularity(sel,Rectangularity)

    *6.等效椭圆方向/长轴/短轴/半径长度计算

    *elliptic_axis(sel, Ra, Rb, Phi)

    *area_center(sel,area,row,col)

    *gen_ellipse(ellip,row,col,Phi,Ra,Rb)

    *7.椭圆离心率/蓬松度/结构系数计算

    *eccentricity(sel,anisometry,bulkiness,struc)

    *8.最小外接圆半径

    *smallest_circle(sel,row,column,radius)

    *gen_circle(circle,row,column,radius)

    *9.最大内接圆半径

    *inner_circle(sel,row,column,radius)

    *gen_circle(circle,row,column,radius)

    *10.最大轴平行内接矩形宽度/高度col1-col,row1-row

    inner_rectangle1(sel,row,col,row1,col1)

    gen_rectangle1(rec,row,col,row1,col1)

    *11.区域边界到中心的平均距离/中心距离偏差/圆度/多边形边数

    *roundness(sel,Distance, Sigma, Roundness, Sides)

    *12.区域的连通数/洞数

    *connect_and_holes(sel,NumConnected, NumHoles)

    *13.区域内所有洞的面积之和

    *area_holes(sel,Area)

    *14.区域最大半径

    *diameter_region(sel,row1,col1,row2,col2,dia)

    *disp_line(hWnd, row1, col1, row2, col2)

    *15.区域角度

    *orientation_region(sel,phi)

    *row:=300+100*sin(phi)

    *column:=300+100*cos(phi)

    *disp_arrow(hWnd, 300, 300, row, column,1)

    *16.欧拉数,即连通数和洞数之差

    *euler_number(sel,num)

    *17.最小外接矩形的方向/一半高/一半宽

    *smallest_rectangle2(sel,row,col,phi,hei,wid)

    *gen_rectangle2(rec,row,col,phi,hei,wid)

    *gen_rectangle1(sel,row,col,row+hei,col+wid)复制代码

    对这些区域特征含义及效果了解后,就可以很方便的进行区域选择操作,如选择下图竖线

    1.jpg (68.99 KB, 下载次数: 2)

    上位机通过halcon中图像区域特征选择指定区域

    2017-6-5 12:26 上传

    dev_close_window()

    read_image(Image,'1.jpg')

    dev_open_window(0, 0, 512, 512, 'black', hWnd)

    rgb1_to_gray(Image,rgb)

    dev_display(rgb)

    threshold (rgb, Regions, 160, 255)

    connection(Regions,con)

    select_shape(con,sel,'rect2_len1','and',25,80)

    select_shape(sel,sel,'column','and',340,380)

    fill_up(sel,fil)

    count_obj(fil,Number)

    smallest_rectangle2(fil,Row, Column, Phi, Length1, Length2)

    gen_rectangle2(rec,Row, Column, Phi, Length1, Length2)

    dev_display(rgb)

    dev_display(rec)复制代码

    图片保存为1.jpg,与工程文件同级目录,得出效果图

    2.JPG (55.5 KB, 下载次数: 0)

    上位机通过halcon中图像区域特征选择指定区域

    2017-6-5 12:28 上传

    select_shape函数的例程可在halcon按F1,打开编程手册,搜索获得

    展开全文
  • 提出了钻孔应变数据特征分析参量"应变比速率"的概念,用于量化分析区域应力的演变趋势。研究表明,矿山开采中的冲击地压孕育、诱发过程伴随着区域应力场的调整,且钻孔应变实测数据验证了传统采动影响范围以外更大区域...
  • 为实现煤矿工作面矿压规律的精准分析,提出了工作面区域矿压分析理论,明确了工作面矿压分析的区域概念、区域矿压显现特征参数区域划分流程,从而提出了基于支架工作阻力大数据的工作面区域矿压分析技术。...
  • 在相关反馈阶段,将图像看作是由各子区域内兴趣点局部特征构成的多示例包,根据用户选择的实例图像生成正包和反包,采用多示例学习算法获得体现图像语义的目标概念。本方法缩小了用户查询中的歧义性,在Corel图像库中...
  • 之前写的都是有关于ROI的区域提取,但是对于提取到的区域我们需要提取它的特征,才可以在后期的特征匹配中排上用场。 这篇文章主要记录我是如何对指静脉图片做二值纹理特征提取的 原理: 一种比较特征提取简单的...
  • 学习目标 能分析出鲁尔区的工业区位特征 探讨鲁尔区发展中存在的问题成因 根据问题原因推断鲁尔区可持续发展的策略 能力提升 通过讨论比较鲁尔区与我国东北的辽中南重工业基地发展的异同 ;1.传统工业区的概念;3....
  • 图像特征概念、什么是图像特征

    万次阅读 2016-07-26 16:01:48
    有少量修改,如有疑问,请问原作者! 常用的图像特征有颜色特征、纹理特征、形状特征、空间关系特征。...一 :颜色特征  ...一般颜色特征是基于像素点的特征,此时所有属于图像或图像区域的像素都有
  • 一、区域概念不管是研究区域经济学还是区域科学,都需要首先弄明白“什么是区域?”可是这个问题却一直没有得到一致的答案,今后可能也不会达成共识,因为各个学科的研究视角不同,对区域的界定也就不同了。即使是...
  • 转载,原链接(建议在原链接查看) 矩阵是个非常抽象的数学概念,很多人到了这里往往望而生畏。...矩阵的特征方程式是: A * x = lamda * x 这个方程可以看出什么?上次我们提到矩阵实际可以看...
  • 机器视觉学习(一):特征提取基本概念总结一、特征提取概念二、特征概述1.边缘2.角3.区域4.脊三、常用图像特征概述1.颜色特征2.纹理特征3.形状特征4.空间关系特征 一、特征提取概念 特征提取是计算机视觉和...
  • 一、操作系统的概念 操作系统(Operating System,OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以...二、操作系统的特征 并发、共享、虚拟、异步 2.1 并发 ..
  • 本文根据闭合流域水量平衡原理,以环境水文学的基本观点,阐述了福建省主要流域和区域的水量平衡各要素,并对分区的水量平衡要素与特征系数进行分析,初步得出几个规律性的概念,为流域综合治理工农业生产提供可靠的...
  • 图象特征提取.pdf

    2020-06-09 09:47:07
    特征提取是计算机视觉和图像处理中的一个概念。它指的是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征特征提取的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点、连续的曲线或者...
  • 图像分割与特征提取 MATLAB实现 图像分割是指将图像中有意义的对象与其背景分离并把这些对象按照不同的含义分割开来也就是说把图像中具有不同含义的对象提取出来图像分割的方法大致可以分为基于边缘检测的方法和...
  • 计算机视觉 图像特征与描述 《人工智能应用基础》 颜色特征 几何特征 形状特征 基于关键点的特征描述 ...角点特征概念 角点是在任意方向上移动(u,v),都会有很明显的变化。如下图一个局部很小的区域
  • 基于改进区域生长算法的图像分割方法实现

    万次阅读 多人点赞 2020-05-31 16:31:56
    (2)然后,基于经典区域生长方法,自己查阅文献,设计改进的区域生长算法,实现图像分割; (3)目视比较分析2种方法的分割效果,概述改进方法分割效果的优点和不足之处; (4)实现分水岭分割。 二、需求分析 2.1...
  • Halcon特征提取

    千次阅读 2021-01-26 21:26:51
    1:区域特征 1.1 面积 最简单的区域特征区域的面积。 1.2 重心 重心用来描述区域的位置。 算子area_center用来得到面积和重心。 1.3 椭圆参数 椭圆的长轴半径、短轴半径、以及相对于横轴的夹角,用来定义...
  • 基于区域分割(图像分割)

    千次阅读 2021-02-11 22:29:06
    1. 区域生长区域增长方法是根据同一物体区域内象素的相似性质来聚集象素点的方法,从初始区域(如小邻域或甚至于每个象素)开始,将相邻的具有同样性质的象素或其它区域归并到目前的区域中从而逐步增长区域,直至没有...
  • 数据集特征提取_特征提取和选择

    千次阅读 2020-11-20 01:02:30
    引用: 图像的特征提取都有哪些算法​wenwen.sogou.com蒋竺波:机器学习入门讲解:什么是特征(Feature)和特征选择(Feature Selection)?​zhuanlan.zhihu.com图像...一般传统的cv特征指低层视觉特征,DL特征使用语...
  • ReID基础 | 全局特征和局部特征

    千次阅读 2021-04-07 11:28:47
    局部特征 局部特征是指对图像中的某个区域进行特征提取,最后将多个局部特征融合起来作为最终特征。方式:切片(一般水平切分)、利用姿态信息、利用分割信息(例如把人分割出来)、网格。 2.1 一些概念 姿态:通常...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 119,909
精华内容 47,963
热门标签
关键字:

区域的概念及特征