├── 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)
--------------------------------------------------------------------------------