日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【YoLov5实战】记录一次不太成功的实战,足球场人物识别

發布時間:2023/12/15 编程问答 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【YoLov5实战】记录一次不太成功的实战,足球场人物识别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

實戰項目參考:

yolov5實戰

我是從打標簽開始,一步一步的做的。

起因是想自己做點什么,而且覺得要從打標簽這種比較“無聊乏味”的工作開始,對yolov5的整個流程好有個完整的認識。

想法來源:

之前看過一則新聞,AI攝像誤認裁判光頭為足球
想一想覺得很有趣,如果識別技術不是單純的追蹤足球,而是改為類似“綜合考慮球員密度和足球位置”這樣的設計會不會更好?
譬如:球場22個人,確定在一個確定的攝像機畫面大小范圍內,把攝像機角度調整為足球位置和球員數量都最佳的位置。這樣就把問題變成了一個足球位置和球員密度的雙目標優化問題,不單單考慮足球的位置,還要考慮足球和球員聚類中心的位置。根據二者的位置來實現鏡頭調度。

我的想法大概是這樣一個流程:
1. 用YOLO做一個識別算法能夠隨時標記出畫面內球員位置和足球位置
2. 設計一種算法,計算球員聚類中心(這個不能是簡單的中心,因為持球隊員、空擋位置接應點球員、防守球員、暫時無關球員等等,他們之間的權重肯定是不同的)
3. 設計一種調度算法,根據球員聚類中心、足球位置、二者運動方向來同時確定攝像機調度
4. 在現實世界進行一個物理測試

具體要怎么處理這個復雜問題,首先要設計一陣規則,怎樣衡量足球位置和球員密度的重要程度,設計怎樣的函數來表示球員密度、表示所謂的“足球位置最佳”?如果運動到了邊路鏡頭該怎么變化?如果有快速的傳切配合,足球位置快速的變化,怎樣保證鏡頭不會劇烈晃動?門將開大腳,足球位置和球員位置中心距離巨大這種情況又該怎么考慮?具體的處理這個問題實在是太復雜了。我一個人很難搞定,而且也沒有時間、也沒有攝像機以及球場上的兩只球隊來配合我我測試(= =、)。但是我還是可以把這個設想的第一步搞一搞——用yolo5對畫面分析,分析當前鏡頭的球員數量和足球位置。

于是目標也就計劃好了。

項目目標:

總之就是最后得到給一段俯視球場鏡頭,識別技術能標出鏡頭內球員位置和足球位置。這就是我能做到的事情。后續的,以后再說吧。
做出這種樣子,就是要實現的目標(雖然這幅圖片上并沒有足球(被人擋住了))

項目實現:

STEP1 獲取數據集圖片

作為一名阿森納球迷,我選擇了20-21賽季阿森納的一場比賽。阿森納vs曼城,

首先下載視頻。
然后每隔12秒取一幀圖片,這里我一開始取的是前一個小時的,但是實際上最后并沒有用這么多

import cv2 capture=cv2.VideoCapture(r'F:/素材資源/足球比賽/【英語解說】20-21賽季英超第25輪|阿森納VS曼城 全場錄像 - 1.21.02.2021(Av416851693,P1).mp4') #視頻名稱 print(capture.isOpened()) num=0# 總共輸出一個小時 24*60*60 = 86400 # 每4秒鐘輸出一幀 24 * 12 = 288 # 86400 / 288 = 300 能夠得到300張數據集 while True: ret,img=capture.read() if not ret:print("path 1")breakif num % 288 ==0: cv2.imwrite(r'arsvsmcn/%s.jpg'%('pic_'+str(num)),img) #寫出視頻圖片.jpg格式print("已輸出:"+str(num//288)+"幀")if num == 86400: # 一個小時breaknum=num+1capture.release()
  • 效果

    一共300張圖片,之后要人工篩選,把近景的全部刪掉,因為我們本身就是對主攝像圖像畫面來做工作的,近景的都沒必要繼續留下。
    還剩下213張。

再繼續,就是打標簽了。

STEP2 打標簽

參考:利用labelimg打標簽
計劃:把這213張圖片全部打完標簽。
實際情況:這個部分真的好痛苦,差不多平均每張圖片有10名左右的球員,以及時有時無的足球。一共213張圖片,我打了107張(正好一半),大概總共打了1000多個標簽,實在是不想再打了,斷斷續續用了大概4到5個小時左右吧?當時的心態是就打算先試驗性的進行下一步驟了,如果效果還可以就這樣,不行的話在接著打。
當然也在這里我犯了個可以說是系統性錯誤的問題,暫時按下不表。

最終效果

最后把xml格式轉為yolo格式即可(這個地方是參考了一個博客做的,但是具體鏈接沒有保存)

STEP3 對yolo5項目調參

接下來就是調參了,首先去gitHub下載yolov5,
導入pycharm

  • 選yolov5s.pt作為預訓練權重
  • data文件夾下確定數據yaml文件
  • models文件夾下確定模型yaml文件
# data文件要修改的參數(此行不要出現) # number of classes nc: 2# class names names: [ 'person','football' ] # models # parameters nc: 2 # number of classes
  • 編碼有關注意: yaml文件不支持UTF-8 因此不能輸入任何中文注釋

STEP4 訓練

  • train.py修改的參數(main部分)
parser = argparse.ArgumentParser()parser.add_argument('--weights', type=str, default='weights/yolov5s.pt', help='initial weights path')parser.add_argument('--cfg', type=str, default='models/nowusing.yaml', help='model.yaml path')parser.add_argument('--data', type=str, default='data/nowusing.yaml', help='data.yaml path')parser.add_argument('--hyp', type=str, default='data/hyp.scratch.yaml', help='hyperparameters path')parser.add_argument('--epochs', type=int, default=100)parser.add_argument('--batch-size', type=int, default=8, help='total batch size for all GPUs') # CUDA out of memory.

因為我的筆記本只有好幾年前的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模塊后加入

wandb = None # add this

把這個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实战】记录一次不太成功的实战,足球场人物识别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。