普通段位玩家的CV演算法崗上岸之路(2023屆秋招)

語言: CN / TW / HK

前言 在捲成麻花的2022年,一個沒有上述背景、沒有名校撐腰的普通科班小碩能入坑中大廠的CV演算法崗嗎?作者現身說法:還是能!

作者:記憶的迷谷@知乎(已授權CV技術指南轉載)

來源:http://mp.weixin.qq.com/s/FokKQ2eTsjhUquGmgo3SBQ

歡迎關注公眾號CV技術指南,專注於計算機視覺的技術總結、最新技術跟蹤、經典論文解讀、CV招聘資訊。

計算機視覺入門1v3輔導班

寫在前面

是的,今年的秋招確實是肉眼可見的難度增加:縮招、裁員、畢業生人數爆炸,這些關鍵字已然成為2023屆秋招的代名詞。競爭激烈,演算法崗入坑的難度更是直線上升。卡第一學歷、卡名校、卡重點實驗室......這些“基本操作”早已司空見慣。

在捲成麻花的2022年,一個沒有上述背景、沒有名校撐腰的普通科班小碩能入坑中大廠的CV演算法崗嗎?

我的回答是:能,但是很難、很卷,且容錯率較低。因為CV演算法崗的競爭對手基本都在985分段,且動不動就是某C9高校的重點實驗室。

因為身邊的人不走演算法崗,所以全程基本靠自己摸索,期間遇到了各種困難、走了許多彎路。為了記錄這段有意義的經歷,同時給自己一樣出身普通的師弟們(實驗室沒有師妹)提供CV演算法崗的就業思路,將本人的整個秋招的真實歷程分享給大家。【長文警告↓↓↓】

導讀:

本篇文章主要分為以下幾個章節:

  • 【背景】,【歷程】主要介紹了本人秋招前的狀態,以及從研究生入學到秋招的過程。

  • 【需要掌握的技能】從硬實力、軟實力兩個方面介紹秋招時可以增加自己競爭力的點。由於每個人的基礎情況不同,CV演算法崗也有較多細分方向,本章節僅供參考,大佬請直接略過。

  • 【總結】秋招的一些小的建議。

補充說明: 1. 閱讀文章之前,請務必瞭解“倖存者偏差”這一概念,CV演算法崗的秋招形式嚴峻,請保持理智。 2. 本文的“普通”一詞是指本科雙非、碩士非985、非重點實驗室、無頂會、投遞崗位為CV演算法崗的計算機科班應屆研究生,並無冒犯之意。

背景

概述:

本人本科雙非軟體工程專業,碩士普通211的計算機技術專業,目前研究方向是計算機視覺。

秋招拿到【虹軟、vivo、OPPO三家offer,均為計算機視覺類(CV)演算法崗,有SP也有大白菜】(除去國企銀行),和大佬們的offer沒得比,但感覺基本接近自己的預期。(雖然已於9月獲得虹軟轉正意向書,為了給自己的秋招不留遺憾,同時可以通過不同的offer明確自己在秋招大軍的整體定位,所以堅持完整參與了秋招)。

具體情況:

  • 身邊的環境

除了我的大大大師兄(高我三四屆)拿了某中廠演算法offer以外,我們實驗室就再也沒有人走過演算法崗。包括同門在內的同屆同學,也基本都是開發。師兄和同學也都勸退我走演算法,改開發。

在我找到第一份演算法實習之前,大部分人都認為我選擇這條路是一個頭鐵且愚蠢的行為,且常聽到陰陽怪氣的言論。

每次刷知乎,總能看到“19年演算法崗供大於求”、“20年演算法崗諸神黃昏”、“21年演算法崗灰飛煙滅”,今年又換了個四字詞語 --“人間煉獄”。各路“過來人”也都是全方位勸退。

​好在自己的家人比較支援我自己做決定,只不過最後選擇offer的時候,家人們曾勸我躺平一個隨手拿的國企,放棄自己的專業,我要真想躺平還用的著這麼卷麼,大無語。

總之,身邊自始至終支援我走演算法崗的,四捨五入就只剩自己了。沒關係,意料之中罷了。

  • 自己擁有的一些條件

導師不會push我們給他發論文,且只要完成規定的任務,就允許我們自己出去找實習。【秋招上岸的關鍵性因素】

實驗室有免費使用的入門級計算資源,雖然只是1080Ti這種級別的顯示卡,且當時還要和師兄一起用。但是拿來學習跑跑實驗還是綽綽有餘的。同時家裡贊助更新了一臺2060GPU的筆記本,用來本地除錯也挺好使。

學校的線下課程在研一期間全部上完,研一課程結束就可以做實習早鳥。

歷程

本節按照時間線的順序,敘述了本人歷時兩年的秋招戰線。

【初識演算法】2020年9月~2020年10月

結束擺爛、確定方向階段。 研究生入學,之前聯絡的導師莫名其妙把我鴿 了,不得不重新找導師。

我的選擇標準有兩個:一是教授,二是允許實習。在本科國獎託底和自己死皮賴臉的堅持下,我現在的導師給加了一個名額,順利入組。

導師給我明確了CV的研究方向,同時分享了一些資料(因為才學疏淺,當時沒能看懂,後面就跑去B站知乎學習了),每週組會彙報自己的學習進度。也是這個時候發現自己對CV挺感興趣的,也是初生牛犢不怕虎,確定自己走演算法崗的方向。

【走出迷茫】2020年11月~2021年2月

夯實基礎階段。 因為導師安排的任務主要偏學術,我也意識到:如果僅僅靠導師的指導、按部就班的學習就去找演算法崗工作,是遠遠不夠的。於是,自己找到了一位前輩指點自己系統地入門深度學習。之後制定學習計劃、學習基礎鋪墊知識、篩選和閱讀paper、debug原始碼、參照已開源的工作來複現未開源的論文......在完成導師佈置的任務之餘,花了大量時間,算是搞明白深度學習的路子了。在此期間,完成導師安排的專案、自己找一些開源的專案補充學習,可以加深自己的理解同時還能潤色簡歷。

當時的部分學習計劃(分類&檢測篇)

因為搞演算法除了python的基本要求外,C++多少也要會一些。也是從這個時候,制定了刷力扣的長期計劃,強迫自己學習C++,程式設計題也全部用C++寫。刷題不求多,但重在把思維和語法熟練度鍛鍊好。

【穩紮穩打】2021年3月~2021年5月

備戰實習階段。 過年給自己放了半個月假,開始著手找第一段實習。聽了師兄的建議(當時師兄在鵝廠實習搞開發,respect),開始刷牛客面經,查漏補缺,力扣保證一週刷七題。

同時系統地整理之前學習的筆記,也是這個時候我寫了知乎的第一篇部落格,並立下了一年寫完50篇技術部落格的flag(已於2022年4月達成)。

【初露鋒芒】2021年5月~2021年6月

第一段實習的投遞、面試階段。 第一次投實習沒有經驗,先投了一些難度拉滿的大廠:商湯、位元組都給了面試,但是面得稀爛,商湯的面試官更是在無coding題的情況下問了我兩個小時的問題,面試結束後當場自閉。

後來總結了面試失敗的經驗,也補上了自己面試中沒有答出來的知識點。現在想想,當時的我真的是愚蠢至極,就應該先面小廠,積累面試經驗,起碼不至於面試過後髒了自己的大廠面評(因為秋招的時候,這兩家秒掛我的簡歷,應該是自己作沒的 )。

經歷了十多場面試,也積累了足夠的經驗,最終自己如願拿到了vivo AI研究院的演算法崗實習offer。

【漸入佳境】2021年7月~2022年1月

第一段實習。在我的軟磨硬泡下,導師先是同意我出去實習半年(美滋滋)。

入職以後,令人窒息的壓力接憧而至:老大給我的研究方向是神經網路結構搜尋(NAS)方向 -- 一個自己從來沒聽說過的預研方向,與此同時,同組的實習生來自武大,還比我早來一個月,需要儘快跟進她的進度。於是,自己白天調研相關工作、復現一些論文、慢慢接手專案,晚上加班讀原始碼、刷部落格(捲到了旁邊的實習生,實在抱歉)。第一個月頂著壓力,總算把進度拉上來,專案步入正軌。

9月,恰好看到Kaggle有個CV新賽,恰好這時候藍廠取消大小周,於是就報名參加了。之後差不多兩個月的時間,白天趕專案,晚上和週末搞比賽。

11月,專案需要優化的模型計算量首次降低到100M以下,同時比賽也拿到了銅牌(第一次參賽,拉胯的成績,但盡力了)。

後面的時間就是邊實習邊準備開題,順利完成了實習階段的任務,拿到了口頭轉正(可惜AI研究院今年不招人,靠自己重新走流程拿的影像演算法部,權衡了一下,還是想待在自己熟悉且喜歡的組),與nice的同事們告別。

【一波三折】2022年2月~2022年5月

嚮導師爭取了第二次實習的機會,開始著手準備暑期實習,同時和之前實習的武大同學合作一篇論文。但沒高興多久,上海的疫情就爆發了,幾乎整個上海的實習HC都沒了,與此同時學校疫情封樓,天天牢飯吃到心態爆炸,差點想轉開發(慶幸自己沒轉)。

雖然有了一段大廠實習經歷,但找第二段實習甚至更艱難:收到一堆海筆,只收到了三家面試(某周的週一面了美團,面試官很nice,面試也順利,他還表達了希望我面試通過後早點過去實習,結果週五反手收到個感謝信☺)。磕磕絆絆拿到了第二份offer -- 虹軟的計算機視覺演算法崗實習。

【穩中求勝】2022年5月~2022年9月初

第二段實習。 這次研究方向是視線檢測,因為在藍廠的實習積累了許多專案經驗,所以無論是搭環境還是上手專案都很快。

我們組所有的實習生每週都會單獨開個週會,可以瞭解大家的進展,同時還能偷學一些技巧,因此在這邊自己成長的速度很快。和我搭檔的實習生是天大的,我倆都做視線方向,經常一起討論專案中遇到的難點,如我mentor所說,1+1 > 2,無論是實習還是秋招,找個伴共同進步總好過孤軍奮戰。

7月~9月初,工作時間肝專案,下班以後的空閒時間刷題、刷面經,準備轉正答辯,投提前批(演算法提前批卡學校,基本全泡池子),投秋招,基本每天搞到11點才休息(轉正名額有限,不敢做賭狗)。

8月底順利通過轉正答辯,9月初拿到了虹軟為數不多的轉正意向書。

【衝刺終點】2022年9月~2022年10月

收穫的季節。實習結束,導師召回返校,一邊做導師安排的工作一邊搞秋招。

總共筆試了二三十家公司,面了六七家(因為不是985、研究方向有差異,也被拒了蠻多)。最後到手虹綠藍三家offer,於十月中旬塵埃落定。平時經常做RGB影象演算法,沒想到拿的offer也剛好涵蓋RGB三種顏色 ,或許這就是緣分吧。

需要掌握的技能

硬實力篇

1.基礎知識

入坑演算法崗的基本功。推薦李航老師的 《統計學習方法》 以及周志華老師的西瓜書。入門深度學習推薦斯坦福 《CS231N》 課程(在B站上可以找到中文字幕版)。不太推薦一上來啃《深度學習》(花書),對小白不友好,但是後期可以當工具書使用。

確定了自己的研究 / 學習的方向後,可以在各類部落格上找到對應方向大牛整理的paper list,選取一些經典必看的論文,並在Github中找到對應的原始碼閱讀【一定要看原始碼,一定要看原始碼,一定要看原始碼】, 面試的時候,資深的面試官經常會問一些細節問題,而只有你理解了原始碼是怎麼實現的前提下,應對這些問題才能遊刃有餘。在學習時,要及時總結和整理,將論文裡的知識精煉成自己筆記的過程,其實就相當於模擬回答面試官問題的過程。整理的東西多了,就變成的所謂的“八股文”,相較於開發,演算法的面經更靈活,面試的問題也因人而異,一份屬於自己的“八股”很重要,同時它也是實習和秋招面試前最有價值的複習資料。

2.實習

如果導師允許的話,【一定要儘早出去實習,一定要儘早出去實習,一定要儘早出去實習】。 實習經歷越豐富、實習公司的層次越高、實習的時間越久,你的競爭力越強。曾經有HR和我說過,CV演算法崗的普通分段同學很少能進流程,如果沒有實習經歷,自己大概率會被淘汰。

PS:實驗室不給實習的同學,也不要灰心,實習不是入職演算法崗的必要條件,但是如果你但凡有機會實習,一定要好好把握。

3.專案

冷知識:在簡歷和麵試中把自己的論文以專案的形式描述,面試官會更感興趣。

“如果你發表的不是頂會,那麼我更希望你用專案的形式敘述你的作品。”這是面試時一位面試官的原話。所以在這裡,我把自己的論文歸類為專案,且當我把論文以專案的形式更新到簡歷中,後面的面試會問到這部分工作的頻率明顯增加。

很多人覺得自己的專案可能不是那麼出彩,覺得拿不出手。在這裡完全可以打消這個顧慮,我們投的又不是天才少年計劃,所以只要能把自己的專案講明白,言之有理,都可以作為一個加分項。在面試前,一定要梳理好自己的專案,例如解決的問題、應用場景、創新點、難點、資料是怎麼處理的、badcase是怎麼優化的、後面還能改進的地方......講專案的時候一定要自信、有條理,建議面試前可以多試講幾次錄個音。

4.比賽

打比賽有兩種策略:

第一種策略:運氣好,碰到了自己熟悉方向的比賽,在比賽中儘可能刷高自己的名次。

第二種策略:只有自己感到陌生的方向(不過也是CV類比賽),用最快的時間上手該方向,然後儘可能深入,爭取比賽中較好的排名。

我當時的運氣並不好,沒有遇到自己熟悉方向的比賽,所以選擇了第二種策略。花了一個多月的時間,利用下班時間和週末的空當去打了場kaggle比賽,因為第一次參賽加上精力和水平有限,以一枚kaggle的銅牌收場(讓各位路過的大佬見笑了)。但是面試時,向面試官展現快速上手陌生領域工作的能力,同時把自己的創新點以及解決問題的思路、所採用的方法都講清楚,也是一個不錯的加分項。

5.程式設計能力

老生常談的問題,無論是筆試和麵試,手撕程式碼都是不可或缺的一個環節,最有效提升自己程式設計能力的手段就是刷題。

因為自己在考研時就有深入學習過資料結構,且本科在打一些程式設計比賽時也有系統地練習過一段時間,所以基礎還算比較紮實。如果程式設計基礎比較差的話,推薦B站上一個up主分享的錄播

視訊:LeetCode刷題班(C++)(http://www.bilibili.com/video/BV1GK411J76n/%3Fspm_id_from%3D333.337.search-card.all.click%26vd_source%3D10e0f295b6ee116aee6983cb3d4bbbdf)。這套課程時長在40多個小時,解題思路也符合普通選手的段位(基本沒有花裡胡哨的風騷解法),同時課程的深度和廣度足以應對大部分的筆試和麵試。

除了上述視訊中的題目,力扣的《劍指offer》《熱題Top100》系列也是很經典的題目。如果想按章節刷題,《程式碼隨想錄》也是不錯的選擇。一些高頻題型或者自己第一遍沒吃透的題目,最好再二刷三刷加深理解。自己的刷題量在300道左右(後期沒有重新整理的題目,而是二刷甚至三刷把演算法吃透),屬於中規中矩的水平,筆試中的hard題寫起來有些吃力,但是面試中手撕程式碼基本都能A。

軟技能篇

本章節是自己在實習中和組內大佬們工作、相處中總結出的一些內容,可能對大家的實習轉正有幫助,也是我認為自己能拿到轉正意向的一些重要因素。(因人而異,僅供參考)

1.表達能力

【搞CV,做出來的是東西,但東西是給人做的】 認清這一點很重要,不要只沉浸在創作的過程中,要能把自己的想法、實現方式清晰明確地表達出來,別人才知道你這段時間在做什麼,做出了什麼。

千萬不要自己明明做出了一些成果,卻因為支支吾吾表達不清楚,讓大家覺得你很水。要時刻牢記:無論我做了什麼,只要是我自己做出來的,都能夠給人講明白。

2.溝通能力

【清晰地回答問題 & 高效地提問問題】, 有效溝通主要體現在這兩個方面。

大部分人都能做到前者,回答問題前,先大概想一下應該從哪些點來回答提問者的問題,不要想一出說一出,這樣別人會認為你的邏輯很混亂。

這裡重點介紹後者。首先,要明確什麼問題可以問。 舉個例子,專案環境怎麼搭建,或者百度上/公司內部文件能搜到的問題,自己費點心思解決就好。如果自己嘗試解決但解決不了,那這種問題就很適合問。其次,問問題要有自己的思考,如果遇到一個不懂的問題,可以先說一下自己嘗試解決這個問題的方法,以及自己的理解,然後指出到底哪裡的細節不懂,這種情況對方一般很樂意解答。最後,問問題選準時機,如果你覺得這個問題對方需要花時間才解釋清楚,就找個對方有空的時候(平時可以多觀察一下你的mentor,看他一般啥時候不忙),因為有時候對方回答的比較敷衍可能確實是因為沒有時間。

3.反饋能力

【自己完成的每一個階段,都最好讓別人心裡有數】 當手裡有團隊分配的任務時,最好定期向mentor反饋進度。這樣你走的每一步都是可控的,如果你的想法不可行,可以得到及時糾正;如果發現當前的結果和預期有偏差,也可以及時發現問題所在。千萬不要自己搗鼓來搗鼓去,到了deadline發現自己一點進展也沒有,最後彙報工作時,你尷尬、你的mentor也尷尬。

4.自驅力

【主動探索問題的解決方式】 在公司裡,會發現大佬們的時間都很寶貴:沒有人會像學校裡的老闆一樣有時間整天盯著你幹活,也不會有人時刻指點你這個專案該怎麼做。優勝劣汰的環境下,只能靠自我驅動。

在幾乎不靠別人幫助的前提下,自己主動提出正確、可行的解決方案,同時想辦法用程式碼實現並取得成果 -- 這本身就是一件可以證明自己能力的行為,同時積極主動解決問題的態度也更容易給人留下深刻印象。

5.邏輯思維能力

【思考問題儘可能清晰且有條理】 簡單來說,就是把每份任務都當做一個小論文去對待,做到像論文一樣思路清晰、有條理,做每一件事都有自己的思考,有自己的路子。這個能力在研究生階段或多或少都能得到鍛鍊,在這裡就不再贅述了。

6.規劃能力

【把一個大目標拆分為具體環節的能力】明確自己的目標以後,有清晰、可行的規劃。

例如,為了完成秋招這一大目標,我把兩年的時間拆成了多個階段(詳見歷程章節)去實現目標;為了提升自己的競爭力,把CV演算法工程師所需要的能力拆分成硬實力和軟技能兩大類,然後每個大類再拆分成具體的環節,逐一提升自己的能力。

7.執行力

【下了決心就馬上去做,不拖泥帶水】 有些人之所以是思想上的巨人,行動上的弱者,主要是因為缺乏執行力(僅用於描述一些客觀存在的人群,請勿對號入座)。克服懶、拖延這兩個壞毛病,這一點自然而然就能做到。

總結

1.沒有傘的孩子,必須努力奔跑。 網際網路的大環境變差,普通玩家的體驗越來越糟糕,只有掌握過硬的本領,才能在凜冽的寒冬中生存,在惡劣的大環境中也能遊刃有餘。

2.要有自己的判斷力,別人認為困難的事情,未必自己做不成。經常研究別人的涼經只會增加自己的精神內耗。

3.打鐵還需自身硬。基礎不牢,地動山搖。

4.能實習,儘早出去實習;不給實習,儘量爭取實習;實在不能實習,取長補短彌補自己的實習經歷空缺。

5.如果不能在某一方面做到出類拔萃,那麼根據木桶原理,請儘可能做到面面俱到,包括但不限於硬實力和軟實力。

6.秋招對於大部分人來說都不是一帆風順的,要做好心理準備。自己也遇到了很多心態爆炸的經歷(沒寫進去是因為太搞人心態),但能堅持熬過去就上岸了。

寫在最後

本文詳細介紹了自己秋招上岸CV演算法崗的全過程,除了自己努力的因素外,還不乏選擇、運氣、機遇等不確定因素的加持,僅供各位讀者參考,在選擇就業方向時請保持理智(大佬請隨意)。預祝各位還在秋招的同學們順利拿到自己心儀的offer。

特別感謝自己遇到的一些貴人(按時間順序):

  1. 我本科所在學院的院長。和清華博後最近距離的一段時間,也是自己成長最迅速的一段時間。

  2. 我的研究生導師。寶藏導師,給了我兩次、共計十個月的實習時間。

  3. DeepLearningGoGoGo前輩。技術紮實的大佬,自己入門深度學習的加速器。

  4. 兩次實習的老大和mentor們。現實中的伯樂,把我從菜雞堆裡撈出來, 如果沒有這兩段豐富的實習經歷加持,我應該還在秋招池子裡泡澡。

此外,還要感謝vivo AI研究院和虹軟nice的同事們、和我一起實習的其他實習生夥伴,以及秋招路上曾幫助過我的人。

完結撒花✨。克服懶惰,花了17天時間,每天抽一個小時完成了本篇的超長經驗貼,謹以紀念自己長達兩年的秋招戰線,希望幫助到更多還在猶豫是否入坑演算法崗的同學,同時可能也是本年度封筆的文章了。

如果你覺得這篇文章有幫助的話,請多多點贊轉發,希望可以幫助到更多有需要的人。

本文僅做學術分享,如有侵權,請聯絡刪文。

歡迎關注公眾號CV技術指南,專注於計算機視覺的技術總結、最新技術跟蹤、經典論文解讀、CV招聘資訊。

計算機視覺入門1v3輔導班

【技術文件】《從零搭建pytorch模型教程》122頁PDF下載

QQ交流群:444129970。群內有大佬負責解答大家的日常學習、科研、程式碼問題。

其它文章

深度理解變分自編碼器(VAE) | 從入門到精通

計算機視覺入門1v3輔導班

計算機視覺交流群

用於超大影象的訓練策略:Patch Gradient Descent

CV小知識討論與分析(5)到底什麼是Latent Space?

【免費送書活動】關於語義分割的億點思考

新方案:從錯誤中學習,點雲分割中的自我規範化層次語義表示

Transformer交流群

經典文章:Transformer是如何進軍點雲學習領域的?

CVPR 2023 Workshop | 首個大規模視訊全景分割比賽

如何更好地應對下游小樣本影象資料?不平衡資料集的建模的技巧和策

U-Net在2022年相關研究的論文推薦

用少於256KB記憶體實現邊緣訓練,開銷不到PyTorch千分之一

PyTorch 2.0 重磅釋出:一行程式碼提速 30%

Hinton 最新研究:神經網路的未來是前向-前向演算法

聊聊計算機視覺入門

FRNet:上下文感知的特徵強化模組

DAMO-YOLO | 超越所有YOLO,兼顧模型速度與精度

《醫學影象分割》綜述,詳述六大類100多個演算法

如何高效實現矩陣乘?萬文長字帶你從CUDA初學者的角度入門

近似乘法對卷積神經網路的影響

BT-Unet:醫學影象分割的自監督學習框架

語義分割該如何走下去?

輕量級模型設計與部署總結

從CVPR22出發,聊聊CAM是如何啟用我們文章的熱度!

入門必讀系列(十六)經典CNN設計演變的關鍵總結:從VGGNet到EfficientNet

入門必讀系列(十五)神經網路不work的原因總結

入門必讀系列(十四)CV論文常見英語單詞總結

入門必讀系列(十三)高效閱讀論文的方法

入門必讀系列(十二)池化各要點與各方法總結

TensorRT教程(三)TensorRT的安裝教程

TensorRT教程(一)初次介紹TensorRT

TensorRT教程(二)TensorRT進階介紹