前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【设计模式】深入浅出单实例Singleton设计模式

【设计模式】深入浅出单实例Singleton设计模式

作者头像
周三不加班
发布于 2019-09-04 08:28:25
发布于 2019-09-04 08:28:25
77600
代码可运行
举报
文章被收录于专栏:程序猿杂货铺程序猿杂货铺
运行总次数:0
代码可运行

单实例Singleton设计模式可能是被讨论和使用的最广泛的一个设计模式了,这可能也是面试中问得最多的一个设计模式了。这个设计模式主要目的是想在整个系统中只能出现一个类的实例。这样做当然是有必然的,比如你的软件的全局配置信息,或者是一个Factory,或是一个主控类,等等。你希望这个类在整个系统中只能出现一个实例。当然,作为一个技术负责人的你,你当然有权利通过使用非技术的手段来达到你的目的。比如:你在团队内部明文规定,“XX类只能有一个全局实例,如果某人使用两次以上,那么该人将被处于2000元的罚款!”(呵呵),你当然有权这么做。但是如果你的设计的是东西是一个类库,或是一个需要提供给用户使用的API,恐怕你的这项规定将会失效。因为,你无权要求别人会那么做。所以,这就是为什么,我们希望通过使用技术的手段来达成这样一个目的的原因。

本文会带着你深入整个Singleton的世界

1

Singleton的教学版本

这里,我将直接给出一个Singleton的简单实现,因为我相信你已经有这方面的一些基础了。我们姑且把这个版本叫做1.0版

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void test() {
        // version 1.0
        public class Singleton {
            private static Singleton singleton = null;
            private Singleton() {}
            public static Singleton getInstance() {
                if(singleton == null) {
                    singleton = new Singleton();
                }
                 return singleton;
            }
        }
    }

在上面的实例中,我想说明下面几个Singleton的特点:(下面这些东西可能是尽人皆知的,没有什么新鲜的)

  1. 私有(private)的构造函数,表明这个类是不可能形成实例了。这主要是怕这个类会有多个实例。
  2. 即然这个类是不可能形成实例,那么,我们需要一个静态的方式让其形成实例:getInstance()。注意这个方法是在new自己,因为其可以访问私有的构造函数,所以他是可以保证实例被创建出来的。
  3. 在getInstance()中,先做判断是否已形成实例,如果已形成则直接返回,否则创建实例。
  4. 所形成的实例保存在自己类中的私有成员中。
  5. 我们取实例时,只需要使用Singleton.getInstance()就行了。

当然,如果你觉得知道了上面这些事情后就学成了,那得给你当头棒喝一下了,事情远远没有那么简单。

2

Singleton的实际版本

上面的这个程序存在比较严重的问题,因为是全局性的实例,所以,在多线程情况下,所有的全局共享的东西都会变得非常的危险,这个也一样,在多线程情况下,如果多个线程同时调用getInstance()的话,那么,可能会有多个进程同时通过 (singleton== null)的条件检查,于是,多个实例就创建出来,并且很可能造成内存泄露问题。嗯,熟悉多线程的你一定会说——“我们需要线程互斥或同步”,没错,我们需要这个事情

Singleton升级成1.1版

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Singleton {
    private static Singleton singleton = null;
    private Singleton() { }
    public static Singleton getInstance() {
        if(singleton == null) {
            synchronized(Singleton.class) {
                singleton = new Singleton();
            }
        }
        return singleton;
    }
}

嗯,使用了Java的synchronized方法,看起来不错哦。应该没有问题了吧?!错!这还是有问题!为什么呢?前面已经说过,如果有多个线程同时通过(singleton== null)的条件检查(因为他们并行运行),虽然我们的synchronized方法会帮助我们同步所有的线程,让我们并行线程变成串行的一个一个去new,那不还是一样的吗?同样会出现很多实例。嗯,确实如此!看来,还得把那个判断(singleton== null)条件也同步起来。

Singleton升级成1.2版

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Singleton {
    private static Singleton singleton = null;
    private Singleton()  { 
    public static Singleton getInstance() {
        synchronized (Singleton.class) {
            if (singleton == null) {
                singleton = new Singleton();
            }
         }
        return singleton;
    }
}

不错不错,看似很不错了。在多线程下应该没有什么问题了,不是吗?的确是这样的,1.2版的Singleton在多线程下的确没有问题了,因为我们同步了所有的线程。只不过嘛……,什么?!还不行?!是的,还是有点小问题,我们本来只是想让new这个操作并行就可以了,现在,只要是进入getInstance()的线程都得同步啊,注意,创建对象的动作只有一次,后面的动作全是读取那个成员变量,这些读取的动作不需要线程同步啊。这样的作法感觉非常极端啊,为了一个初始化的创建动作,居然让我们达上了所有的读操作,严重影响后续的性能啊!还得改!嗯,看来,在线程同步前还得加一个(singleton== null)的条件判断,如果对象已经创建了,那么就不需要线程的同步了。OK,下面是1.3版的Singleton。

Singleton升级成1.3版

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// version 1.3
public class Singleton {

    private static Singleton singleton = null;
    private Singleton() {   }
    public static Singleton getInstance() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

感觉代码开始变得有点罗嗦和复杂了,不过,这可能是最不错的一个版本了,这个版本又叫“双重检查”Double-Check。下面是说明:

  1. 第一个条件是说,如果实例创建了,那就不需要同步了,直接返回就好了。
  2. 不然,我们就开始同步线程。
  3. 第二个条件是说,如果被同步的线程中,有一个线程创建了对象,那么别的线程就不用再创建了。

相当不错啊,干得非常漂亮!请大家为我们的1.3版起立鼓掌!

但是,如果你认为这个版本大攻告成,你就错了。

主要在于singleton = new Singleton()这句,这并非是一个原子操作,事实上在 JVM 中这句话大概做了下面 3 件事情。

  1. 给 singleton 分配内存
  2. 调用 Singleton 的构造函数来初始化成员变量,形成实例
  3. 将singleton对象指向分配的内存空间(执行完这步 singleton才是非 null 了)

但是在 JVM 的即时编译器中存在指令重排序的优化。也就是说上面的第二步和第三步的顺序是不能保证的,最终的执行顺序可能是 1-2-3 也可能是 1-3-2。如果是后者,则在 3 执行完毕、2 未执行之前,被线程二抢占了,这时 instance 已经是非 null 了(但却没有初始化),所以线程二会直接返回 instance,然后使用,然后顺理成章地报错。

对此,我们只需要把singleton声明成 volatile 就可以了。下面是1.4版:

Singleton升级成1.4版

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// version 1.4
public class Singleton {
    private volatile static Singleton singleton = null;
    private Singleton() {   }
    public static Singleton getInstance()  {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return
            singleton;
    }
}

使用 volatile 有两个功用:

1)这个变量不会在多个线程中存在复本,直接从内存读取。

2)这个关键字会禁止指令重排序优化。也就是说,在 volatile 变量的赋值操作后面会有一个内存屏障(生成的汇编代码上),读操作不会被重排序到内存屏障之前。

但是,这个事情仅在Java 1.5版后有用,1.5版之前用这个变量也有问题,因为老版本的Java的内存模型是有缺陷的。

3

Singleton 的简化版本

上面的玩法实在是太复杂了,一点也不优雅,下面是一种更为优雅的方式:

这种方法非常简单,因为单例的实例被声明成 static 和 final 变量了,在第一次加载类到内存中时就会初始化,所以创建实例本身是线程安全的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// version 1.6
public class Singleton {
    private volatile static
    Singleton singleton = new Singleton();
    private Singleton() {   }
    public static Singleton getInstance()  {
        return singleton;
    }
}

但是,这种玩法的最大问题是——当这个类被加载的时候,new Singleton() 这句话就会被执行,就算是getInstance()没有被调用,类也被初始化了。

于是,这个可能会与我们想要的行为不一样,比如,我的类的构造函数中,有一些事可能需要依赖于别的类干的一些事(比如某个配置文件,或是某个被其它类创建的资源),我们希望他能在我第一次getInstance()时才被真正的创建。这样,我们可以控制真正的类创建的时刻,而不是把类的创建委托给了类装载器。

好吧,我们还得绕一下:

下面的这个1.6版是老版《Effective Java》中推荐的方式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// version 1.6
public class Singleton {
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    private Singleton() {
    }
    public static final Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

上面这种方式,仍然使用JVM本身机制保证了线程安全问题;由于 SingletonHolder 是私有的,除了 getInstance() 之外没有办法访问它,因此它只有在getInstance()被调用时才会真正创建;同时读取实例的时候不会进行同步,没有性能缺陷;也不依赖 JDK 版本。

4

Singleton 优雅版本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public enum Singleton{
   INSTANCE;
}

居然用枚举!!看上去好牛逼,通过EasySingleton.INSTANCE来访问,这比调用getInstance()方法简单多了。

默认枚举实例的创建是线程安全的,所以不需要担心线程安全的问题。但是在枚举中的其他任何方法的线程安全由程序员自己负责。还有防止上面的通过反射机制调用私用构造器。

这个版本基本上消除了绝大多数的问题。代码也非常简单,实在无法不用。这也是新版的《Effective Java》中推荐的模式。

5

Singleton的其他问题

怎么?还有问题?!当然还有,请记住下面这条规则——“无论你的代码写得有多好,其只能在特定的范围内工作,超出这个范围就要出Bug了”,这是“陈式第一定理”,呵呵。你能想一想还有什么情况会让这个我们上面的代码出问题吗?

01

Class Loader

不知道你对Java的Class Loader熟悉吗?“类装载器”?!C++可没有这个东西啊。这是Java动态性的核心。顾名思义,类装载器是用来把类(class)装载进JVM的。JVM规范定义了两种类型的类装载器:启动内装载器(bootstrap)和用户自定义装载器(user-defined class loader)。 在一个JVM中可能存在多个ClassLoader,每个ClassLoader拥有自己的NameSpace。一个ClassLoader只能拥有一个class对象类型的实例,但是不同的ClassLoader可能拥有相同的class对象实例,这时可能产生致命的问题。如ClassLoaderA,装载了类A的类型实例A1,而ClassLoaderB,也装载了类A的对象实例A2。逻辑上讲A1=A2,但是由于A1和A2来自于不同的ClassLoader,它们实际上是完全不同的,如果A中定义了一个静态变量c,则c在不同的ClassLoader中的值是不同的。

于是,如果咱们的Singleton 1.3版本如果面对着多个Class Loader会怎么样?呵呵,多个实例同样会被多个Class Loader创建出来,当然,这个有点牵强,不过他确实存在。难道我们还要整出个1.4版吗?可是,我们怎么可能在我的Singleton类中操作Class Loader啊?是的,你根本不可能。在这种情况下,你能做的只有是——“保证多个Class Loader不会装载同一个Singleton”。

02

序例化

如果我们的这个Singleton类是一个关于我们程序配置信息的类。我们需要它有序列化的功能,那么,当反序列化的时候,我们将无法控制别人不多次反序列化。

03

多个Java虚拟机

如果我们的程序运行在多个Java的虚拟机中。什么?多个虚拟机?这是一种什么样的情况啊。嗯,这种情况是有点极端,不过还是可能出现,比如EJB或RMI之流的东西。要在这种环境下避免多实例,看来只能通过良好的设计或非技术来解决了。

04

volatile变量

关于volatile这个关键字所声明的变量可以被看作是一种 “程度较轻的同步synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是synchronized的一部分。当然,如前面所述,我们需要的Singleton只是在创建的时候线程同步,而后面的读取则不需要同步。所以,volatile变量并不能帮助我们即能解决问题,又有好的性能。而且,这种变量只能在JDK 1.5+版后才能使用。

05

关于继承

是的,继承于Singleton后的子类也有可能造成多实例的问题。不过,因为我们早把Singleton的构造函数声明成了私有的,所以也就杜绝了继承这种事情。

06

关于代码重用

也话我们的系统中有很多个类需要用到这个模式,如果我们在每一个类都中有这样的代码,那么就显得有点傻了。那么,我们是否可以使用一种方法,把这具模式抽象出去?这算是个思考题吧,留给广大网友!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-09-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员啊粥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
多项SOTA!SVDFormer-自增强自结构双生点云补全算法-ICCV2023论文详解
目前,点云补全任务只要存在以下两个挑战:利用不完整的点云中生成真实的全局形状,并生成高精度的局部结构。当前的方法要么仅使用3D坐标系,要么导入额外的标注好相机内部参数的图像,来指导模型补全缺失部分的几何。然而,这些方法并不总是完全利用可用于准确高质量点云补全的跨模态自结构信息。
BBuf
2023/09/08
1.3K0
多项SOTA!SVDFormer-自增强自结构双生点云补全算法-ICCV2023论文详解
多任务学习新篇章 | EMA-Net利用Cross-Task Affinity实现参数高效的高性能预测
现代AI研究正在迅速融入作者的日常生活。然而,大多数最先进模型庞大且依赖远程访问,因为它们无法轻松部署在边缘设备如移动电话、智能配件或可穿戴医疗设备上。对于许多应用,模型在本地运行且无需依赖网络的需求突显了在模型设计中平衡性能与参数效率的重要性。
集智书童公众号
2024/01/29
8320
多任务学习新篇章 | EMA-Net利用Cross-Task Affinity实现参数高效的高性能预测
nuscenes再创新高!EA-LSS:高效优化LSS方案,即插即用~
大家好,很开心能够受邀来到自动驾驶之心分享我们最近针对多模态BEV 3D目标检测的改进方案——EA-LSS。下面将会给大家详细介绍EA-LSS的设计思路与实验。
公众号-arXiv每日学术速递
2023/09/11
1.1K0
nuscenes再创新高!EA-LSS:高效优化LSS方案,即插即用~
​四大院校携手 GraphBEV | 将激光雷达和相机信息融合到BEV,比 BEVFusion性能高出8.3% !
三维目标检测是自动驾驶系统的一个关键组成部分,旨在准确识别和定位汽车、行人以及三维环境中的其他元素[49, 58]。为了鲁棒和高品质的检测,当前的实践主要遵循像BEVFusion[29, 34]这样的多模态融合范式。不同的模态通常提供互补的信息。例如,图像含有丰富的语义表示,但缺乏深度信息。相比之下,点云提供了几何和深度信息,但却是稀疏的且缺乏语义信息。因此,有效利用多模态数据的优势同时减轻其局限性,对于提高感知系统的鲁棒性和准确性至关重要[58]。
AIGC 先锋科技
2024/07/08
1.1K0
​四大院校携手 GraphBEV  |  将激光雷达和相机信息融合到BEV,比 BEVFusion性能高出8.3% !
三万字收藏 | 三维场景点云理解与重建技术
作者:龚靖渝, 楼雨京, 柳奉奇, 张志伟, 陈豪明, 张志忠, 谭鑫, 谢源, 马利庄
一点人工一点智能
2023/08/24
1.7K0
三万字收藏 | 三维场景点云理解与重建技术
厦门大学突破 SRKD框架 | 雨天无阻,显著提高了检测精度
近年来,利用点云数据进行三维目标检测的研究兴趣日益增长。为了在自动驾驶等领域广泛应用,这些模型必须在多种环境下展现出稳健的性能。尽管在基准数据集上的三维目标检测已经取得进展,但在恶劣天气条件(例如,雨天)下实现一致且可靠性能仍是一个开放的挑战。
集智书童公众号
2024/04/12
8660
厦门大学突破 SRKD框架 | 雨天无阻,显著提高了检测精度
AdaFit:一种对基于学习的点云法线估计方法的新思考(ICCV2021)
AdaFit: Rethinking Learning-based Normal Estimation on Point Clouds (2021-ICCV)
3D视觉工坊
2021/10/21
1.2K0
CVPR一次中66篇,大装置一天训练完GPT-3,商汤准备迎战未来
机器之心原创 作者:张倩 商汤的「既要…… 又要…… 还要……」 6 月 19 日,CVPR 2021 在线上拉开帷幕。作为计算机视觉三大顶会之一,本届 CVPR 大会一共接收了 7039 篇有效投稿,最终有1366 篇被接收为poster,295篇被接收为oral,接收率大概为 23.6%。 在前段时间公布的最佳论文候选名单中,我们发现,华人一作论文占据了半壁江山(16/32)。当然,这一现象并非偶然。其实,早在九年前,华人学者就已经凭借其创新精神在国际 CV 顶会上大放异彩,比如香港中文大学的汤晓鸥团
机器之心
2023/03/29
3930
CVPR一次中66篇,大装置一天训练完GPT-3,商汤准备迎战未来
14篇论文入选CVPR!快手视觉研究成果精华总结
机器之心发布 机器之心编辑部 在正在进行的 CVPR 2021 上,快手有多篇论文被接收,涵盖三维视觉、目标检测、视频目标分割、人脸伪造技术检测等热门研究领域。 计算机视觉和模式识别领域的顶级会议 CVPR 正在进行中,本次大会接收率为 23.7%,其中快手有 14 篇论文被接收,这也是快手在国际视觉技术相关领域顶级会议上中稿最多的一次,研究成果数量的阶段性爆发标志着快手产学研合作从探索期逐步进入成熟期。 此次快手的中稿论文,涵盖了三维视觉、目标检测、视频目标分割、人脸伪造技术检测等热门研究领域,部分研究成
机器之心
2023/03/29
5680
14篇论文入选CVPR!快手视觉研究成果精华总结
CVPR 2023 点云系列 | Point-NN无需训练的非参数、即插即用网络
项目代码:https://github.com/ZrrSkywalker/Point-NN
AiCharm
2023/05/15
7850
CVPR 2023 点云系列 | Point-NN无需训练的非参数、即插即用网络
小目标检测新方法SCTransNet | 空间通道交叉Transformer & 互补前馈达成完美语义信息传递
SCTransNet有效地编码了目标与背景之间的语义差异,从而提升了其内部表征,以准确检测小红外目标。 在三个公开数据集NUDT-SIRST、NUAA-SIRST和IRSTD-1k上的大量实验表明,所提出的SCTransNet优于现有的IRSTD方法。 代码:https://github.com/xdFai
集智书童公众号
2024/02/21
2.1K0
小目标检测新方法SCTransNet | 空间通道交叉Transformer & 互补前馈达成完美语义信息传递
点云压缩研究进展与趋势
以激光扫描为代表的主动采集装备在易操作性、机动灵活性、智能化、高效化等方面日益成熟,利用三维成像技术采集密集点的空间坐标、色彩纹理和反射强度等信息,可高保真且快速重建被测目标的三维实体,在工程测量、生物医学、智慧城市、虚拟现实(VR)、增强现实(AR)等科学与工程研究中发挥十分重要的作用[1-4]。
一点人工一点智能
2023/03/13
3.1K0
点云压缩研究进展与趋势
UADA3D 突破激光雷达难题 | 引领无监督域自适应新趋势,助力点云三维目标检测突破!
基于LiDAR的感知系统对于自动驾驶汽车[20]或移动机器人[41]的安全导航至关重要。一个关键挑战是在车辆环境中对物体进行可靠检测和分类[54]。最先进的(SOTA)三维目标检测方法在很大程度上依赖于用于训练的数据集的质量和多样性,同时也取决于这些数据集在推理过程中如何真实地反映现实世界条件。获取和标注此类数据仍然是一项重大的技术和实践挑战,既耗时又劳动密集。这在三维目标检测模型的大规模开发和部署中构成了一个主要障碍。
集智书童公众号
2024/05/10
9480
UADA3D 突破激光雷达难题 | 引领无监督域自适应新趋势,助力点云三维目标检测突破!
CPEM:通过身份一致性和表情独占约束实现精确的面部运动重定向
现有方法通常将该问题表述为三维人脸重建问题,该问题从人脸图像中估计人脸身份和表情等人脸属性。然而,由于缺乏身份和表情的ground-truth标签,大多数基于3d人脸重建的方法都不能准确地捕捉人脸的身份和表情。因此,这些方法可能无法实现预期的性能。
用户1324186
2024/05/11
3460
CPEM:通过身份一致性和表情独占约束实现精确的面部运动重定向
7 Papers & Radios | 上交、商汤致力高质量点云补全;伯克利等提出通用伪造图像检测方法
论文 1:Learning from Web Data with Memory Module
机器之心
2020/03/25
8450
一种基于分层聚合的3D实例分割方法(ICCV 2021)
Hierarchical Aggregation for 3D Instance Segmentation (ICCV 2021)
3D视觉工坊
2022/03/11
1.1K0
一种基于分层聚合的3D实例分割方法(ICCV 2021)
深度学习点云质量增强方法综述
随着三维探测技术的发展,点云逐渐成为最常用的三维物体/场景表征的数据类型之一,广泛应用于自动驾驶、虚拟/增强现实、文物修复以及虚拟导览等诸多场景。
一点人工一点智能
2024/04/09
1.9K0
深度学习点云质量增强方法综述
探索3D视觉中的Transformer架构:通用Backbone与自适应采样策略 !
计算机视觉中的一个基本问题是在三维空间中理解和识别场景与物体。它允许以紧凑的方式表达关系,并提供在现实世界中导航和操作的能力。3D视觉在各个领域都发挥着重要作用,包括自动驾驶、机器人技术、遥感、医疗、增强现实、设计行业等众多应用。
未来先知
2024/08/08
6680
探索3D视觉中的Transformer架构:通用Backbone与自适应采样策略  !
基于深度学习的RGBD深度图补全算法文章鉴赏
【GiantPandaCV导语】本文针对3维视觉中的深度图补全问题,介绍了一下近年基于深度学习的RGB-D深度图补全算法进展。深度图的质量对3维视觉至关重要,深度图的优劣极大地影响了后续的3d识别等工作,但目前较多研究聚焦于自动驾驶领域的Lidar深度图的补全,而对RGB-D相机涉猎较少,故本文介绍几篇基于consumer RGB-D cameras深度图补全的深度学习方法,以此来看看近期该领域的发展现状。
BBuf
2021/07/01
2.4K0
基于深度学习的RGBD深度图补全算法文章鉴赏
14篇论文入选CVPR!快手视觉研究成果精华总结
计算机视觉和模式识别领域的顶级会议 CVPR 正在进行中,本次大会接收率为 23.7%,其中快手有 14 篇论文被接收,这也是快手在国际视觉技术相关领域顶级会议上中稿最多的一次,研究成果数量的阶段性爆发标志着快手产学研合作从探索期逐步进入成熟期。
公众号-arXiv每日学术速递
2021/07/02
7800
14篇论文入选CVPR!快手视觉研究成果精华总结
推荐阅读
多项SOTA!SVDFormer-自增强自结构双生点云补全算法-ICCV2023论文详解
1.3K0
多任务学习新篇章 | EMA-Net利用Cross-Task Affinity实现参数高效的高性能预测
8320
nuscenes再创新高!EA-LSS:高效优化LSS方案,即插即用~
1.1K0
​四大院校携手 GraphBEV | 将激光雷达和相机信息融合到BEV,比 BEVFusion性能高出8.3% !
1.1K0
三万字收藏 | 三维场景点云理解与重建技术
1.7K0
厦门大学突破 SRKD框架 | 雨天无阻,显著提高了检测精度
8660
AdaFit:一种对基于学习的点云法线估计方法的新思考(ICCV2021)
1.2K0
CVPR一次中66篇,大装置一天训练完GPT-3,商汤准备迎战未来
3930
14篇论文入选CVPR!快手视觉研究成果精华总结
5680
CVPR 2023 点云系列 | Point-NN无需训练的非参数、即插即用网络
7850
小目标检测新方法SCTransNet | 空间通道交叉Transformer & 互补前馈达成完美语义信息传递
2.1K0
点云压缩研究进展与趋势
3.1K0
UADA3D 突破激光雷达难题 | 引领无监督域自适应新趋势,助力点云三维目标检测突破!
9480
CPEM:通过身份一致性和表情独占约束实现精确的面部运动重定向
3460
7 Papers & Radios | 上交、商汤致力高质量点云补全;伯克利等提出通用伪造图像检测方法
8450
一种基于分层聚合的3D实例分割方法(ICCV 2021)
1.1K0
深度学习点云质量增强方法综述
1.9K0
探索3D视觉中的Transformer架构:通用Backbone与自适应采样策略 !
6680
基于深度学习的RGBD深度图补全算法文章鉴赏
2.4K0
14篇论文入选CVPR!快手视觉研究成果精华总结
7800
相关推荐
多项SOTA!SVDFormer-自增强自结构双生点云补全算法-ICCV2023论文详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档