[圖像算法]-YOLOV5測試及訓(xùn)練自己的數(shù)據(jù)集

YOLOV5項目復(fù)現(xiàn)


首先說一下軟硬件配置這一塊:win10 + i7-9700kf + rtx2070Super + cuda10.2 + anaconda


image.png

一、YOLOv5 實現(xiàn)檢測

1.1 下載源碼

進(jìn)入官方地址,進(jìn)行源碼下載 https://github.com/ultralytics/yolov5[大概4M左右]

1.2 下載官方模型(.pt文件)

文中作者是把模型都放到了谷歌網(wǎng)盤里了,如果沒有梯子,訪問會很慢–>>作者給的模型地址

1.3 配置虛擬環(huán)境

虛擬環(huán)境的優(yōu)點不再闡述
創(chuàng)建虛擬環(huán)境:

conda create -n yolov5 python==3.7,**在yolov5中盡量用python3.7**。

進(jìn) 入 環(huán) 境 :

conda activate yolov5

再安裝所需庫:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt(使用清華鏡像源)

在pip install的時候,可能會出現(xiàn)read timeout的情況,你需要更換鏡像源,或者多執(zhí)行幾次pip install,如果還有其他報錯,請留言評論區(qū),我會及時回復(fù),因為我在安裝的時候也報了一些錯,但是都沒有記錄下來

1.4 進(jìn)行測試

進(jìn)入到y(tǒng)olov5根目錄下,我這里是用的powershell,你也可以在控制臺,都是一樣的。
在這里插入圖片描述

運行測試文件: python detect.py --source 0 【0:是指定的本機(jī)攝像頭】PS:我特么的竟然一次運行成功,多少是挺失望
下圖是下載pt文件


image.png

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓雷霆嘎巴↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ZBC↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

二、YOLOV5 實現(xiàn)訓(xùn)練

2.1 首先是準(zhǔn)備數(shù)據(jù)集

★ 數(shù)據(jù)集的準(zhǔn)備工作,我以前的博客有細(xì)寫過,—>>傳送門
★ 數(shù)據(jù)集準(zhǔn)備好后,一定先確保label和JPEGImages這兩個文件夾在同一目錄里
[圖片上傳失敗...(image-51eb0c-1613616264582)]

2.2 文件修改

2.2.1 修改數(shù)據(jù)集方面的yaml文件

作者是把以前用的.data、.names文件合并到了data/coco.yaml中,打開coco.yaml進(jìn)行修改

# COCO 2017 dataset http://cocodataset.org
# Download command: bash yolov5/data/get_coco2017.sh
# Train command: python train.py --data ./data/coco.yaml
# Dataset should be placed next to yolov5 folder:
#   /parent_folder
#     /coco
#     /yolov5

# 這些是生成的圖片的路徑文件,這里是我自己的路徑,需要修改成你自己的路徑,絕對路徑也ok
train: ../coco/2007_train.txt  # 118k images
val: ../coco/2007_val.txt  # 5k images
test: ../coco/2007_test.txt  # 20k images for submission to https://competitions.codalab.org/competitions/20794

# 你數(shù)據(jù)集的類別數(shù)
nc: 1

# 類別的名稱
names: ['cell phone']

# Print classes
# with open('data/coco.yaml') as f:
#   d = yaml.load(f, Loader=yaml.FullLoader)  # dict
#   for i, x in enumerate(d['names']):
#     print(i, x)

2.2.2 修改網(wǎng)絡(luò)參數(shù)方面的yaml文件

這個相當(dāng)于以前版本的.cfg文件,在models/yolov3-spp.yaml【當(dāng)然,你想用哪個模型就去修改對應(yīng)的yaml文件】

# parameters
nc: 1  # 數(shù)據(jù)集類別數(shù)
depth_multiple: 1.0  # expand model depth
width_multiple: 1.0  # expand layer channels

# anchors【你也可以使用k-means去產(chǎn)出你自己數(shù)據(jù)集的anchors】
anchors:
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

# darknet53 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Conv, [32, 3, 1]],  # 0
   [-1, 1, Conv, [64, 3, 2]],  # 1-P1/2
   [-1, 1, Bottleneck, [64]],
   [-1, 1, Conv, [128, 3, 2]],  # 3-P2/4
   [-1, 2, Bottleneck, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 5-P3/8
   [-1, 8, Bottleneck, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 7-P4/16
   [-1, 8, Bottleneck, [512]],
   [-1, 1, Conv, [1024, 3, 2]], # 9-P5/32
   [-1, 4, Bottleneck, [1024]],  # 10
  ]

# yolov3-spp head
# na = len(anchors[0])
head:
  [[-1, 1, Bottleneck, [1024, False]],  # 11
   [-1, 1, SPP, [512, [5, 9, 13]]],
   [-1, 1, Conv, [1024, 3, 1]],
   [-1, 1, Conv, [512, 1, 1]],
   [-1, 1, Conv, [1024, 3, 1]],
   [-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1]],  # 16 (P5/32-large)

   [-3, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 8], 1, Concat, [1]],  # cat backbone P4
   [-1, 1, Bottleneck, [512, False]],
   [-1, 1, Bottleneck, [512, False]],
   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, Conv, [512, 3, 1]],
   [-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1]],  # 24 (P4/16-medium)

   [-3, 1, Conv, [128, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P3
   [-1, 1, Bottleneck, [256, False]],
   [-1, 2, Bottleneck, [256, False]],
   [-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1]],  # 30 (P3/8-small)

   [[], 1, Detect, [nc, anchors]],   # Detect(P3, P4, P5)
  ]

2.2.3 修改train.py中的一些參數(shù)

train.py在根目錄里,修改一些主要的參數(shù),奧利給

parser.add_argument('--epochs', type=int, default=200)  # 訓(xùn)練的epoch
parser.add_argument('--batch-size', type=int, default=16)  # batch_size 顯卡垃圾的話,就調(diào)小點
parser.add_argument('--cfg', type=str, default='models/yolov5s.yaml', help='*.cfg path')
parser.add_argument('--data', type=str, default='data/coco.yaml', help='*.data path')
parser.add_argument('--img-size', nargs='+', type=int, default=[640, 640], help='train,test sizes')

2.3開始訓(xùn)練

直接 python train.py 就Ok了

成功訓(xùn)練如圖所示
[圖片上傳失敗...(image-b97001-1613616264581)]

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓無情哈拉少↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

在這里插入圖片描述
在這里插入圖片描述

2.4 ?

等它訓(xùn)練完就沒問題了,但是還是要時不時看一眼,具體看什么,我也不知道呀,反正是看就完事兒了????????????????????????????????

都訓(xùn)練完了,測試的話,就不用再說的吧,阿sir,

三、個人對于yolov5的看法

先說一個情況吧,我在復(fù)現(xiàn)yolov4時,使用1080p的攝像頭進(jìn)行測試的時候,檢測的幀率只有1.7fps(在我的rtx2070s顯卡上),不管我如何調(diào)整cfg文件里的寬高,基本都無濟(jì)于事,然后我用480p的攝像頭才可以達(dá)到20fps,不要搞我啊,阿sir,現(xiàn)在攝像頭基本都是在1080p檢測的啊,480p怎么能滿足?。。。?!我不知道為什么圖像在相同的cfg參數(shù)下,分辨率對檢測速度影響會這么大。但是,啊,但是,我在用yolov5的時候,用1080P就可以達(dá)到實時,最主要的是yolov5的模型非常小,比yolo的前幾個系列小了大概4倍,非常適合做嵌入。對于yolov5,雖然是作者自封的,但是非常達(dá)到我心里的預(yù)期?。?!,不吹不黑,yolov5是我遇到最牛啤的目標(biāo)檢測算法,你說呢,你是不是也這么感覺的呢


在這里插入圖片描述
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容