Advertisement
Guest User

Untitled

a guest
Apr 26th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.40 KB | None | 0 0
  1. import cv2
  2. import numpy as np
  3. import os
  4. import pickle
  5. import tensorflow as tf
  6. from sklearn.metrics import confusion_matrix
  7. import cv2
  8. import numpy as np
  9. import os
  10. import pickle
  11. import tensorflow as tf
  12. from sklearn.metrics import confusion_matrix
  13.  
  14. #Funkcja pobierz n elementow
  15. def prepare_y(result):
  16.     tmp = np.zeros(output_size)
  17.     tmp[result] = 1
  18.     return tmp.tolist()
  19.  
  20. def get_next_batch(batch_size, data_set):
  21.     elements = np.random.randint(0, len(data_set), batch_size)
  22.     x = np.array([tmp[0].tolist() for tmp in [data_set[i] for i in elements]])
  23.     y = np.array([prepare_y(tmp[1]) for tmp in [data_set[i] for i in elements]])
  24.    
  25.     return (x, y)
  26.  
  27. def get_all_set(data_set):
  28.     x = np.array([tmp[0].tolist() for tmp in data_set])
  29.     y = np.array([prepare_y(tmp[1]) for tmp in data_set])
  30.    
  31.     return (x, y)
  32. #Funkcja pobierz n elementow
  33. def prepare_y(result):
  34.     tmp = np.zeros(output_size)
  35.     tmp[result] = 1
  36.     return tmp.tolist()
  37. def get_next_batch(batch_size, data_set):
  38.     elements = np.random.randint(0, len(data_set), batch_size)
  39.     x = np.array([tmp[0].tolist() for tmp in [data_set[i] for i in elements]])
  40.     y = np.array([prepare_y(tmp[1]) for tmp in [data_set[i] for i in elements]])
  41.    
  42.     return (x, y)
  43. def get_all_set(data_set):
  44.     x = np.array([tmp[0].tolist() for tmp in data_set])
  45.     y = np.array([prepare_y(tmp[1]) for tmp in data_set])
  46.    
  47.     return (x, y)
  48.  
  49. folder_path = "F:\\EiTI Infa\\Semestr 6\\SNR\\SNR Projekt\\"
  50. path = folder_path + "SET_C\\"
  51. bounding_boxes = folder_path + "bounding_boxes.txt"
  52. class_min = 483
  53. class_max = 538
  54. size_x = 64
  55. size_y = 128
  56. boxes = {}
  57. hog = cv2.HOGDescriptor() # grupa IC
  58. data_set = []
  59.  
  60. for row in open(bounding_boxes).read().split('\n'):
  61.     if row == "":
  62.         break
  63.     tmp = row.split()
  64.     boxes[tmp[0]+".jpg"] = list(map(int, tmp[1:5]))
  65.  
  66. for folder in os.listdir(path):
  67.     print(folder)
  68.     for file in os.listdir(path+folder):
  69.         img = cv2.imread(path+folder+"\\"+file, cv2.IMREAD_COLOR)
  70.         bb = boxes[file]
  71.         crop_img = img[bb[1]:bb[1]+bb[3], bb[0]:bb[0]+bb[2]]
  72.         resized_image = cv2.resize(crop_img, (size_x, size_y))
  73.         hog_descriptor = hog.compute(resized_image)
  74.         data_set.append([hog_descriptor.reshape(hog_descriptor.size), int(folder) - class_min])
  75. data_set = np.array(data_set)
  76.  
  77. #Zapis danych!
  78. data_set_file = open('birds.data', 'wb')
  79. pickle.dump(data_set, data_set_file)
  80. data_set_file.close()
  81.  
  82. #Odczyt danych!
  83. data_set_file = open('birds.data', 'rb')
  84. data_set = pickle.load(data_set_file)
  85. data_set_file.close()
  86.  
  87. #Przygotowanie zbiorow testowego i treningowego
  88. test_set_ratio = 0.3
  89. test_set_elements = []
  90. for i in range(class_max - class_min + 1):
  91.     tmp = data_set[np.array(data_set)[:, 1] == i]
  92.     test_element_count = int(len(tmp) * test_set_ratio)
  93.     test_set_elements = test_set_elements + list(np.random.permutation([True] * test_element_count + [False] * (len(tmp) - test_element_count)))
  94. test_set_elements
  95. training_set_elements = np.logical_not(test_set_elements)
  96. test_set = data_set[test_set_elements]
  97. training_set = data_set[training_set_elements]
  98.  
  99. activation
  100. ### SIEC NEURONOWA ###
  101. layer_size_base = 32
  102. layers = np.array([2, 4, 5, 8, 10])
  103. #layers = np.array([3, 6, 9, 12])
  104. #layers = np.array([5, 10, 15])
  105. #layers = np.array([10, 20])
  106. #layers = np.array([30])
  107. layers = layers * layer_size_base
  108. input_size = len(data_set[0][0])
  109. output_size = class_max - class_min + 1
  110. activation = tf.nn.relu
  111. layers = np.insert(layers, 0, input_size)
  112. layers = np.append(layers, output_size)
  113.  
  114. ## MODEL SIECI!
  115. tf.reset_default_graph()
  116. x  = tf.placeholder(tf.float32, [None, input_size], name = 'x')
  117. y_ = tf.placeholder(tf.float32, [None, output_size], name = 'y_')
  118. eps = tf.placeholder(tf.float32, name = 'eps')
  119. layers_count = len(layers)
  120. for i in range(layers_count - 1):
  121.     W = tf.Variable(tf.truncated_normal([layers[i], layers[i+1]], 0, 1/np.sqrt(layers[i])))
  122.     b = tf.Variable(np.zeros(layers[i + 1]), dtype = tf.float32)
  123.     if i == 0:
  124.         y = activation(tf.matmul(x, W) + b)
  125.     else:
  126.         y = activation(tf.matmul(y, W) + b)
  127. y = tf.nn.softmax(y)
  128. cross_entropy = -tf.reduce_sum(y_*tf.log(y))
  129. opimalizer = tf.train.GradientDescentOptimizer(eps)
  130. train_step = opimalizer.minimize(cross_entropy)
  131.  
  132. #Inicjalizacja grafu
  133. sess = tf.InteractiveSession()
  134. sess.run(tf.global_variables_initializer())
  135.  
  136. #Uczenie sieci
  137. batch_size = 200
  138. test_batch_size = 200
  139. iteration_count = 10_000
  140. eps_param = 0.0009
  141. print_info_rate = 10000
  142. print("Iteracja\tBłąd\t\tSkuteczność[zbior treningowy]\tSkuteczność[zbior testowy]")
  143. test_xs, test_ys = get_all_set(test_set)
  144. for i in range(0, iteration_count + 1, batch_size):
  145.     batch_xs, batch_ys = get_next_batch(batch_size, training_set)
  146.     sess.run(train_step, feed_dict = {x: batch_xs, y_: batch_ys, eps: eps_param})
  147.    
  148.     if i % print_info_rate == 0:
  149.         training_error = cross_entropy.eval(feed_dict={x: batch_xs, y_: batch_ys})
  150.        
  151.         result = y.eval(feed_dict={x:test_xs})
  152.        
  153.         trening_xs, trening_ys = get_next_batch(1000, training_set)
  154.         traning_result = y.eval(feed_dict={x:trening_xs})
  155.        
  156.         print(str(i) + "\t\t" +
  157.               str(training_error) + "\t\t" +
  158.               "{:0,.2f}".format(100*np.mean(np.argmax(traning_result, axis = 1) == np.argmax(trening_ys, axis = 1)))+"%\t\t\t\t"+
  159.               "{:0,.2f}".format(100*np.mean(np.argmax(result, axis = 1) == np.argmax(test_ys, axis = 1)))+"%")
  160.  
  161. #Macierz pomyłek
  162. predictions = np.argmax(y.eval(feed_dict={x:test_xs}), axis = 1)
  163. true_labels = np.argmax(test_ys, axis = 1)
  164. conf_matrix = confusion_matrix(true_labels, predictions)
  165. #parami trzeba łączyć True Positive, False Positive, ....
  166. #Keras to liczy,
  167.  
  168. sess
  169. pred = sess.predict(x_test)
  170. pred = pred[:,1] # Only positive cases
  171. plot_roc(pred,y_compare)
  172.  
  173.  
  174. https://docs.google.com/document/d/1fLzQAGQgCDiCle04cCRCOCefYD1_2co6nqC2ica1jv4/edit
  175.  
  176.  
  177.  
  178. Ta część zadania bazuje na sieciach splotowych. W pierwszej kolejności uczą Państwo
  179.  
  180. (a konkretnie douczają) sieć na gotowej, popularnej i skutecznej strukturze, np. VGG-
  181. 16, VGG-19, AlexNet, ResNet-50, ResNet-101, GoogleNet, Inception-v3, SqueezeNet itp.
  182.  
  183. Wynik klasyfikacji na znanym modelu, będzie stanowił dla Państwa podstawę do porówania
  184. skuteczności Państwa sieci. W następnym kroku tworzą Państwo swoją strukturę sieci
  185. (może być wzorowana na popularnych sieciach, ale może to być kilka warstw splotowych,
  186. muszą Państwo pamiętać ze im większa sieć, tym więcej parametrów do nauki i czas
  187. treningu może być bardzo długi). Najlepiej, aby eksperymenty zacząć od:
  188. - podziału danych na zbiory treningowy i testowy (np. w stosunku 5:1, wystarczy raz
  189. podzielić dane i się tego trzymać)
  190. - trenowania sieci
  191. - wrzucania zdjęć bez modyfikacji danych
  192. - sztucznego zwielokrotniania zdjęć treningowych (testowych nie ruszamy!), np.
  193. każde zdjęcie poddajemy dodatkowo: a) rotacji, b) translacji, c) rotacji i translacji.
  194. Modyfikacji dokonujemy np. losując dziesięć lub dwadzieścia razy kąt z pewnego
  195. niewielkiego przedziału, np. ±5° lub/i wektory przesunięcia [x,y]. Do modyfikacji,
  196. która najbardziej poprawi skuteczność klasyfikacji dodajemy losowo szum (np.
  197. gaussowski). W ten sposób uzbierały się nam już cztery eksperymenty z sieciami. Z
  198. tych czterech wybieramy jeden najlepszy i...
  199. - sprawdzamy różne rozmiary deskryptora na warstwie przed klasyfikacją (trzy
  200. dowolne rozmiary) – eksperyment piąty
  201. - na najlepszej strukturze sprawdzamy, co się stanie, jak dodamy dropout –
  202. eksperyment szósty
  203. - na koniec badamy wpływ przesłonięcia obrazu:
  204. - grupy A i B zakrywają fragmenty obrazów tylko ze zbioru treningowego
  205. (zobaczymy, jak sobie radzi sieć, jeśli ma styczność z zasłoniętym częściowo
  206. obrazkiem)
  207. - grupy C i D zakrywają fragmenty obrazów treningowych (pewnej części obrazów,
  208. nie wszystkich), będziemy chcieli sprawdzić jak sieć sobie poradzi, gdy do
  209. treningu wejdą dane zakłócone (ktoś np. wsadzi palec, lub inaczej przesłoni
  210. zdjęcie)
  211. Eksperyment z wczesnym zatrzymaniem uczenia niech Państwo wprowadzą na dowolnym
  212. etapie, na początku, w środku, na końcu,
  213. (Uwaga, liczą się wyniki na zbiorze testowym, w treningu powinno się udać zejść do
  214. 100% skuteczności.)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement