【YoLov5实战】记录一次不太成功的实战,足球场人物识别
實戰項目參考:
yolov5實戰
我是從打標簽開始,一步一步的做的。
起因是想自己做點什么,而且覺得要從打標簽這種比較“無聊乏味”的工作開始,對yolov5的整個流程好有個完整的認識。
想法來源:
之前看過一則新聞,AI攝像誤認裁判光頭為足球
想一想覺得很有趣,如果識別技術不是單純的追蹤足球,而是改為類似“綜合考慮球員密度和足球位置”這樣的設計會不會更好?
譬如:球場22個人,確定在一個確定的攝像機畫面大小范圍內,把攝像機角度調整為足球位置和球員數量都最佳的位置。這樣就把問題變成了一個足球位置和球員密度的雙目標優化問題,不單單考慮足球的位置,還要考慮足球和球員聚類中心的位置。根據二者的位置來實現鏡頭調度。
我的想法大概是這樣一個流程:
1. 用YOLO做一個識別算法能夠隨時標記出畫面內球員位置和足球位置
2. 設計一種算法,計算球員聚類中心(這個不能是簡單的中心,因為持球隊員、空擋位置接應點球員、防守球員、暫時無關球員等等,他們之間的權重肯定是不同的)
3. 設計一種調度算法,根據球員聚類中心、足球位置、二者運動方向來同時確定攝像機調度
4. 在現實世界進行一個物理測試
具體要怎么處理這個復雜問題,首先要設計一陣規則,怎樣衡量足球位置和球員密度的重要程度,設計怎樣的函數來表示球員密度、表示所謂的“足球位置最佳”?如果運動到了邊路鏡頭該怎么變化?如果有快速的傳切配合,足球位置快速的變化,怎樣保證鏡頭不會劇烈晃動?門將開大腳,足球位置和球員位置中心距離巨大這種情況又該怎么考慮?具體的處理這個問題實在是太復雜了。我一個人很難搞定,而且也沒有時間、也沒有攝像機以及球場上的兩只球隊來配合我我測試(= =、)。但是我還是可以把這個設想的第一步搞一搞——用yolo5對畫面分析,分析當前鏡頭的球員數量和足球位置。
于是目標也就計劃好了。
項目目標:
總之就是最后得到給一段俯視球場鏡頭,識別技術能標出鏡頭內球員位置和足球位置。這就是我能做到的事情。后續的,以后再說吧。
做出這種樣子,就是要實現的目標(雖然這幅圖片上并沒有足球(被人擋住了))
項目實現:
STEP1 獲取數據集圖片
作為一名阿森納球迷,我選擇了20-21賽季阿森納的一場比賽。阿森納vs曼城,
首先下載視頻。
然后每隔12秒取一幀圖片,這里我一開始取的是前一個小時的,但是實際上最后并沒有用這么多
- 效果
一共300張圖片,之后要人工篩選,把近景的全部刪掉,因為我們本身就是對主攝像圖像畫面來做工作的,近景的都沒必要繼續留下。
還剩下213張。
再繼續,就是打標簽了。
STEP2 打標簽
參考:利用labelimg打標簽
計劃:把這213張圖片全部打完標簽。
實際情況:這個部分真的好痛苦,差不多平均每張圖片有10名左右的球員,以及時有時無的足球。一共213張圖片,我打了107張(正好一半),大概總共打了1000多個標簽,實在是不想再打了,斷斷續續用了大概4到5個小時左右吧?當時的心態是就打算先試驗性的進行下一步驟了,如果效果還可以就這樣,不行的話在接著打。
當然也在這里我犯了個可以說是系統性錯誤的問題,暫時按下不表。
最終效果
最后把xml格式轉為yolo格式即可(這個地方是參考了一個博客做的,但是具體鏈接沒有保存)
STEP3 對yolo5項目調參
接下來就是調參了,首先去gitHub下載yolov5,
導入pycharm
- 選yolov5s.pt作為預訓練權重
- data文件夾下確定數據yaml文件
- models文件夾下確定模型yaml文件
- 編碼有關注意: yaml文件不支持UTF-8 因此不能輸入任何中文注釋
STEP4 訓練
- train.py修改的參數(main部分)
因為我的筆記本只有好幾年前的1050Ti,所以batch-size沒敢調太大,只設置了8個batch。其他的參數基本也沒什么可說的
- 訓練過程出現的bug
問題1
ValueError: Media Bounding Box Debugger/Images is invalid.Please remove invalid …
這個問題是wandb導致的,這里我一開始選擇正經的注冊了wandb賬號,然后開辟了項目,但是還是報錯,而且是很沒有什么頭緒的Warning和Error,后來感覺我壓根就不需要這個輔助功能,干脆選擇吧這個部分給Ban了得了。就選用了本文的解決辦法
在utils/wandb_logging/wandb_utils.py中一開始的try/except模塊后加入
把這個BAN了,這樣就好了。
問題2
AttributeError: Cant get attribute SPPF on module models.common
這個問題的解決方法
但我并沒有搞明白為什么會出現這種情況。
- 之后就能正常運行了
正式試驗
第一次試了30個epoch,速度還是挺快的,可能數據集確實不是很多,所以很快就結束了,得到了結果。之后又進行了第二次試驗,跑了100個epoch,跑了20分鐘
第一次30個epoch
第二次100個epoch
最后tensorboard的結果
之后又看了一下loss,沒有我想象的那么差,所以在“紙面上”還是挺能打的,具體看效果就需要用其他的數據來檢驗一下了。
STEP5 測試檢驗
首先是用原視頻來檢驗一下,因為我選取的是前60分鐘的(雖然并沒有都用完),我直接用了后面的視頻來進行檢驗。
- 這里一開始還出現了一個小bug,就是標簽太大了,具體差不多是按照[這里的辦法來修改的](https://blog.csdn.net/ghostype/artic在這里插入圖片描述
le/details/122113895)
效果圖展示
比我想象的要好,因為人都識別的比較準確,除了說第二張圖片在人比較密集的時候,他會出現識別的人變多了之類的情況之外其他都還好。
然后我繼續用其他的錄像來進行測試檢驗
布雷頓0-2埃弗頓的一場比賽
切爾西vs利物浦的一場比賽
這場比賽陽光很足,球場分為了陰陽兩面,在這種情況還能識別出來,說明魯棒性是比較強的。我本以為能適應好原來訓練用的那場比賽就可以了,沒想到其他的比賽也基本上可以,這還真的讓我有點開心。
不過看著看著我就發現了一個很嚴重的問題——為什么只有person標記,沒有football標記??
存在問題
幾乎所有的視頻,幾乎每一幀,都只顯示了person標記,而沒有顯示過football標記。
發現這個問題的時候我是有點懵逼的,后來仔細一想就想清楚了,因為我每一張圖片都是少則5個多則20多個person標記,但是football標記只有1個,如果被球員擋住了甚至連一個都沒有,football標記的數量太少了,而且足球所占的像素本身就很少,在切出來的訓練集里還有很多是擊球一瞬間的虛影狀態,被爭搶狀態的混戰狀態,這些情況導致了足球標記無法出現,也可以說是有其必然性的。這可以說是系統性問題了,一開始設計數據集就出現了紕漏,所以可以說,我值完成了一半的目標(識別人),而另一半的目標(識別球)沒有完成。
這里看得我實在有點…
改進目標與展望
一點小感想
雖然總的來說這次并不是很成功,不過總的來說也不算太差,對自己來說是一次完整的yolo實戰(從自己搞數據集開始,到訓練、驗證、測試一套流程走下來),很有意思,也很讓我感覺快樂(跑出結果那一瞬間真的有種小時候格斗游戲打掉boss時候的那種快樂感)。所以還是比較滿意的。
改進的可能
既然問題是打的標簽不平衡,person太多football太少,解決辦法便是把圖片切開,每張圖片保證一個人、一個足球,大概這樣的程度。不過這樣的話不僅僅是我要從打標簽開始從頭再來,我還需要把現有的圖片篩選分割切片,選出持球人和足球了。這個工作量想一想就有點太頭皮發麻了,剛剛經歷了5個小時打標簽的我短時間內實在是不想在經歷一次了。而且我還有其他的事情,所以這個就先按下暫且不表了。
展望
2021年一整年的經歷之后我明白了目前自己更想做的是那些“有意義的事情”,不想把浪費時間在一些很虛的東西上,類似辯經啊、自己騙自己的做一些所謂的努力之類的,所以打算做點“正事”,學點自己想干的,不管是對自己也好還是對誰,起碼是要有收獲,真的留下點什么,不想學了點皮毛就去裝模作樣的搞的自己很高深的樣子,希望能從細枝末節的事情出發。一點一點的做東西吧,之后還會在計算機視覺這方面努力。
然后就是等目前手上的事情結束了去啃yolo的源碼,CNN的基本數學原理已經搞明白了,batch-size之類的參數的作用也基本都懂,但總的來說在代碼層面目前還是個調包俠,慢慢把這些落到實處吧。
打完標簽的數據集
鏈接:https://pan.baidu.com/s/1_VMK5845PJJPi6sRg8dVUw
提取碼:rcpx
總結
以上是生活随笔為你收集整理的【YoLov5实战】记录一次不太成功的实战,足球场人物识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 出圈游戏c语言用指针求,出圈游戏程序设计
- 下一篇: 清除IDM假冒序列号及重置试用期