感悟 | CV算法工程師一年
點擊下方卡片,關(guān)注“新機器視覺”公眾號
視覺/圖像重磅干貨,第一時間送達
文僅交流,侵刪 編輯 Jack Cui
在知乎看到一篇文章,工作一年的 CV 算法工程師的工作感想。
里面的很多感受,深有感觸,分享給大家,希望對你能有所幫助。
原文如下:
努力的伍六七:
https://zhuanlan.zhihu.com/p/395255446
今天是正式工作后的第一年,打算做一件事,以后要持續(xù)記錄自己的工作感想和生活狀態(tài)。
人這一輩子那么有限,作為一個普通人,也許我窮極一生也不會有什么大的成就可以讓外人為我寫下一個傳記。
但是我可以用自己的手記錄下我這一生,吃過的苦,犯過的錯,愛過的人,在和一些網(wǎng)友聊過之后,我發(fā)現(xiàn)我是蕓蕓眾生中的一粒沙,那些自以為的經(jīng)歷其實在陌生的一個環(huán)境里也有人同樣地經(jīng)歷著。
希望我的文字可以激勵那些人,希望我的錯誤可以警惕那些人。
算法工程師必備的技能
我的具體研究方向是計算機視覺算法工程師,眾所周知,當我們在說起算法工程師的時候,大家一般都會把工程師說成調(diào)參俠,而那種天天看論文發(fā)論文的又被捧上天。其實不然,我想以我從業(yè)一年的角度來說,一個計算機視覺算法工程師需要具備的技能。
算法工程師的工作內(nèi)容首先是每日三問:業(yè)務(wù)KPI達標了嗎?badcase解決了嗎?CornerCase優(yōu)化了嗎?你所有的工作的目的就是去解決這三個問題。
所以日常的工作內(nèi)容是看看什么Case沒有解決,制定優(yōu)化目標,迭代,再看,再優(yōu)化,不斷循環(huán)往復(fù)。看上去是不是覺得算法工程師這個工作簡單,枯燥,無聊?
其實不然,因為我相信每一份工作都是有它枯燥簡單的地方,大名鼎鼎的李飛飛,吳恩達這些數(shù)據(jù)科學家難道就沒有做過調(diào)參的工作了?凡是不可以偏概全,我眼中的算法工程師要具備的技能點是這樣的。
能意識到數(shù)據(jù)的價值和用法
頂尖的數(shù)據(jù)科學家肯定是會比一般人更理解數(shù)據(jù)的價值,以及做一個算法類的項目,需要用到什么樣的數(shù)據(jù),使用什么樣的特征,有哪些需要考量的細節(jié),在這個項目中的優(yōu)化目標所關(guān)聯(lián)的數(shù)據(jù)需求是什么。
能做好高效合理的算法選型
這一個我就是要打臉那些說算法工程師是調(diào)參俠的人了,你以為的調(diào)參俠是把一個學習率從0到1e-3挨個嘗試,改改配置就行。實際上當接到一個新項目的時候,作為一個算法工程師是需要快速調(diào)研算法論文,并且制定算法優(yōu)化方案的。
并且很多時候這個子方向你是之前沒有接觸過,比如突然讓你去從一個分類項目中去做一個跟蹤項目,你需要在一周之內(nèi)去調(diào)研業(yè)界的跟蹤算法文章并理清楚跟蹤算法的分類成績,優(yōu)缺點分析,核心思想分析,這一點沒有論文積累是比較難的。
優(yōu)秀的算法工程師就是要具備這種快速選型并且抓重點,最后還能給出一個合理的算法選型。一般考慮的角度是(可部署性,精度指標,速度怎么樣,有沒有不支持的算子,是否開源等等)。話說在這一點上,沒有人會傻到對一個新項目去復(fù)現(xiàn)沒開源的SOTA論文。
全流程的把控能力
這方面算軟實力,偏項目管理。正如我之前說的一個需求從定義,調(diào)研,方案制定,數(shù)據(jù)采集,標注,模型訓練,Inference,SDK的集成。
這一套流程都是要有時間節(jié)點的,不僅僅是項目負責人給的節(jié)點,算法工程師自身也要給自己定義節(jié)點并且高效把控。比如采集的安排要考慮采集方案的合理性,高效性。
標注的時候要定義好標注邊界,在你手里過的數(shù)據(jù)要要詳細的記錄,不然到時候數(shù)據(jù)找不到真是個很麻煩的事情。模型訓練的時候從輸入圖片校對,target校對,inference代碼,看著loss慢慢降下去了就可以安心喝個咖啡休息休息,這套流程其實就是一般的軟件開發(fā)一樣,不需要擔心完不成的問題,但是要考慮風險,把控進度,注重細節(jié),考驗的是一個算法工程細不細的問題。
代碼功底
算法工程師基本都是Python為主,python作為一種簡單的語言使用起來當然非常方便。(不要用C++的高端來批判使用python的我們了,用C++寫模型的訓練那是憨憨或者是大神(yolo作者)干的事。
python代碼除了基礎(chǔ)的操作,數(shù)字,字符串,類,裝飾器等等,其他就是各種工具要用的數(shù)量,numpy, pandas, torch, opencv, multiprocess等,具體看你的研究方向了。在系統(tǒng)架構(gòu)上,我覺得學習開源代碼,比如PaddlePaddle和MMLab的代碼都是非常好的學習資源。
只不過我們所謂的架構(gòu)是把一個算法項目的前處理,后處理,model_build,backbone,neck,head等等這些組件化的一種架構(gòu),但是我認為一些設(shè)計模式的思想還是和軟件開發(fā)一樣的,大量的工廠模式,觀察者模式的思想在這些算法架構(gòu)中都有體現(xiàn)。
對于C++這方面,我之前也有執(zhí)念要不要學CUDA,現(xiàn)在覺得不需要,我所任務(wù)的算法工程師的C++功底是要能高效完成邏輯上的處理,以及能夠快速定位和調(diào)試遇到的bug,Cmake也要能看得懂,要有把算法模型部署上線的能力,對C++的基礎(chǔ)類型,STL,指針,引用,多態(tài),繼承,命名空間,模板都熟悉。至于一些指令級優(yōu)化,算子融合啥的,那都是專業(yè)的人去做了。
算法優(yōu)化能力
這是個核心技能,一定要秉持著數(shù)據(jù)>算法>創(chuàng)新的思路去做一個項目,當優(yōu)先級高的遇到了瓶頸了再去做下一個環(huán)節(jié)的事情。數(shù)據(jù)側(cè)就是要不斷去做badcase分析,按場景按類別去分好自己的訓練數(shù)據(jù),同樣要對測試集,測試方案,測試指標要不斷改進和優(yōu)化。
算法上則要考慮的是backbone的設(shè)計選擇,neck的設(shè)計選擇,head中target的設(shè)計選擇,數(shù)據(jù)增強方案(這個比較重要,除了幾何增強,還有像素級增強),更好的Pretrain模型,后處理的邏輯優(yōu)化,大模型KD優(yōu)化,類別不均衡的優(yōu)化,難樣本挖掘優(yōu)化等。
重點說下后處理,這個環(huán)節(jié)其實非常重要,很多時候基于邏輯的規(guī)則可以提高你模型一大半的性能,代碼一般都簡單,但是需要你去從數(shù)據(jù)反饋中挖掘這個規(guī)則怎么制定。創(chuàng)新性則是你的研究能力。
研究能力
很多論文其實價值不大,不是在于沒有創(chuàng)新,而是在于這個創(chuàng)新都是為了“新”去做的,并且在那么一兩個公開數(shù)據(jù)集上達到了比較好的效果就可以發(fā)論文來證明這個工作的價值。有時候?qū)嶒灹税l(fā)現(xiàn)不好,就改一通網(wǎng)絡(luò),我已經(jīng)看了很多篇加了deform_conv魔改網(wǎng)絡(luò)的方案了。
非常solid的文章當然值得尊重,比如之前看多目標跟蹤的時候看完centertrack的時候,感覺這篇文章真的簡單,溫柔,有力量!不過我其實也不是吃不到葡萄說葡萄酸哈,能發(fā)頂會當然是大大的好哈。畢竟程序員往高了走,頂會頂刊,行業(yè)影響力是妥妥的硬通貨!但是不過是工程還會做研究,調(diào)研論文,復(fù)現(xiàn)論文都是必備的技能,這塊其實我覺得也是屬于研究能力的范疇。
數(shù)學能力
很多人都說算法工程師對數(shù)學要求高,其實我不太清楚這個要求高具體指啥水平,但是起碼公式推導(dǎo)是肯定要掌握的,不然很多論文也看不懂的,比如最近在看目標跟蹤的文章,我感覺對數(shù)學水平還是有一定要求的,不然連傅里葉變換,卡爾曼濾波都整不明白,那真的沒法玩,至于比這更高的數(shù)學要求,那就讓那些數(shù)學家,研究員搞去吧。我反正是搞不了,爹媽就給我這腦袋,不是金剛鉆我也不攬瓷器活。
聚焦一個方向
由點開始出發(fā),算法一般就是推薦,搜索,NLP,CV,控制規(guī)劃這些子方向。我本身是做CV的,所以對CV稍微比較了解一點,在CV里其實方向也非常多,傳統(tǒng)圖像處理,識別,檢測,分割,單目標跟蹤,多目標跟蹤,人臉相關(guān)任務(wù)(屬性,情緒,識別等等),GAN,顯著性檢測,異常檢測,超分辨率,OCR,圖像復(fù)原(去霧,去雨,去陰影,補全圖像...),深度估計,ReID,SLAM,以及通用技術(shù)模型量化,剪枝,模型蒸餾,meta learning,遷移學習……。
看到這應(yīng)該明白為啥CV這么卷了吧,而且有些方向的門檻和技術(shù)棧比較高,比如SLAM,一般社招SLAM的話基本都是要有相關(guān)經(jīng)驗的,不然一個只做過分類任務(wù)的人去做SLAM估計會很吃力。我的想法就是要從一個小方向出發(fā),在幾個小方向內(nèi)挖深,然后對其他大方向也觸類旁通,這樣才能有更好的進步。畢竟方向是不一樣,能力需求還是差不多的。
算法工程師的技術(shù)成長
這一年下來,我感覺自己在技術(shù)上收獲還是蠻多的,在這個大項目組里,檢測,分割,分類,識別,關(guān)鍵點都有所接觸,同事也非常nice,不同方向的同事平時也樂于分享自己技術(shù)棧里的工作和前沿文章。
但是有點比較無奈的就是自己在算法創(chuàng)新這一點上還是有所欠缺。希望下一年的時間里,自己可以不斷加強這方面的能力提升。
算法能力
當然是重中之重,leetcode不僅僅是招聘的篩選標準,也是鍛煉一個人算法思維的重要手段。雖然不得不說hard的題一般都是有一些ACM的技巧性在里面,但是我認為一個成熟的算法工程師,一定是要有秒解easy題,對middle的題也要基本能cover得住。
不然用技巧性,題目和業(yè)務(wù)不搭邊這樣的說法只能是掩蓋自己思維能力不足的借口。這一點自己做得還不夠好,還是要不斷提高。
PPT和文字能力
對,沒錯,我要把這個放到技術(shù)篇。因為寫PPT真的是個技術(shù)活!!!看了組內(nèi)老大哥寫的那PPT,技術(shù)邏輯條理分明,布局結(jié)構(gòu)美觀大氣,講PPT那個滔滔不絕的樣子真是好萊塢大片一鏡到底,絕了!!!作為一個有語言障礙的人,十分佩服,羨慕這樣的人。
不過我總結(jié)了大佬的PPT和演講。做一個好的PPT,尤其是技術(shù)類的PPT,第一點就是要對自己的技術(shù)棧非常清晰,技術(shù)能力是絕對要過關(guān)。圖和文字上,就是要以圖代字,不能空洞,也不用浮夸,更不用像學校課件一樣放一些動態(tài)特效。技術(shù)人員的PPT只要三個點:邏輯清晰,內(nèi)容充實,一目了然。
在美觀性上,我下載了論壇和組內(nèi)會議的優(yōu)質(zhì)PPT分析了下,所謂美觀其實只要有個簡約的背景,文字和圖標最好一起用,多放一些柱狀圖,折線圖等說明你的工作,時間線的匯報來個帶箭頭的圖表述下。PPT這個東西,要積累模板,要理清邏輯,要整理材料,要抓住重點,要自信表達。希望自己和觀眾老爺們的PPT能力都可以不斷進步,一時菜雞不要緊,永遠不行動才是最可怕的。
前沿技術(shù)的跟進
做算法這一點確實是和其他行業(yè)差異比較大的,算法的技術(shù)更迭特別快。要經(jīng)常閱讀前沿論文,也許不會直接拿來用,但是技術(shù)的優(yōu)化細節(jié)是否有助于現(xiàn)有的項目這個其實還是需要考量一下的。
不要用(不都是用老方法做項目)這樣的說法來diss我,你要是這么想你就用10年的算法一直用,近3年的文章都不看,當有新的有價值的東西出來的時候等你知道了別人早就用上了,而且長時間不看論文。也會慢慢喪失對文獻閱讀和理解的能力,就和一個人長時間不寫代碼了就不會寫代碼一樣。
現(xiàn)有的技術(shù)方案總結(jié)
僅僅根據(jù)自己比較了解的識別,檢測,分割方面的一些總結(jié)。
比較通用的算法側(cè)優(yōu)化是backbone(resnet resnext resnest efficientNet等大模型,mobilenet hrnet shufflenet等系列小模型),Neck(fpn, bi-fpn,panet等各種FPN層),比較實用的網(wǎng)絡(luò)優(yōu)化(deform_conv,se-net,cbam等attention結(jié)構(gòu)),head優(yōu)化(主要是target設(shè)計的方方面面。
比如檢測anchor-base和anchor-free之間的差異就是在于target和輸出之間加了一個anchor作為橋梁),訓練策略優(yōu)化(主要集中在正負樣本均衡,損失函數(shù)設(shè)計,比如過采樣,欠采樣,損失函數(shù)比如FocalLoss,triplet_loss,訓練流程上比如OHEM等)。
訓練參數(shù)優(yōu)化(CosineLearningRate等LR方面的優(yōu)化,AutoAugment、Mixup、CutOut等數(shù)據(jù)增強方面的優(yōu)化),預(yù)訓練模型(基于無監(jiān)督大數(shù)據(jù)Moco等, 大分辨率pretrain, 最差也得ImageNet-pretrain了,這塊NLP方面做的比較好,CV這塊我比較看好無監(jiān)督或者半監(jiān)督的方法),新方案(ViT,DETR等transformer在CV里的各種應(yīng)用)。
知識蒸餾,大模型蒸餾小模型是每一個公司都會要的技術(shù)棧,可看hinto的開山之作,當時后面還有各種多teacher,加權(quán)等方案。
最后就是訓練數(shù)據(jù)的干凈,對不同場景都能cover到,對于訓練參數(shù)中的具體數(shù)值就跑模型看效果。以上是我這一年經(jīng)驗所總結(jié)的算法優(yōu)化方向,重點在于總結(jié)方向,具體細節(jié)方法太多了就不一一贅述。
就這一年的工作經(jīng)驗看來,很多時候不同的算法方案之間很多時候效果上實際差距其實不大,這一點在我跑ATSS的實驗的時候也更加確定。
但是有些東西比如attention_block,transformer,KD等確實是硬通貨。做一個算法工程師最重要的素質(zhì)是在海量的算法方案中理解,吃透那些真正的干貨,然后不斷在實踐中去驗證,并總結(jié)吸收到自己的腦子里。
最后
工作,就是總結(jié)經(jīng)驗,改進提高的過程,人生又何嘗不是如此。
—版權(quán)聲明—
僅用于學術(shù)分享,版權(quán)屬于原作者。
若有侵權(quán),請聯(lián)系微信號:yiyang-sy 刪除或修改!
