# 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)))
Exemple #2
0
			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
Exemple #3
0
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):
Exemple #4
0
        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)
Exemple #5
0
 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)
Exemple #6
0
 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
Exemple #10
0
                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)