使用深度學(xué)習(xí)從視頻中估計(jì)車輛的速度
我想要解決的問題是:在一輛車?yán)镉幸粋€(gè)攝像頭,我想知道車開得有多快。你顯然不能看速度表,只能看視頻片段本身。深度學(xué)習(xí)魔法應(yīng)該能幫助我們。
數(shù)據(jù)
我有兩個(gè)不同的視頻。一個(gè)用于訓(xùn)練,另一個(gè)用于測試。訓(xùn)練視頻有20399幀,測試視頻有10797幀。視頻下載地址:https://github.com/commaai/speedchallenge。下面是一些例子:

視頻中的樣本圖像
訓(xùn)練視頻的標(biāo)簽是a .txt文件,其中每一行對應(yīng)于特定幀的速度。
方法
這個(gè)問題最有趣的地方是你的神經(jīng)網(wǎng)絡(luò)輸入會是什么樣子。僅從一個(gè)靜態(tài)圖像計(jì)算速度是不可能的。一種有效的方法是將兩個(gè)或更多的圖像堆疊在一起,或者像LSTM或Transformer那樣連續(xù)地堆疊。另一個(gè)是計(jì)算光流,我決定用它。
什么是光流?它基本上是一種為每個(gè)像素計(jì)算矢量的方法,告訴你兩幅圖像之間的相對運(yùn)動(dòng)。有一個(gè)很棒的computerphile視頻:https://www.youtube.com/watch?v=4v_keMNROv4,你可以了解更多細(xì)節(jié)。有一些“經(jīng)典”的計(jì)算機(jī)視覺算法可以用來計(jì)算光流,但深度學(xué)習(xí)已經(jīng)變得更好了(這一點(diǎn)也不奇怪)。那么什么是SOTA方法,讓我們看看paperswithcode:

RAFT 看起來不錯(cuò),它還有PyTorch的實(shí)現(xiàn)。我forked原始存儲庫,并使其更簡單一些。我不需要訓(xùn)練,評估等等。我只會用它來推理。
計(jì)算光流
為了進(jìn)行推斷,網(wǎng)絡(luò)將兩幅圖像拼接起來,并預(yù)測了一個(gè)維度為*(2, image_height, image_width)*的張量。如前所述,圖像中的每個(gè)像素對應(yīng)一個(gè)二維向量。我們將在實(shí)際訓(xùn)練中使用這些文件,因此我們將它們保存為.npy文件。如果你想象光流圖像它會是這樣的:

訓(xùn)練
記住我們訓(xùn)練的目的:
光流→模型→車速估計(jì)
我選擇的模型是EfficientNet。我非常喜歡它,因?yàn)樗目蓴U(kuò)展性。它有8個(gè)不同的版本供你選擇,最大的一個(gè),EfficientNet-B7仍然非常非常好。你可以從一個(gè)像B0這樣的小變體開始,然后如果一切工作正常,你有一個(gè)足夠好的GPU,你可以選擇一個(gè)更大的。還有一個(gè)PyTorch庫,我會使用它來非常容易地加載預(yù)先訓(xùn)練好的網(wǎng)絡(luò)模型,地址:https://github.com/lukemelas/effecentnet-PyTorch。如果你打開[train.ipynb](https://github.com/sharifelfouly/vehicle-speed - estimate),你就可以看到訓(xùn)練是如何運(yùn)作的。
我總是從B0開始,然后放大到B3,因?yàn)槲业腉PU只有6 GB內(nèi)存。經(jīng)過訓(xùn)練,我得到如下結(jié)果(loss為均方誤差):

訓(xùn)練損失

驗(yàn)證損失
很好,看起來一切都很正常!訓(xùn)練和驗(yàn)證損失都在降低,網(wǎng)絡(luò)沒有過擬合。
結(jié)果如下:

雖然不完美,但它確實(shí)有一些用
總結(jié)
我通常不太喜歡特征工程,但我認(rèn)為在這種情況下它做得很好。下一步是嘗試一些序列化的東西,比如Transformer或LSTM。