在YOLOV5優化算法當中,根據不同的數據信息,通常會事先設定固定Anchor,接下來本文關鍵為大家介紹了有關yolov5中anchors設定的資料,原文中根據案例編碼推薦的十分詳盡,必須的小伙伴可以借鑒一下
yolov5中增強了響應式導向框(AutoLearningBoundingBoxAnchors),但是其他yolo系類是不存在的。
一、默認設置導向框
Yolov5中默認設置保留了某些對于coco數據信息的預置導向框,在yolov5的環境變量*.yaml里已經預置了640×640圖像尺寸下導向框的規格(以yolov5s.yaml為例子):
#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
anchors主要參數一共有四行,每排9個標值;且每一行意味著運用不同類型的特征圖;
1、首行要在最大的一個特點圖中錨框
2、下一頁是在正中間的的特點圖中錨框
3、第三行要在最小特點圖中錨框;
在物體檢測任務時,一般希望能在大一點的特征圖上來檢驗個人目標,但大特征圖才帶有大量個人目標信息內容,因而大特點圖中anchor標值一般設為小標值,而大特點圖中標值設定為大標值檢驗大總體目標。
二、自定導向框
1、訓練的時候快速計算導向框
yolov5中并不只是應用默認設置導向框,在進行練習之前都會對模型集中標注信息內容進行核實,估算此數據信息標明信息內容對于默認設置導向框的最好均方誤差,當最好均方誤差大于等于0.98,一般不必須升級導向框;假如最好均方誤差低于0.98,就需要重算合乎此數據信息的導向框。
審查導向框適合不適合標準的函數公式在/utils/autoanchor.py報告中:
defcheck_anchors(dataset,model,thr=4.0,imgsz=640):
在其中thr就是指數據信息集中標注框高寬較大閥值,默認設置是采用超參文檔hyp.scratch.yaml里的“anchor_t”變量值。
審查關鍵編碼如下所示:
defmetric(k):#computemetric r=wh[:,None]/k[None] x=torch.min(r,1./r).min(2)[0]#ratiometric best=x.max(1)[0]#best_x aat=(x>1./thr).float().sum(1).mean()#anchorsabovethreshold bpr=(best>1./thr).float().mean()#bestpossiblerecall returnbpr,aat bpr,aat=metric(m.anchor_grid.clone().cpu().view(-1,2)) 在其中2個指標值必須說明一下(bpr和aat): bpr(bestpossiblerecall) aat(anchorsabovethreshold)
其中bpr主要參數就是說確定是否必須重算導向框的根據(是不是低于0.98)。
重算合乎此數據信息標明框的導向框,是運用kmean聚類方法達到的,編碼在/utils/autoanchor.py文件中:
def kmean_anchors(path='./data/coco128.yaml',n=9,img_size=640,thr=4.0,gen=1000,verbose=True): """Creates kmeans-evolved anchors from training dataset Arguments: path:path to dataset*.yaml,or a loaded dataset n:number of anchors img_size:image size used for training thr:anchor-label wh ratio threshold hyperparameter hyp['anchor_t']used for training,default=4.0 gen:generations to evolve anchors using genetic algorithm verbose:print all results Return: k:kmeans evolved anchors Usage: from utils.autoanchor import*;_=kmean_anchors() """ thr=1./thr prefix=colorstr('autoanchor:') def metric(k,wh):#compute metrics r=wh[:,None]/k[None] x=torch.min(r,1./r).min(2)[0]#ratio metric #x=wh_iou(wh,torch.tensor(k))#iou metric return x,x.max(1)[0]#x,best_x def anchor_fitness(k):#mutation fitness _,best=metric(torch.tensor(k,dtype=torch.float32),wh) return(best*(best>thr).float()).mean()#fitness def print_results(k): k=k[np.argsort(k.prod(1))]#sort small to large x,best=metric(k,wh0) bpr,aat=(best>thr).float().mean(),(x>thr).float().mean()*n#best possible recall,anch>thr print(f'{prefix}thr={thr:.2f}:{bpr:.4f}best possible recall,{aat:.2f}anchors past thr') print(f'{prefix}n={n},img_size={img_size},metric_all={x.mean():.3f}/{best.mean():.3f}-mean/best,' f'past_thr={x[x>thr].mean():.3f}-mean:',end='') for i,x in enumerate(k): print('%i,%i'%(round(x[0]),round(x[1])),end=','if i<len(k)-1 else'n')#use in*.cfg return k if isinstance(path,str):#*.yaml file with open(path)as f: data_dict=yaml.load(f,Loader=yaml.SafeLoader)#model dict from utils.datasets import LoadImagesAndLabels dataset=LoadImagesAndLabels(data_dict['train'],augment=True,rect=True) else: dataset=path#dataset #Get label wh shapes=img_size*dataset.shapes/dataset.shapes.max(1,keepdims=True) wh0=np.concatenate([l[:,3:5]*s for s,l in zip(shapes,dataset.labels)])#wh #Filter i=(wh0<3.0).any(1).sum() if i: print(f'{prefix}WARNING:Extremely small objects found.{i}of{len(wh0)}labels are<3 pixels in size.') wh=wh0[(wh0>=2.0).any(1)]#filter>2 pixels #wh=wh*(np.random.rand(wh.shape[0],1)*0.9+0.1)#multiply by random scale 0-1 #Kmeans calculation print(f'{prefix}Running kmeans for{n}anchors on{len(wh)}points...') s=wh.std(0)#sigmas for whitening k,dist=kmeans(wh/s,n,iter=30)#points,mean distance k*=s wh=torch.tensor(wh,dtype=torch.float32)#filtered wh0=torch.tensor(wh0,dtype=torch.float32)#unfiltered k=print_results(k) #Plot #k,d=[None]*20,[None]*20 #for i in tqdm(range(1,21)): #k[i-1],d[i-1]=kmeans(wh/s,i)#points,mean distance #fig,ax=plt.subplots(1,2,figsize=(14,7),tight_layout=True) #ax=ax.ravel() #ax[0].plot(np.arange(1,21),np.array(d)**2,marker='.') #fig,ax=plt.subplots(1,2,figsize=(14,7))#plot wh #ax[0].hist(wh[wh[:,0]<100,0],400) #ax[1].hist(wh[wh[:,1]<100,1],400) #fig.savefig('wh.png',dpi=200) #Evolve npr=np.random f,sh,mp,s=anchor_fitness(k),k.shape,0.9,0.1#fitness,generations,mutation prob,sigma pbar=tqdm(range(gen),desc=f'{prefix}Evolving anchors with Genetic Algorithm:')#progress bar for _ in pbar: v=np.ones(sh) while(v==1).all():#mutate until a change occurs(prevent duplicates) v=((npr.random(sh)<mp)*npr.random()*npr.randn(*sh)*s+1).clip(0.3,3.0) kg=(k.copy()*v).clip(min=2.0) fg=anchor_fitness(kg) if fg>f: f,k=fg,kg.copy() pbar.desc=f'{prefix}Evolving anchors with Genetic Algorithm:fitness={f:.4f}' if verbose: print_results(k) return print_results(k)
對kmean_anchors()函數中的主要參數做個簡單的解釋(編碼中有了英語注解):
path:包括數據信息目標文件夾等信息的yaml文檔(例如coco128.yaml),或是數據信息偏微分(yolov5快速計算導向框時就是通過的這種方法,先將數據信息標簽信息載入再加工)
n:導向框的總數,既有幾個;初始值是9
img_size:圖像尺寸。估算數據信息樣版標簽框的高寬時,也是需要縮放進img_size尺寸之后再計算出來的;初始值是640
thr:數據信息集中標注框高寬較大閥值,默認設置是采用超參文檔hyp.scratch.yaml里的“anchor_t”變量值;初始值是4.0;快速計算時,就會自動根據自己所采用的數據信息,進行計算適宜的閥值。
gen:kmean聚類算法迭代次數,初始值是1000
verbose:是不是打印全部數值,初始值是true
如果不想快速計算導向框,還可以在train.py中設定主要參數就可以:
parser.add_argument('--noautoanchor',action='store_true',help='disableautoanchorcheck')
2、練習前手動式估算導向框
如果采用yolov5運動效果并不好(清除其他問題,只關心“預置導向框”這些因素),yolov5在審查默認設置導向框是不是符合標準時,計算出來的最好均方誤差超過0.98,并沒有快速計算導向框;這時也可以自己手動式估算導向框。【就算自己的信息集中化總體目標高寬最高值低于4,默認設置導向框不一定是最理想的】
最先可以自己編寫一個程序,統計一下你所能鍛煉的數據信息全部標簽框高寬,看看高寬關鍵遍布在哪些范疇、較大高寬多少錢?例如:你應用的信息集中化總體目標高寬較大達到5:1(乃至10:1),那還是需要重算導向框了,對于coco數據信息的主要高寬是4:1。
隨后在yolov5系統中構建一個新的python文件test.py,手動式估算導向框:
import utils.autoanchor as autoAC #對數據集重新計算anchors new_anchors=autoAC.kmean_anchors('./data/mydata.yaml',9,640,5.0,1000,True) print(new_anchors) 輸入信息如下(只截取了部分): autoanchor:Evolving anchors with Genetic Algorithm:fitness=0.6604:87%|████████▋|866/1000[00:00<00:00,2124.00it/s]autoanchor:thr=0.25:0.9839 best possible recall,3.84 anchors past thr autoanchor:n=9,img_size=640,metric_all=0.267/0.662-mean/best,past_thr=0.476-mean:15,20,38,25,55,65,131,87,97,174,139,291,256,242,368,382,565,422 autoanchor:thr=0.25:0.9849 best possible recall,3.84 anchors past thr autoanchor:n=9,img_size=640,metric_all=0.267/0.663-mean/best,past_thr=0.476-mean:15,20,39,26,54,64,127,87,97,176,142,286,257,245,374,379,582,424 autoanchor:thr=0.25:0.9849 best possible recall,3.84 anchors past thr autoanchor:n=9,img_size=640,metric_all=0.267/0.663-mean/best,past_thr=0.476-mean:15,20,39,26,54,63,126,86,97,176,143,285,258,241,369,381,583,424 autoanchor:thr=0.25:0.9849 best possible recall,3.84 anchors past thr autoanchor:n=9,img_size=640,metric_all=0.267/0.663-mean/best,past_thr=0.476-mean:15,20,39,26,54,63,127,86,97,176,143,285,258,241,369,380,583,424 autoanchor:thr=0.25:0.9849 best possible recall,3.84 anchors past thr autoanchor:n=9,img_size=640,metric_all=0.267/0.663-mean/best,past_thr=0.476-mean:15,20,39,26,53,63,127,86,97,175,143,284,257,243,369,381,582,422 autoanchor:thr=0.25:0.9849 best possible recall,3.84 anchors past thr autoanchor:n=9,img_size=640,metric_all=0.267/0.663-mean/best,past_thr=0.476-mean:15,20,40,26,53,62,129,85,96,175,143,287,256,240,370,378,582,419 autoanchor:Evolving anchors with Genetic Algorithm:fitness=0.6605:100%|██████████|1000/1000[00:00<00:00,2170.29it/s] Scanning'..coco128labelstrain2017.cache'for images and labels...128 found,0 missing,2 empty,0 corrupted:100%|██████████|128/128[00:00<?,?it/s] autoanchor:thr=0.25:0.9849 best possible recall,3.84 anchors past thr autoanchor:n=9,img_size=640,metric_all=0.267/0.663-mean/best,past_thr=0.476-mean:15,20,40,26,53,62,129,85,96,175,143,287,256,240,370,378,582,419 [[14.931 20.439] [39.648 25.53] [53.371 62.35] [129.07 84.774] [95.719 175.08] [142.69 286.95] [256.46 239.83] [369.9 378.3] [581.87 418.56]] Process finished with exit code 0
輸出的9組新的錨定框即是根據自己的數據集來計算的,可以按照順序替換到你所使用的配置文件*.yaml中(比如yolov5s.yaml)。就可以重新訓練了。
參考的博文(表示感謝!):
https://github.com/ultralytics/yolov5
https://blog.csdn.net/flyfish1986/article/details/117594265
https://zhuanlan.zhihu.com/p/183838757
https://blog.csdn.net/aabbcccffffd01/article/details/109578614
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/130263.html
如今yolov5的neck用的都是PANet,在efficient文章中給出了BiFPN結構,也有更為很不錯的特性,接下來本文關鍵為大家介紹了對于如何將yolov5里的PANet層改成BiFPN的資料,需用的小伙伴可以借鑒一下 一、Add 1.在common.py后放入如下所示編碼 #融合BiFPN設定可學習培訓主要參數學習培訓不一樣支系的權重值 #2個支系add實際操作 cl...
如今yolov5的neck用的都是PANet,在efficient文章中給出了BiFPN結構,也有更為很不錯的特性,接下來本文關鍵為大家介紹了對于如何將yolov5里的PANet層改成BiFPN的資料,必須的小伙伴可以借鑒一下 一、Add 1.在common.py后放入如下所示編碼 #融合BiFPN設定可學習培訓主要參數學習培訓差異支系的權重值 #2個支系add實際操作 clas...
摘要:結論正確檢測小物體確實是一個挑戰。下載視覺實戰項目講在小白學視覺公眾號后臺回復視覺實戰項目,即可下載包括圖像分割口罩檢測車道線檢測車輛計數添加眼線車牌識別字符識別情緒檢測文本內容提取面部識別等個視覺實戰項目,助力快速學校計算機視覺。 點擊上方小白學視覺,選擇加星標或置頂 重磅干貨,第一時...
閱讀 910·2023-01-14 11:38
閱讀 877·2023-01-14 11:04
閱讀 740·2023-01-14 10:48
閱讀 1981·2023-01-14 10:34
閱讀 942·2023-01-14 10:24
閱讀 819·2023-01-14 10:18
閱讀 499·2023-01-14 10:09
閱讀 572·2023-01-14 10:02