Zhangzhe's Blog

The projection of my life.

0%

新手管理者的关键跨越

1. 新手管理者会遇到的 9 个管理难题和需要完成的 3 个关键跨越

1.1 九个管理难题

  1. 从同事变为管理者,接受和适应“管理者”的身份。
  2. 空降到团队做管理者,被团队接纳和认可。
  3. 给团队成员分配合理的任务,提出合理的要求。
  4. 让员工承担更多或更有挑战性的工作,付出额外的努力。
  5. 让员工理解和认同管理者的要求,真正承担起责任。
  6. 处理团队搞不定的问题和突发状况。
  7. 及时掌握团队的任务执行情况,提前干预。
  8. 用恰当的方式给予员工反馈。
  9. 根据员工的不同情况,因材施教。

1.2 三个关键跨越

  1. 获得团队的认可和信任,完成“承担管理责任”的跨越。
  2. 让团队稳定可靠地交付工作成果,完成“推动执行”的跨越。
  3. 帮助团队改进和提升,完成“辅导他人”的跨越。

2. 新手管理者为何难以完成关键跨越

2.1 新手管理者普遍存在的现象

  • 通常当前在任的一线管理者在“承担管理责任”和“推动执行”方面表现良好,但在“辅导他人”方面表现很差,同时这也是相对最不受企业重视的能力。

2.2 管理者难以完成管理跨越的原因

  1. 从关注“事”到关注“人”,管理工作需要把工作对象和重心从“事”转移到“人”,这会挑战一部分管理者的工作习惯。
  2. 从“短期”到“长期”,管理工作相对需要更长的时间的投入才能看到成效,一部分管理者会等不及。
  3. 从“优势”变成“陷阱”,管理者习惯用过去自己习惯和擅长的方式解决问题,也更喜欢做自己擅长的事情。

2.3 新手管理者应该怎么做

  1. 需要做好的心态准备是“空杯心态”。
  2. 对“我过去这样成功过”的想法保持警惕。
  3. 列出一个反向待办事项清单,训练自己少做和不做过去自己擅长的事。

3. 成功跨越:在行动中改变

3.1 新手管理者在进行管理发展时,需要先理解两个问题

  1. 某些人可能更具有管理潜力,更适合做管理。具备潜力的人有更高的起点和更好的准备状态,但无论多有管理潜力,都与管理岗位的要求存在差距,而缩小差距的唯一办法就是进行管理实践。
  2. “知行不合一”是常态,管理者能采取有效的管理行动却未必具备相应的素质能力,同样,不具备一定优势的管理者,仍然可以先努力使自己的行为贴近团队管理者应有的表现。

3.2 新手管理者若想获得发展,需要采取的发展原则是从自身优势出发,先行动起来

  1. 了解自己的优势,把自己的优势作为一个支撑点和发力点。
  2. 行动起来,在行动中学习和发展。
  3. 通过管理历练和具体的时间,发展出相应的素质和能力。

3.3 新手管理者可以采用 APPLE 发展策略

APPLE 发展策略:

  1. Awareness: 认知管理者的要求,以及自身优势。
  2. Path: 制定一个最小化的发展路线图。从优势出发,给自己建立一个支撑点,并制定一个包括发展目标,具体行动和检验方法的计划。
  3. Practice: 付诸行动,通过刻意和反复的练习,跟过去的习惯已建立好的脑区地图抢夺资源,建立起新的通往目的地的路径。
  4. Learn: 学习知识,结合实践总结和反思。在实践中先有体验,学习就是带着问题寻找答案的主动过程。
  5. Evaluation: 定期评估,学会重新看待“评价”,把评价看做反映某一阶段性状态的中性动作。

关键跨越一:承担管理责任

4. 信任的基石:承担管理责任

4.1 新手管理者上任后的首要任务是取得团队的认可和信任

  1. 必须表现出一个管理者该有的样子,承担起管理的责任。
  2. 承担管理责任有三个关键要点:表率垂范、为结果负责和组织意识。

4.2 表率垂范包括以身作则和身先士卒

  1. 以身作则的核心是,要求下属的管理者自己要先做到。
  2. 身先士卒主要是,管理者在困难或关键时刻能顶上,冲在最前面。
  3. 要做到表率垂范,态度和勇气比能力更重要,是愿不愿的问题,而非能不能到问题。

4.3 为结果负责包括为所做决定负责和为团队的工作结果负责

  1. 要做到为决定负责,得学会适应两个常态:一是会犯错,二是不能两全其美。
  2. 为团队的工作结果负责要区分“好”的和“坏”的结果。取得坏结果时要帮团队“背锅”,取得好结果时则要把舞台和聚光灯留给下属。

4.4 组织意识包括遵守和代表组织的规则,以及团队的利益为先

  1. 在建章立制之前,应先适应和符合现有的规则。
  2. 团队利益为先是指你要为团队和公司着想,把个人利益放在团队之后。

5. 新手管理者容易走进的误区

5.1 新手管理者在取得下属认可和信任时,容易走入的第一类误区

  1. 过于依赖个人的专业能力,想要靠专业征服团队。这会带来的主要问题是管理者成为团队能力的上限,限制员工的发展。
  2. 认为可以完全不靠专业,发挥领导力即可。这会带来的问题是管理浮于表面,无法获得实质性的成效。

5.2 在进入管理岗位后,管理者需要在个人能力上实现两个转换

  1. 从运用自己的专业能力解决具体问题,转换为将专业优势赋能于团队。
  2. 从运用自己的个人实力去带领团队,转换为培养和成就团队。

5.3 第二类误区是让下属满意,还是让上级满意的问题

  1. 唯下”的管理者通常用两种方式取悦下属:一是让下属尽量少吃苦,二是滥用物质奖励。本质上都只是满足了保障性因素,只能让下属处于“不是不满意,也不是满意”的中性状态。
  2. “唯上”的管理者围绕上级开展工作,不太关心员工的感受。这类管理者的个人发展极为有限,更易受领导更换或组织环境变化影响。

5.4 管理者只需要让客户满意,这本质上是对绩效负责

  1. 管理者需要为此而帮助下属改进和挑战下属突破。这是管理者与团队建立信任的正确方式。

5.5 第三类误区是关于与下属的距离和关系

管理者易走入的两个极端:

  1. 制造距离感,以树立个人领导权威。
  2. 过于注重经营关系,导致为关系所累,或是只运用人际和影响技巧而不交心,变成对下属的操纵控制。

5.6 管理者需要把握不同场合的交往分寸

  • 管理者需要把握不同场合的交往分寸,做到“工作时严肃立规矩,私下可称兄道弟”。“事务”导向和“人际”导向的管理者所需要的努力不同,前者需要增加交流和互动,后者需要把握好情感投入的度。这样管理者与下属之间才能既有信任,也有温度。

6. 真诚是最好的套路

6.1 真诚是赢得信任的终极套路,包括真诚坦率和展现真我

6.2 真诚坦率包括两个维度

  1. 管理者能分享真实的信息,不隐瞒、不遮掩、不欺骗。
  2. 管理者能站在员工的角度理解员工,照顾员工的感受,真正为员工着想。根据这两个维度,管理者与下属相处有四种方式。
    • 虚伪应付:不告知员工信息或不讲真话,同时也不在乎员工的感受。这是最不真诚的,管理者展现的是一种高高在上地掌控一切的傲慢。
    • 真情假意:因为担心员工受伤害,而遮遮掩掩,不直接沟通。这样反而会弄巧成拙,员工会感觉到管理者有话不明说,因而会有各种猜测,从而造成很多误会。
    • 直言不讳:有话明说,但不太考虑员工的感受。尽管可能会让员工感觉不舒服,但这种方式比虚伪应付和真情假意更真诚。
    • 真诚坦率:既讲真话、实话,又能照顾到员工的感受。

6.3 做到真诚坦率要注意五点

  1. 就事论事
  2. 讲具体的事
  3. 多分析背景信息
  4. 不带着情绪
  5. 多给建议和指导

6.4 为了满足各种社会期待,每个人都会包装自己

但如果包装后的公众自我与你的内在自我差别很大,就会出现问题。

  1. 虚张声势很容易会被看出来,让管理者看起来不值得被信赖。
  2. 过度假装会让管理者自己很不开心。

6.5 展现真我要做到三点

  1. 认识你自己
  2. 建立你内心的准则
  3. 适当地暴露弱点

关键跨越二:推动执行

7. 新手管理者的执行力 2.0

7.1 新手管理者需要将个人执行力升级为团队执行力

  • 新手管理者需要将个人执行力升级为团队执行力,把最大化团队产出作为自己的工作目标,投入精力完成管理工作。

7.2 新手管理者要充分发挥团队成员的能力

  • 新手管理者要充分发挥团队成员的能力,激发团队成员的工作动力,并提供必要的支持,为团队成员减少工作阻力。

7.3 新手管理者需要警惕常见的六大误区

  • 新手管理者需要警惕常见的六大误区,规避不适用的思维模式和行为模式,完成管理角色转型。
    • 误区一:超人心态
    • 误区二:完美主义
    • 误区三:想当然
    • 误区四:控制狂
    • 误区五:疏离旁观
    • 误区六:安于现状

8. 做该做的事,把“猴子”还给下属

8.1 管理者要多做自己该做的事,少做或不做不该做的事

  1. 员工现有能力可以完成的任务,要坚定不移地交给员工去做。
  2. 员工“跳一跳”能完成的任务也可以交给员工去做,同时管理者要提供必要的辅导和资源支持。
  3. 员工能力差距较大但有意愿去挑战的任务,如果有试错的空间,管理者可以和员工一起做,并承担失败的风险。

8.2 忍住,让员工去思考和解决问题,避免接过原本属于员工的“猴子”

  1. 不要直接给员工答案。
  2. 用提问的方式启发员工,让员工思考下一步如何行动。
  3. 让员工为工作任务负起责任来。

8.3 不要做“超人”,放平心态

  1. 对团队多一些耐心,不要为了快速达成目标而代替员工完成工作。
  2. 通过帮助团队成长获得新的成就感,不要因为无法站在舞台中央的失落感,就选择自己做事,和下属竞争站回舞台中央的机会。
  3. 不要因为害怕失败就不敢冒险放手让下属尝试,要给员工犯错空间,并学会把失败当成自己和团队学习的机会。
  4. 不需要通过代替员工做事去刻意讨好下属,得有把任务派给员工后被讨厌的勇气。

9. 要事第一:目标取舍的智慧和勇气

9.1 良好的开端是成功的一半,在明确目标阶段管理者要做到“要事第一”

  1. 到重要的20%,重点投入。
  2. 跟上级充分沟通,让上级帮助明确不同目标的重要性和优先级排序。
  3. 不要追求面面俱到,得学会取舍,避免目标平均主义。

9.2 管理者在完成短期目标的同时,需要考虑如何实现年度目标,逐步建立长期思维

  1. 管理工作本身就是在为长期目标负责。
  2. 学会拉长时间维度去评估投入与收益。
  3. 根据业务紧迫性和团队成熟度对目标的优先级进行动态调整。

10. 人事匹配:让对的人去做对的事

10.1 根据意愿能力四象限,完成人事匹配

  1. 对于高意愿高能力的明星员工,可以把有难度的重要工作交给他们。
  2. 对于低意愿低能力的问题员工,需要进行绩效反馈,明确绩效改进方向。
  3. 对于高意愿低能力的“潜力股”员工,应以能胜任的工作任务为主,同时分配一些“跳起来”可以够得着的挑战性任务来提升其能力。
  4. 对于低意愿高能力的“精明人”员工,需要适当激发,并保证团队内部任务分配和激励回报的公平性。

10.2 可以通过观察、询问、实战三个环节来判断员工的意愿和能力

10.3 在进行任务沟通时,管理者要做到四点

  • 第一,将工作“翻译”成员工更容易听懂的语言,解释清楚“为什么”。
  • 第二,清晰无误地说明任务要求,不遗漏必要信息。
  • 第三,进行双向沟通,获得员工及时反馈。
  • 第四,与员工沟通不同工作的优先级。

10.4 管理者要避免陷入“想当然”误区

  • 管理者要避免陷入“想当然”误区,主动反思自己是否以己度人,忽略了人与人之间的差异,或低估了任务的难度。

10.5 管理者要避免“想当然”,应该在行动上向员工展现出欢迎提问的姿态,也需要在工作中多观察员工的行为,了解员工的意愿和能力

11. 过程管理:把握尺度

11.1 根据任务容错率和员工成熟度选择不同的管控方式,避免一刀切

  1. 对于容错率高的任务,如果员工成熟度高,可以让员工放手去做;如果员工成熟度低,则需要加强过程辅导。
  2. 对于容错率低的任务,即使员工成熟度高,管理者仍需要管理过程中的关键节点;如果员工成熟度低,这项任务应该由管理者自己负责,带着员工一起完成。

11.2 在过程管理中要避免陷入微观管理,变成“控制狂”,也不能放手不管,做一个远离团队的“甩手掌柜”

11.3 过程管理更有效的方式是设置合理的信息沟通反馈机制

  • 管理者可以通过以下方式获取需要的信息:
    • 定期开例会
    • 建立抄送邮件的规则
    • 工作进度可视化
    • 开展专项会议讨论
    • 加强非正式沟通

12. VUCA时代需要敏捷执行

12.1 VUCA时代需要敏捷执行,核心是以终为始,抓住关键矛盾

12.2 产出最小化可交付成果,尽早获得最终用户的反馈,通过多次迭代来更聪明、高效地工作,完成比完美更重要

12.3 制订有弹性的工作计划,给自己预留20%的时间用于应对临时出现的重要任务或者就用于思考,避免被不重要的事情塞满日程表

12.4 管理者要敢于说“不”,赢回自己的时间

具体可以参考以下三个步骤:

  • 复述对方的要求
  • 解释拒绝的原因
  • 坦诚说“不”

13. 复盘让管理实现闭环

13.1 复盘让管理形成闭环,为管理者提供思考的空间,也是团队改进和提升的原点

13.2 成功的复盘要求管理者和团队成员建立信任,保持开放、包容的心态,并有能力从过往的实践中提炼出规律性的结论,指导行动

13.3 复盘可以作为日常管理的工具,要做到及时和精要,才能保证良好的复盘效果

13.4 专项复盘可以帮助团队及时总结失败教训,沉淀成功经验

专项复盘分为三步曲:

  • 还原事实
  • 分析问题根因
  • 制订行动计划

关键跨越三:辅导他人

14. 辅导他人,亟待提升

14.1 .辅导员工的关键四步

  • 投入时间:坚持在辅导上投入时间,切实帮助团队提升。
  • 明确目标:以绩效目标为导向,了解员工现状,和员工就发展目标达成共识。
  • 反馈与指导:在辅导现场,直面挑战,提升员工的积极性,帮助员工解决问题。
  • 跟进与评价:跟进与评价员工的表现,评价他们的行为进展,并通过正确地批评和表扬他们,帮助他们更好地提升。

14.2 新手管理者在辅导上容易陷入的三个误区

  • 理想化:辅导形式大于内容,不考虑业务需求和员工现状。
  • 以自我为中心:只从自己的想法出发,忽视员工与自己的差异,遇到问题不是从自身寻找原因。
  • 急于求成:对员工的成长没有耐心,辅导员工时容易急躁,急于给员工下定论,难以持续投入。

15. 辅导的开始:如何投入时间

管理者进行辅导的第一步:切实有效地在辅导上投入时间。管理者要注意:

15.1 不为自己没有在辅导上投入找借口

  1. 正视自己没有辅导员工的现状,思考自己要如何改变。
  2. 相信自己可以决定自己的时间,并为自己的时间负责。

15.2 找到问题的症结所在,避免陷入“越努力,越忙碌”的处境

  1. 管理者面对的问题是系统性问题,单一的问题解决思路会起到反效果。
  2. 评估自己的行为会对团队产生的影响,通过辅导提升团队能力,从而建立自己在工作中的正向循环。

15.3 坚持在辅导上进行投入

  1. 辅导更需要细水长流的投入,考验的是管理者是否能坚持。
  2. 管理者需要有意识地培养自己的辅导习惯,可以通过诸如“辅导他人行为清单”的方式提醒自己。

15.4 基于二八原则分配自己的时间

  1. 管理者辅导员工时需要以团队的产出最大化为目标。
  2. 表现优秀的员工更值得,也更需要管理者的辅导。
  3. 只关注绩效表现不佳的员工,容易让其他员工感到不公平。
  4. 有效分配时间的关键在于准确地对员工进行分类。
  5. 管理者在评估员工时,要同时关注当下工作和未来工作的要求。

16. 明确目标,促进绩效达成

管理者在和员工制定辅导目标时,需要遵循以下三个原则:

16.1 促进绩效提升

  1. 基于对绩效目标的分析,结合员工当下的重点工作,初步找出可能需要提升的地方。
  2. 还原工作现场,通过行为观察、他人反馈、情境模拟等多种方式,了解员工实际的工作情况。
  3. 深入分析,找到员工表现背后的原因,制定有针对性的辅导方向。

16.2 和员工达成共识

  1. 在与员工沟通前,管理者和员工都需要做好充分的准备。
  2. 鼓励员工发表意见,认真倾听员工的想法,并且即使遇到冲突也就事论事,不强求员工听取自己的意见,也不和员工去争一时的对错。

16.3 辅导目标可评估、可实现

  1. 辅导目标要注重可行性,不要好高骛远。
  2. 辅导目标中应该包含具体的行为,有助于管理者和员工达成共识。

17. 信任、激发与赋能

在成功辅导员工的过程中,管理者要做到三件事情:与员工建立相互信任的辅导关系;激发员工不断提升自我的积极性;赋能员工,提升员工解决问题的能力。

17.1 建立相互信任的辅导关系

  1. 管理者要让员工尽快感受到自己的提升,从而让其对辅导抱有信心。
  2. 管理者需要避免高高在上,和员工做平等沟通,多倾听员工的想法。

17.2 激发员工的积极性

  1. 面对受挫的员工:管理者需要引导员工从长远和正向的角度看待问题,理解其受挫的感受和心情,并通过工作的调配转移其注意力。
  2. 面对积极性不高的员工:让员工更客观地认知自己的水平;为员工树立榜样,展现未来发展愿景;通过竞争持续调动员工的积极性。
  3. 面对缺少行动力的员工:发挥目标的管控作用,要求员工必须有行动;让员工为自己负责,管理者避免越俎代庖;必要时,终止辅导关系。

17.3 赋能员工

  1. 理解员工能力提升的三个阶段:知道、理解和应用。员工要逐步形成自己的知识体系,并通过思考和实践,不断地获得反馈和提升。
  2. 只让员工去尝试而不给予反馈,或只让员工学习知识而不实践都不是适合员工的辅导方式。
  3. 在赋能员工时,管理者要让员工通过历练,感受到挑战和问题所在,并对问题进行分析和思考,进而在实践中做出尝试和探索。在逐步探索中,管理者要鼓励员工形成自己的判断,通过对外输出,将自己的经验转化为能力。

18. 跟进与评价

员工的能力提升需要经历持续练习和反馈的过程。管理者需要在这个过程中持续跟进员工的行为表现,及时发现并指出员工的问题,帮助他们持续改进。管理者还需要及时看到员工取得的进展,并及时给予鼓励和肯定。

18.1 把辅导当成项目来管理

跟进最难的地方在于坚持,管理者可以按照管理项目的方式,始终聚焦辅导目标,制订跟进计划,明确责任人,使用辅助工具,以帮助自己形成跟进的习惯。

18.2 对员工的成长有耐心

员工的成长并非一蹴而就,管理者需要给员工时间和试错的空间,并且当员工取得进步时,即使没有达到期待,也要给予正向的鼓励。

18.3 做出正确的批评和表扬

跟进是评价和反馈的基础,要做到正确地批评和表扬,管理者要以事实为依据,以解决问题为导向,并在沟通时保持真诚。

成为管理者

19. 管理者发展的全景图:五个阶段的关键跨越

19.1 一个人的职业发展会历经很多角色,了解管理者发展的全景图,能帮助你提前做好准备,学会换位思考,理解上下级的工作挑战和想法

19.2 你会经历的职场角色有五个阶段

  1. 管理自我
  2. 管理他人
  3. 管理管理者
  4. 管理职能/事业部
  5. 管理企业

19.3 管理自我阶段的关键挑战

管理自我阶段的关键挑战:稳定可靠地交付工作成果、保持并提高专业的水准和效率、与客户和工作伙伴顺畅沟通。
所需完成的关键跨越:

  1. 高效执行
  2. 展现专业素养
  3. 有效沟通

19.4 管理他人阶段的关键挑战

管理他人阶段的关键挑战:获得团队的认可和信任、让团队稳定可靠地交付工作成果、帮助团队改进和提升。
所需完成的关键跨越:

  1. 承担管理责任
  2. 推动执行
  3. 辅导他人

19.5 管理管理者阶段的关键挑战

管理管理者阶段的关键挑战:

  1. 系统性地解决问题
  2. 让一线管理者充分发挥作用
  3. 统一目标,平衡资源和利益
    所需完成的关键跨越:
  4. 系统化思考
  5. 授权
  6. 协同增效

19.6 管理职能/事业部阶段的关键挑战

应对常态化的模糊和不确定状况、以经营思维管理职能部门或事业部、确保人才梯队支持业务持续发展。所需完成的关键跨越:

  1. 模糊决策
  2. 经营意识
  3. 构建人才梯队

19.7 整个职业发展过程中也起着决定性作用的另外几个底层能力

还有几个底层能力,在整个职业发展过程中也起着决定性作用。这些能力包括:

  1. 清晰的自我认知能力
  2. 持续学习能力
  3. 弹性和韧性

19.8 发展关键跨越上的能力

发展关键跨越上的能力需要做到:

  1. 充分了解这些能力的完整行为链条
  2. 保持刻意练习
  3. 做好打持久战的准备

20. 一生的修炼,更好的自己

如同电影《和平战士》中,心灵导师苏格拉底对主人公丹·米尔曼所说:“没有开始或者终止,只有过程。”人生是一场修炼,修的是心性,炼的是技能,没有终点,出生即开始,永远都在进程中。我们陪伴了很多管理者走过“至暗时刻”,别着急,每个人都会经历,没有谁比谁更高明,只要坚持就会成功。在坚持的路上,除了职场的收获,你还会获得很多可迁移的技能。正如在游泳池中学会了游泳,在大海中也能施展一样。管理者练就的管理技能、打磨的心性,都可以在更多人生的场景找到应用机会。所以可以说,一旦成为管理者,就进入了这场修行的经验加速区:管理技能要求的倾听、沟通、共情,用在处理家庭矛盾、开展子女教育中,也效果明显;管理角色要求的时间管理、任务分配、绩效辅导、培养员工等技能,在自我管理、家庭决策、子女教育中,同样增益匪浅。成为管理者,能加速人生的修炼,乃至成就更好的自己。

1. 三维重建流程

1.1 运动恢复结构(Structure from Motion, SfM)

  • 输入:
    • 多视角图像
    • 相机内参
  • 输出:
    • 稀疏三维点云
    • 相机外参(位姿)
  • 主要过程:
    • 特征提取: 从图像中提取出能够用于匹配的特征点,如角点、边缘等。
    • 特征匹配: 在图像序列中匹配相对应的特征点,以建立图像之间的对应关系。
    • 相机定位: 利用特征匹配信息,估计相机在不同图像之间的运动,即相机的位姿。
    • 三维重建: 基于相机的位姿估计和特征点的视差信息,计算出场景中物体的三维坐标。

1.2 多立体视觉(Multi-View Stereo, MVS)

  • 输入:
    • 多视角图像
    • 相机内外参
    • 稀疏三维点云
  • 输出:
    • 稠密三维点云
  • 主要过程:
    • 图像对齐: 通过相机定位和特征匹配,将多个图像对齐,确保它们在同一坐标系下。
    • 深度图生成: 对每个像素估计其在场景中的深度或距离。这可以通过多个视角的图像之间的视差信息来实现,视差越大表示物体离
    • 机越近。
    • 点云重建: 利用深度图,将每个像素映射到三维空间中,形成一个点云表示物体的表面。

1.3 表面重建

  • 输入:稠密三维点云
  • 输出:场景/模型的三角网格(三角面片)
  • 主要过程:
    • 网格生成: 将点云转换为更为紧凑和结构化的表示,通常是三角网格。
  • 表面模型通常可导入可视化软件,也可进行物理仿真

1.4 纹理重建

  • 输入:
    • 多视角图像
    • 相机内外参
  • 输出:
    • 场景/模型的纹理图像
  • 主要过程:
    • 纹理映射(Texture Mapping): 将从图像中捕捉到的纹理信息映射到三维模型的表面上。这可以通过将图像中的颜色信息映射相应的三维模型表面上的顶点或像素来实现。这样,模型就能够呈现出与真实世界相似的外观。
    • 相邻像素插值: 由于模型表面上的顶点或像素数量有限,需要进行插值操作,以在整个表面上创建平滑和连续的纹理。这通常涉及对相邻像素之间的颜色进行插值,以便在纹理映射的过程中产生平滑的过渡效果。
    • 去除失真和伸缩: 在将图像纹理映射到三维模型时,可能会发生一些失真和伸缩。为了保持模型的准确性和真实性,需要进行一些校正步骤,以修复这些失真。
  • 纹理重建后即可可视化

2. 神经辐射场(Neural Radiance Fields, NeRF)

  • 将三维重建流程存储在 三角面片和纹理信息 的三维信息用神经网络拟合(隐式建模)。
  • 缺点是无法进行物理仿真。
  • 优点:
    • ppl 简单
    • 无空洞
    • 高逼真

WIP

URL

TL;DR

  • 传统基于关键点检测的车道线检测网络通常需要根据任务的定义设计模型输出头结构,比如 UFLD 算法每条车道线需要占据一个输出 channel
  • 本论文提出一种新颖的车道线检测范式,解耦了任务和网络,仅使用固定的输出通道数即可检测任意多条车道线。

Algorithm

总体思路

ganet2.png

  • 如何实现只用一个 channel 输出即可检测任意多条车道线?一个可以想到的简单方法是:
    1. 输出一个 channel = 1heat map,其中每个位置的 heat map value 依旧表示该位置是车道线关键点的概率。
    2. 使用阈值过滤得到所有车道线的关键点坐标(每条车道线关键点数量应 >= 2)。
    3. 使用聚类的方式将一堆关键点分成若干组,每组关键点表示一条车道线。聚类中的 “距离” 判定逻辑需要根据一些先验知识进行设计(比如:因为车道线在图片中更接近竖直方向,因此水平距离权重小于垂直距离)。
  • 上述操作中的聚类过程包含了很多人为总结的先验知识,非常不 “机器学习”,于是我们可以改进这个过程:
    1. 输出一个 channel = 1heat map 和一个 channel = 2offset map,其中每个位置的 heat map value 依旧表示该位置是车道线关键点的概率,每个位置的 offset map value 表示 如果该点是关键点,那么该点相对于本条车道线起始点的偏移(x, y),起始点表示一条车道线关键点中最靠近图片下方的点。
    2. 使用阈值过滤得到所有关键点,将关键点对应位置的偏移 offset 得到新的点 p',理论上同一条车道线的每一个关键点偏移后得到的新位置 p' 都一致,都是车道线起始点。
    3. 因为神经网络不太能拟合到 loss == 0,因此还需要对所有的 p' 进行聚类,每个类表示一条车道线实例,本质相当于将聚类中的距离判定逻辑吸到神经网络内部。
  • 以上就是本论文提出的 GANet 算法的核心思想:用固定的有限个输出通道去预测任意条车道线。

网络结构

ganet1.png

LFA(Lane-aware Feature Aggregator)

ganet3.png

动机

  • 传统的2D卷积在固定的网格状区域内采样特征,这不适用于处理车道线的狭长形状。
  • 因此作者使用如下步骤改进各关键点上的局部特征:
    1. 预测该关键点同一条车道线紧邻的 num_adjacent_keypoints 个点的 offset,进行显式监督。
    2. 用预测的 offset 引导可变形卷积改进关键点局部特征。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import torch
import torch.nn as nn
from torchvision.ops import deform_conv2d
import math
class LFA(nn.Module):
def __init__(self, in_channels, out_channels, num_adjacent_keypoints=5):
super(LFA, self).__init__()
self.offset_conv = nn.Conv2d(in_channels, 2 * num_adjacent_keypoints, kernel_size=1)
self.deform_conv_weight = nn.Parameter(torch.Tensor(out_channels, in_channels, 3, 3))
nn.init.kaiming_uniform_(self.deform_conv_weight, a=math.sqrt(5))
def forward(self, x):
# x: input feature map with shape [batch_size, in_channels, height, width]

# Step 1: Predict the offsets for adjacent keypoints
offsets = self.offset_conv(x) # shape: [batch_size, 2 * num_adjacent_keypoints, height, width]

# Step 2: Perform deformable convolution to aggregate features
aggregated_features = deform_conv2d(x, offsets, self.deform_conv_weight, stride=1, padding=1)

return aggregated_features, offsets # Return both aggregated features and offsets
# Initialize LFA module
lfa = LFA(in_channels=64, out_channels=128, num_adjacent_keypoints=5)
# Dummy input feature map with shape [batch_size, in_channels, height, width]
input_feature_map = torch.randn(16, 64, 128, 128)
# Forward pass
aggregated_features, predicted_offsets = lfa(input_feature_map)
# aggregated_features 是特征输出
# predicted_offsets 是预测的相邻的 num_adjacent_keypoints 个车道线的偏移量,显式监督

Thought

  • 提出了一种灵活的车道线检测范式,具有较好的可拓展性,目前在车道线榜单上比较靠前。
  • 另外一个创新点是LFA module,主要是用到了可形变卷积,对于大多数动态性较差的端侧芯片来说,不容易部署。

URL

TL;DR

  • 传统 BEV 算法中 View Transform 都是通过 LSS 实现 Image ViewBEV View 的转变,这种视角转换方法依赖于图像视角的深度估计(显式(例如 BEVDepth)或隐式(例如 LSS / BEVDet 等))。
  • 本文提出一种新的通过时空注意力机制实现的 View Transform 方法,在 Neuscenes 数据集上取得了不错的 3D 目标检测成绩(略差于 BEVDet4D)。

Algorithm

bevformer.png

整体架构

1. 输入

  • 输入包含两部分,分别是:
    • 环视图(6 张)
    • BEV Queriesshape = [num_voxel, dim]
    • History BEV Feature(上一帧的 BEV Feature 输出,shape = [num_voxel, dim]

2. 输出

  • 输出为当前帧的 BEV Featureshape = [num_voxel, dim]),记作 BtB_t
  • 暂时不考虑任务头

3. 网络模块

  1. 图像特征提取
    • 6 张图片单独做 CNN base 特征提取,输出记作 FtF_t
  2. 时序信息融合:
    • 将构造的 BEV Queries(记作 Q),和上一帧的 BEV Feature(记作 Bt1B_{t-1})做 Self-Attention
    • 其中 Q 作为 QueryBt1B_{t-1} 作为 Key / value,做 Attention 运算
    • 虽然这里的 Query / Key / Value 并不同源,但依然被称为是 Self-Attention 而不是 Cross-Attention,是因为 QBt1B_{t-1} 都属于 BEV 语义
    • 输出记作 Q'
  3. 空间交叉注意力(视角转换
    • 此步骤是本文的重点,BEVFormer 通过这一步将透视图特征转换为俯视图特征
    • 输入为:
      • Q'
      • FtF_t
    • Cross-Attention 运算,其中:
      • Q' 作为 Queries
      • FtF_t 作为 Key / Value
    • 用预设的无意义且可学习的 BEV Queries 去查询图片总体特征,得到 BEV Feature 输出,记作 BtB_t
  4. 任务相关头
    • 输入为:BEV Feature
    • 输出为:BEV 视角下的检测 / 分割等任务预测结果
    • 模型结构:可以是 CNN base 也可以是 Transformer base
  • 以上提到的所有 Attention 过程都需要额外添加 Position embedding

Thought

  • 过程并不复杂,只要看过经典的 DETR,都熟悉这种套路:预设一个无意义的(随机初始化但可学习) pattern 序列作为 Query 去查询 image features,得到有意义的结果(或者说是可监督的结果)
  • 后续的部分工作对其改进是:将随机初始化预设的 Query 有意义化(例如通过一个轻量化 2D 检测头预检测,得到 proposal 并编码为 Query

URL

TL;DR

  • 本文提出一种 BEV 视角下的的 3D 目标检测算法,作者认为尽管深度对相机 3D 检测至关重要,但最近的方法中的深度估计却出奇地不足。
  • BEVDepth 通过利用显式深度监督(来自 lidar 点云)来解决这个问题。
  • 同时使用关键帧和过渡帧在 bev feature 维度进行特征融合,引入时序信息,提高模型效果。

Algorithm

bevdepth1.png

  • BEVDet4Dpipeline 很相似,区别是 BEVDepth 使用了 DepthNet 用激光雷达点云数据做了深度监督。
  • DepthNet 深度监督的输入是 6v 图像特征和每个相机的内外参,输出为 相机相关深度估计(camera_awareness_depth_estimation)
    bevdepth2.png

显式监督效果和 baseline 对比还是很赞的!
table.png
MAPNDS 吊打了一众基于纯视觉的算法

Thought

  • 多帧训练中过渡帧使用了 nuScenes 数据集的 Sweep 数据(没有人工标注的原始数据,只包含图像和 lidar 点云),无形中拓展了数据量。
  • 本文创新点不多,基本是 BEVDet4D + DepthNet,更像是一个工程优化,比如:用 cuda 写了 voxel pooling 过程,计算过程非常高效。

URL

TL;DR

  • BEVDet4D 是基于 BEVDet 加入了时序信息的一篇论文
  • 具体来说就是将上一帧的 BEV Feature 和本帧的 BEV Feature 对齐后 Concat 到一起送入 BEV Encoder 中进行 BEV 视角下的 3D 目标检测
  • BEVDet 论文中的 image encoder + view transformer 完全保持不变
  • 由于有两帧的信息,所以对速度的预测相较于单帧有较大提升

Algorithm

整体流程

bevdet4d.png
BEV Feature 层面(View Transformer 的输出)融合两帧信息

算法的伪代码表示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class BEVDet4D:
def __init__(self):
# 初始化相关的编码器、转换器和其他必要的组件
self.image_view_encoder = ImageViewEncoder()
self.view_transformer = ViewTransformer()
self.bev_encoder = BEVEncoder()
self.head = DetectionHead()
self.previous_bev_feature = None
def spatial_alignment(self, feature):
# 这里执行空间对齐操作,具体细节可能需要根据原始论文进行补充
# 实际代码中这里似乎没有开,即上一帧的 BEV feature 直接和本帧 BEV feature map concat
aligned_feature = ...
return aligned_feature
def forward(self, current_image):
# 使用图像视图编码器和视图转换器处理当前图像
image_feature = self.image_view_encoder(current_image)
transformed_feature = self.view_transformer(image_feature)
# 使用BEV编码器获取当前帧的BEV特征
current_bev_feature = self.bev_encoder(transformed_feature)
# 如果存在前一帧的BEV特征,则进行空间对齐和融合
if self.previous_bev_feature:
aligned_previous_feature = self.spatial_alignment(self.previous_bev_feature)
fused_feature = concatenate(aligned_previous_feature, current_bev_feature)
else:
fused_feature = current_bev_feature
# 使用检测头部进行3D物体检测
detections = self.head(fused_feature)
# 保存当前帧的BEV特征以供下一帧使用
self.previous_bev_feature = current_bev_feature
return detections
# 实例化BEVDet4D并进行前向传递
bevdet4d = BEVDet4D()
detections = bevdet4d.forward(current_image)

result

BEVdet4D2.png

效果比 BEVDet 好了不少,尤其是 mAVE (速度误差)

Thought

  • 没有很大的创新点,更像是 BEVDet 的一个使用 trick
  • BEVDet 的计算量主要分布在 image encoderview transformer,所以复用上一帧的 BEV feature 即充分利用了上一帧的计算量,对当前帧引入的额外计算量也比较可控(BEV encodertask head 都比较轻量)

URL

TL;DR

  • 本文介绍了一种 BEV 视角下的 3D 障碍物检测算法,该算法的输入是由多张(6张)图片组成的车身环视视角,输出为车身周围障碍物的 3D bbox
  • LSS(lift-splat-shoot) 算法较为相似,但任务不同,LSS 想要解决的是 BEV 视角下的分割问题,BEVDet 想要解决的是 3D 障碍物检测问题
  • FCOS3D 等单目 3D 障碍物检测的任务类型相似,区别在于:单目 3D 障碍物检测对每个视角做 3D 障碍物检测后,需要使用后处理融合跨视角的物体,BEVDet 可以将跨视角融合问题内嵌到模型中(BEV

Algorithm

总体结构

BevDet.png
由上图可以看出,模型主要由四个部分组成,分别是:

  • Image-view Encoder:图像特征提取(backbone + neck),6个视角分别做特征提取,不做视角间特征融合
  • View Transformer:视角变换(同时也实现了图像间信息融合),从图像视角转换为 BEV 视角,使用的方法和 LSS 方法一样,输出为 BEV feature
  • BEV Encoder:对 BEV feature 用一个较小的 BEV backbone 做特征提取
  • Head:任务头,预测 3D bbox 等,本文使用了 CenterPoint Head

算法流程的伪代码表示

1
2
3
4
5
6
7
8
9
10
11
12
# 定义输入,shape: (8, 6, 256, 704, 3) [batch, camera, H, W, C]
input_images = get_input_images()
# 图像视图编码器,输出shape: (8, 6, 16, 44, 256) [batch, camera, H//16, W//16, C]
image_view_features = image_view_encoder(input_images)
# 视图变换器,输出shape: (8, 64, 128, 128) [batch, C, Bev_H, Bev_W]
transformed_features = view_transformer(image_view_features)
# BEV编码器,输出shape: (8, 256, 64, 64) [batch, C, Bev_H//2, Bev_W//2]
encoded_bev_features = bev_encoder(transformed_features)
# 任务特定头部进行3D物体检测,输出shape: (8, num_objects, object_info)
detection_results = task_specific_head(encoded_bev_features)
# 返回3D物体检测结果
return detection_results

数据增广方法

  • 独立图片空间数据增广:图片的翻转、裁剪和旋转可以用 3x3 矩阵表示,在 View Transformer 的时候需要做对应逆变换,即 同时更改图片和 View Transformer 过程
  • BEV视角下的数据增广:在BEV空间的学习中,数据量少于图像视图空间,因为每个样本包含多个摄像机图像,所以更容易过拟合;该增广方法遵循常见的 LiDAR 方法,采用了 2D 空间中的常见数据增广操作,如翻转、缩放和旋转,需要对应修改目标 3D bbox,即 同时更改 BEV Feature 和 3D bbox GT

Scale-NMS

  • 由于 BEV 空间中不同类别的空间分布与图像视图空间中的分布非常不同,所以作者提出了 Scale-NMS,在执行经典的 NMS 算法之前根据每个对象的类别来缩放每个对象的大小,可显著提高了对小面积类别(如行人和交通锥)的预测性能

Thought

  • 从模型结构和数据增广方式看 BEVDet 本质是一个二阶段算法:
    • image Encode + View Transformer:环视图像编码到 BEV 空间
    • BEV Encoder + Task HeadBEV 空间下的 3D 障碍物检测
  • 但第一阶段输出的 BEV Feature 没有用 LiDAR 点云监督就有点怪…(后续的改进算法加了)

URL

TL;DR

  • 提出了一个完全端到端的多目标跟踪框架
  • 将多目标跟踪问题形式化为一组序列预测问题
  • 引入了跟踪感知的标签分配
  • 提出了用于时间建模的集体平均损失和时间聚合网络方法

Algorithm

MOTR 整体流程

MOTR.png

  1. 特征提取:用 CNN backbone 提取连续帧中每一帧的特征(上图中的 Enc
  2. 查询生成:用 Deformable Transformer 对第一步提取的特征进行查询(上图中的 Dec
    • 对于视频第一帧,只解码 object detection query (上图中的 qdq_d )得到 hidden state
    • 对于非第一帧,将 object detection query (上图中的 qdq_d )和上一帧的 tracking query (上图中的 qtrq_{tr} )先 concat 再进行解码得到 hidden state
  3. 预测结果生成:用一个简单的结构将上一步得到的 hidden state 映射到任务空间,预测结果包含 object detection resultstracking results
  4. 得到下一帧的 tracking query:用 QIM (Query Interaction Module, 查询交互模块) 将上一步得到的预测结果映射为下一帧的 tracking query
  5. 计算损失 / 输出预测结果:对于训练,计算集体平均损失(CAL, Collective Average Loss);对于预测,直接输出第 3 步得到的结果
  • 描述 MOTR 过程的伪代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
def process_frame(frame, detect_queries, track_queries=None, ground_truths=None):
# 使用CNN提取帧特征
# frame shape: (height, width, channels)
frame_features = extract_frame_features(frame) # Shape: (height, width, channels)
if track_queries is None:
# 使用Deformable DETR解码器生成隐藏状态
# detect_queries shape: (num_queries, query_dim)
# frame_features shape: (height, width, channels)
hidden_states = deformable_detr_decoder(detect_queries, frame_features) # Shape: (num_queries, hidden_dim)
else:
queries = concatenate(track_queries, detect_queries) # Shape: (num_queries + num_tracks, query_dim)
hidden_states = deformable_detr_decoder(queries, frame_features) # Shape: (num_queries + num_tracks, hidden_dim)
# 生成预测
# hidden_states shape: (num_queries, hidden_dim)
predictions = predict(hidden_states) # Shape: (num_queries + num_tracks, num_classes + 4)
# 使用Query Interaction Module (QIM)生成下一帧的跟踪查询
# hidden_states shape: (num_queries, hidden_dim)
track_queries = qim(hidden_states) # Shape: (num_tracks, query_dim)
if ground_truths is not None:
# 使用Collective Average Loss (CAL)进行训练
# predictions shape: (num_queries, num_classes + 4)
# ground_truths shape: (num_objects, num_classes + 4)
loss = cal(predictions, ground_truths)
backpropagate(loss)
return predictions, track_queries # Shape: (num_queries + num_tracks, num_classes + 4), (num_tracks, query_dim)
def process_video(video, ground_truths=None):
# 初始化检测查询
# 返回形状:(num_queries, query_dim)
detect_queries = initialize_detect_queries()
track_queries = None # Shape: (num_tracks, query_dim)
for frame in video:
predictions, track_queries = process_frame(frame, detect_queries, track_queries, ground_truths)
if ground_truths is None:
yield predictions

查询交互模块

  • 查询交互模块 Query Interaction Module (QIM)MOTR 中的一个关键组件,它负责处理物体的进入和退出,以及增强长期的时间关系建模
  • QIM 的输入是当前帧预测的 detection resulttracking result,输出是下一帧的 tacking query
  • 通俗来说,QIM 是根据当前帧预测的结果,给出下一帧的 “提问”
  • QIM 过程的伪代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def query_interaction_module(hidden_states, scores, tau_en, tau_ex, M):
# hidden_states shape: (num_queries, hidden_dim)
# scores shape: (num_queries, num_classes)
# tau_en, tau_ex: entrance and exit thresholds
# M: number of consecutive frames for exit threshold
# Object Entrance
entrance_mask = scores.max(dim=1) > tau_en # Shape: (num_queries,)
hidden_states = hidden_states[entrance_mask] # Shape: (num_entrance_queries, hidden_dim)
# Temporal Aggregation Network (TAN),主要目的是融合时序信息,本文是用了一个 Multi-Head Self-Attention 实现
hidden_states = temporal_aggregation_network(hidden_states) # Shape: (num_entrance_queries, hidden_dim)
# Object Exit
exit_mask = scores.max(dim=1) < tau_ex # Shape: (num_entrance_queries,)
exit_mask = exit_mask.rolling(window=M).sum() > 0 # Shape: (num_entrance_queries,)
hidden_states = hidden_states[~exit_mask] # Shape: (num_track_queries, hidden_dim)
return hidden_states # Shape: (num_track_queries, hidden_dim)

集体平均损失

  • 集体平均损失(Collective Average Loss,CAL)是 MOTR 算法中用于训练的损失函数。不同于传统的逐帧计算损失,CAL 收集整个视频剪辑的所有预测,然后基于整个视频剪辑计算总体损失
  • 集体平均损失的代码描述
1
2
3
4
5
6
7
8
9
10
11
12
13
14
def collective_average_loss(predictions, ground_truths, matching_results):
total_loss = 0
total_objects = 0
for i in range(len(predictions)):
pred_tracked = predictions[i]['tracked']
pred_detected = predictions[i]['detected']
gt_tracked = ground_truths[i]['tracked']
gt_detected = ground_truths[i]['detected']
match_tracked = matching_results[i]['tracked']
match_detected = matching_results[i]['detected']
total_loss += single_frame_loss(pred_tracked, match_tracked, gt_tracked)
total_loss += single_frame_loss(pred_detected, match_detected, gt_detected)
total_objects += len(gt_tracked) + len(gt_detected)
return total_loss / total_objects

Thought

  • 以一种非常优雅的方式解决了端到端多目标追踪的任务,打破了之前 NN detection + Hard logic code trackingtracking 范式
  • 这种非黑盒的(显式监督 detecion bbox)复杂任务端到端训练,启发了后续的许多更复杂的端到端任务,例如 UniAD

URL

TL;DR

  • 提出了 Deformable DETR:这是一种新的目标检测模型,解决了现有 DETR 模型的收敛速度慢和特征空间分辨率有限的问题。
  • 使用可变形的注意力模块:这些模块只关注参考点周围的一小部分关键采样点,从而在更少的训练周期内提高了性能,尤其是对小对象的检测。
  • 结合了可变形卷积的稀疏空间采样和 Transformer 的关系建模能力:这使得模型能够在处理大规模数据时保持高效,同时还能捕捉到复杂的上下文关系。
  • 引入了一种两阶段的变体:在这个变体中,区域提议由 Deformable DETR 生成,然后进行迭代的细化。这使得模型能够更精确地定位和识别目标。

Algorithm

deformable_detr.png

Deformable DETR 整体结构图

Deformabel Attention Block

deformable_attention.png

  • Multi-Head Attention:
    MultiHeadAtten(zq,x)=m=1MWm[kΩkAmqkWmxk]MultiHeadAtten(z_q, x) = \sum_{m=1}^MW_m[\sum_{k\in\Omega_k}A_{mqk}\cdot W_m'x_k]
    • 输入为一个 query 的表征 zqz_q ,以及总特征 x,输出为 query 查询结果向量

    • M 表示 number of head

    • AmqkA_{mqk} 表示 softmax(QKTd)softmax(\frac{QK^T}{\sqrt{d}})

    • WmxkW_m'x_k 实际上就是 self-attention 中的 VV

  • Deformable Attention:
    DeformableAtten(zq,pq,x)=m=1MWm[k=1KAmqkWmx(pq+Δpmqk)]DeformableAtten(z_q,p_q,x) = \sum_{m=1}^MW_m[\sum_{k=1}^KA_{mqk}\cdot W_m'x(p_q + \Delta p_{mqk})]
    • 输入为一个 query 的表征 zqz_q ,总特征 x,以及 query 对应的 预设采样位置,输出为 query 查询结果向量
    • Δpmqk\Delta p_{mqk} 表示由 zqz_q 计算得到的 基于预设查询位置的横纵偏移
    • Amqk=softmax(zqWa)  ,WaRdim×num_points  ,zqRdimA_{mqk} = softmax(z_qW_a)\ \ ,W_a\in\mathbb{R}^{dim\times num\_points}\ \ ,z_q\in\mathbb{R}^{dim} ,即 point position attention 是由 query 线性映射得到的 ,因此 Deformable Attention 没有 Key 的存在,只有 QueryValue
    • K 表示 number of points,即采样点个数
  • Multi-Scale Deformable Attention
    MSDeformableAtten(zq,p^q,{x}l=1L)=m=1MWm[l=1Lk=1KAmlqkWmxl(ϕl(p^q)+Δpmlqk)]MSDeformableAtten(z_q,\hat{p}_q,\{x\}_{l=1}^L) = \sum_{m=1}^MW_m[\sum_{l=1}^L\sum_{k=1}^KA_{mlqk}\cdot W_m'x^l(\phi_l(\hat{p}_q) + \Delta p_{mlqk})]
    • Deformable Attention 不同的是,输入的 x 变成了多尺度特征(例如 backbone 不同深度的特征),更贴近实际视觉工程化应用场景
    • point 采样范围是所有 levelfeature map,即 MSDefromableAttention 有全局 attention 信息
  • Deformable AttentionSelf Attention 对比
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import torch
import torch.nn.functional as F
import math
def attention(query, key, value):
# query, key, value shapes: (batch_size, sequence_length, embedding_dim)
scores = torch.matmul(query, key.transpose(-2, -1)) / math.sqrt(query.size(-1))
# scores shape: (batch_size, sequence_length, sequence_length)
probs = F.softmax(scores, dim=-1)
# probs shape: (batch_size, sequence_length, sequence_length)
output = torch.matmul(probs, value)
# output shape: (batch_size, sequence_length, embedding_dim)
return output
def deformable_attention(query, value, reference_points, num_sampling_points, atten_linear, offset_linear):
# query shape: (batch_size, sequence_length, embedding_dim)
# value shape: (batch_size, sequence_length, embedding_dim)
# reference_points shape: (batch_size, sequence_length, 2)
# num_sampling_points: integer, number of points to sample around each reference point

batch_size, seq_len, embed_dim = query.size()

# Calculate offsets
# offset_linear is a linear layer that predicts the offsets
offsets = offset_linear(reference_points).view(batch_size, seq_len, num_sampling_points, 2)
# offsets shape: (batch_size, sequence_length, num_sampling_points, 2)

# Calculate sampling positions based on reference points
sampling_positions = reference_points.unsqueeze(2) + offsets
# sampling_positions shape: (batch_size, sequence_length, num_sampling_points, 2)

# Sample values (this is simplified; you might need interpolation)
# Here, we assume value and reference_points are in the same space for simplicity
sampling_values = value.gather(1, sampling_positions.long())
# sampling_values shape: (batch_size, sequence_length, num_sampling_points, embedding_dim)

# Calculate scores
# atten_linear is a linear layer that transforms the query for calculating attention scores
scores = atten_linear(query).view(batch_size, seq_len, num_sampling_points)
# scores shape: (batch_size, sequence_length, num_sampling_points)

# Softmax to get attention probabilities
probs = F.softmax(scores, dim=-1)
# probs shape: (batch_size, sequence_length, num_sampling_points)

# Calculate output
output = torch.matmul(probs, sampling_values)
# output shape: (batch_size, sequence_length, embedding_dim)

return output

Thought

  • query 线性映射代替 querykey 外积做 attention 数学上可解释性会变差,计算复杂度会降低
  • Deformable Conv 是典型的对 NPU 不友好,Deformable Attention 会更复杂,被代季峰支配的恐惧
  • Multi-scale 做各特征尺度上的信息融合,开创了一个 CNN 做 backbone + Deformable Transformer 做 head 的计算机视觉任务模型新范式,甚至省去了 FPN
  • 总之是用各种便宜的计算来近似复杂的全局 attention,复杂度从 H*W --> K,即 O(n2)>O(K)O(n^2) -> O(K)

TL;DR

  • 本文介绍了 YOLO 系列几种高效的 backbone 设计,主要包括:VoVNetPRNCSPNetELANE-ELAN

Algorithm

1. VoVNet

  • paper: https://arxiv.org/pdf/1904.09730.pdf
    vovnet.png
  • 作者认为 densenet 存在问题:每一层 Conv 都使用之前所有层的输出,因此会导致当前 Convinput channel 很大,输出到 output channel 却较小
  • 因此,作者只在 VoVNet Block 的最后一个 Conv 才用之前所有层的输出
  • 相同计算量下,效果优于 ResnetDenseNet

2. PRN

3. CSPNet(YOLOV5)

4. ELAN

  • paper: https://arxiv.org/pdf/2211.04800.pdf
    elan.png
  • ELAN 全称是 Efficient Layer Aggregation Network, 作者以 VoVNetResNet 做对比,VoVNet 在叠加更多 block 时表现要比 ResNet 更差,作者分析是因为 VoVNet 结构中存在过多的 transition layers,这导致在叠加 block 时最短梯度路径( the shortest gradient path )不断增加,从而使得 block 增加时训练难度上升
  • PRN 相比 ResNet,使用 mask 让输入只有部分 channel 通过 identity connection,丰富了梯度来源;
  • CSPNet 通过将 channel split,一方面增加了梯度信息(同 PRN),另一方面减少了 computational block 中的计算量;
  • ELAN 的思想是:搭建网络时需要考虑每一层的最短最长梯度路径,还要考虑整个网络的最长梯度路径。

5. E-ELAN(YOLOV7)