当前位置: 首页 > 编程日记 > 正文

我在旷视研究院做检测 | 技术头条

640?wx_fmt=jpeg


作者 | 俞刚,旷视研究院Detection组负责人。2014年博士毕业于新加坡南洋理工大学,加入旷视。主要负责检测,分割,跟踪,骨架,动作行为等方面的研究以及算法落地工作。俞刚博士带队参加 2017 COCO+Places 挑战赛获得检测第一名,人体姿态估计第一名;接着,带队参加 2018 COCO+Mapillary 挑战赛,获四项第一。


【导语】入职旷视研究院已经四年多,一转眼已经从单兵作战,到现在有一个Detection团队。一路过来有坎坷,有经历,有成长。这次希望通过分享的方式,让各位对旷视研究院(Detection组)有更多了解,同时也把我个人的心路历程呈现出来,为后来者抛砖引玉。


一、求职


时间回退到五年前,已交完PhD thesis的我,开始准备找工作。当时导师非常nice,给了一份保底工作,在学校里做research fellow, 这样我就有足够的时间好好找工作,但是缺乏完整的职业规划。一开始投递了一些高校教职,面试了一些学校也拿了一些offer。偶然间应师弟邀请去旷视参观。当时公司刚从银谷搬到融科,人数不多,但氛围出奇好;环境虽没现在火热,也没有多少友商,但是能感觉到一种气息——每个人对技术的执着追求。没做多少犹豫,我就跟老婆一起搬来了北京。


二、起步


刚来时,雄心勃勃想大干一场,却低估了很多事情的难度。前前后后揽了不少活,但是没有干出什么成绩。2015年的时候,旷视研究院已经希望做一些零售商超方面的工作,没有什么行业背景,没有什么项目经历,感觉自己把产品想象得太简单。这段时间的一个总结是:算法不等于产品,有产品也不等于能落地解决客户问题。当然,那时候的算法非常粗糙,还是基于传统方法,感觉充其量只是一个受限场景的demo。经过反思,觉得需要先把算法真正做扎实。


于是,在2015年的时候,我第一次接触了深度学习,虽然当时深度学习已经爆发了。2015年在旷视研究院的那段时间是非常幸福的,停下来,好好思考一下,其实可以学习到很多东西。基于深度学习,Detection组开始做的第一个任务就是行人检测,最开始使用fast rcnn,后来慢慢切换到faster rcnn。同时Detection组开始基于行人检测做人体骨架算法。另外,为了更精细的定位人体框,Detection组又做了一些分割算法。所有这些算法的研究构成了Detection组的雏形。但是那时,我忽视了一个非常重要的方面——团队培养。

三、带人


旷视研究院前几年的生源质量其实非常好,实习生都是有非常好的背景。比如我最早的两个实习生,一个实习生拿了ACM world final的金牌(第二名), 另外一个去了MIT读博。后来很多实习生都是OI金牌之类的。当然,这些其实跟我没什么关系,我并没有带人的经验。很多同学在团队里付出了很多努力,但是实际收益很小。当时自己可能是有些失落的,我开始反思,如何才能真正培养同学,如何才能增加团队的战斗力。我花了很多时间跟实习同学一起去琢磨各种paper, 研究各种细节,讨论各种实验结果。从那个时候开始,Detection组真正成长出来了一批非常强而且可靠的同学。那批同学现在已经成为我们组的骨干,很多人已经自己带起了一个小团队。同时,Detection组招人的要求也在不断完善。从只看基础能力,到后来会关注一些软性能力,比如motivation,价值观等等。一个让我有深刻反思的例子是一个同学推荐了两个OI同学,一个是OI金牌,另外一个OI银牌但是有非常强的规划和motivation。我没有经过多少思考就选择那个OI金牌的同学。后来那个OI银牌的同学快速成长起来,同时做出了非常多优秀的工作。价值观在小团队野蛮生长期可能并不是很突出的问题,但是当团队变大后,这个问题的严重性会暴露出来。


四、产品


那个时候Detection组人不多,但是大家士气都很好,研究算法工作已有起色,有了比较好的刷点经验。但是当时的问题在于,Detection组渐渐离产品越来越远。我们所做的东西希望能用在实际产品中,但是算法成熟度不高,所以离实际落地距离还是非常的远。2016年暑期,公司迎来了孙剑老师的加入,这对于Detection组以及我个人来讲都是有非常大的帮助。经过一段时间的梳理,Detection组正式接手了所有的检测工作,包括产品中用到的人脸检测。这一步对于打通技术完整检测技术链条是非常重要的,因为我们同时做检测产品的研发,同时做检测基础算法的预研,让我们真正end-to-end在优化过程。比如产品中的难点可以转化为研究问题去帮忙探索,这样可以确保研究方向是实用导向的。另外一方面,很多研究方面的经验可以快速transfer到产品中使用。


经过一段时间,我跟另一个同事重新搭起了一套新的检测算法,相比上一版算法有非常明显的提升,无论是速度跟精度。当然,因为是糙出来的,所以有非常多不合理的细节。经过一步步完善以及更多同学的努力,到今天,Detection组的算法有了非常本质的提升。总结一下,一个产品用的算法可能需要做好各个细节: 训练集的持续增加,科学细分的benchmark,合理的数据格式以及高效的data provider, 统一的codebase以及完善的文档,定期的发版计划,以及badcase的追踪和维护。当然,在那个时候,很多细节做的都不好。除了上述细节之外,还有一个我没做好的维度是团队的工程化建设,工具链的建立。这个问题一直被忽略,或者以比较低的优先级在进行着,导致长期来讲Detection组的效率比较低,研究员花了非常多的时间在处理数据,流程等工作,而这些工作其实可以自动化的。另外,因为本身没有很好的工程基础,所以Detection组一般只负责算法模块的实现,没有完整Pipeline架构层的能力,这可能会导致算法能力无法很好的发挥出来。当然,目前我们对这方面的建设是非常重视的,同时也我们会花很多时间来提高团队的产品能力和效率。


五、科研


随着团队的成熟,一些现有同学的成长以及强有力的新同学加入,目前产品层的算法Detection组也梳理的比较顺利。但是基础研究上面走的有点累。具体来讲,Detection组一直走在复现的路上,比如有一个新的算法,复现一下,刚复现完,可能新的算法又出来了。这让我深深意识到之前基础算法工作中的短板,如果只是follow别人,那永远不可能超越。从那时起,Detection组主攻几个点,在多个同学的努力下,渐渐有了自己的算法工作,比如从最早期的RFCN++, Large Kernel Matters, 到后来的MegDet, DetNet等。大家慢慢找到了方向,找到了自信。


Detection组开始参加一些比赛,比如2017年ICCV的COCO以及2018年 ECCV的COCO比赛。因为早期的积累,加上多团队的合作分工,我们对于结果还是非常有信心的。这里可以提两个细节。2017年时,我们从来没有参加过COCO比赛,也没有太多经验,但是我们心态非常好。有一次对话过程中,孙剑老师问我们,希望能跑到单模型多少结果,当大家犹豫时,有一个同学脱口说了49。我们一致认为他在吹牛,因为当时我们的点可能只有46。但是在比赛前,他确实做到了。在2018年的比赛过程中,我们的一个感受就是tough,每天sync过程中,一般会同步之前的实验结果,但往往一天天的实验都是不涨点的,虽然每次大家都会觉得有点失落,但是大家的斗志始终非常旺盛,一直尝试各种想法,哪怕可能只有0.1的涨点,大家都很非常兴奋。从那段时间的反思过程中,我觉得团队中需要有一些”软性“能力,对胜利的渴望,对问题的坚持和执着是非常重要的。


另外,在研究过程中,我从孙剑老师身上学到的一个非常重要的点,就是专注。这个词虽然说起来很简单,但是我自己一直做得不好。很多时候,我们对于研究的态度是希望到处开花,各个领域皆有涉及,然后每个领域都能分一杯羹。但是真正的研究工作可能需要花大量的精力和时间去深挖一个点,这必然需要放弃掉一些其他的东西。从2019年开始,Detection组的研究范围重新定义,停掉了一些任务,同时把精力聚焦在几个重要的点上。希望这些改变能让Detection组真正带来一些“大招”,而不是简单的小打小闹。


640?wx_fmt=jpeg


六、招聘


2017年下半年到现在,因为业务等需要,Detection组需要招聘更多的同学。因为一开始不重视招聘,导致2017年校招犯了一个非常严重的失误,直接导致2018年甚至是2019年的人力短缺,所以这一年过得非常累,因为可能一个人需要同时补很多洞。2018年我复盘了自己招聘过程中的问题,重新理解了招聘。招聘首先不是为了解决现在的问题,而是为了以后做准备,一定要未雨绸缪。另外,很重要的是,招聘不单是HR的工作,更是每个leader的工作。那时候,每周都会拿出很多时间去面试,去沟通同学,对于很多候选同学来讲,其实我们自己去沟通会比HR更能让同学们了解旷视研究院的情况以及他可能的工作。同时间,另外一个经验是招聘需要发动全员一起行动。首先如果只有自己一个人去操心招聘,这样精力肯定不够,所以Detection组会发动每一个同学去招聘,让每个同学理解招聘的重要性以及学会如何去招人。同时,我们也会通过一些宣传,让大家了解我们,愿意加入我们。


七、管理


因为短时间内很多新同学的加入,我渐渐的意识到Detection组在变大,之前的一些管理方式可能已经不是很适用了。因为我对于管理其实是个小白,虽然开始尝试读一些书,学习一些课程,但是感觉处理起来还是比较简单粗暴。其实算法团队的管理跟很多传统工程的管理还是有区别的。不能太教条,这样会影响团队成员的积极性和创造性。我们需要的可能是赋能,让团队提高效率,而不是制造障碍和瓶颈。我的一些尝试是首先是做好基础建设,特别是组内的工具链,codebase, 文档,论坛, tech-talk分享等。只有具备高效自动化的工具才能真正解放每一个同学,把时间花在刀刃上面。另外,Detection组内的信息共享,科学的培训体系对于每一个同学的成长都是非常必要的。另外一层就是培养一些Leader,包括可以替换自己的同学。每个团队大了后,一定需要有同学成长起立,来帮忙负责做一些管理。同时每个Leader本身也需要有一些二号位,来做补位等。即使是我自己,也希望能培养一些同学完成工作。这样可能团队才是最健康的状态。另外一方面Detection组会制定一些流程,一些计划来帮助团队提升。因为工作久了,可能会有一些惯性,很多时候我们希望能有一些新的想法,新的思路来提升大家战斗力。当然我们发现要推广这些新的流程可能会花很多时间,很多精力,所以目前的经验是不会频繁的推广新的流程,每个新流程都需要在一些sub-team小团队中先做验证。总结一下,我们希望能提供一个很好的平台,把优秀的同学聚在一起,一起去干出一番成绩,同时也希望新来的同学基于我们平台快速成长。


团队稳定后,另外一个可能突出的问题是我们做的是算法,正如文章前面写的,算法不等于产品,所以Detection组开始学习一些产品方面的知识。Detection组内每周会有一次产品相关的分享讨论,主要是讨论算法如何在产品中发挥更大的价值等等。因为只有更好的产品意识才能把算法真正落地。同时我们也可能希望能跟“客户”做更多的沟通交流,了解具体的需求以及讨论可能性。很多时候,算法,工程,产品,商务,客户是两两之间沟通的,中间每次传递都有可能信息的丢失和理解的偏差。正如神经网络一样,Detection组可能希望的是拉通,end-to-end的优化,同时最好有一些类似residual的shortcut来更好的传递信息。从价值观角度来讲,旷视研究院希望用算法解决客户问题,给客户创造价值。而不是为了算法的落地而落地。

八、建议


上面给出了一些我个人的一些经历。同时基于这些年我看到的很多同学,我希望给出一些我自己零碎的建议。这些建议是对职业生涯中的三种不同阶段给出的。


1、假设你是学生


(1)一定要提前做好规划,无论是工作还是继续深造。假设有问题,多跟老师,师兄,师姐等沟通,了解更多信息来做判断。任何决定可以适度犹豫,但是不要太纠结。


(2)基本功非常重要比如工程能力,比如数学基础等等。


(3)在导师允许的前提下,多出来实习,看看外面的世界,同时多认识一些同学。


(4)假设你刚入职工作。


(5)平台很重要,跟一些很强的同学一起共事可能是一件非常有意思的事情。


(6)不要挑活,要相信付出是一定有收获的。


(7)自驱力很重要,一定要主动去学习。


2、假设你已经开始带团队


(1)一定要有共赢的思想。大家一同有收益而不是“一将功成万骨枯”。真正关心了解每个团队成员的需求,多沟通,多倾听每个人的意见,建议良好的反馈机制,发挥出每个人的最大价值。


(2)增强基础建设,流程建设,确保组织以更高效的方式运作。


(3)方向的把控很重要,避免“战胜了所有对手,但是输给了这个时代”这种窘态。


说了很多,还是希望让大家对旷视研究院以及Detection组有一定的了解,也希望我的分享能让大家避免我踩过的坑,有更多同学加入我们,一起去探索一个超越人类的检测算法,扩宽认识边界,真正让计算机视觉技术推动人类的进步和发展。


如果有兴趣加入旷视 Detection 组,可以给俞刚老师发邮件:

yugang@megvii.com


原文链接:

https://zhuanlan.zhihu.com/p/61910297?utm_source=ZHShareTargetIDMore&utm_medium=social&utm_oi=40535670652928

(本文为AI科技大本营转载文章,转载请联系原作者)


实习生招募

640?wx_fmt=jpeg


推荐阅读:

  • Python超越Java,Rust持续称王!Stack Overflow 2019开发者报告

  • 科大讯飞刷新纪录,机器阅读理解如何超越人类平均水平?技术头条

  • 12个案例教你用Python玩转数据可视化

  • 抵制996!Python之父发声背后,这个社区一呼百应!

  • 刘强东割袍弃兄弟,马爸爸醉心 996

  • 996.ICU 下被过度消费的程序员,还配享受生活吗?

  • 漫画:图的 “最短路径” 问题 | 技术头条

  • 4000万假币流入波场, 发生在凌晨的BTT假币攻击事件始末及细节披露

  • 刺激!我31岁敲代码10年,明天退休!

640?wx_fmt=png


点击“阅读原文”,查看更多精彩文章。

相关文章:

【Ubuntu】ubuntu设置GUI程序自启动

1、在启动脚本中添加 在脚本中添加,如“/etc/rc/”“etc/rc.d”“/etc/rc?.d”“/ect/profile”“.bash_profile”等等。 百度下有很多讲解,这里不再赘述。 2、利用ubuntu界面系统启动 终端中执行:gnome-session-properties,出…

(转)关于数据库主键和外键(终于弄懂啦)

一、什么是主键、外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯…

浏览器兼容:IE6,IE7,IE8,FIREFOX,Chrome

javascript部分1. document.form.item 问题问题:代码中存在 document.formName.item("itemName") 这样的语句,不能在FF下运行解决方法:改用 document.formName.elements["elementName"]2. 集合类对象问题问题&#xff1a…

如何将DynamoDB的数据增量迁移到表格存储

为什么80%的码农都做不了架构师?>>> 摘要: AWS 的 Amazon DynamoDB 和阿里云的表格存储 TableStore 都是完全托管的NoSQL数据库服务,提供快速的、可预期的性能,并且可以实现无缝扩展。本篇文章介绍了如何使用 Lambda …

【Ubuntu】ping: unknown host www.baidu.com

1、问题描述 每次重新设置网络后,ping百度总是报错: $ ping www.baidu.com ping: unknown host www.baidu.com2、原因分析 原因是:查看/etc/resolv.conf,发现没有设置DNS服务。 $ cat /etc/resolv.conf # Dynamic resolv.con…

马云:“996 是一种巨大的福气”

作者 | 伍杏玲出品 | CSDN(ID:CSDNnews)【导语】自3月27日996.ICU话题诞生以来,目前GitHub已获得21万的Star,引发国内外的广泛关注和热议。很多人质疑996工作制,Python之父Guido Van Rossum更直言“996反人…

Firebug Console 与命令行全集

Console API 当打开 firebug (也包括 Chrome 等浏览器的自带调试工具),window 下面会注册一个叫做 console 的对象,它提供多种方法向控制台输出信息,供开发人员调试使用。下面是这些方法的一个简单介绍,适时地运用它们&#xff0c…

100%的程序员都想挑战的算法趣题!| 码书

计算机的世界每天都在发生着深刻的变化。新操作系统的发布、CPU性能的提升、智能手机和平板电脑的流行、存储介质的变化、云的普及……这样的变化数不胜数。在这样日新月异的时代中,“算法”是不变的重要基石。要编写高效率的程序,就需要优化算法。无论开…

【Qt】qss样式表之:QCalendarWidget,日历窗口样式表设置

1、效果图: 2、qss样式表 其中表头的背景颜色等设置不起作用,只好在下面的代码中实现。 /*日历*/ QCalendarWidget QHeaderView {qproperty-minimumSectionSize:0; } QCalendarWidget QMenu{background-color: rgb

BZOJ5324 洛谷4563 LOJ2545:[JXOI2018]守卫——题解

https://www.lydsy.com/JudgeOnline/problem.php?id5324 https://www.luogu.org/problemnew/show/P4563 https://loj.ac/problem/2545 题目见上。 参考:https://blog.csdn.net/dofypxy/article/details/80196942 区间dp,设f[i][j]为[i,j]的答案&#xf…

构建高可靠性网络

拓补图如下: 1. 浮动静态路由配置一条主链路,一条辅助链路!正常情况使用主链路,主链路出现故障,切换到辅助链路!H3C主线路 s0-s0 采用ospf 默认度量值是10,辅助线路 s1-s1 配置静态路由,默认度量值是10,无需调整,数据包默认值走s0-s0链路CISCO主线路 s0-s0 采用ospf 默认度量…

LeetCode上最难的链表算法题,没有之一

作者 | 程序员小吴转载自五分钟学算法(ID: CXYxiaowu)该题在 LeetCode 官网上有关于链表的问题中标注为最难的一道题目:难度为 Hard ,通过率在链表 Hard 级别目前最低。题目描述合并 k 个排序链表,返回合并后的排序链表…

【Qt】qss样式表之:自定义属性实现动态切换样式

1、问题描述 例如在播放器中播放按钮,由“播放”状态切换成“暂停”状态后,响应的图标要跟着状态切换。 2、解决方法 使用qss样式表中的属性功能,自定义一个属性,当按钮动作时,改变它的属性值。 在qss中分别对不同的属性值设置 样式。 但是qss不能自动监听属性值的变…

深入学习Lock锁(2)——LockSupport工具类

2019独角兽企业重金招聘Python工程师标准>>> 在同步组件中,当需要阻塞或唤醒一个线程的时候,都会使用LockSupport工具类来完成相应 工作。LockSupport定义了一组的公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能&#xf…

受用一生的高效PyCharm使用技巧(二)

本文转载自公众号Python编程时光(ID: Python-Time)今天又来给大家推荐一些我自己的用的小技巧,大家择需所取即可。如果你还没看过,可以下面的传送门,直接访达:受用一生的高效 PyCharm 使用技巧(…

【GStreamer】基本概念及安装

一、参考网站 官方主页 https://gstreamer.freedesktop.org/ 官方手册 https://gstreamer.freedesktop.org/data/doc/gstreamer/ 官方教程: https://gstreamer.freedesktop.org/documentation/tutorials/index.html 官方基础教程 https://gstreamer.freedesktop.org/docum…

python学习day3

1丶 用户先进行登陆如果用户名在文件中且用户密码也正确就登陆成功调用购物车函数,如果用户用户名输入正确密码错误,提示用户密码错误且重新输入,如果用户 输入用户名不存在,提示用户是否创建该用户,调用注册函数。 1.…

Visual Studio 2010构建Web浏“.NET研究”览器应用程序

2001年,我使用C#中的WebBrowser ActiveX控件编写了我的第一个应用程序,点此阅读,Kapil Sony写了一篇文章介绍了C# 2.0中上海企业网站制作的WebBrowser控件,每一次.NET新版本发布,控件和功能都会发生一些变化&#xff0…

如何通过结构化智能体完成物理构造任务?| 技术头条

作者 | Victor Bapst, Alvaro Sanchez-Gonzalez,Carl Doersch, Kimberly L. Stachenfel译者 | Linstancy编辑 | 一一出品 | AI 科技大本营(ID:rgznai100)摘要物理构造 (physical construction) 是根据物理动力学原理构造带有一些功能的物体的能力&#x…

【GStreamer】gstreamer工具详解之:gst-launch-1.0

一、gst-launch-1.0 1、简介: gst-launch-1.0构建和运行基本GStreamer管道的工具 官网:https://gstreamer.freedesktop.org/documentation/tools/gst-inspect.html?gi-language=c 命令格式: gst-launch-1.0 [OPTIONS] PIPELINE-DESCRIPTION2、OPTIONS参数选项: –help…

WPF查找子控件和父控件方法

原文:WPF查找子控件和父控件方法public List<T> GetChildObjects<T>(DependencyObject obj, string name) where T : FrameworkElement{DependencyObject child null;List<T> childList new List<T>();for (int i 0; i < VisualTreeHelper.GetCh…

ARP(Accounting Resource Planning)项目感想

ARP是Accounting Resource Planning&#xff08;会计资源计划&#xff09;的简称。转载于:https://blog.51cto.com/lya041/690079

【GStreamer】gstreamer工具详解之:gst-inspect-1.0

二、gst-inspect-1.0 1、简介 gst-inspect-1.0 打印插件列表、指定插件或指定元素的信息 2、命令格式: gst-inspect-1.0 [OPTION...] [PLUGIN|ELEMENT]3、OPTION参数选项: --help --gst-info-mask=FLAGS 设置GStreamer信息标志?? -a, --print-all 打印所有插件和元…

心酸科研路:3年前CVPR论文,仅被引用11次,如今成就黑洞照片!

众所周知&#xff0c;黑洞照片已经朋友圈刷屏了&#xff0c;可你也许不知道这张照片背后的一个故事。 译者 | Linstancy、Major 编辑 | 琥珀 出品 | AI科技大本营&#xff08;公众号ID&#xff1a;rgznai100&#xff09; 近日&#xff0c;由天文学家公布的人类首张黑洞照片引…

Redis和Memcache的区别是什么

Redis和Memcache都是内存数据库&#xff0c;但它们之间还是有区别的&#xff0c;跟着ytkah看看Redis和Memcache的区别吧 Redis 支持多种数据结构&#xff0c;如string,list,dict,set,zset,hyperloglog 单线程请求&#xff0c;所有命令串行执行&#xff0c;并发情况下不需要考虑…

windows加载符号小计

1、如果当前并没有设置符号路径和符号服务器&#xff0c;且当前正在调试&#xff0c; 则需要设置符号服务器和路径后&#xff0c;重新调试生效 2、如果当前有些pdb没有加载&#xff0c;因为这些pdb放在其他路径了&#xff0c;未加载&#xff0c;当把pdb拷到程序启动目录时&…

谈谈Python那些不为人知的冷知识(一)

本文转载自公众号Python编程时光&#xff08;ID:Python-Time&#xff09;小明在日常Code中遇到一些好玩&#xff0c;冷门的事情&#xff0c;通常都会记录下来。现在已经积攒了一些了&#xff0c;最近打算整理一波&#xff0c;发出来给大家补补。一篇只分享五个&#xff0c;有时…

【GStreamer】gstreamer工具详解之:ges-launch-1.0

三、ges-launch-1.0 1、简介 ges-launch-1.0:视频裁剪编辑,GStreamer编辑服务原型工具 详见官网:https://gstreamer.freedesktop.org/documentation/tools/ges-launch.html?gi-language=c#mandatory-arguments1 ges-launch-1.0 创建多媒体时间线并将其回放,或将其呈现为…

三大软件公司争霸赛区块链

导语&#xff1a;\\区块链技术发展到今天&#xff0c;区块链的扩容、吞吐量、运维弹性&#xff08;Operational Resilience&#xff09;、安全性、企业支持和Token管理等挑战&#xff0c;已成为区块链进一步发展绕不开的技术问题。\\突破这些现实技术挑战&#xff0c;不仅构能建…

【系列索引】结合项目实例 回顾传统设计模式 打造属于自己的模式类系列

网上设计模式的文章很多 虫子就不再和大家扯一些没有营养的理论 开此系列博文 一方面因为自己颓废了大半年 趁此机会回顾一下 另一方面希望能够帮助新人走出设计模式的误区, 如何做好设计模式 1.在发掘新的模式之前&#xff0c;必须熟悉理解现有的模式。许多模式看起来像是全新…