精华内容
下载资源
问答
  • 提出了一种新的自适应弹性网络算法(Adaptive Elastic Net,AEN)解决聚类问题,该算法利用弹性网络算法得到的[K]个中心点作为聚类初始中心点,并利用局部搜索择优算法在每次迭代中更新中心点。以聚类完成后每一簇的...
  • 针对样本维数随着样本个数变化的情况,研究了自适应弹性网络变量选择的一致性。首先在部分正交条件下,证明了初始的单变量回归子是零一致的,然后据此证明了自适应弹性网络能取得一致的变量选择。从渐近性能的角度考虑,...
  • 基于自适应弹性网络回归的目标跟踪(OBJECT TRACKING WITH ADAPTIVE ELASTIC NET REGRESSION)阅读笔记 摘要 近年来,各种基于回归的跟踪方法取得了很大的成功,然而,在大多数方法中,提取的所有特征都是用来表示...

    基于自适应弹性网络回归的目标跟踪(OBJECT TRACKING WITH ADAPTIVE ELASTIC NET REGRESSION)阅读笔记

    by:家行hang
    论文链接:
    Object tracking with adaptive elastic net regression
    Zhang, Shunli ; Xing, Weiwei
    2017 IEEE International Conference on Image Processing, Sept. 2017, pp.2597-2601

    参考:
    1. 目标跟踪简介

    摘要

    近年来,各种基于回归的跟踪方法取得了很大的成功,然而,在大多数方法中,提取的所有特征都是用来表示对象的,而不需要进行特征选择。
    (这里的意思是提取的所有特征全都用上了,而不是选择着去用)

    本文提出了一种 基于自适应权(adaptive weight)弹性网络回归 的新的跟踪方法,一方面,跟踪被表述为一个 弹性网络回归 问题,它不仅可以充分利用空间信息,而且可以自动选择特征来减轻不稳定或不准确点的影响,另一方面,回归模型中的“1范数”和“2范数”正则化会自适应调整,以更好地提高性能。实验结果表明,所提出的自适应弹性网络回归跟踪方法能够获得满意的跟踪性能。

    参考:
    1. 机器学习中的正则化
    2. 几种范数的简单介绍
    3. 范数理解(0范数,1范数,2范数)
    4. 【机器学习】正则化的线性回归 —— 岭回归与Lasso回归
    5. 为什么正则化能减少模型过拟合程度
    6. 为什么正则化(Regularization)可以减少过拟合风险

    关键词:目标追踪,弹性网络回归(elastic net regression),自适应权(adaptive weight)

    1 介绍

    目标跟踪作为计算机视觉领域的研究热点之一,在视频监控、运动分析等领域有着广泛的应用。然而,跟踪面临着严重遮挡、变形、背景复杂等多种因素,难以实现鲁棒跟踪。

    表观模型(appearance model)在跟踪中起着重要的作用,传统的表观模型一般可分为两类:
    - 生成式模型(generative model):就是只有一个模型,你把测试用例往里面一丢,label就出来了,如SVM。
    - 判别式模型(discriminative model):有多个模型(一般有多少类就有多少个),你得把测试用例分别丢到各个模型里面,最后比较其结果,选择最优的作为label,如朴素贝叶斯。

    (???表观模型中的区别呢???)

    参考:
    1. 产生式模型与判别式模型的区别
    2. 机器学习–判别式模型与生成式模型
    3. 生成式模型和判别式模型的区别
    4. 机器学习 之 生成式模型 VS 判别式模型

    近年来,一些基于回归的判别式模型取得了很大的发展,并获得了最先进的跟踪性能。例如,Hare等人提出了基于结构化输出回归的Struck方法,使用结构化输出预测来避免中间分类步骤,Henriques 等人提出了将跟踪表示为基于岭回归模型构造相关滤波器的问题,Zhang等人提出了基于混合支持向量机的跟踪方法,其中在目标的相邻样本基础上建立了支持向量回归模型。与传统的基于二分类的判别模型不同,回归模型具有一些明显的优势。例如,回归的目标和跟踪任务总是一致的,可以充分利用背景信息。然而,大多数基于回归的跟踪方法使用提取的所有特征。每个特性都被赋予相同的权重,并且不考虑特性的重要性。换句话说,就是没有特征选择。

    在跟踪过程中,我们可以观察到目标的形状可能发生变形,或者目标发生了姿势的变化。此外,目标可能被另一个物体遮挡(Fig. 1).这些因素表明目标的某些部分不稳定,可能会影响表观模型的性能。遮挡也会干扰训练样本,从而降低模型的准确度。通过选取样本的稳定准确的部分建立外观模型,可以减少变形和遮挡的影响,提高鲁棒性。
    (这部分说明特征选取的重要性,可以减少目标跟踪中变形和遮挡的影响。)

    本文将跟踪问题表述为一个自适应弹性网络回归问题。弹性网络是一种包含 “1范数”和“2范数”正则化 的回归技术。它可以看作是 Lasso回归 和 岭回归 的结合,保留了上述两种回归模型的优点。弹性网络在许多领域都得到了应用,并取得了成功的应用。将跟踪定义为一个弹性网络回归问题可以带来两个好处:
    - 弹性网络保持了回归模型的优点,可以利用背景的更多信息。
    - 弹性网络能够自适应地选择稳定的特征进行训练,从而使表观模型更加精确。
      

    此外,我们提出了一种自适应策略来自动确定“1范数”和“2范数”的权重。实验结果表明,该方法可以获得与许多最先进的跟踪方法相似的跟踪结果。

    2 用弹性网络回归跟踪

    2.1 具有自适应弹性网络回归的表观模型

    2.1.1 简述

    虽然采用了岭回归和支持向量回归等不同的回归策略来构建回归表观模型,但权重向量w的正则项往往采用“2范数”,对特征的鲁棒性不够重视。在此,我们将跟踪定义为一个弹性网络回归问题,弹性网络能够自适应地选择最稳定的特征来学习函数,从而在“1范数”和“2范数”之间进行权衡,因此,我们使用弹性网来选择最鲁棒、最稳定的外观表现特征,减少变形、遮挡等因素对外观变化的影响。

    具体来说,假设训练样本集为 x x ,其对应样本的元素为 xi x i ,回归值为 yi y i
    线性回归函数可以定义为 f(x)=wTx f ( x ) = w T x ,其中训练样本 xi x i 和回归值 yi y i 均以相应的均值为中心。然后将弹性网络正则化回归的优化问题表示为:
             minwi12||wTxiyi||22+λ(α1||w||1+α2||w||22),(1) m i n w ⁡ ∑ i 1 2 | | w T x i − y i | | 2 2 + λ ( α 1 | | w | | 1 + α 2 | | w | | 2 2 ) , ( 1 )
            (???是加上了两种正则项的损失函数么???)
    这里的 λ λ 表示误差与正则化之间的权衡参数, α1 α 1 , α2 α 2 控制“1范数”和“2范数”正则化的比例,并且 α1+α2=1 α 1 + α 2 = 1

    此外,我们把等式(1)中的 α=[α1,α2]T α = [ α 1 , α 2 ] T 也视为优化参数。由于视频序列的不同帧中对象的稳定特性可能不同,不同视频序列中的对象也可能不同,因此对权衡参数进行自适应调整是有益的。
    之后,等式(1)变为:
             minw,αi12||wTxiyi||22+λ(α1||w||1+α2||w||22)+ρ2||α||22,(2) m i n w , α ⁡ ∑ i 1 2 | | w T x i − y i | | 2 2 + λ ( α 1 | | w | | 1 + α 2 | | w | | 2 2 ) + ρ 2 | | α | | 2 2 , ( 2 )
    这里的 ρ ρ 也表示一个权衡参数,又加了一个新的正则化项 ||α||22 | | α | | 2 2 ,以便控制“1范数”和“2范数”的平衡。通过求解等式(2)中的优化问题,就可以用最优的 w w α来表示外观模型。

    2.1.2 优化(???)

    由于有两个不同的参数 w w α,等式(2)的优化问题可以通过两阶段迭代算法进行优化。首先,通过修正 α α ,等式(2)中的优化问题退化为等式(1),等式(1)这是一个标准的弹性网络回归问题。目前已有很多现成的算法来解决在等式(1)中的优化问题。例如 LARS-EN 算法。在此,我们采用 SPAMS 工具箱来解决这个问题。
    第二步,得到 w w 后,我们对其进行了修正并解决α的优化问题:
             minwiλ(α1||w||1+α2||w||22)+ρ2||α||22,(3) m i n w ⁡ ∑ i λ ( α 1 | | w | | 1 + α 2 | | w | | 2 2 ) + ρ 2 | | α | | 2 2 , ( 3 )
    这是一个二次优化问题,可以用Matlab直接求解。然后这两个步骤可以迭代进行得到最优的 w w α

    2.1.3 准备样本

    基于滑动窗口策略,在网格中密集采样训练样本。假设目标中心的位置是 (x0,y0) ( x 0 , y 0 ) ,目标区域的宽度和高度分别为 w w h,并且样本的归一化的大小是 NS× NS N S ×   N S ,此外,我们将归一化目标样本的坐标表示为 (0,0) ( 0 , 0 ) 。如果将训练样本按照归一化目标的像素密集采样,步长为 d d ,则归一化区域的训练半径为是NS,此外,我们希望训练样本能够覆盖不同程度的目标区域。因此,归一化样本 xi x i 在归一化区域中的位置就是 (pi,qi) ( p i , q i ) ,其中 pi,qi[Ns,Ns] p i , q i ∈ [ − N s , N s ] 。相应地,归一化之前, xi x i 的位置为 (piw/Ns,qih/Ns) ( p i w / N s , q i h / N s ) (???为什么???),这可以通过反向映射得到。通过在 [Ns,Ns] [ − N s , N s ] 上改变 pi p i qi q i ,我们可以得到所有与目标有不同重叠的训练样本。

    参考:
    1. 滑动窗口算法
    2. 【深度学习理论】基于滑动窗口的目标检测算法

    网格中选取的样本存储在相邻的缓冲区 Bn B n 中,提供了紧凑的空间约束。在我们的方法中, Bn B n 中的每个样本对应一个特定的位置。此外,我们还构建了另一个训练样本缓冲区,即深度为 D D (???)的目标缓冲区Bt,它由之前的跟踪结果填充,提供了时间约束。

    2.1.4 确定回归值

    为了使回归和跟踪的目标一致,在此,我们采用高斯函数作为回归函数,其中最大的回归函数值对应于目标的位置。由于我们将训练样本归一化到固定大小,所以可以通过归一化大小来实现高斯函数,以避免不同目标大小的影响。
             yi=exp((x¯¯¯(i)2+y¯¯¯(i)2)/σ2),(4) y i = e x p ⁡ ( − ( x ¯ ( i ) 2 + y ¯ ( i ) 2 ) / σ 2 ) , ( 4 )
    x¯¯¯(i) x ¯ ( i ) y¯¯¯(i) y ¯ ( i ) 分别表示样本 xi x i 的归一化相对水平和垂直位置, σ2 σ 2 表示高斯函数的方差。利用训练样本和确定的回归值,通过优化等式(1)中的问题,训练弹性网络回归模型,得到模型参数 w w

    2.2 搜索策略

    通过建立的表观模型,我们可以逐帧完成跟踪。在此,我们利用一个简单而有效的滑动窗口采样策略来寻找最优的跟踪结果。第t1帧获得的目标位置记为 lt1 l t − 1 ,第 t t 帧的一个候选样本xj的位置记为 l(xj) l ( x j ) ,在第 t1 t − 1 帧中我们在 lt1 l t − 1 周围滑动采样窗口,获得一系列候选样本。如果 lt1 l t − 1 l(xj) l ( x j ) 满足 ||l(xj)lt1||2<Rs | | l ( x j ) − l t − 1 | | 2 < R s , xj x j 将被选为候选样本。通过将候选样本归一化为固定大小并提取特征,通过计算得到候选样本 xj x j 的回归值 f(xj) f ( x j ) xj x j 的置信度可以表示为:
             conf(xj)=exp((f(xj)ymax)2).(5) c o n f ( x j ) = e x p ⁡ ( − ( f ( x j ) − y m a x ) 2 ) . ( 5 )
    然后,通过计算得到最优候选样本:
             xopt=argmaxxjconf(xj).(6) x o p t = a r g m a x x j ⁡ c o n f ( x j ) . ( 6 )
            (arg代表当 conf(xj) c o n f ( x j ) 取最大值时,x的取值)

    2.3 更新模型

    在得到跟踪结果 xopt x o p t 后,我们更新弹性网络模型以适应外观的变化。为此,我们采用再训练策略(retraining strategy)来更新弹性网络模型。

    由于我们已经将样本分为目标部分 Bt B t 和邻近部分 Bn B n ,我们分别更新 Bt B t Bn B n 中的样本。对于 Bt B t ,我们以先入先出(First-In-First-Out(FIFO))的原则更新样本,即最早进入目标缓冲区的样本将被 xopt x o p t 替换。对于 Bn B n ,由于每个位置对应的样本只有一个,所以我们选择与现有模型最小吻合的样本 Nu N u 进行更新。基于 xopt x o p t 的位置,我们首先根据章节2.1.3的介绍选择 xopt x o p t 周围的样本,然后通过回归模型来测量新样本与已有模型的吻合程度。假设新样本集为 X X ′ ,元素为 xi x i
    对应 xi x i 的测度是 mi=|y^iyi| m i = | y ^ i − y i | ,这里的 y^i y ^ i 为弹性网络模型对 xi x i 的预测值, yi y i 为预定义的理想回归值。 mi m i 值越大,说明样本 xi x i 不适合当前模型。
    因此,我们选择 Nu N u 样本比其他样本更大,以 Bn B n 代替相邻位置相同的样本。利用更新后的样本,我们可以通过求解等式(1)来重新训练弹性网络模型,在提出的更新方案的基础上,可以对回归模型进行尽可能大的更新,以适应外观的变化。

    Fig.2. 上图是在所有51个序列的测试中,ENT和其他跟踪模型的精确图和成功图。方括号中的值分别表示精度图上 Thp=20 T h p = 20 像素处的精度和成功图上对应的AUC值。

    Table 1. 下表是ENT和其他跟踪模型的CLE (in pixel), VOR,Precison 和 SR 的对比结果:

    3 实验

    3.1 初始化

    提出的基于自适应弹性网络的跟踪方法记为ENT,初始化如下:
    提取具有5像素窗口大小和9个方向的HOG特征来表示;
    样本的归一化大小为 30× 30 30 ×   30
    训练半径和搜索半径分别设置为30像素和26像素;
    高斯函数中, σ2=0.01 σ 2 = 0.01
    正则化参数中, α1 α 1 初始化为0.5, λ λ 初始化为0.5, ρ ρ 初始化为10;
    为了更新的比值 Nu/M N u / M 初始化为0.05;
    所有序列的参数都是固定的。(???这句话是什么意思???)

    参考:
    1. HOG特征(Histogram of Gradient)学习总结
    2. 目标检测的图像特征提取之(一)HOG特征
    3. 方向梯度直方图(HOG,Histogram of Gradient)学习笔记二 HOG正篇

    3.2 与最先进的追踪器对比

    3.3 参数分析

    4. 结论

    本文采用弹性网络回归方法构造了一种新的跟踪方法。将跟踪问题表述为弹性网络回归问题,既可以利用回归模型的优点,又可以利用弹性网络选择最稳定的特征进行表示。我们对基准数据集中的跟踪方法进行了评价,实验结果表明,该方法能比其他许多基于回归的跟踪方法取得更好的效果。

    展开全文
  • 针对癌症分类中的重要基因选择问题,提出了一种基于顺向坐标下降算法的自适应弹性网络.该自适应弹性网络通过引入数据驱动权重,在构建分类器的同时能自适应地成群选择基因,从而产生了一个稀疏的学习模型,增强了可解释...
  • PCD型自适应弹性网络在微阵列分类中的应用
  • 在本文中,作者提出了一种用于图像边缘链接的自适应弹性网方法。 边缘链接为一项基本的计算机视觉任务,这是一个受约束的优化问题。 在建议的方法中, 弹性网中引入了自适应动态参数策略和随机噪声策略, 这使网络...
  • 网络游戏-一种基于弹性自适应神经网络的建筑物能耗预测方法.zip
  • 弹性网络是一种使用 L1,L2范数作为先验正则项训练的线性回归模型.这种组合允许学习到一个只有少量参数是非零稀疏的模型,就像 Lasso一样,但是它仍然保持一些像Ridge的正则性质。我们可利用 l1_ratio 参数控制L1和...

                                                  弹性网络(Elastic Net)

    弹性网络是一种使用 L1,L2范数作为先验正则项训练的线性回归模型.这种组合允许学习到一个只有少量参数是非零稀疏的模型,就像 Lasso一样,但是它仍然保持一些像Ridge的正则性质。我们可利用 l1_ratio 参数控制L1和L2的凸组合。弹性网络是一不断叠代的方法。

     

    弹性网络最妙的地方是它永远可以产生有效解。由于它不会产生交叉的路径,所以产生的解都相当不错。举例来说,对一个随机产生的50个城市的推销员问题,弹性网络的解只有比德宾和威尔萧的论文中所提的最具竞争力的演算法长2%(什么是最具竞争力的演算法?有人说是林-克尼根(Lin-Kernighan)演算法,也有人说是SA+OP)。但是弹性网络最吸引人的地方不在它的有效解,而在它收敛的速度。许多人试着去改善弹性网络收敛的速度,都有不错的结果。举例来说,柏尔(Burr)所提出的改良版可令50个城市的推销员问题的收敛次数由1250大幅降为30次。一个最佳化的弹性网络的速度会比林-克尼根快两倍。

    弹性网络在很多特征互相联系的情况下是非常有用的。Lasso 很可能只随机考虑这些特征中的一个,而弹性网络更倾向于选择两个。 在实践中,Lasso 和 Ridge 之间权衡的一个优势是它允许在循环过程(Under rotate)中继承 Ridge 的稳定性。

    在这里,最小化的目标函数是:

    应用案例

    from itertools import cycle
    import numpy as np
    import matplotlib.pyplot as plt
    
    from sklearn.linear_model import lasso_path, enet_path
    from sklearn import datasets
    
    diabetes = datasets.load_diabetes()
    X = diabetes.data
    y = diabetes.target
    
    X /= X.std(axis=0)  # Standardize data (easier to set the l1_ratio parameter)
    
    # Compute paths
    
    eps = 5e-3  # the smaller it is the longer is the path
    
    print("Computing regularization path using the lasso...")
    alphas_lasso, coefs_lasso, _ = lasso_path(X, y, eps, fit_intercept=False)
    
    print("Computing regularization path using the positive lasso...")
    alphas_positive_lasso, coefs_positive_lasso, _ = lasso_path(
        X, y, eps, positive=True, fit_intercept=False)
    print("Computing regularization path using the elastic net...")
    alphas_enet, coefs_enet, _ = enet_path(
        X, y, eps=eps, l1_ratio=0.8, fit_intercept=False)
    
    print("Computing regularization path using the positive elastic net...")
    alphas_positive_enet, coefs_positive_enet, _ = enet_path(
        X, y, eps=eps, l1_ratio=0.8, positive=True, fit_intercept=False)
    
    # Display results
    
    plt.figure(1)
    ax = plt.gca()
    
    colors = cycle(['b', 'r', 'g', 'c', 'k'])
    neg_log_alphas_lasso = -np.log10(alphas_lasso)
    neg_log_alphas_enet = -np.log10(alphas_enet)
    for coef_l, coef_e, c in zip(coefs_lasso, coefs_enet, colors):
        l1 = plt.plot(neg_log_alphas_lasso, coef_l, c=c)
        l2 = plt.plot(neg_log_alphas_enet, coef_e, linestyle='--', c=c)
    
    plt.xlabel('-Log(alpha)')
    plt.ylabel('coefficients')
    plt.title('Lasso and Elastic-Net Paths')
    plt.legend((l1[-1], l2[-1]), ('Lasso', 'Elastic-Net'), loc='lower left')
    plt.axis('tight')
    
    
    plt.figure(2)
    ax = plt.gca()
    neg_log_alphas_positive_lasso = -np.log10(alphas_positive_lasso)
    for coef_l, coef_pl, c in zip(coefs_lasso, coefs_positive_lasso, colors):
        l1 = plt.plot(neg_log_alphas_lasso, coef_l, c=c)
        l2 = plt.plot(neg_log_alphas_positive_lasso, coef_pl, linestyle='--', c=c)
    
    plt.xlabel('-Log(alpha)')
    plt.ylabel('coefficients')
    plt.title('Lasso and positive Lasso')
    plt.legend((l1[-1], l2[-1]), ('Lasso', 'positive Lasso'), loc='lower left')
    plt.axis('tight')
    
    
    plt.figure(3)
    ax = plt.gca()
    neg_log_alphas_positive_enet = -np.log10(alphas_positive_enet)
    for (coef_e, coef_pe, c) in zip(coefs_enet, coefs_positive_enet, colors):
        l1 = plt.plot(neg_log_alphas_enet, coef_e, c=c)
        l2 = plt.plot(neg_log_alphas_positive_enet, coef_pe, linestyle='--', c=c)
    
    plt.xlabel('-Log(alpha)')
    plt.ylabel('coefficients')
    plt.title('Elastic-Net and positive Elastic-Net')
    plt.legend((l1[-1], l2[-1]), ('Elastic-Net', 'positive Elastic-Net'),
               loc='lower left')
    plt.axis('tight')
    plt.show()
    展开全文
  • 结合自适应遗传算法与弹性BP神经网络的亚硝酸盐预测模型.pdf
  • 针对目前营养盐检测主要是通过化学方法实现,无法获得在线检测的问题,利用营养盐与其影响因子之间的关系, 提出结合自适应遗传算法与弹性BP 神经网络的预测模型. 利用改进的自适应遗传算法, 通过交叉、变异获取...
  • 绿色弹性网络中的调制自适应修饰
  • 弹性云光网络中用于梳理的自适应多级调制
  • 自适应网络化装备保障模式研究
  • 提出了基于模糊逻辑的自适应过滤方案,构建了基于模糊规则的系统。结果表明基于模糊规则的系统通过对报告中背书请求数目的确定来控制过滤方案的安全水平。该方案能够保证能量节约和反虚假数据注入式攻击的足够的弹性...
  • 利用MATLAB 进行BP神经网络的预测(含有神经网络工具箱) 最近一段时间在研究如何利用预测其销量个数,在网上搜索了一下,发现了很多模型来预测,比如利用回归模型、时间序列模型,GM(1,1)模型,可是自己在结合...

            利用MATLAB 进行BP神经网络的预测(含有神经网络工具箱)

      最近一段时间在研究如何利用预测其销量个数,在网上搜索了一下,发现了很多模型来预测,比如利用回归模型、时间序列模型,GM(1,1)模型,可是自己在结合实际的工作内容,发现这几种模型预测的精度不是很高,于是再在网上进行搜索,发现神经网络模型可以来预测,并且有很多是结合时间序列或者SVM(支持向量机)等组合模型来进行预测,本文结合实际数据,选取了常用的BP神经网络算法,其算法原理,因网上一大堆,所以在此不必一一展示,并参考了bp神经网络进行交通预测的Matlab源代码这篇博文,运用matlab 2016a,给出了下面的代码,并最终进行了预测

    clc
    
    clear all
    
    close all
    
    %bp 神经网络的预测代码
    
    %载入输出和输入数据
    
    load C:\Users\amzon\Desktop\p.txt;
    
    load C:\Users\amzon\Desktop\t.txt;
    
    %保存数据到matlab的工作路径里面
    
    save p.mat;
    
    save t.mat;%注意t必须为行向量
    
    %赋值给输出p和输入t
    
    p=p;
    
    t=t;
    
    %数据的归一化处理,利用mapminmax函数,使数值归一化到[-1.1]之间
    
    %该函数使用方法如下:[y,ps] =mapminmax(x,ymin,ymax),x需归化的数据输入,
    
    %ymin,ymax为需归化到的范围,不填默认为归化到[-1,1]
    
    %返
    展开全文
  • 混合局部递归神经网络用于创建不确定的多变量单输入/多输出系统的比例积分微分(PID)样的神经网络非线性自适应控制器。 它由一个在隐藏层中具有不超过三个神经节点的神经网络组成,并且在一个隐藏层中分别包含一个...
  • 针对无线传感器网络(WSN)数据不精确和不可靠的问题,根据感知数据的空间相关性定义了弹性空间模型,并在此基础上提出一种自适应近邻空间清洗方法(ANSA)。该方法根据感知数据波动动态调整近邻空间大小,并通过计算...
  • 怎样才算自适应机械臂?适应操作对象位置的不确定性适应复杂外部环境的干扰适应类似任务的快速迁移什么让自适应成为可能?力控技术用位置来控制力 ——用关节电流控制力 ——关节力矩传感器 ——关节力矩加末端六维力...


    本文转载至微信公众号 ROBOTICS

    协作机械臂够用了吗?

    工业机械臂的应用已有六十多年的历史,在各种各样的产线上都能找到他们的身影。传统的工业机械臂追求快速、精确的位置控制,它们能代替人工完美胜任那些靠“轨迹”就能定义的工作,比如把A处的东西移动到B处、比如在工件上切割一个圆形、比如往汽车外壳上喷油漆……事实上,在这一类工作上,机械臂依靠成熟的硬件设计和电子控制系统,完成任务的质量和速度都远超过人类。
    生产线上搬运货物到传送带上的传统机械臂
    即便如此,这一类传统的工业机械臂依然有三个主要的不尽人意的地方。

    第一,它们完全专注于完成任务以至于对它可能对周围造成的危险漠不关心——大部分工业机械臂工作时都需要严禁任何人进入它的工作空间,由于对此的忽视而造成的悲剧并不少见;

    第二,要“教会”它们做一个新的工作挺麻烦的——工业机械臂往往需要专门的工程人员使用特定的语言对其进行编程,告诉它们动作的次序、要实现的轨迹等等,由此在工业机械臂厂家与工业制造商之间催生了“集成商“这样一个产业;

    第三,它们只能做一部分依靠快速、精确的位置控制就可以胜任的工作——现实中还有很大一部分工作是传统机械臂无法完成的。

    二十世纪末,在对传统机械臂这几个局限性的认识下,研究人员提出了协作机器人的概念。这几年,协作机器人炒得非常火热:传统的工业机械臂制造商KUKA、ABB、发那科等等都纷纷推出了自己的协作机器人;以协作机器人起家的UR、Rethink、以至最新的Franka等也频繁出现在人们的视野中。

    从“协作”的字面意义可以看到,人们希望工业机械臂不再只是被圈在围栏里自顾自地完成它被编程的任务,而是能够更多地与人类“协同工作”。针对上述传统工业机械臂的三点缺陷,协作机器人在现有技术能达到的水平基础上开出了几张处方:第一是通过降低机械臂负载、限制运动速度、限制关节输出力矩、在机械臂上包裹软性材料、算法实现碰撞检测等方式,提高机械臂的安全性、让机械臂可以走出围栏;第二是通过研发更容易看懂的示教器、图形化编程方法、拖拽示教算法等,开发更直观易用的人机交互方式,让没有经过专业训练的人也能轻松指挥机器人工作;第三是在前面两点的基础上,让机械臂与人一起合作去完成那些机械臂本身无法完成的事情,比如柔性打磨、装配等等。
    图中机械臂与人合作完成组装
    去年,协作机器人的先驱Rethink宣布倒闭,引发了行业里的很多思考:协作机器人真的如所说的那么好用吗?真的有能产生大规模价值的应用场景吗?制造工业真的愿意为此买单吗?其实依作者看来,协作机器人固然有它的市场,但从长远上看,它更像是一个过渡。协作机器人的“协”字,与其说是机械臂与人的协作,不如说是一种“妥协”,是在现有软硬件技术还无法彻底解决前述三个问题的情况下的妥协。大部分协作机械臂为了实现协作的目标,不得不以牺牲某些方面的性能为代价,包括但不限于负载、速度、位置精度等等。协作机器人并没有真正实现机械臂在产线的低成本快速部署,甚至产业对新兴集成商仍有很大的需求。传统机械臂无法完成的任务、协作机器人依然无法完成——用与人协作的方式完成这类工作的想法,似乎与制造业真正的需求背道而驰。

    怎样才算自适应机械臂?

    随着技术的发展,新一代的机械臂势必要跳出“协作”的框架,而真正从本源上去改进传统机械臂的不足:它需要能够在不牺牲性能的前提下具备本质的安全性;能够像一个学徒一样迅速理解并独立完成一项新的任务;能够完成那些传统机械臂不可能做好、但如今因为人工的紧缺或者工作环境的恶劣而急需被自动化的工作。一个能达到这些要求的机械臂,需要的不仅仅是与人协作的能力,更是自身对复杂环境与复杂任务的适应能力。因此,我们将新一代的机械臂定义为“自适应机器人”(Adaptive Robot)。

    自适应是一个比较抽象的词,但也没有一个词能比它更准确地描述新一代机器人所具备的特性了。传统的机械臂几乎没有“适应性”可言——它们在工作时依赖于许多假设的成立,比如工件总是会在某个特定位置摆成某个姿势、机械臂工作时周围绝对不会有任何人任何东西来打扰它;即使加上了工业视觉,机械臂对工业视觉的精度要求也非常高,所以对每一条产线每一个工件,工业相机的标定、环境光的设置、视觉算法等都需要繁复的调整;即使加入了碰撞检测,机械臂也只是在检测到碰撞的时候停止一切运动,而不可能继续完成手头的工作。对种种假设的依赖决定了现有的机械臂每在一个产线实现一个应用都需要专门的人员花费大量的精力和金钱来部署。

    针对这种种让人觉得机械臂依然“很蠢”的不便之处,我们认为自适应机器人需要满足以下三个特性:

    • 适应操作对象位置的不确定性(Tolerance for position variation)
    • 适应复杂外部环境的干扰(Great disturbance rejection)
    • 适应类似任务的快速迁移(Transferrable intelligence)

    适应操作对象位置的不确定性

    与传统机械臂不同,我们人类的手臂在“定位”这件事上是很弱的。如果闭上眼睛、只依靠所谓的“本体知觉”(即肌肉和关节的感觉),研究表明人手的定位误差能有5厘米之多。然而即使闭着眼睛,大部分人都能够轻松把钥匙插进门锁孔里,这显然不是靠“定位”做到的。并且,大部分人洗碗刷锅也不需要眼睛死死盯着锅碗瓢盆;不管它们在水池里是怎样的姿态,人手都可以依着它们的形状在正确的方向施力、把每一个角落都洗干净。一个自适应的机械臂需要具备类似人手在完成这些工作时的能力。即使工件的位置信息不够精确、或者因为某种原因在加工时产生了位移和姿态的改变,机械臂都能够通过与物体接触得到的信息及时调整末端操作器的位置和对外界施力的大小方向。
    人在插内存条时基于“手感“的下意识调整
    人在插内存条时基于“手感“的下意识调整

    自适应机械臂在插插头时基于力的调整
    自适应机械臂在插插头时基于力的调整

    适应复杂外部环境的干扰

    虽然在定位上非常弱,但人的手臂却具有很强的抗干扰性能。人可以稳稳把一杯水从一个地方拿到另一个地方,这个过程中别人推他的手或者手臂,这杯水都不会洒出来。清洁高层建筑外墙的“蜘蛛人”,在强风中、摇晃的平台上依然能够很好地完成这项工作。自适应机械臂同样应该具备这样在一定程度的外部干扰下仍然能够完成特定任务的能力,降低部署时对环境的要求、替代人类完成像高空外墙清洁这样复杂且危险的任务。

    BBC纪录片:清洗世界最高建筑 人需要在绳索悬挂、强风中完成擦玻璃的工作
    BBC纪录片:清洗世界最高建筑 人需要在绳索悬挂、强风中完成擦玻璃的工作

    自适应机械臂的抗干扰性能:在工件同时水平/竖直运动+人手推机械臂的干扰下继续工作
    自适应机械臂的抗干扰性能:在工件同时水平/竖直运动+人手推机械臂的干扰下继续工作

    适应类似任务的快速迁移

    毫无疑问,人类的“技能迁移能力”是惊人的:学会了插一种类型的接插件,就能学会USB、miniUSB、microUSB、typeC、lightning等等各种各样的接插件,进而学会拼乐高;学会了转瓶盖,就能学会转各种大小各种样式的瓶盖,进而学会拧螺母;学会了按一种开关,就能学会按会反弹的、不会反弹的、杠杆型的、船型的各种开关,进而学会弹奏键盘乐器……自适应机械臂也应该在“学会”抛光某个型号的手机背板之后,能够很快学会抛光各种型号的手机背板,再以很小的努力就学会抛光汽车外壳、打磨木制家具。在技能相似的任务之间快速迁移,是自适应机器人的核心能力。
    自适应机械臂展示抛光应用的可迁移性
    自适应机械臂展示抛光应用的可迁移性

    什么让自适应成为可能?

    前面我们说,协作机器人这个概念其实是对现有的硬件软件技术限制的妥协。那么,什么样的技术才让自适应机器人成为可能呢?我们认为最关键的有两点:

    第一、 真正能用的、高精度、高响应的力控技术;这是奠定一切自适应技术的基石;

    第二、 建立在完整感知能力(包括视觉和力觉)基础上的层级式智能;这是完整发挥力控技术潜力的一座大厦。

    这两点缺一不可,仅仅依靠其中的一点不足以让机器人具备足够的适应性——也因此,自适应机器人的革新必须是自底向上的、系统性的、全面的革新。

    力控技术

    对力控技术的需求是显而易见的,尽管不自知,但人类日常生活99%以上的动作都离不开对力的感知和控制,比如拖地板、按开关、插插座……力觉对于人类操作行为如此重要,在机械臂中却长期缺失,也因此大部分需要力觉引导或需要直接控制接触力的任务,机械臂都无法胜任。

    不过,在科研领域,机械臂的力控技术也不是什么新东西,关于它的各项研究已经进行了30年之久。这几年,工业界开始尝试应用力控技术,然而能将力控技术做到足够大规模应用的却几乎没有。机械臂的力控应用在工业制造业的相对空白并不是因为市场不需要,而是现有的力控技术从硬件到软件、从应用成本到长期使用的可靠性都与实际需求相差甚远。

    用位置来控制力 ——

    目前比较常见的一种力控的做法是在现有的位置控制机械臂末端加装六维的力/力矩传感器,用“外部”力控制回路、“内部”位置控制回路的方法来实现。通俗地说,这种方法把控制力转化为控制位移——想象用机械臂的末端去按压一个弹簧,那么机械臂从弹簧原点沿着弹簧方向的位移大小就会正比于它施加在弹簧上的力。然而,如果这个弹簧非常非常硬,那么很小的位移就会引起很大的力的变化,这会使机械臂变得非常容易不稳定。因此,采用这种方法做力控的机械臂通常会在末端加上柔性材料来应对外界的刚性冲击;而对需要刚性接触的抛光任务而言,这种算法就很难实现。
    一个用六轴机器人+末端六维力/力矩传感器实现的基于力控的轮廓自适应,可以明显看到末端非常软;另外也可以间接看到机械臂施加在物体上的法向力并不是恒定的。
    一个用六轴机器人+末端六维力/力矩传感器实现的基于力控的轮廓自适应,可以明显看到末端非常软;另外也可以间接看到机械臂施加在物体上的法向力并不是恒定的。

    用关节电流控制力 ——

    用位置来控制力很多时候是不得已而为之——机械臂本体生产商出于安全考虑,不会开放位置控制以外的回路,即使开放,刷新频率也比较低。对于开放电流控制的机械臂而言,另一种常用的力控算法是用末端的六维力/力矩传感器加关节电流控制来实现。通常,电机的输出力矩与输入电流的比值是一个常数,因此电流控制可以近似于关节力矩控制;然而由于减速传动机构的存在,这个近似是非常粗糙的。当我们需要末端施加一定的力时,我们算出关节需要施加的扭矩并换算成电流,这时每个关节实际输出的扭矩与我们的要求会有不小的偏差;于是控制器只好根据测到的末端的力来调整指令,接着每个关节的电流再做相应调整……显然,用每个关节不甚准确的扭矩去控制末端的力/力矩,控制回路必然需要做更多的调节,因此系统的响应很难做到足够快;同时由于误差的存在,机械臂本身的动态特性没办法被很好补偿,它的稳定性和运动精度也比较差。
    平面抛光,注意左上角的”Speed 5X“
    平面抛光,注意左上角的”Speed 5X“,实际运动速度只有图示的五分之一

    关节力矩传感器 ——

    这几年很多新型的机械臂会在每个关节中加入关节力矩传感器。关节力矩传感器的实现主要有两种方法,一种叫“串联弹性驱动器”(SEA),简单来说,就是用编码器测量关节内一个弹簧的位移来计算关节输出的力矩;另一种方法是通过测量金属应变片的微小形变来测量关节扭矩。SEA在足式机器人中有很大优势,因为关节自带的”弹簧“有很好的抗冲击保护作用;然而在机械臂中,它却会使整个机械臂变得“软绵绵”,大大降低位置控制的精度和响应速度。应变片(strain gauge)制作的扭矩传感器在机械臂中相对好用一些,但也有它自己的麻烦之处,比如贴应变片的工艺比较复杂、应变片本身温漂比较明显、抗冲击性能比较差容易被撞坏、成本比较高等等——这也是关节扭矩控制机器人价格居高不下的原因之一。

    关节力矩传感器还有一个问题:虽然测量的是一个维度的扭矩,它的读数却很容易被其他维度施加的力/力矩影响,造成读数误差。在串联机械臂上,这个问题尤其明显,因为每一个关节都会受到其后所有关节/连杆施加在它上面的各个方向的力。为了尽可能降低这个因素造成的测量误差,除了优化关节力矩传感器,机械臂的关节也需要为此专门设计。

    关节力矩加末端六维力传感器 ——

    近年来,**具有关节力矩传感器的机械臂又在末端甚至基座也加上六维的力/力矩传感器。**这种做法对于提高末端力控制的精确度和响应速度都是很有必要的。可惜的是,由于现有产品的限制,这相当于在机械臂成本高昂又容易坏的关节扭矩传感器之上,又增加一个成本更高昂、更容易坏的六维力/力矩传感器。目前市面上可以买到的六维力/力矩传感器有几种不同的工作原理:依然用金属应变片的、用红外光检测硅传感器微小位移的、还有用电容去检测微小位移的;无论哪一种,在精度、零漂、噪音、滞回效应、耐用性上多少都有些不足,而足够好的又会非常贵。这些问题使得部署力控应用同样需要耗费大量精力去调整,力控机器人因此无法发挥出全部的潜力。

    整机力控算法 ——

    高精度、高响应、成本又在合理范围内的力控技术离不开在上述所提的各个方面的改进:首先,用位置或关节电流做力控都有本质上的局限性,配备力矩传感器的关节力矩控制必不可少:在关节力矩尽可能快速准确控制的基础上,机械臂末端的力控制性能才能有质的提升;其次,现有的力传感产品性能都不够好、价格也过高,为使传感器这个力控的基本要素具备足够好的性价比,关节力矩传感器以及末端的六维力/力矩传感器都需要重新设计;然后,机械臂的关节需要专门为力矩控制做优化,尽可能减少其他方向的力对一维力矩传感器的干扰;最后,在所有这些改进的基础上,一个先进的整机力控算法才能发挥出力控机器人所有的潜力。
    自适应机械臂需要对硬件到软件都进行自主研发及优化
    自适应机械臂需要对硬件到软件都进行自主研发及优化

    由于一直以来硬件的限制,整机力控算法是一个业界少有人涉足的领域。虽然在论文里相关理论已存在许多年,但论文里永远只有最美最基本的描述;许多最新的研究结果甚至没有被发表出来。只有立足于为力控专门打造的硬件基础上,我们才能真正关注到每一处实现的细节,真正将理论落到实处——这一过程是远复杂于理论本身的。

    层级式智能

    高性能的力控技术只是第一步,在力控技术之上,机械臂需要知道如何结合其他信息、有效地使用这项能力。前面我们说,层级式智能是完整发挥力控技术潜力的一座大厦——那么什么是层级式智能呢?

    非层级智能 ——

    在讲层级式智能之前,我们先来看看非层级式的智能。这几年随着深度学习的火热发展,有一批学者和企业希望将深度学习的方法也引入到机器人的应用中。他们对机械臂采取了被称为“end-to-end training”的方法:比如说拧一个瓶盖,算法只关注机器人的动作距离成功拧好瓶盖有多远(通过原始图像和关节位置),深度神经网络的输出直接就是机械臂每个电机输出的扭矩;用这种方法,我们对机械臂运动学、动力学模型的依赖相对减小、机械臂的力/位置控制算法也不需要做了。

    用这种方法教会机械臂去完成一些任务,效果还是很不错的。然而众所周知,训练深度神经网络离不开大量的数据:要么需要机械臂运行很多很多次以采集足够的数据、要么需要大量机械臂同时训练来减少数据采集的时间——这个难点是显而易见的,研究人员也提出了一些优化的方法。即使抛开这一点,我们认为end-to-end training至少还有以下几点局限,使它难以得到实际应用:

    第一,训练的结果只能适应特定任务、特定环境、甚至特定的机械臂,不具备迁移性;每在新的地方接到新的任务,我们都需要对机械臂进行重新训练或者一定程度的再训练。

    第二,外界的干扰、发生意外时的安全机制,这些对于机械臂的训练结果而言都是边角案例(Corner Case)。以完成任务为目的训练的深度神经网络难以应对过程中可能有的外界干扰,也很难保证机械臂运行过程中周围人的安全。

    第三,用这种方法可以做一些简单任务,比如拧瓶盖、挂衣服、把积木放进对应形状的孔里等等。然而,如果让它去做抛光、擦窗户这样稍微复杂、步骤比较长的任务,或者套装轴承这种可行解非常少的任务,它是很难训练出一个深度神经网络模型来掌握这些技能的。

    智能的底层、中层与高层 ——

    忽略层级直接做end-to-end训练,似乎也不是我们人类掌握和运用技能的方法。比如说擦窗户这个事情,我们会先识别窗户玻璃的边界,然后手拿湿布在玻璃上一边来回移动、一边往垂直玻璃的方向施力以增加与污渍之间的摩擦力;同时确认玻璃的每一处都有被擦到。这个过程中,人需要调用自身很多的能力,有的是有意识调用,比如对玻璃和污渍的识别;还有的早已“编码”在潜意识里,人根本不知道自己正在使用这样的能力,比如对手臂移动和施力的控制。尽管不自知,但每时每刻需要往哪条肌肉发送多少电信号这样的问题,负责思考用什么轨迹擦窗户的“有意识的大脑”从来不需要去思考。

    我们认为机械臂的智能也应该是类似的,负责识别哪里是窗户玻璃、思考应该怎么擦玻璃的那部分智能,并不需要知道每时每刻机械臂的每个关节应该在什么位置或者应该施加多少电流,甚至就连垂直玻璃表面用力然后来回移动的这个动作也已经学习在了机械臂的“潜意识”中。底层的智能就像潜意识般控制着手臂的基础运动,中层的智能编码各种基础运动的不同序列,而高层的智能负责认知、理解、规划等等复杂的智能——我们把这样的智能称为“层级式”智能。

    在层级式智能的体系中,每一个层级相对独立,专注在自己控制/规划/思考的领域。底层智能无法直接影响顶层智能,但顶层智能的实施依赖于底层,顶层对底层起到指导、调节的作用。另外,每一层的智能通常只需调节直属下一层,而不需要跨级下达指令。
    一个简化的层级式智能示意图

    从简单到复杂,从快到慢 ——

    如上图所示,在层级式智能中,**智能从底层到顶层是越来越复杂的,但相应的也是越来越慢的。**一个被蛇吓过的人会在碰到一根绳子时“下意识”地躲避,直到“定睛一看”是绳子才发现是虚惊一场——这个躲避的过程比起视觉的识别和认知要快上许多倍。同样的,如果机械臂在工作中受到人的干扰,其底层的控制算法应该能够快速做出反应,在继续完成任务的同时避免对人造成伤害,而不需要等到顶层智能去发现人的存在、再下达命令开启安全措施。如果机械臂在为一个有弧度的工件抛光,那么机械臂较为底层的“元动作”控制就足以让它快速“适应”工件的形状运动;如果通过三维视觉去给工件建模、再发送模型的信息给机械臂调整它的运动轨迹和施力方向,这个过程不仅太慢、而且严重受限于三维视觉能达到的精度。因此,无论是基于安全的考量还是为了完成任务的效率和效果,自适应机器人都必须有一个分层次、由简单到复杂、由快到慢的智能系统。

    真正发挥人工智能的优势 ——

    机械臂的控制/智能系统分层次以后,顶层的智能可以专注处理自己的事情、而不需要分配精力去关心底层的实现细节。传统机械臂自动化采用的工业视觉,通常专注于识别和定位——视觉定位的精度是一个极其重要的指标,直接影响任务的成败。在自适应机器人应用中,视觉的关键是“认知与理解”;我们可以用深度学习“认识”一类物品的方式去做物体的粗定位和空间位姿判定,也可以用视觉辅助判断工作的有效性(比如玻璃有没有擦到足够干净)。因为不再依赖于高精度的工业视觉,部署应用机械臂的自动化生产线将比以往省去许多成本与反复调试的精力。

    除了视觉认知,力觉的认知是人工智能没有怎么涉足过的主题——因为比起机器视觉,机器力觉信息的获取太有限了。人拥有遍布全身的皮肤感受器,也能够知道关节的每一块肌肉施加了多少力气——依靠身上无数大大小小的“力传感器”,人能够了解所接触的物体的材质、分辨物品的形状、估算物体的重量;还能辨别容器里东西的数量和性质、判断物体之间的连接是否足够紧密、在打包时判断装箱的方式和效果……自适应机器人的人工智能在先进的力传感与力控技术之上,将会有无限的发挥空间去利用力觉信息来认识世界、解决各种实际问题。


    很多人担忧机器人会取代人类的工作。 对于这种担忧,以前我们会说,这个担忧多余了,真实能用的机器人还是太笨、能做的事情还太有限;后来做协作机器人的人也说,我们依然需要“人类的大脑”去应对生产线上的诸多需求,机器人只是处于协作的位置。然而,如果你到工厂的一线去看看,工人们不停插拔同一个零件的无趣、抛光时飞扬的金属或木头粉末,对人的身心又何尝不是一种伤害呢?如果你知道还有多少工序必须要人来做、效率低下又出错率高;有多少工厂招工困难、生产成本上升,这些对行业发展又何尝不是一种制约呢?让机器人代替人类去完成这些危险、有害健康、越来越少人愿意进行的工作,让机器人去提高制造业的生产效率和质量,又何尝不是一件对人类有益的事情。

    自适应机器人的诞生是带着这样的愿景的——新的技术,归根到底,应该是为了改善人类生活质量而生。


    CC的碎碎念+广告时间

    这是一篇科普文章,所以CC尽量不使用专业术语,写的概念又都比较复杂,难免有不严谨之处,还请见谅。

    保密原因,CC不能透漏更深入的技术和理论细节。如果你感兴趣,欢迎你到Flexiv一探究竟。


    参考资料、图片来源及视频出处

    https://www.youtube.com/watch?v=Yqp7lcNDwuw&t=1s

    https://www.youtube.com/watch?v=wcRuXrduj6Q&t=110s

    https://www.youtube.com/watch?v=AVofbcEJ1Nk

    https://www.kuka.com/en-us/products/robotics-systems/software/application-software/kuka-forcetorquecontrol

    https://www.youtube.com/watch?v=10IeB4-lp7g

    https://www.youtube.com/watch?v=s5gAKA-cYQg


    展开全文
  • 自适应安全架构依托持续性监测与回溯分析形成了集防御、监测、响应、预测为一体的安全防护体系,对于高级定向攻击具备智能与弹性安全防护能力。通过对自适应安全及软件定义安全框架进行研究,结合现有网络安全现状,...
  • 弹性网络

    2016-09-26 20:23:00
    一、光网络的发展: 传送网从准同步数字体系(Pseudo-synchronous DigitalHierarchy,PDH)发展到同步数字体系(Synchronous Digital Hierarchy,SDH)、波分复用(Wavelength Division Multiplex,WDM),再到分组传送网...
  • 里面有附加动量法反向传播网络训练程序,自适应学习及弹性bp算法等,适用于神经网络控制入门.
  • 页面自适应方法

    千次阅读 2017-10-20 17:00:46
    大体上,布局中会用到的有:尺寸相关的盒子模型,普通流、浮动、绝对定位三种定位机制,CSS3中的transform、弹性盒子模块、试验中的grid模块。逛园子的时候经常可以看到浮动布局,inline-block布局,弹性盒布局
  • 移动端自适应

    2019-08-13 15:01:19
    一个就是根据不同的屏幕分辨率和设备像素比来尽可能选择高分辨率的图片,也就是当在小屏幕上不需要高清图或大图,这样我们用小图代替,就可以减少网络带宽了。 1.使用 max-width(图片自适应): 图片自适应意思就是...
  • flex-wrap: wrap;
  • 弹性网络(基础知识)

    万次阅读 2014-07-29 21:13:56
    一、光网络的发展: 传送网从准同步数字体系(Pseudo-synchronous DigitalHierarchy,PDH)发展到同步数字体系(Synchronous Digital Hierarchy,SDH)、波分复用(Wavelength Division Multiplex,WDM),再到分组传送网...
  • 移动web开发笔记

    万次阅读 2016-05-15 20:12:27
    流动布局页面对用户更友好,因为它能自适应用户的设置。 页面周围的空白区域在所有分辨率和浏览器下都是相同的,在视觉上更美观。 如果设计良好,流动布局可以避免在小分辨率下出现水平滚动条。 缺点: 设计...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,263
精华内容 2,905
关键字:

自适应弹性网络