Exemple #1
0
    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 ""