# load all the txt file except the classed.txt, test.txt, train.txt label_file = glob('%s/[!classes, test, train]*.txt' % labels_txt) print('label count: {}'.format(len(label_file))) dataset = [] for label in label_file: with open(os.path.join(labels_txt, label), 'r') as f: txt_content = f.readlines() for line in txt_content: line_split = line.split(' ') roi_width = float(line_split[-2]) roi_height = float(line_split[-1]) if roi_width == 0 or roi_height == 0: continue dataset.append([roi_width, roi_height]) # print([roi_with, roi_height]) return np.array(dataset) data = load_dataset(ROOT_PATH) out = kmeans(data, k=CLUSTERS) print(out) print("Accuracy: {:.2f}%".format(avg_iou(data, out) * 100)) print("Boxes:\n {}-{}".format(out[:, 0] * SIZE, out[:, 1] * SIZE)) ratios = np.around(out[:, 0] / out[:, 1], decimals=2).tolist() print("Ratios:\n {}".format(sorted(ratios)))
ymin = int(obj.findtext("bndbox/ymin")) / height xmax = int(obj.findtext("bndbox/xmax")) / width ymax = int(obj.findtext("bndbox/ymax")) / height dataset.append([xmax - xmin, ymax - ymin]) return np.array(dataset) if __name__ == '__main__': num = input('epoch:') data = load_dataset(ANNOTATIONS_PATH) # 论文中的大小 ACC:63.89% yolov3_anchors = [[10,13],[16,30],[33,23],[30,61],[62,45],[59,119],[116,90],[156,198],[373,326]] yolov3_anchors = np.array(yolov3_anchors) print('YOLOV3 ACC:%.2f%%'%(avg_iou(data, yolov3_anchors/416)*100)) a = int(data.size/2) print('dataset anchor num: %d'%a) # 用于计算anchor平均大小 anchor_sum = np.ones((CLUSTERS, 2))*0 # 用于计算平均acc acc_sum = np.ones((a,2))*0 # 迭代多次 for i in range(1,int(num)+1): out,t = kmeans(data, k=CLUSTERS) acc = avg_iou(data, out) out = sorted(out, key=(lambda x: x[0])) anchor_sum += out acc_sum += acc
for s in [300, 512]: print("Size: {}".format(str(s))) if s == 512: cfg = change_cfg_for_ssd512(cfg) CLUSTERS = 36 anchor_num_dic = dict(zip(range(7), [4, 6, 6, 6, 6, 4, 4])) out = kmeans(data, k=CLUSTERS) areas = np.around(out[:, 0] * out[:, 1], decimals=6).tolist() area_order = np.argsort(areas) anchors = out[area_order] print(anchors.shape) print("Average IoU before clip: {:.2f}%".format( avg_iou(val_data, anchors) * 100)) if cfg['clip']: anchors = np.clip(anchors, 0, 1) print("Average IoU after clip: {:.2f}%".format( avg_iou(val_data, anchors) * 100)) anchors_loc = [] for k, f in enumerate(cfg['feature_maps']): for i, j in product(range(f), repeat=2): f_k = cfg['min_dim'] / cfg['steps'][k] # unit center x,y cx = (j + 0.5) / f_k cy = (i + 0.5) / f_k sumcum = 0 for m in range(k):
lab = 'claster' + str(i + 1) plt.scatter(data[index == i, 0], data[index == i, 1], s=10, c=color[i], marker=mark[i], label=lab) plt.legend() plt.grid() plt.show() if __name__ == '__main__': ANNOTATIONS_PATH = '/home/yangna/yangna/code/object_detection/darknet_origin/scripts/VOCdevkit/VOC2013/Annotations' CLUSTERS = 9 IMG_SIZE = 608 iteration = 10 #iterate multiple times,take take the best 'avg_iou' result print('loading data...') data = load_dataset(ANNOTATIONS_PATH) print('calculating anchor clusters...') for index in range(iteration): out, iter_times = kmeans(data, k=CLUSTERS) print('\n\niter %d' % (index + 1)) print('kmeans iterate %d times' % iter_times) print('Accuracy avg_iou: {:.2f}%'.format(avg_iou(data, out) * 100)) #print('Boxes w, h:\n {}-{}'.format(out[:, 0]*IMG_SIZE, out[:, 1]*IMG_SIZE)) print('Boxes w, h:\n {}'.format(out * IMG_SIZE)) ratios = np.around(out[:, 0] / out[:, 1], decimals=2).tolist() print('Ratios w/h:\n {}'.format(sorted(ratios))) #plot_data(out, data, CLUSTERS)
def test_avg_iou_simple(self): self.assertEqual(avg_iou(np.array([[200, 200]]), np.array([[200, 200]])), 1.) self.assertEqual(avg_iou(np.array([[200, 200]]), np.array([[100, 200]])), .5) self.assertEqual(avg_iou(np.array([[200, 200]]), np.array([[200, 100]])), .5)
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 x = avg_iou(wh, k) return x # x, best_x
ANNOTATIONS_PATH = "/home/cy/集群数据/data/labels/train_data/" SIZE = 608 CLUSTERS = 9 def load_dataset(path): dataset = [] txt_file = os.listdir(path) for txt in txt_file: with open(path + txt, 'r') as f: for annotation in f.readlines(): annotation = annotation.split('\t') dataset.append( [float(annotation[3]) * SIZE, float(annotation[4]) * SIZE]) return np.array(dataset) data = load_dataset(ANNOTATIONS_PATH) out = kmeans(data, k=CLUSTERS) # print(out) original_anchor = [[10, 13], [16, 30], [33, 23], [30, 61], [62, 45], [59, 119], [116, 90], [156, 198], [373, 326]] original_anchor = np.array(original_anchor) print("original accuracy: {:.2f}%".format( avg_iou(data, original_anchor) * 100)) print("Accuracy: {:.2f}%".format(avg_iou(data, out) * 100)) print("Boxes:\n {}".format(out)) ratios = np.around(out[:, 0] / out[:, 1], decimals=2).tolist() print("Ratios:\n {}".format(sorted(ratios)))
for i in range(10): ##### 可以修改,不要太大,否则时间很长 anchors_tmp = [] clusters = kmeans(train_boxes, k=CLUSTERS) idx = clusters[:, 0].argsort() clusters = clusters[idx] # print(clusters) for j in range(CLUSTERS): anchor = [ round(clusters[j][0] * 640, 2), round(clusters[j][1] * 640, 2) ] anchors_tmp.append(anchor) print(f"Anchors:{anchor}") temp_accuracy = avg_iou(train_boxes, clusters) * 100 print("Train_Accuracy:{:.2f}%".format(temp_accuracy)) ratios = np.around(clusters[:, 0] / clusters[:, 1], decimals=2).tolist() ratios.sort() print("Ratios:{}".format(ratios)) print(20 * "*" + " {} ".format(count) + 20 * "*") count += 1 if temp_accuracy > best_accuracy: best_accuracy = temp_accuracy best_anchors = anchors_tmp best_ratios = ratios
anchors.append([s_k, s_k]) # aspect_ratio: 1 # rel size: sqrt(s_k * s_(k+1)) s_k_prime = sqrt(s_k * (cfg['max_sizes'][k] / cfg['min_dim'])) anchors.append([s_k_prime, s_k_prime]) # rest of aspect ratios for ar in cfg['aspect_ratios'][k]: anchors.append([s_k * sqrt(ar), s_k / sqrt(ar)]) anchors.append([s_k / sqrt(ar), s_k * sqrt(ar)]) anchors = np.array(anchors) print(anchors.shape) print("Average IoU before clip: {:.2f}%".format( avg_iou(data, anchors) * 100)) if cfg['clip']: anchors = np.clip(anchors, 0, 1) print("Average IoU after clip: {:.2f}%".format( avg_iou(data, anchors) * 100)) anchors_loc = [] for k, f in enumerate(cfg['feature_maps']): for i, j in product(range(f), repeat=2): f_k = cfg['min_dim'] / cfg['steps'][k] # unit center x,y cx = (j + 0.5) / f_k cy = (i + 0.5) / f_k # aspect_ratio: 1 # rel size: min_size
ymax = int(obj.findtext("bndbox/ymax")) if (xmax - xmin) == 0 or (ymax - ymin) == 0: continue # to avoid divded by zero error. dataset.append([xmax - xmin, ymax - ymin]) return np.array(dataset) print("Start to load data annotations on: %s" % ANNOTATIONS_PATH) data = load_dataset(ANNOTATIONS_PATH, normalized=BBOX_NORMALIZE) print('{}'.format(type(data))) #<class 'numpy.ndarray'>,(144027, 2) print("Start to do kmeans, please wait for a moment.") out = kmeans(data, k=CLUSTERS) #out为由kmeans找到的聚类中心点 out_sorted = sort_cluster(out) print('out_sorted', out_sorted) print("Accuracy: {:.2f}%".format( avg_iou(data, out) * 100)) #每个框与聚类中心点的最大IOU的平均值,可以用来表示所有框与聚类中心点的平均相似度 show_cluster(data, out, max_points=2000) if out.dtype != np.float32: out = out.astype(np.float32) print("Recommanded aspect ratios(width/height)") print("Width Height Height/Width") for i in range(len(out_sorted)): print("%.3f %.3f %.1f" % (out_sorted[i, 0], out_sorted[i, 1], out_sorted[i, 2])) show_width_height(data, out, bins=50)