def _startCaffeLearning(self, neural_network_id, picture_set, start_iteration = 0): """ Pomocná metoda, která zastřešuje započatí učení nad Frameworkem Caffe. V této metodě se volají veškeré pomocné skripty, které jsou potřeba, aby mohlo započít učení. Metoda očekává tři parametry kterými jsou identifikátor neuronové sítě, identifikátor databáze fotografií a volitelný parametr, který udává číslo iterace od kterého se má učení spustit. Tento parametr se využívá, pokud již klasifikátor naučený byl a chceme v učení pokračovat. Pokud se tento parametr nevyplní, tak se jako výchozí hodnota nastaví hodnota 0, tudíž bude klasifikátor učen od začátku. """ learn_script = self.config.caffe.learn_script create_imagenet_script = self.config.caffe.create_imagenet_script create_mean_file_script = self.config.caffe.create_mean_file_script # Cteni konfigurace solveru z databaze solver_config_path = self._getPath(neural_network_id, 'solver') solver_config = util.readProtoSolverFile(solver_config_path) # Parsovani cest ze souboru imagenet_train_val.prototxt layer_config = util.readProtoLayerFile(solver_config.net) layer_paths = util.parseLayerPaths(layer_config) # Ziskat picture set a vygenerovat soubory s cestami k obrazkum (validacni a ucici) picture_files = self._createFilesWithImages(neural_network_id, picture_set) # Otevreni souboru pro zapis learn_log_path = self._getPath(neural_network_id, 'new_log') dir = os.path.dirname(learn_log_path) if not os.path.exists(dir): os.makedirs(dir) #endif dbg.log('Learning log: ' + learn_log_path, INFO=3) learn_log = open(learn_log_path, 'w') if not learn_log: raise self.ProcessException("Nemuzu vytvorit soubor s logem uceni (" + learn_log_path + ")!") #endif # Vymazat stare uloznene obrazky pokud existuji if os.path.exists(layer_paths[util.TRAIN][util.SOURCE]): shutil.rmtree(layer_paths[util.TRAIN][util.SOURCE]) endif if os.path.exists(layer_paths[util.VALIDATE][util.SOURCE]): shutil.rmtree(layer_paths[util.VALIDATE][util.SOURCE]) endif # Vytvoreni argumentu pro spusteni skriptu pro vytvoreni databaze obrazku. Prvni parametr je cesta ke skriptu create_args = [] create_args.append(create_imagenet_script) create_args.append(picture_files[util.TRAIN]) create_args.append(picture_files[util.VALIDATE]) create_args.append(layer_paths[util.TRAIN][util.SOURCE]) create_args.append(layer_paths[util.VALIDATE][util.SOURCE]) dbg.log("create_args " + str(create_args), INFO=3) # Vytvorit imagenet pomoci souboru s obrazky a zadanych cest kde se maji vytvorit subprocess.call(create_args) # Vytvoreni argumentu pro spusteni skriptu pro vytvoreni mean souboru obrazku pro trenovaci obrazky create_mean_file_args = [] create_mean_file_args.append(create_mean_file_script) create_mean_file_args.append(layer_paths[util.TRAIN][util.SOURCE]) create_mean_file_args.append(layer_paths[util.TRAIN][util.MEAN_FILE]) dbg.log("create_mean_file_args " + str(create_mean_file_args), INFO=3) # Vytvorit mean file pro trenovaci obrazky subprocess.call(create_mean_file_args) # Vygenerovani cesty pro mean file soubor pro klasifikaci mean_file_path = self._getPath(neural_network_id, 'mean_file') dir = os.path.dirname(mean_file_path) if not os.path.exists(dir): os.makedirs(dir) #endif # Vytvoreni binarniho souboru, ktery dokaze nacist numpy. # Tento soubor je potreba pro klasifikaci obrazku, vyse vytvoreny mean file se pouziva pro trenovani site. self._createClassifyMeanFile(layer_paths[util.TRAIN][util.MEAN_FILE], mean_file_path) # Vytvoreni argumentu pro spusteni skriptu pro vytvoreni mean souboru obrazku pro validacni obrazky create_mean_file_args = [] create_mean_file_args.append(create_mean_file_script) create_mean_file_args.append(layer_paths[util.VALIDATE][util.SOURCE]) create_mean_file_args.append(layer_paths[util.VALIDATE][util.MEAN_FILE]) # Vytvorit mean file pro validacni obrazky subprocess.call(create_mean_file_args) # Vytvoreni solver souboru pro uceni self._generateSolverFile(solver_config_path, network['id']) # Vytvoreni argumentu pro spusteni skriptu pro uceni neuronove site. Prvni parametr je cesta ke skriptu learn_args = [] learn_args.append(learn_script) learn_args.append('train') learn_args.append('-solver=' + solver_config_path) if start_iteration: if not solver_config.snapshot_prefix: raise self.ProcessException("Nepodarilo se precist prefix nazvu souboru s ulozenym ucenim (" + solver_config.snapshot_prefix + ")!") #endif dbg.log("Prefix souboru s ulozenym ucenim: " + solver_config.snapshot_prefix, INFO=3) result = self.config.backend.proxy.neural_network.getSnapshotStatePath(neural_network_id, start_iteration) saved_file_path = result['data'] learn_args.append('-snapshot=' + saved_file_path) #endif dbg.log(str(learn_args), INFO=3) p = subprocess.Popen(learn_args, stderr=learn_log, stdout=learn_log) if p: return p.pid #endif return False
def process(self): learn_time_script = self.config.caffe.learning_time_script learn_script = self.config.caffe.learn_script print self.config.caffe.solver_config_dir for dirname, dirnames, filenames in os.walk(self.config.caffe.solver_config_dir): for filename in filenames: filepath = os.path.join(dirname, filename) log_output = os.path.join(self.config.caffe.log_path, os.path.splitext(filename)[0] + self.LOG_FILE_EXT) print "----- " + filepath + " -----" # Cteni solver souboru a nacteni cesty k modelu solver_config = util.readProtoSolverFile(filepath) model_file = solver_config.net print "model: " + model_file print "log: " + log_output log_file = open(log_output, "w") if not log_file: raise self.ProcessException("Nemuzu vytvorit logovaci soubor (" + log_file + ")") # endif print "Test #1: Learning (iterations: " + str(solver_config.max_iter) + ")" start = time.time() # Vytvoreni argumentu pro spusteni uceni a nasledneho mereni doby trvani learn_args = [] learn_args.append(self.config.caffe.time_command) learn_args.append(self.config.caffe.time_command_param) learn_args.append(learn_script) learn_args.append("train") learn_args.append("-solver=" + filepath) p = subprocess.Popen(learn_args, stderr=log_file, stdout=log_file) p.communicate() end = time.time() print " - Time: " + str((end - start)) + " s" test_iterations = self.config.caffe.test_iterations print "Test #2: Caffe time learning (iterations: " + str(test_iterations) + ")" start = time.time() # Vytvoreni argumentu pro spusteni skriptu pro mereni rychlosti uceni test_lear_args = [] learn_args.append(self.config.caffe.time_command) learn_args.append(self.config.caffe.time_command_param) test_lear_args.append(learn_time_script) test_lear_args.append(model_file) test_lear_args.append(test_iterations) if self.config.caffe.graphic_device_id != None: test_lear_args.append(self.config.caffe.graphic_device_id) # endif # Spusteni casove mereneho uceni p = subprocess.Popen(test_lear_args, stderr=log_file, stdout=log_file) p.communicate() end = time.time() print " - Time: " + str((end - start)) + " s" log_file.close() print ""