yolov3 anchors k-means指令碼
最近再回過頭了看了下經典的 yolov3 演算法, 裡面的 anchors 聚類是用的 k-means . 下面是 python的一個實現, 大家可以參考討論.
import os, sys
import numpy as np
import cv2
if len(sys.argv) < 5:
print('usage:\n\t%s datacfg num_of_clusters width height')
sys.exit(-1)
datacfg = sys.argv[1]
num_of_clusters = int(sys.argv[2])
width = int(sys.argv[3])
height = int(sys.argv[4])
train_file = None
with open(datacfg) as fr:
dc = fr.readlines()
for t in dc:
ts = t.split('=')
if ts[0].strip()== 'train' and len(ts) > 1:
train_file = ''.join(ts[1:]).strip()
break
if train_file is None:
print('can\'t find train in data file')
sys.exit(-1)
number_of_boxes = 0
r_wh_arr = []
with open(train_file) as fr:
dc = fr.readlines()
for i, t in enumerate(dc):
t = os.path.abspath(t.strip())
t1 = os.path.join(os.path.dirname(os.path.dirname(t)),'labels',\
os.path.basename(os.path.splitext(t)[0])+'.txt')
if not os.path.exists(t1):
print('can\'t find %s'%(t1))
continue
with open(t1) as lab_fr:
for lab_l in lab_fr.readlines():
lt = lab_l.split()
if len(lt) != 5:
print('wrong label:',t1)
continue
for ti in range(1,len(lt)):
lt[ti] = float(lt[ti])
lb_n,lb_x,lb_y,lb_w,lb_h= lt
if lb_x > 1 or lb_x <= 0 or \
lb_y > 1 or lb_y <= 0 or \
lb_w > 1 or lb_w <= 0 or \
lb_h > 1 or lb_h <= 0 :
print('wrong label:',t1)
continue
number_of_boxes += 1
r_wh_arr.append([lb_w*width,lb_h*height])
print("\r loaded \t image: %d \t box: %d"%(i+1, number_of_boxes),end='')
print("\n all loaded. ")
criteria = (cv2.TERM_CRITERIA_EPS +
cv2.TERM_CRITERIA_MAX_ITER, 10000, 0)# TERM_CRITERIA_MAX_ITER
flags = cv2.KMEANS_PP_CENTERS
data = np.float32(np.array(r_wh_arr))
compactness, labels, centers = cv2.kmeans(data, num_of_clusters, None, criteria, 10, flags)
print('anchors = ',end='')
for p in sorted(centers.tolist(),key=lambda x: x[0]*x[1]):
print('%.4f,%.4f, '%(p[0],p[1]),end='')
loaded image: 792 box: 939
all loaded.
anchors = 21.2969,11.8091, 17.5623,17.6491, 16.9178,24.6314, 22.1751,20.8706, 32.5937,16.0246, 21.6062,30.9830, 17.6986,39.9335, 74.9313,148.7542, 150.5354,153.2271
相關文章
- 不帶Anchors和NMS的目標檢測
- k-means聚類聚類
- YOLOv3 的 TensorFlow 實現,GitHub 完整原始碼解析YOLOGithub原始碼
- pytorch實現yolov3(1) yolov3基本原理PyTorchYOLO
- Yolov3程式碼分析與訓練自己資料集YOLO
- iOS逆向 Shell指令碼+指令碼重簽名iOS指令碼
- 常用指令碼學習手冊——Bat指令碼指令碼BAT
- 07 聚類演算法 - 程式碼案例三 - K-Means演算法和Mini Batch K-Means演算法效果評估聚類演算法BAT
- Bash指令碼指令碼
- powershell指令碼指令碼
- jpsall指令碼指令碼
- perl指令碼指令碼
- shell指令碼指令碼
- MySQL指令碼MySql指令碼
- java 指令碼Java指令碼
- JMeter指令碼JMeter指令碼
- 04聚類演算法-程式碼案例一-K-means聚類聚類演算法
- hadoop_批量命令指令碼&同步檔案指令碼Hadoop指令碼
- YOLOv3最全復現程式碼合集(含PyTorch/TensorFlow和Keras等)YOLOPyTorchKeras
- 初學指令碼指令碼
- python 常用指令碼Python指令碼
- Redis - Lua 指令碼Redis指令碼
- Linux指令碼分享Linux指令碼
- shell指令碼案例指令碼
- 19、python 指令碼Python指令碼
- SQLServer 常用指令碼SQLServer指令碼
- 備份指令碼指令碼
- 位元組碼指令
- 常用shell指令碼指令碼
- C# 指令碼C#指令碼
- MySQL 常用指令碼MySql指令碼
- Linux Shell指令碼Linux指令碼
- redolog生成指令碼指令碼
- k-means演算法筆記演算法筆記
- k-means 演算法介紹演算法
- 自動化指令碼安裝mysql shell指令碼範例指令碼MySql
- appium ios java 指令碼如何用指令執行,例如 adb 那種方式執行指令碼APPiOSJava指令碼
- Locust 程式碼指令碼實現指令碼