{"cells":[{"metadata":{},"cell_type":"markdown","source":"github:  \nhttps://github.com/PaulChongPeng/darknet/blob/master/tools/k_means_yolo.py  ","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"!ls /kaggle/input/ifashion-2020-boxes-w-h/boxes_w_h.pk","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# import pandas as pd\n# train_df = pd.read_csv('/kaggle/input/imaterialist-fashion-2020-fgvc7/train.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# train_df.head()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# coding=utf-8\n# k-means ++ for YOLOv2 anchors\nimport numpy as np\n\nclass Box():\n    def __init__(self, x, y, w, h):\n        self.x = x\n        self.y = y\n        self.w = w\n        self.h = h\n\ndef overlap(x1, len1, x2, len2):\n    len1_half = len1 / 2\n    len2_half = len2 / 2\n\n    left = max(x1 - len1_half, x2 - len2_half)\n    right = min(x1 + len1_half, x2 + len2_half)\n\n    return right - left\n\n\ndef box_intersection(a, b):\n    w = overlap(a.x, a.w, b.x, b.w)\n    h = overlap(a.y, a.h, b.y, b.h)\n    if w < 0 or h < 0:\n        return 0\n\n    area = w * h\n    return area\n\n\ndef box_union(a, b):\n    i = box_intersection(a, b)\n    u = a.w * a.h + b.w * b.h - i\n    return u\n\n\ndef box_iou(a, b):\n    return box_intersection(a, b) / box_union(a, b)\n\n\ndef init_centroids(boxes,n_anchors):\n    centroids = []\n    boxes_num = len(boxes)\n\n    centroid_index = int(np.random.choice(boxes_num, 1))\n    centroids.append(boxes[centroid_index])\n\n    print(centroids[0].w,centroids[0].h)\n\n    for centroid_index in range(0,n_anchors-1):\n\n        sum_distance = 0\n        distance_thresh = 0\n        distance_list = []\n        cur_sum = 0\n\n        for box in boxes:\n            min_distance = 1\n            for centroid_i, centroid in enumerate(centroids):\n                distance = (1 - box_iou(box, centroid))\n                if distance < min_distance:\n                    min_distance = distance\n            sum_distance += min_distance\n            distance_list.append(min_distance)\n\n        distance_thresh = sum_distance*np.random.random()\n\n        for i in range(0,boxes_num):\n            cur_sum += distance_list[i]\n            if cur_sum > distance_thresh:\n                centroids.append(boxes[i])\n                print(boxes[i].w, boxes[i].h)\n                break\n\n    return centroids\n\n\ndef do_kmeans(n_anchors, boxes, centroids):\n    loss = 0\n    groups = []\n    new_centroids = []\n    for i in range(n_anchors):\n        groups.append([])\n        new_centroids.append(Box(0, 0, 0, 0))\n\n    for box in boxes:\n        min_distance = 1\n        group_index = 0\n        for centroid_index, centroid in enumerate(centroids): \n            distance = (1 - box_iou(box, centroid))\n            if distance < min_distance:\n                min_distance = distance\n                group_index = centroid_index\n        groups[group_index].append(box)\n        loss += min_distance \n        new_centroids[group_index].w += box.w\n        new_centroids[group_index].h += box.h\n\n    for i in range(n_anchors): \n        new_centroids[i].w /= len(groups[i])\n        new_centroids[i].h /= len(groups[i])\n\n    return new_centroids, groups, loss\n\n\ndef compute_centroids(pickle_dir,n_anchors,loss_convergence,grid_size,iterations_num,plus):\n\n    boxes = []\n\n    \n    \n    import pickle\n    with open(pickle_dir,'rb') as pk:\n        boxes_list = pickle.load(pk)\n    for box_w_h in boxes_list:\n        w = box_w_h[0]\n        h = box_w_h[1]\n        boxes.append(Box(0, 0, w, h))\n       \n    if plus:\n        centroids = init_centroids(boxes, n_anchors)\n    else:\n        centroid_indices = np.random.choice(len(boxes), n_anchors)\n        centroids = []\n        for centroid_index in centroid_indices:\n            centroids.append(boxes[centroid_index])\n\n    # iterate k-means\n    centroids, groups, old_loss = do_kmeans(n_anchors, boxes, centroids)\n    iterations = 1\n    while (True):\n        centroids, groups, loss = do_kmeans(n_anchors, boxes, centroids)\n        iterations = iterations + 1\n        print(\"loss = %f\" % loss)\n        if abs(old_loss - loss) < loss_convergence or iterations > iterations_num:\n            print(\"iterations:\",iterations)\n            print(\"abs(old_loss - loss)\",abs(old_loss - loss))\n            return centroids\n        old_loss = loss\n\n        for centroid in centroids:\n            print(centroid.w * grid_size, centroid.h * grid_size)\n\n    # print result\n    for centroid in centroids:\n        print(\"k-means result：\\n\")\n        print(centroid.w * grid_size, centroid.h * grid_size)\n        \n    return centroids\n    \n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def compute_rate(centroids, comment):\n    rates = []\n    scales = []\n    for box in centroids:\n        rate = box.w/box.h \n        rates.append(rate)\n        rates.sort()\n        \n        scale = box.w*box.h\n        scales.append(scale)\n        scales.sort()\n        \n    print(comment)\n    print(\"rates: \", rates)\n    print('scales: ', scales)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"# label_path = \"/raid/pengchong_data/Data/Lists/paul_train.txt\"\nn_anchors = 5\nloss_convergence = 1e-6\ngrid_size = 1\niterations_num = 100\nplus = 0\nanchors5_1e6_100 = compute_centroids('/kaggle/input/ifashion-2020-boxes-w-h/boxes_w_h.pk',n_anchors,loss_convergence,grid_size,iterations_num,plus)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# label_path = \"/raid/pengchong_data/Data/Lists/paul_train.txt\"\nn_anchors = 3\nloss_convergence = 1e-6\ngrid_size = 1\niterations_num = 100\nplus = 1\nanchors3_1e6_100 = compute_centroids('/kaggle/input/ifashion-2020-boxes-w-h/boxes_w_h.pk',n_anchors,loss_convergence,grid_size,iterations_num,plus)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"compute_rate(anchors3_1e6_100,'anchors3_1e6_100')\ncompute_rate(anchors5_1e6_100,'anchors5_1e6_100')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}