Wolfspeed—重回隧道而壮士断腕的碳化硅巨头

碳化硅芯观察 2023-08-24 19:06

前言

就在2021年底的财年第1季度电话会议上,CEO Gregg Lowe表示纽约州莫霍克谷8寸晶圆厂(MVF)建设进展顺利,并且获得了第一份正式采购合同——“看到了隧道尽头的曙光”同一时期,管理层信心满满的制定了2024财年(日历年2023年7月至2024年6月)财务模型,预计Wolfspeed营收和毛利润率将分别大幅提高到15亿美元和50%。


走在没有尽头隧道中

随着MVF 产线成为Wolfspeed与关键客户签署LTSA保供协议里的核心内容,“隧道尽头的曙光”成为其后数次财报电话会中的标志性用语。无论是在MVF即将建成前,还是公司宣称这座意义重大的晶圆厂即将产出数百万美元营收之时,管理层都用这段短语鼓舞市场情绪:道路坎坷,但帝国兴亡,在此一举。

事情正在起变化

起高楼,宴宾客,情况的变化在去年底出现端倪。按照《Wolfspeed,一往无前,股价还原》中所述,运营中出现数个利空消息,财务也暴露出增收不增利的情况,使得在2022年7-9月所属季度的财报公布后,Wolfspeed股价大跌近30%。

碳化硅大厂Wolfspeed一年以来的股价变化,数次出现财报后股价大跌的情况

如果用一个字形容公司的运营问题,那就是”急”。
在MVF还未投产之时,为了实现早先制定2024财年15亿美元营收等财务目标,急于提高材料事业部的销售收入。
这导致为了增加碳化硅衬底产出,在没有充分评估上下游生产流程之前,Durham 6寸材料产线就匆忙上马加长版晶锭。之后才发现晶圆切割和衬底抛光等步骤对加长晶锭兼容性不佳,良率低于预期,影响了材料事业部连续几个季度的营收和毛利润率。
其次是急于MVF的尽快投产,Wolfspeed把人力和其他资源都倾入其中,反而忽视为MVF提供8寸衬底的Durham厂区十号楼材料产线的建设。以至于需要设备进场时,才发现供应商的交期远超过往,致使8寸衬底的供应拖累了MVF的产线验证和客户样品准备。
当然,也可能是前期为了保证MVF晶圆厂建设所需,公司资金压力较大,无法提前订购设备和零件。但是无论如何,面对2020年就已经出现的半导体供应链紧绷状况,运营团队准备并不充分。
2022年底,管理层曾乐观预估2023财年下半年业绩将回到正常轨道,营收预计仍然会达到10亿美元这一里程碑。但是,之前文章中笔者认为短短1-2个季度难以完全解决出现的问题,目标恐怕难以达成。最后实际业绩也符合笔者的判断,Wolfspeed 2023财年营收仅为9.22亿美元。
上述的问题集中在战术层面,主要对公司的短期业绩产生影响。而战略层面上的“急“来自MVF晶圆厂和公司激进的扩产计划。

欲速则不达

无可厚非,MVF 8寸晶圆厂投资决策本身没有任何问题。
原有Durham 6寸晶圆产线已经没有扩产潜力,每季度能够实现的碳化硅功率器件营收至多1亿美元,上下浮动5%-7%。而且因为与公司射频RF产品部分共线生产,任何对射频器件生产流程的调整或者生产设备的调试都会影响更为关键的碳化硅产线。这导致射频产线从4寸到6寸的升级迟迟不能进行,给毛利润率带来负300 个基点(-3%)的拖累。
虽然决策正确,但是执行却屡出波折。Wolfspeed在MVF开工时的规划是分三期进行建设,第一期占用50%的超净间面积,预计在2022年上半年完成并开始试产。但是,越来越火爆的碳化硅市场使得公司决定将MVF一次性建成,因此实际试产时间被推迟了近一年。
MVF的延期以及前述运营挑战似乎在相当一段时间内都没有反映在Wolfspeed的中长期业绩预期上。在问题已现端倪的2022年底,管理层还继续延用2022年上半年向上修正后的财务模型,认为2024财年和2026财年营收依然能够达到15亿和28亿美元。在今年初介绍在德国建设第二座8寸晶圆厂的规划时,公司甚至还提出2027财年营收40亿美元的目标(详情请见《两强合作直指欧洲芯片大基金,影响几何?》)。

Wolfspeed基于MVF按时投产所制定的财务模型(来源:01芯闻)

可惜墨菲定律虽迟但到,MVF、加长晶锭和设备交期的负面影响在今年开始逐渐被华尔街和投资者质疑,股价上也有了相应的表现。

因此,管理层被迫逐步降低预期,向投资者发出警示信号——从MVF建设初期所规划的2025财年起预期贡献超过70%的营收,到2023年上半年实现显著销售额,再到同年中期有数百万美元的营收。然而,在最近2023年4至6月季度报告中,首席执行官Gregg Lowe确认MVF所带来的营收未超过100万美元。
必然有人需要为整体运营失速承担责任。这个被祭天者就是负责全球运营的高级副总裁Rex Felton Jr. 。今年二月,Wolfspeed突然宣布Felton因为家庭原因离职,同时将他的职责进行分拆,分别交给四位管理者负责,同时这四位管理者全部晋升为高级副总裁,直接向CEO汇报。从这些动作中可以看出,Wolfspeed的运营状况已经到了不换脑就换人的程度。

运营高级副总的离职小作文(来源:01芯闻,LinkedIn)

All-in

然而,让投资者和众多长期关注者更加担忧的是公司过于激进的投资策略。
就在MVF仍在努力提升产能之际,Wolfspeed已经公布了总额高达65亿美元的全球产能扩展计划。除了MVF的8寸产线已经基本建设完毕,但启动费用仍需继续投入外,位于Durham厂区的10号楼8寸衬底工厂和位于Siler City的第二座碳化硅衬底厂"The JP" 已经进入建设阶段。此外,公司还在年初宣布了位于德国萨尔州恩斯多夫、与采埃孚共同投资的第二座自动化8寸碳化硅晶圆厂的规划。
所有这些项目都是绿地投资(Greenfield Investment),与棕地投资(Brown Field Investment)相比,Wolfspeed在投资总额、建设周期以及资本回报率方面承担更高的风险。
仅以JP工厂为例,在2024财年,公司将投入近20亿美元,这相当于其销售额的两倍。同时,Durham 10号楼8寸碳化硅烧结炉到位率75%,还需要继续投入设备和后续需要的启动费用。而如果德国的晶圆厂获得开工批准,从2024或2025财年开始,还需要投入30亿美元的资金。
更为令人担忧的是Wolfspeed正面临一种“水多了加面,面多了加水”的困境。公司决定将MVF晶圆厂用一期而非三期建成,却发现Durham 10号衬底工厂只能满足MVF满产所需的20%碳化硅衬底。因此,The JP衬底工厂必须迅速建设和投产,其产能爬坡的时间将决定MVF何时能够达到满产状态,进而实现管理层设定的财务模型目标(一些更具体的产能数据和JP的关键时间节点,会在“01芯闻”知识星球中提供)。

MVF晶圆厂何时守得云开见月明(来源:网络)

因此,就像鲨鱼一样,Wolfspeed必须保持游动(投资)的状态,一旦停下就可能面临死亡(衰退)。正如笔者在另一篇文章中所指出的,Wolfspeed必须也只能在碳化硅这条赛道不断all-in,这给公司的资产负债表、利润表和现金流量表带来了极大的压力。反观其竞争对手如英飞凌、意法和安森美等公司拥有其他能产生利润和现金流的“摇钱树”(cash cow)业务,因此在大规模投资碳化硅上更能游刃有余。

同时,不利的运营状况和竞争格局也在内部产生压力。作为一家有着几十年历史的企业,从专注材料的Cree转型为专注半导体的Wolfspeed,势必带来种种制约。
在公司内部,原Cree团队与后来CEO引入的德州仪器背景团队,在资源分配、人员调整等方面存在话语权之争。运营中出现的问题也导致材料团队和器件团队产生龃龉。这种局面间接引发了之前提到的一系列高层人员变动。

市场影响

迅速扩大的车规碳化硅器件需求与缓慢爬坡的MVF产能供给,成为Wolfspeed与众多LTSA汽车客户之间主要的矛盾。整车制造商和一级供应商原本计划依靠MVF 8寸产线的10倍产能,满足市场对碳化硅驱动电动汽车的需求,但是MVF的投产推迟打乱了这一计划。在2022年底至2024年期间,这些重点客户只能采购6寸产线的产品来填补需求缺口。

而正如前面提到的,Durham 6寸晶圆厂满载下每个季度至多生产1亿美元上下的碳化硅器件,此前主要供应工业和新能源领域的广大客户。为了保持与汽车LTSA大客户的良好关系,公司只能将Durham晶圆厂产能优先满足其需要。这意味着没有签署LTSA的客户,或者行业优先度较低的客户,难以获得足够产能,或者交期会被推迟。然后,失去工业和新能源市场的部分市场份额也许是Wolfspeed在当前两个烂苹果中那个相对不烂的选择。
彼之毒药,吾之蜜糖。Wolfspeed战略性的退出部分工业和新能源市场对Wolfspeed的竞争对手来说可能是一次机会之窗。意法和英飞凌等国际大厂对碳化硅MOSFET器件必然有所企图。而目前产能溢出,但是产品组合大多集中于非车规产品的国产供应商,可能在二极管和低端MOSFET上获得红海中稍纵即逝的喘息时机。
一个小插曲:当分析师询问Wolfspeed如何解决汽车大客户当前只能依赖Durham 6寸产线供应而不是LTSA中规定的MVF 8寸产线时,管理层顾左右而言它,表示公司的投资计划非常庞大,客户无法在其他地方找到接近的产能水平,因此难以脱离Wolfspeed。对此,意法是第一个不答应。

财务影响

在今年4月的财报中,Wolfspeed发布了财务预警。原本计划在2024财年实现的营收从预期的15亿美元减少到10亿美元。同时,毛利润率则腰斩,从50%降至25%。此外,实现25%这个毛利润率底部的时间与MVF何时达到20%产能利用率高度相关,间接又受到Durham厂区10号楼的投产进度影响。
在8月的财报电话会中,CFO Neill Reynolds宣布因为MVF进入初步投产状态,按照美国证券委员会SEC的指导意见,晶圆厂启动费用在会计归类上会从费用类别变为晶圆厂未充分利用产能而带来的成本,纳入生产成本(COGS)。这导致Wolfspeed的碳化硅器件生产成本额外增加3700万美元,2023年7-9月季度预期毛利润率将下降至历史最低水平,中位数仅有14%。
此外,由于车规产品从MVF 8寸产线转向Durham 6寸产线生产,也对毛利润率造成了负面影响。。车规产品的生产成本较高,而汽车客户的议价权较分散的工业和新能源客户也更强。因此,此前依据8寸晶圆前瞻成本所制定的报价,在仅能靠6寸产线生产时,毛利率也相应受到影响。

对2024财年第1季度,管理层给出的营收预期中位数目标仅为2.3亿美元,环比减少580万美元。这是在Durham 10号楼8寸衬底产线75%烧结炉就位,可以为MVF晶圆厂提供更多8寸衬底的前提下给出的。公司给出的唯一解释是Durham 晶圆厂上个季度的产出高于平均水平,而本季度预计会回撤,因此导致了营收预期中位数的下调。
此外,公司给出的2024财年全年营收预期为10亿至11亿美元,增长 8%至19%。相比其他碳化硅大厂通常高达30%至70%的碳化硅营收增长,这一增长幅度显得相对不够突出。
在短期内营收增长受限,但却需要大量资本支出和债务融资的情况下,公司在现金流上面临相当大的挑战。Wolfspeed每季度仅利息支出就有5500万美元,再加上资本支出,上个季度的净现金流出高达4.55亿美元。
以上的财务数据让华尔街感到十分不满。Charter Equity 分析师爱德华-斯奈德(Edward Snyder)在电话会上少有地发表了负面评价:“去年大部分时间,我们都在讨论MVF的运营问题,以及你们对收益率和利润率的目标,还有你们如何预测这些数字,以便我们能很好地了解它是否达到了预期……但坦白地说,连续四个季度的业绩严重低于预期,这对你们的股票来说并不好,而且看起来明天的股价也不会很好……“
作为为数不多的好消息,上个季度Wolfspeed又获得16亿美元的Design-in(设计导入),将2023财年的该指标锁定在83亿美元。可惜远水解不了近渴,总计高达190亿美元的Design-in在未来相当一段时间没有足够的产能来满足。

前景

Wolfspeed目前遇到的种种问题使得其总市值从巅峰时期的一百多亿美元,下降到目前的不足60亿美元。但是公司在当前热点碳化硅赛道里拥有最为悠久地技术的积累,因此市场一直在思考Wolfspeed是否会成为某家半导体巨头的并购猎物。

谁是大鱼?(来源:01芯闻)

笔者认为猎手中最有可能的就是德州仪器,原因有以下几个方面。
首先德州仪器是一家美国本土企业,因此收购同为美国公司的Wolfspeed,不会出现几年前英飞凌收购Wolfspeed时那样,被美国海外投资委员会(CFIUS)所否决。
此外,德州仪器作为模拟和功率半导体领域的最大公司,目前手中的现金和短期投资高达95亿美元,足够全额现金收购Wolfspeed。
第三,德州仪器目前的功率产品组合集中在中低压段,高压产品仅有氮化镓器件。收购Wolfspeed可以带来同为第三代半导体核心的碳化硅器件,补全德州仪器高压产品组合,做到既有高频开关,又有高压大电流开关。同时,与驱动芯片、信号链芯片等产品线形成合力。
最后,值得注意的是,Wolfspeed的中高层团队中有许多成员拥有德州仪器的背景。目前关键的运营部门中,许多人都是德州仪器的老员工。甚至连CEO Gregg Lowe本人也曾在德州仪器工作过27年,担任高管职务。因此,将Wolfspeed融入以运营为长的德州仪器中,相对来说难度较低。
当然,也存在一些反对意见。笔者从德州仪器内部了解到,就是否投资碳化硅或者收购Wolfspeed,有员工曾在全体大会上询问高管团队,得到的答复是并不在管理层的考虑范围之内。
目前,德州仪器已经在运营和建设多个晶圆厂,但大部分都集中于12寸产线。管理层的重点是将现金投入并专注于运营12寸产线,而非更小的晶圆尺寸。然而当前主流的碳化硅产线仍然为6寸,8寸产线的占比仍需3-5年时间才能显著提升,因此与德州仪器的运营重点存在相当大的差距。
此外,超过80%的碳化硅TAM(Total Addressable Market)集中在电动汽车的动力系统领域。然而在这个领域中,德州仪器的存在感并不强。德州仪器的的竞争优势集中在汽车、工业、通信设备以及企业系统等六大市场中的模拟和嵌入式产品方面。因此,尽管产品层面上碳化硅可以和德州仪器当前产品形成了一定的协同,但在应用领域上却难以得到体现。

自救

当然,Wolfspeed也不会坐以待毙,公司在融资、产能和预付款方面持续主动出击。
在6月底,Wolfspeed从阿波罗全球资产管理公司(Apollo Global Management Inc.)为首的银行团处获得20亿美元融资,采用七年期担保票据的结构,票面利率高达9.875%。
紧接着在7月初,Wolfspeed宣布与瑞萨(Renesas)签署了为期10年的衬底供应合同,从2025年开始生效。瑞萨为此支付了高达20亿美元的定金。
另外,公司还宣布计划从外部获得8寸衬底来源,争取以比完全依赖自产更快的速度提高MVF晶圆厂产能利用率。细节此处暂时按下不表。

出售产业(来源:01芯闻)

除此以外,在昨天(8/22日)公司突然宣布以1.25亿美元出售其射频RF业务。购买方MACOM Technology Solutions Holdings将付出7500万现金和5000万等价股票,计划在今年年底完成交易。
2018年Wolfspeed以3.45亿欧元从英飞凌购得射频业务,初衷是巩固其在射频碳化硅基氮化镓(GaN-on-SiC)技术领域的领导地位,并获得更多市场、客户和封装专业技术。然后,五年努力经营,一朝三折甩卖,壮士断腕不过如此。
尽管如此,这次出售决策的脉络十分清晰。Wolfspeed过去一段时间和未来都将专注于碳化硅功率器件和化合物半导体材料业务。而射频业务板块与公司发展目标和重点客户群体重合度很小,以至于射频产品的产线升级在公司内部难以获得优先级。在目前公司面临困境情况下,与其让射频业务拖累整体毛利润率,不如出售该业务以获取急需的资金,并减少因射频业务产能利用不足而导致的亏损。。
这一决策是否能帮助Wolfspeed度过脆弱期,坚持到MVF晶圆厂和The JP衬底工厂投产,使得公司仍然作为一家独立公司运营?这值得国内半导体创业者和从业人员“以史为镜、以人为镜“。

小结

结合最新的Wolfspeed财务数据以及昨天刚刚公布的业务出售消息,通过笔者长期观察的综合分析,揭示了Wolfspeed这家碳化硅领域的巨头为何从一度前景光明变为危机四伏,同时探讨公司的自救举措、可能前景,以及对其竞争对手的利好消息。

笔者文章所引用的文章和研报,以及一些关键数据资料等会放到同名知识星球供读者下载。由于公众号的限制,无法提供留言功能,但欢迎读者加入知识星球,与笔者进行交流与讨论。


*免责声明:本文由作者原创。文章内容系作者个人观点,碳化硅芯观察转载仅为了传达观点,仅代表碳化硅芯观察对该观点赞同或支持,如果有任何异议,欢迎联系碳化硅芯观察。

评论 (0)
  • [完结19章]SpringBoot开发双11商品服务系统
    今天给大家分享一下关于SpringBoot开发双11商品服务系统的整个流程,我将深度还原大厂实习期技术成长全流程,让你收获大厂项目开发全流程与实战经验,具备应对大流量场景问题的解决能力,全面助力提升实习/转正/跳槽表现力与成功率。


    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。

    目的
    让大家更容易使用 spring,更容易集成各种常用的中间件、开源软件。
    SpringBoot 基于 Spring 开发, SpringBoot 本身并不提供 Spring 框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于 Spring 框架的应用程序。
    SpringBoot 不是用来替代 spring 的解决方案,而是和 spring 框架紧密结合提升 spring 开发者体验的工具。

    准备测试数据
    我们先导入准备好的测试数据,这个测试数据是一份商品数据。

    字段包含商品id,name(商品名)
    last_month_sales(最近一个月的销量)
    favorites(收藏数)这几个字段,我们主要是通过商品名来搜索。
    首先我先先创建一个商品索引
    PUT goods
    {
      "settings": {
        "number_of_shards": 1,
        "number_of_replicas": 0
      },
      "mappings": {
        "properties": {
          "id": {
            "type": "keyword",
            "doc_values": false,
            "norms": false,
            "similarity": "boolean"
          },
          "name": {
            "type": "text"
          },
            "price": {
            "type": "double"
          },
          "last_month_sales": {
            "type": "long"
          },
          "favorites": {
            "type": "long"
          },
          "year":{
            "type": "short"
          }
        }
      }
    }
    千里之行,始于足下。想要舒舒服服地使用Spring框架,就要把它的开发环境配置好,这对它好,也对我好。

    1. jdk 的配置       
    使用 IDEA 进行开发,在 IDEA 中配置 jdk 的方式很简单,打开 File->Project Structure选择 SDKs。
    在 JDK home path 中选择本地 jdk 的安装目录。
    在 Name 中为 jdk 自定义名字通过以上三步骤,即可导入本地安装的 jdk。如果是使用 STS 或者 eclipse 可以通过两步骤添加:
    window->preference->java->Instralled JRES 来添加本地 jdk。
    window-->preference-->java-->Compiler 选择 jre,和 jdk 保持一致。
    PUT test_index/_doc/1
    {
      "string_field":"imooc",
      "int_field": 100,
      "float_field":3.14,
      "bool_field":true,
      "date_field":"2022/03/16",
      "obj_field":{"key1":"value1","key2":100},
      "array_field1":[100,3.14],
      "array_field2":[100,"200"],
      "array_field3":["2022/03/16","100"],
      "array_field4":["100","2022/03/16"],
      "null_field":null
      }
      创建 Spring Boot 项目后需要进行 maven 配置。打开 File->settings,搜索 maven,配置一下本地的 maven 信息。在 Maven home directory 中选择本地 Maven 的安装路径;在 User settings file 中选择本地 Maven 的配置文件所在路径。在配置文件中配置一下国内阿里的镜像,这样在下载 maven 依赖时,速度会变得很快。
    {
      "test_index" : {
        "mappings" : {
          "properties" : {
            "array_field" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "bool_field" : {
              "type" : "boolean"
            },
            "date_field" : {
              "type" : "date",
              "format" : "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
            },
            "float_field" : {
              "type" : "float"
            },
            "int_field" : {
              "type" : "long"
            },
            "obj_field" : {
              "properties" : {
                "key1" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                },
                "key2" : {
                  "type" : "long"
                }
              }
            },
            "string_field" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }
          }
        }
      }
    }

    从以上结果中,我们可以看到 Spring Boot 通过MVN方式自动为项目配置了对应的 springframework、logging、jackson 以及 Tomcat 等依赖,而这些正是我们在开发 Web 项目时所需要的。

    那么细心的同学可能会发现一个问题,即在以上 pom.xml 的配置中,引入依赖 spring-boot-starter-web 时,并没有指明其版本(version),但在依赖列表中,我们却看到所有的依赖都具有版本信息,那么这些版本信息是在哪里控制的呢? 
    {
      "_index" : "test_index",
      "_id" : "1",
      "_version" : 1,
      "_seq_no" : 0,
      "_primary_term" : 1,
      "found" : true,
      "_source" : {
        "string_field" : "Chan",
        "int_field" : 100,
        "int_string_field" : "100",
        "float_field" : 3.14,
        "bool_field" : true,
        "date_field" : "2022/03/16",
        "obj_field" : {
          "key1" : "value1",
          "key2" : 100
        },
        "array_field" : [
          "value1",
          "100"
        ],
        "null_field" : null
      }
    }
    spring-boot-starter-parent 是所有 Spring Boot 项目的父级依赖,它被称为 Spring Boot 的版本管理中心,可以对项目内的部分常用依赖进行统一管理。

    <parent>    

            <groupId>org.springframework.boot</groupId>    

            <artifactId>spring-boot-starter-parent</artifactId>    

            <version>2.5.6</version>    

            <relativePath/> 

    </parent>

    Spring Boot 项目可以通过继承 spring-boot-starter-parent 来获得一些缺省的配置内容,它主要提供了以下特性:

    默认 JDK 版本(Java 8)

    默认字符集(UTF-8)

    依赖管理功能

    资源过滤

    默认插件配置识别 

    application.properties 或 application.yml 类型的配置文件
    DELETE test_index

    PUT test_index
    {
      "mappings": {
        "dynamic":false 
      }
    }
    GET test_index/_search
    {
      "query": {
       "term": {
         "field1.field2": {
           "value": "imooc ES"
         }
       }
      }
    }

    GET test_index/_doc/4

    DELETE test_index

    PUT test_index
    {
      "mappings": {
        "dynamic":"strict" 
      }
    }


    POST test_index/_doc/2
    {
      "field1":{
       "field2":"imooc ES" 
      }
    }

    GET test_index/_search
    {
      "query": {
       "term": {
         "field1.field2": {
           "value": "imooc ES"
         }
       }
      }
    }

    GET test_index/_doc/4

    以下就是本文的全部内容,感谢大家观看
  • 12、如何挑选立式磁棒电感厂家
    12、如何挑选立式磁棒电感厂家
  • 浅谈地下污水厂智能照明控制应用

    结合某地下污水厂项目,从结构、系统组成、系统功能、控制要求、场景模式等方面介绍了地下污水厂智能照明控制系统,探索了一套适用于地下污水厂的智能照明控制策略,以确保地下污水厂正常运行的照明需求。

  • 首个基于Transformer的分割检测+视觉大模型视频课程(23年新课+源码+课件)
    自动驾驶是高安全型应用,需要高性能和高可靠的深度学习模型,Vision Transformer是理想的选摔。现在主流的自动驾驶感知算法基本都使用了Vision Transformer相关技术,比如分割、2D/3D检测,以及最近大火的大模型 (如SAM),Vision Transformer在自动驾驶领域的落地方面遍地开花。5一方面,在自动驾驶或图像处理相关算法岗位的面试题中,Vision Transformer是必考题,需要对其理论知识有深入理解,并且在项目中真实的使用过相关技术。

    Transformer出自于Google于2017年发表的论文《Attention is all you need》,最开始是用于机器翻译,并且取得了非常好的效果。但是自提出以来,Transformer不仅仅在NLP领域大放异彩,并且在CV、RS等领域也取得了非常不错的表现。尤其是2020年,绝对称得上是Transformer的元年,比如在CV领域,基于Transformer的模型横扫各大榜单,完爆基于CNN的模型。为什么Transformer模型表现如此优异?它的原理是什么?它成功的关键又包含哪些?本文将简要地回答一下这些问题。

    我们知道Transformer模型最初是用于机器翻译的,机器翻译应用的输入是某种语言的一个句子,输出是另外一种语言的句子。
    var i *int = nil
    fmt.Println("i.size:", unsafe.Sizeof(i)) //8

    var i8 *int8 = nil
    fmt.Println("i8.size:", unsafe.Sizeof(i8)) //8

    var s *string = nil
    fmt.Println("s.size:", unsafe.Sizeof(s)) //8

    var ps *struct{} = nil
    fmt.Println("ps.size:", unsafe.Sizeof(ps)) //8

    var si []int = nil
    var si1 []int = nil
    fmt.Println("si.size:", unsafe.Sizeof(si)) //24

    var ii interface{} = nil
    fmt.Println("ii.size:", unsafe.Sizeof(ii)) //16
    我们以生成我,爱,机器,学习,翻译成<bos>,i,love,machine,learning,<eos>这个例子做生成过程来解释。
    训练:

    把“我/爱/机器/学习”embedding后输入到encoder里去,最后一层的encoder最终输出的outputs [10, 512](假设我们采用的embedding长度为512,而且batch size = 1),此outputs 乘以新的参数矩阵,可以作为decoder里每一层用到的K和V;
    将<bos>作为decoder的初始输入,将decoder的最大概率输出词向量A1和‘i’做cross entropy(交叉熵)计算error。
    将<bos>,“i” 作为decoder的输入,将decoder的最大概率输出词 A2 和‘love’做cross entropy计算error。
    将<bos>,“i”,“love” 作为decoder的输入,将decoder的最大概率输出词A3和’machine’ 做cross entropy计算error。
    将<bos>,“i”,"love ",“machine” 作为decoder的输入,将decoder最大概率输出词A4和‘learning’做cross entropy计算error。
    将<bos>,“i”,"love ",“machine”,“learning” 作为decoder的输入,将decoder最大概率输出词A5和终止符做cross entropy计算error。
    那么并行的时候是怎么做的呢,我们会有一个mask矩阵在这叫seq mask,因为他起到的作用是在decoder编码我们的target seq的时候对每一个词的生成遮盖它之后的词的信息。
    func main() {
    s := []string{"a", "b", "c"}
    fmt.Println("s:origin", s)
    changes1(s)
    fmt.Println("s:f1", s)

    changes2(s)
    fmt.Println("s:f2", s)

    changes3(s)
    fmt.Println("s:f3", s)
    }

    func changes1(s []string) {
    var tmp = []string{"x", "y", "z"}
    s = tmp
    }

    func changes2(s []string) {
    // item只是一个副本,不能改变s中元素的值
    for i, item := range s {
    item = "d"
    fmt.Printf("item=%s;s[%d]=%s", item, i, s[i])
    }
    }

    func changes3(s []string) {
    for i := range s {
    s[i] = "d"
    }
    }

    首先我们需要为每个输入向量(也就是词向量)创建3个向量,分别叫做Query、Key、Value。那么如何创建呢?我们可以对输入词向量分别乘上3个矩阵来得到Q、K、V向量,这3个矩阵的参数在训练的过程是可以训练的。注意Q、K、V向量的维度是一样的,但是它们的维度可以比输入词向量小一点,比如设置成64,其实这步也不是必要的,这样设置主要是为了与后面的Mulit-head注意力机制保持一致(当使用8头注意力时,单头所处理的词向量维度为512/8=64,此时Q、K、V向量与输入词向量就一致了)。我们假设输入序列为英文的"Thinking Machines"
    想要深度理解Attention机制,就需要了解一下它产生的背景、在哪类问题下产生,以及最初是为了解决什么问题而产生。

    首先回顾一下机器翻译领域的模型演进历史:

    机器翻译是从RNN开始跨入神经网络机器翻译时代的,几个比较重要的阶段分别是: Simple RNN, Contextualize RNN,Contextualized RNN with attention, Transformer(2017),下面来一一介绍。

    「Simple RNN」 :这个encoder-decoder模型结构中,encoder将整个源端序列(不论长度)压缩成一个向量(encoder output),源端信息和decoder之间唯一的联系只是: encoder output会作为decoder的initial states的输入。这样带来一个显而易见的问题就是,随着decoder长度的增加,encoder output的信息会衰减。
    func main(){
    var c = make(chan int)
    fmt.Printf("c.pointer=%p\n", c) //c.pointer=0xc000022180
    go func() {
    c <- 1
    addChannel(c)
    close(c)
    }()

    for item := range c {
    //item: 1
    //item: 2
    fmt.Println("item:", item)
    }
    }

    func addChannel(done chan int) {
    done <- 2
    fmt.Printf("done.pointer=%p\n", done) //done.pointer=0xc000022180
    }
    在测试模型的时候,Test:decoder没有label,采用自回归一个词一个词的输出,要翻译的中文正常从encoder并行输入(和训练的时候一样)得到每个单词的embedding,然后decoder第一次先输入bos再此表中的id,得到翻译的第一个单词,然后自回归,如此循环直到预测达到eos停止标记
    type visit struct {
    a1  unsafe.Pointer
    a2  unsafe.Pointer
    typ Type
    }

    func deepValueEqual(v1, v2 Value, visited map[visit]bool) bool {
    if !v1.IsValid() || !v2.IsValid() {
    return v1.IsValid() == v2.IsValid()
    }
    if v1.Type() != v2.Type() {
    return false
    }

    // We want to avoid putting more in the visited map than we need to.
    // For any possible reference cycle that might be encountered,
    // hard(v1, v2) needs to return true for at least one of the types in the cycle,
    // and it's safe and valid to get Value's internal pointer.
    hard := func(v1, v2 Value) bool {
    switch v1.Kind() {
    case Pointer:
    if v1.typ.ptrdata == 0 {
    // not-in-heap pointers can't be cyclic.
    // At least, all of our current uses of runtime/internal/sys.NotInHeap
    // have that property. The runtime ones aren't cyclic (and we don't use
    // DeepEqual on them anyway), and the cgo-generated ones are
    // all empty structs.
    return false
    }
    fallthrough
    case Map, Slice, Interface:
    // Nil pointers cannot be cyclic. Avoid putting them in the visited map.
    return !v1.IsNil() && !v2.IsNil()
    }
    return false
    }

    if hard(v1, v2) {
    // For a Pointer or Map value, we need to check flagIndir,
    // which we do by calling the pointer method.
    // For Slice or Interface, flagIndir is always set,
    // and using v.ptr suffices.
    ptrval := func(v Value) unsafe.Pointer {
    switch v.Kind() {
    case Pointer, Map:
    return v.pointer()
    default:
    return v.ptr
    }
    }
    addr1 := ptrval(v1)
    addr2 := ptrval(v2)
    if uintptr(addr1) > uintptr(addr2) {
    // Canonicalize order to reduce number of entries in visited.
    // Assumes non-moving garbage collector.
    addr1, addr2 = addr2, addr1
    }

    // Short circuit if references are already seen.
    typ := v1.Type()
    v := visit{addr1, addr2, typ}
    if visited[v] {
    return true
    }

    // Remember for later.
    visited[v] = true
    }

    switch v1.Kind() {
    case Array:
    for i := 0; i < v1.Len(); i++ {
    if !deepValueEqual(v1.Index(i), v2.Index(i), visited) {
    return false
    }
    }
    return true
    case Slice:
    if v1.IsNil() != v2.IsNil() {
    return false
    }
    if v1.Len() != v2.Len() {
    return false
    }
    if v1.UnsafePointer() == v2.UnsafePointer() {
    return true
    }
    // Special case for []byte, which is common.
    if v1.Type().Elem().Kind() == Uint8 {
    return bytealg.Equal(v1.Bytes(), v2.Bytes())
    }
    for i := 0; i < v1.Len(); i++ {
    if !deepValueEqual(v1.Index(i), v2.Index(i), visited) {
    return false
    }
    }
    return true
    case Interface:
    if v1.IsNil() || v2.IsNil() {
    return v1.IsNil() == v2.IsNil()
    }
    return deepValueEqual(v1.Elem(), v2.Elem(), visited)
    case Pointer:
    if v1.UnsafePointer() == v2.UnsafePointer() {
    return true
    }
    return deepValueEqual(v1.Elem(), v2.Elem(), visited)
    case Struct:
    for i, n := 0, v1.NumField(); i < n; i++ {
    if !deepValueEqual(v1.Field(i), v2.Field(i), visited) {
    return false
    }
    }
    return true
    case Map:
    if v1.IsNil() != v2.IsNil() {
    return false
    }
    if v1.Len() != v2.Len() {
    return false
    }
    if v1.UnsafePointer() == v2.UnsafePointer() {
    return true
    }
    for _, k := range v1.MapKeys() {
    val1 := v1.MapIndex(k)
    val2 := v2.MapIndex(k)
    if !val1.IsValid() || !val2.IsValid() || !deepValueEqual(val1, val2, visited) {
    return false
    }
    }
    return true
    case Func:
    if v1.IsNil() && v2.IsNil() {
    return true
    }
    // Can't do better than this:
    return false
    case Int, Int8, Int16, Int32, Int64:
    return v1.Int() == v2.Int()
    case Uint, Uint8, Uint16, Uint32, Uint64, Uintptr:
    return v1.Uint() == v2.Uint()
    case String:
    return v1.String() == v2.String()
    case Bool:
    return v1.Bool() == v2.Bool()
    case Float32, Float64:
    return v1.Float() == v2.Float()
    case Complex64, Complex128:
    return v1.Complex() == v2.Complex()
    default:
    // Normal equality suffices
    return valueInterface(v1, false) == valueInterface(v2, false)
    }
    }
    这便是encoder的整体计算流程图了,Transformer模型中堆叠了多个这样的encoder,无非就是输出连接输入罢了,常规操作。
    最后再附上一个Transformer的代码实现,读者有兴趣可以跟着自己复现一下Transformer模型的代码。
       package main

       import (
           "log"
           "sync"
       )

       func init() {
           log.SetFlags(log.Lshortfile)
       }
       func main() {
           lock := sync.Mutex{}

           //Go 1.18 新增,是一种非阻塞模式的取锁操作。当调用 TryLock() 时,
           //该函数仅简单地返回 true 或者 false,代表是否加锁成功
           //在某些情况下,如果我们希望在获取锁失败时,并不想停止执行,
           //而是可以进入其他的逻辑就可以使用TryLock()
           log.Println("TryLock:", lock.TryLock())
           //已经通过TryLock()加锁,不能再次加锁
           lock.Lock()

       }

  • RadarSensors_ARS404-21_cn数据手册​
    RadarSensors_ARS404-21_cn数据手册
  • ECG前置电路设计
    TI出的一个经验文档,讲的很不错
  • 特斯拉电路图.rar
    特斯拉电路图,欢迎大家下载
  • Wayking RadarSensors_LRR7710_中英文产品手册
    Wayking RadarSensors_LRR7710_中英文产品手册
  • 16、谷景电子贴片电感在智能电梯领域应用取得新进展
    16、谷景电子贴片电感在智能电梯领域应用取得新进展
  • 基于单片机的工业级液晶图形显示控制芯片RA8889ML3N-Datasheet
    TFT-LCD液晶显示控制芯片RA8889ML3N的优势:
    低功耗及功能强大:这款芯片最大支持分辨率为1366x2048,内置128Mb SDRAM,可为内容显示进行快速刷新,同时内置视频解码单元,支持JPEG/AVI硬解码播放,为普通单片机实现视频播放提供可能。
    支持多种接口:RA8889ML3N支持MCU端的8080/6800 8/16-bit 非同步并列接口和3/4线SPI及IIC串列接口,以及最大驱动1366x800分辨率的TFT LCD。
    显示功能强大:RA8889ML3N提供多段的显示记忆体缓冲区段,支持多图层功能,并提供画中画(PIP)、支持透明度控制与显示旋转镜像等显示功能。

    应用范围广:这款芯片广泛应用于自动化控制设备、电力监测控制、测量检测仪器仪表、电教设备、智能家电、医疗检测设备、车用仪表及工控自动化等领域。

    技术咨询与交流:QQ2851189731, 微信13760238805

  • 风力发电机组机结构与原理-2018年-赵万清
    风力发电机组机结构与原理,中国电力出版社,PDF版本。
  • CS5511芯片设计原理图
    CS5511的LVDS输出可以配置为在120 Hz时支持高达1920x1080或在100 Hz时支持1920x1200。CS5511 LVDS接口支持单端口和双端口模式。CS5511具有5个配置引脚,可支持32个不同面板分辨率和LVDS工作模式与一个闪光图像的组合。
  • 13、如何解决直插差模电感的异响问题
    13、如何解决直插差模电感的异响问题
  • 用了好几年的吹风机坏了,我决定自己把它拆开修理一下。本来我是以为内部是有一定的电路板的,但是当我打开吹风机的外壳,眼前的景象让我大吃一惊。吹风机内部非常简单,就是电机带着风扇吹一个发热电阻丝。第一步,打开开关部分,仔细检查了一下开关,就是一个普通的开关,串联一个二极管,形成了不同的档位,对应不一样的电流,用的时候就是大风和小风。检查完开关后,发现开关没有问题。第二步,打开吹风机电机部分,也是最重要的部分,但是组成也是比较简单的,就是电机在吹风,前面是电阻丝在发热。检查了一下电阻丝,没有断裂的地方
    curton 2023-12-02 17:20 15浏览
  • 听力危机不可不慎,助听器市场的发展概况根据世界卫生组织WHO于2021年所发布的世界听力报告(World report on hearing)统计,全球目前有20%左右的听损人口;其中「轻度」与「中度」听损人口就占了大约15亿人左右。台湾方面,根据2021年卫生福利部统计处的数据显示,台湾则约有12万人有听力损失的问题,其中更有高达56% (约71,543人)确诊为轻度听损。足以看出听力受损问题已逐渐成为全球新兴的健康议题。听力损失的成因及轻重程度因人而异,但无论如何,或多或少都会影响到我们的日
    百佳泰测试实验室 2023-11-30 17:26 174浏览
  • By Toradex胡珊逢 简介 双屏显示在显示设备中有着广泛的应用,可以面向不同群体展示特定内容。文章接下来将使用 Verdin iMX8M Plus 的 Arm 计算机模块演示如何方便地在 Toradex 的 Linux BSP 上实现在两个屏幕上显示独立的 Qt 应用。 硬件介绍 软件配置 Verdin iMX8M Plus 模块使用 Toradex Multimedia Reference Image V6.4.0 版本,其包含 Qt5.15 相关运行环境。默认系统中已经使
    hai.qin_651820742 2023-12-01 11:53 199浏览
  • 作者:Shawn Prestridge,IAR资深现场应用工程师 / 美国FAE团队负责人 安全一直都是一个非常热门的话题,似乎每周都会听到这样的消息:某某公司如何被入侵,数百万用户的数据被泄露。 我们看到这么多的安全问题,部分原因在于我们对待安全的方式:安全性通常被认为是事后考虑的问题,是在开发结束时才添加到设备上的东西。然而,复杂的系统,尤其是嵌入式系统,有一个很大的攻击面,这让攻击者有机可乘,能够在“盔甲”上找到破绽。如果你去研究大部分黑客试图入侵系统的方式,你很快就会发现,在他们的武
    电子科技圈 2023-11-30 14:43 170浏览
  • 印刷部分 这本书印刷和普通书籍不太一样,类似笔记本的手写体印刷和笔记的网格,有亲近感和新鲜感内容部分 分为通信工程 ;传感器工程;磁传感器工程;太阳电池功能几大部分通信电路是一种用于传输信息的电子电路,可以用于无线通信、有线通信和网络通信等各种通信系统中。传感器电路则是用于感知和测量环境参数的电路,可以探测光、温度、压力、湿度、运动等各种物理量。在学习通信电路方面,可能会接触到模拟通信电路和数字通信电路。模拟通信电路主要涉及模拟信号的传输和处理,如调制解调、信号放大、滤波等。数字通信电路则涉及数
    陇南有只大花猫 2023-11-30 19:01 288浏览
  •        2023年,全球服务器市场开始走低,出货数据双位数的下滑,给整个产业链带来巨大冲击(具体数据如表格)。     中国区服务器市场的IDC数据暂时没有获取,但是可以提供两个新闻供大家参考:  1.新浪财经11/08新闻 浪潮信息前三季业绩双降股价跌52% 应收账款149亿占营收28%存货增四成|浪潮信息_新浪财经_新浪网 (sina.com.cn)(作者:长江商报)   日前
    天涯书生 2023-12-02 13:43 74浏览
  • 随着汽车电子进入电动化+智能网联的时代,新能源、车联网、智能化、电动化四个领域带来了CAN数据的需求,企业车队管理需要数据,汽车运营需要数据,改装、解码、匹配工具打造需要数据,现在就连简单的LED汽车照明控制,也需要匹配数据。这一切,逃脱不了CAN、LIN、SENT、BSD、MOST各种协议下,不同ECU控制单元在不同年份,不同款式下的数据,可以这么说,在新能源这个前提下,我们要做的工作和要做的事情可能要更为复杂、多变。 前日,我拿出一份13年左右丰田的CAN协议,里边包括车灯控制、车
    lauguo2013 2023-11-30 15:45 159浏览
  • 在电力系统中,过电压保护器是一种重要的设备,它对电力设备的安全运行具有重要的作用。下面我们来了解一下过电压保护器的基本结构。过电压保护器通常由三个主要部分组成:间隙、非线性元件和触发器。1. 间隙:间隙是过电压保护器的基本结构之一,它是由两个金属电极组成的,通常采用球形或棒形结构。间隙的间距通常在几毫米到几厘米之间,它能够承受一定的电压,并在过电压条件下进行放电。2. 非线性元件:非线性元件是过电压保护器的另一个重要组成部分。它是一种特殊的电阻器,能够在高电压下呈现出非线性的特性。当电压超过一定
    保定众邦电气 2023-11-30 14:49 215浏览
  • 前言 在网络部署之后和业务开展之前,运营商迫切希望了解当前网络的性能状态,以便为商业规划和业务推广提供必要的基础数据支持。因此,高可靠性和高精确度的性能测试方法对于运营商评判网络性能的优劣,显得尤为重要,而RFC 2544等传统测试标准已不足于鉴定当今的服务等级协议(SLA)。SLA是服务提供商(如ISP)及其最终用户之间的协议,它规定以太网服务的开通或验证必须进行测量,且必须达到SLA的规范要求。目前,对以太网服务进行测试和故障诊断的最佳选择无疑是ITU-T Y.1564标准。 &
    信而泰市场部 2023-11-30 15:06 114浏览
  •     按照 IPC术语,连接盘/Land 是指一块导体,通常用于连接和/或固定元器件的导电部分。    为了增强孔的机械强度,所有的金属化孔或者镀覆孔,在穿过每一层铜箔时,都应该有连接盘,连接盘的形状不限。前面提过的孔环也是连接盘的一种形式。在允许的条件下,孔环和连接盘的尺寸都要尽量大一些。    前面提到过,铜层图案(连接盘)和孔是在不同的工序制作的。由于加工公差的存在,用常见的圆形连接盘和圆孔来说,并不能保证孔和连接盘保持精确的同
    电子知识打边炉 2023-11-30 21:32 227浏览
  •    本文介绍在ALPS平台上进行SSL测试的内容和方法   什么是SSL SSL全称是Secure Sockets Layer,指安全套接字协议,为基于TCP的应用层协议提供安全连接;SSL介于TCP/IP协议栈的第四层和第五层之间,广泛用于电子商务、网上银行等。 SSL协议有三个版本,其中SSL2.0和3.0曾被广泛使用,其中SSLv3.0自1996提出并得到大规模应用成为了事实上的标准,在2015年才被弃用。1999年,IETF收纳了SSLv3.0并
    信而泰市场部 2023-11-30 15:08 151浏览
  • 高低温探针台是一种用于材料科学、物理、化学等领域的实验设备,主要用于在高温和低温环境下对材料进行各种实验和研究。下面是高低温探针台的工作原理。工作原理是将样品放置在加热和冷却组件上,然后使用各种测量仪器对其进行实验和测量。具体来说,其工作流程如下:将样品放置在加热和冷却组件上;启动加热系统,将样品加热到所需的温度;启动制冷系统,将冷却组件降温到所需的温度;通过各种测量仪器对样品进行实验和测量;记录实验数据并进行分析和处理;结束实验后,关闭加热和制冷系统,并解除真空状态,取出样品。总之,高低温探针
    锦正茂科技 2023-12-01 14:50 190浏览
  •    电源连接器的插针遭受损坏的情况非常普遍,这种故障会让连接器的电流传输受到影响,进而影响设备的正常使用,那是什么因素导致电源连接器的插针遭到损坏呢?下面Amass将为您分析其中的原因。   1、应用环境高温 1. 在高温环境下,电源连接器插针易受腐蚀影响,形成氧化层,损失接触压力,甚至可能发生接头烧损情况。对于这种环境,电源连接器需要具备耐高温性能,不仅需满足环境温度要求,还须考虑其在工作状态下的热量散发。  
    艾迈斯电子 2023-11-30 16:33 179浏览
我要评论
0
4
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦