├── README.md ├── apriori.py ├── imgs ├── kaka.jpg ├── myna.jpg ├── result1.png └── result2.png ├── misc.py ├── model.py └── run.py /README.md: -------------------------------------------------------------------------------- 1 | # Mining-Objects 2 | Mining Objects: Fully Unsupervised Object Discovery and Localization From a Single Image 3 | https://arxiv.org/pdf/1902.09968.pdf 4 | unsupervised object discovery and localization in a 5 | strictly general setting where only a single image is given 6 | 7 | Not fully implemented :/ But working :) 8 | 9 | # Usage 10 | ``` 11 | python run.py path_to_img 12 | ``` 13 | 14 | # Results 15 | 16 |

17 | 18 | 19 |

20 | 21 | # Version 22 | TF 2.0 23 | -------------------------------------------------------------------------------- /apriori.py: -------------------------------------------------------------------------------- 1 | from itertools import chain, combinations 2 | 3 | # pixel = { 4 | # 1:[[1,3],[1,4],[2,2],[2,3],[2,4],[3,2],[3,3]], 5 | # 2:[[1,3],[1,4],[2,2],[2,3],[2,4],[3,2],[3,3],[3,4],[4,4]], 6 | # 3:[[1,3],[1,4],[1,5],[2,3],[2,4],[3,4]], 7 | # 4:[[1,3],[1,4],[2,3],[2,4],[3,3],[3,4],[5,3],[5,1]], 8 | # 5:[[1,3],[1,4],[1,5],[2,3],[2,4],[2,5],[3,2]], 9 | # } 10 | # # pixel = { 11 | # # 1:[[1,3],[1,4],[2, 2],[3, 4]], 12 | # # 2:[[1,3],[1,4],[2,2],[2,3]], 13 | # # 3:[[1,3],[2, 2],[2,4],[2,3],[3,4]] 14 | # # } 15 | 16 | def subset(itemset, num): 17 | return [i for i in combinations(itemset, num)] 18 | 19 | def count_subset(itemset): 20 | lk = {} 21 | for item in itemset: 22 | for j in pixel: 23 | it = [str(i) for i in pixel[j]] 24 | k = 0 25 | s = item 26 | for i in item: 27 | if i in it: 28 | k += 1 29 | if k == len(item): 30 | if len(item) > 2: 31 | item = str(s) 32 | if item in lk: 33 | lk[item] += 1 34 | else: 35 | lk[item] = 1 36 | item = s 37 | else: 38 | if item in lk: 39 | lk[item] += 1 40 | else: 41 | lk[item] = 1 42 | return lk 43 | 44 | 45 | def ifinitem(test, item): 46 | k = 0 47 | l = len(item) 48 | for t in test: 49 | for i in range(l): 50 | if item[i] in t: 51 | k += 1 52 | if k == l: 53 | # print ("%s is repeating"%(item)) 54 | return False 55 | 56 | return True 57 | 58 | def ifinset(item, sub, l, test): 59 | k = 0 60 | for i in range(l): 61 | if sub[i] not in item: 62 | item.append(sub[i]) 63 | return item 64 | else: 65 | k += 1 66 | if k == l: 67 | 68 | return [] 69 | elif k == 0: 70 | return item 71 | 72 | 73 | 74 | 75 | def subs(itemset, num): 76 | test = [] 77 | count = len(itemset) 78 | for item in itemset: 79 | l = len(item) 80 | for j in range(1, count): 81 | new = [i for i in item] 82 | new1 = [i for i in itemset[j]] 83 | m = ifinset(new, new1, l, test) 84 | if m not in test: 85 | # print (m) 86 | if ifinitem(test, m) is True: 87 | test.append(m) 88 | else: 89 | pass 90 | else: 91 | pass 92 | # print ("repeating %s"%(m)) 93 | 94 | return test 95 | 96 | def filter_support(ck, MinSupport, count): 97 | L = [] 98 | k = {} 99 | for i in ck: 100 | if (ck[i]/count)*100 >= MinSupport: 101 | L.append(i) 102 | k[i] = ck[i] 103 | return sorted(L), k 104 | 105 | 106 | def Apriori_prune(Ck,MinSupport): 107 | L = [] 108 | for i in Ck: 109 | if Ck[i] >= MinSupport: 110 | L.append(i) 111 | return sorted(L) 112 | 113 | # file = open('example.txt', 'r') 114 | # for line in file: 115 | # for item in line.strip().split(' '): 116 | # if item in C1: 117 | # C1[item] += 1 118 | # else: 119 | # C1[item] = 1 120 | # file.close() 121 | 122 | def num(l): 123 | C1={} 124 | import pdb; pdb.set_trace() 125 | for i in l: 126 | for line in pixel: 127 | it = [str(i) for i in pixel] 128 | if i in it: 129 | if i in C1: 130 | C1[i] += 1 131 | else: 132 | C1[i] = 1 133 | 134 | def run(pix, sup): 135 | global pixel 136 | pixel = pix 137 | C1={} 138 | for line in pixel: 139 | for i in pixel[line]: 140 | if str(i) in C1: 141 | C1[str(i)] += 1 142 | else: 143 | C1[str(i)] = 1 144 | # print (C1) 145 | lm = 3 146 | # l1 = Apriori_prune(C1, sup) 147 | l2,c = filter_support(C1, sup, len(pixel)) 148 | # c = num(l2) 149 | print (c) 150 | # L = subset(l1, 2) 151 | # d = count_subset(L) 152 | # lk = Apriori_prune(d, sup) 153 | # print (len(lk)) 154 | # # while (lk != []): 155 | # L = subs(lk, lm) 156 | # # lk_set = lk 157 | # # if lm > 3: 158 | # # break 159 | # # L = [x for x in L if x] 160 | # d = count_subset(L) 161 | # lk = Apriori_prune(d,sup) 162 | # lk = [eval(i) for i in lk] 163 | # print (len(lk)) 164 | # L = subs(lk, lm) 165 | # d = count_subset(L) 166 | # lk = Apriori_prune(d,sup) 167 | # lk = [eval(i) for i in lk] 168 | 169 | return l2 170 | if __name__ == "__main__": 171 | lk = main(pixel) 172 | print (lk) -------------------------------------------------------------------------------- /imgs/kaka.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anandhupvr/Mining-Objects/045eda9915bb80f238b8c5d0f08dd3883642814b/imgs/kaka.jpg -------------------------------------------------------------------------------- /imgs/myna.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anandhupvr/Mining-Objects/045eda9915bb80f238b8c5d0f08dd3883642814b/imgs/myna.jpg -------------------------------------------------------------------------------- /imgs/result1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anandhupvr/Mining-Objects/045eda9915bb80f238b8c5d0f08dd3883642814b/imgs/result1.png -------------------------------------------------------------------------------- /imgs/result2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anandhupvr/Mining-Objects/045eda9915bb80f238b8c5d0f08dd3883642814b/imgs/result2.png -------------------------------------------------------------------------------- /misc.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import matplotlib.pyplot as plt 3 | import matplotlib.patches as patches 4 | 5 | def find_item(feat): 6 | item = [] 7 | item_values = [] 8 | for i in range(14): 9 | for j in range(14): 10 | if feat[i, j] > 0: 11 | item.append([i, j]) 12 | item_values.append(feat[i, j]) 13 | 14 | return item, item_values 15 | 16 | 17 | def bbox_plot(img, box, map): 18 | plt.imshow(map) 19 | plt.show() 20 | 21 | fig, ax = plt.subplots(1) 22 | # import pdb; pdb.set_trace() 23 | ax.imshow(img) 24 | for i in range(len(box)): 25 | k = 0 26 | s = patches.Rectangle((box[i][k], box[i][k+1]), box[i][k+2], box[i][k+3], linewidth=1, edgecolor='r', facecolor="none") 27 | ax.add_patch(s) 28 | plt.show() -------------------------------------------------------------------------------- /model.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | from tensorflow.keras.applications.vgg16 import VGG16 3 | from tensorflow.keras.preprocessing import image 4 | from tensorflow.keras.applications.vgg16 import preprocess_input 5 | import numpy as np 6 | from tensorflow.keras.models import Model 7 | 8 | 9 | def vgg16(im_dir): 10 | 11 | base_model = VGG16(weights='imagenet') 12 | model = Model(inputs=base_model.input, outputs=(base_model.get_layer('block5_pool').output, base_model.get_layer('block5_conv3').output, base_model.layers[-1].output)) 13 | img = image.load_img(im_dir, target_size=(224, 224)) 14 | 15 | x = image.img_to_array(img) 16 | x = np.expand_dims(x, axis=0) 17 | x = preprocess_input(x) 18 | # all_wg = base_model.layers[-1].get_weights()[0] 19 | pool, relu, pred = model.predict(x) 20 | pool_resized = tf.image.resize(pool, (14, 14)) 21 | features = tf.concat([relu, pool_resized], axis=0) 22 | 23 | return features, pred -------------------------------------------------------------------------------- /run.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | import numpy as np 3 | from scipy import ndimage 4 | import apriori 5 | import cv2 6 | import sys 7 | from misc import find_item, bbox_plot 8 | from model import vgg16 9 | 10 | 11 | im_dir = sys.argv[1] 12 | features, pred_vec = vgg16(im_dir) 13 | td = {} 14 | d = {} 15 | test = {} 16 | lis = [] 17 | j = 0 18 | for feat in features: 19 | for i in range(512): 20 | td[j, i], d[j, i] = find_item(feat[:, :, i]) 21 | j += 1 22 | 23 | feature_map = tf.concat((features[0, :, :, :], features[1, :, :]), axis=2) 24 | 25 | li = [i for i in td.values() if i] 26 | pixel = {} 27 | 28 | 29 | 30 | for i in range(len(li)): 31 | pixel[i] = li[i] 32 | 33 | freq = apriori.run(pixel, 20) 34 | # print (freq) 35 | mk = [eval(i) for i in freq] 36 | support = np.zeros([14, 14]) 37 | for i in range(14): 38 | for j in range(14): 39 | if [i, j] in mk: 40 | support[i, j] = np.array(feature_map[i, j, :]).sum()/1024 41 | 42 | 43 | # last_conv_output = np.squeeze(feature_map) 44 | # import scipy 45 | # pred = np.argmax(pred_vec) 46 | # mat_for_mult = scipy.ndimage.zoom(last_conv_output, (16, 16, 1), order=1) 47 | 48 | 49 | 50 | img = np.zeros([14, 14]) 51 | for i in range(14): 52 | for j in range(14): 53 | if [i, j] in mk: 54 | img[i, j] = 1 55 | 56 | new_img = np.expand_dims(img, axis=2) 57 | new_img = tf.image.resize(new_img, (224, 224)) 58 | 59 | new = np.array(new_img[:, :, 0]).astype(int) 60 | 61 | 62 | labeled_image, num_features = ndimage.label(new) 63 | objs = ndimage.find_objects(labeled_image) 64 | box = np.zeros([len(objs), 4]) 65 | # print (objs) 66 | for i in range(len(objs)): 67 | x = objs[i][1].start 68 | y = objs[i][0].stop 69 | w = objs[i][1].stop - objs[i][1].start 70 | h = objs[i][0].start - objs[i][0].stop 71 | box[i][:] = x, y, w, h 72 | 73 | img = cv2.imread(im_dir, cv2.IMREAD_UNCHANGED) 74 | org_img = cv2.resize(img, (224, 224)) 75 | bbox_plot(org_img, box, support) --------------------------------------------------------------------------------