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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iou画 yolov3_专栏 | 【从零开始学习YOLOv3】4. YOLOv3中的参数进化

發(fā)布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iou画 yolov3_专栏 | 【从零开始学习YOLOv3】4. YOLOv3中的参数进化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原標(biāo)題:專欄 | 【從零開始學(xué)習(xí)YOLOv3】4. YOLOv3中的參數(shù)進(jìn)化

前言:YOLOv3代碼中也提供了參數(shù)進(jìn)化(搜索),可以為對應(yīng)的數(shù)據(jù)集進(jìn)化一套合適的超參數(shù)。本文建檔分析一下有關(guān)這部分的操作方法以及其參數(shù)的具體進(jìn)化方法。1. 超參數(shù)

YOLOv3中的 超參數(shù)在train.py中提供,其中包含了一些數(shù)據(jù)增強(qiáng)參數(shù)設(shè)置,具體內(nèi)容如下:

hyp = { 'giou': 3.54, # giou loss gain

'cls': 37.4, # cls loss gain

'cls_pw': 1.0, # cls BCELoss positive_weight

'obj': 49.5, # obj loss gain (*=img_size/320 if img_size != 320)

'obj_pw': 1.0, # obj BCELoss positive_weight

'iou_t': 0.225, # iou training threshold

'lr0': 0.00579, # initial learning rate (SGD=1E-3, Adam=9E-5)

'lrf': -4., # final LambdaLR learning rate = lr0 * (10 ** lrf)

'momentum': 0.937, # SGD momentum

'weight_decay': 0.000484, # optimizer weight decay

'fl_gamma': 0.5, # focal loss gamma

'hsv_h': 0.0138, # image HSV-Hue augmentation (fraction)

'hsv_s': 0.678, # image HSV-Saturation augmentation (fraction)

'hsv_v': 0.36, # image HSV-Value augmentation (fraction)

'degrees': 1.98, # image rotation (+/- deg)

'translate': 0.05, # image translation (+/- fraction)

'scale': 0.05, # image scale (+/- gain)

'shear': 0.641} # image shear (+/- deg)

2. 使用方法

在訓(xùn)練的時候,train.py提供了一個可選參數(shù) --evolve , 這個參數(shù)決定了是否進(jìn)行超參數(shù)搜索與進(jìn)化(默認(rèn)是不開啟超參數(shù)搜索的)。

具體使用方法也很簡單:

python train.py --data data/voc.data

--cfg cfg/yolov3-tiny.cfg

--img-size 416

--epochs 273

--evolve

實(shí)際使用的時候,需要進(jìn)行修改,train.py中的約444行:

for_ inrange( 1): # generations to evolve

將其中的1修改為你想設(shè)置的迭代數(shù),比如200代,如果不設(shè)置,結(jié)果將會如下圖所示,實(shí)際上就是只有一代。

3. 原理

整個過程比較簡單,對于進(jìn)化過程中的新一代,都選了了適應(yīng)性最高的前一代(在前幾代中)進(jìn)行突變。以上所有的參數(shù)將有約20%的 1-sigma的正態(tài)分布幾率同時突變。

s = 0.2# sigma

整個進(jìn)化過程需要搞清楚兩個點(diǎn):

如何評判其中一代的好壞?

下一代如何根據(jù)上一代進(jìn)行進(jìn)化?

**第一個問題:**判斷好壞的標(biāo)準(zhǔn)。

deffitness(x):

w = [ 0.0, 0.0, 0.8, 0.2]

# weights for [P, R, mAP, F1]@0.5

return(x[:, : 4] * w).sum( 1)

YOLOv3進(jìn)化部分是通過以上的適應(yīng)度函數(shù)判斷的,適應(yīng)度越高,代表這一代的性能越好。而在適應(yīng)度中,是通過Precision,Recall ,mAP,F1這四個指標(biāo)作為適應(yīng)度的評價標(biāo)準(zhǔn)。

其中的w是設(shè)置的加權(quán),如果更關(guān)心mAP的值,可以提高mAP的權(quán)重;如果更關(guān)心F1,則設(shè)置更高的權(quán)重在對應(yīng)的F1上。這里分配mAP權(quán)重為0.8、F1權(quán)重為0.2。

**第二個問題:**如何進(jìn)行進(jìn)化?

進(jìn)化過程中有 兩個重要的參數(shù):

第一個參數(shù)為 parent, 可選值為 single 或者 weighted ,這個參數(shù)的作用是:決定如何選擇上一代。如果選擇single,代表只選擇上一代中最好的那個。

ifparent == 'single'orlen(x) == 1:

x = x[fitness(x).argmax]

如果選擇weighted,代表選擇得分的前10個加權(quán)平均的結(jié)果作為下一代,具體操作如下:

elifparent == 'weighted': # weighted combination

n = min( 10, len(x)) # number to merge

x = x[np.argsort(-fitness(x))][:n] # top n mutations

w = fitness(x) - fitness(x).min # weights

x = (x * w.reshape(n, 1)).sum( 0) / w.sum # new parent

第二個參數(shù)為 method,可選值為 1,2,3 , 分別代表使用三種模式來進(jìn)化:

# Mutate

method = 2

s = 0.2# 20% sigma

np.random.seed(int(time.time))

g = np.array([ 1, 1, 1, 1, 1, 1, 1, 0, .1,

1, 0, 1, 1, 1, 1, 1, 1, 1]) # gains

# 這里的g類似加權(quán)

ng = len(g)

ifmethod == 1:

v = (np.random.randn(ng) *

np.random.random * g * s + 1) ** 2.0

elifmethod == 2:

v = (np.random.randn(ng) *

np.random.random(ng) * g * s + 1) ** 2.0

elifmethod == 3:

v = np.ones(ng)

whileall(v == 1):

# 為了防止重復(fù),直到有變化才停下來

r = (np.random.random(ng) < 0.1) * np.random.randn(ng)

# 10% 的突變幾率

v = (g * s * r + 1) ** 2.0

fori, k inenumerate(hyp.keys):

hyp[k] = x[i + 7] * v[i]

# 進(jìn)行突變

另外,為了防止突變過程,導(dǎo)致參數(shù)出現(xiàn)明顯不合理的范圍,需要用一個范圍進(jìn)行框定,將超出范圍的內(nèi)容剪切掉。具體方法如下:

# Clip to limits

keys = [ 'lr0', 'iou_t', 'momentum',

'weight_decay', 'hsv_s',

'hsv_v', 'translate',

'scale', 'fl_gamma']

limits = [( 1e-5, 1e-2), ( 0.00, 0.70),

( 0.60, 0.98), ( 0, 0.001),

( 0, .9), ( 0, .9), ( 0, .9),

( 0, .9), ( 0, 3)]

fork, v inzip(keys, limits):

hyp[k] = np.clip(hyp[k], v[ 0], v[ 1])

最終訓(xùn)練的超參數(shù)搜索的結(jié)果可視化:

參考資料:

官方issue: https://github.com/ultralytics/yolov3/issues/392

官方代碼:https://github.com/ultralytics/yolov3

責(zé)任編輯:

總結(jié)

以上是生活随笔為你收集整理的iou画 yolov3_专栏 | 【从零开始学习YOLOv3】4. YOLOv3中的参数进化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。