Esempio n. 1
0
    def __init__( self, parent = None ):
        super(Window, self).__init__( parent )
        self.setWindowTitle( 'Interactive Distortion Evolver' )

        ### Experiment Configuration
        # ATW: TODO: When we start getting reasonable distortions, there
        # needs to be a method to reload an old population. For now we'll
        # always make a new one.

        self.experiment_data_dir  = "../external/HyperNEAT/NE/HyperNEAT/out/data"
        self.date_specifier = datetime.now().strftime("%y%m%d_%H%M%S")
        self.image_storage = []

        # Initialize HyperNEAT.
        neat.initialize()

        # See if there is an output directory.
        if not os.path.exists(os.getcwd() + "/output"):
            os.mkdir(os.getcwd() + "/output")

        # Load the image experiment.
        self.experiment = neat.setupExperiment(
            "%s/ImageExperiment.dat" % self.experiment_data_dir,
            "output/imageExp_out_%s.xml" % self.date_specifier )

        # Grab the global parameters.
        self.globals = neat.getGlobalParameters()
        population_size = int(self.globals.getParameterValue('PopulationSize'))

        ### GUI Configuration

        # Set default window size.
        self.setFixedSize( 670, 700 )

        # Initialize the list view for the distorted images.
        lv = QListView( )
        lv.setViewMode( QListView.IconMode )
        lv.setUniformItemSizes( True )
        lv.setSelectionRectVisible( True )
        lv.setMovement( QListView.Static )
        lv.setSelectionMode( QListView.MultiSelection )
        lv.setEditTriggers( QListView.CurrentChanged )
        lv.setResizeMode( QListView.Adjust )
        lv.setIconSize( QSize(120, 120) )
        lv.setMinimumSize( 500, 385 )
        lv.setSpacing( 5 )
        lv.setEnabled( False )
        self.population_list = lv

        # Context menu.
        lv.setContextMenuPolicy( Qt.CustomContextMenu )
        lv.customContextMenuRequested.connect(self.handle_context_menu)

        # Create the population model.
        pm = PopulationModel( population_size )
        self.population_model = pm
        lv.setModel( pm )
        for i in xrange(population_size):
            self.population_model.update_item( i, DummyNetwork( i % 4 + 1 ) )

        # Monitor population list selection changes.
        lv.selectionModel().selectionChanged.connect(self.handle_listview_change )

        # Initialize widgets for displaying the graphic and for choosing
        # a new base image.
        btn_select_image = QPushButton( "Load Image" )
        btn_select_image.released.connect(self.select_image)
        lbl_image = QLabel( "Nothing loaded" )
        lbl_image.setFixedSize( 120, 120 )
        self.original_image_label = lbl_image
        image_layout = QVBoxLayout()
        image_layout.addWidget( btn_select_image )
        image_layout.addWidget( lbl_image )

        # Initialize a horizontal layout for the parameters.
        gb = QGroupBox( "Evolution Parameters" )
        gb.setSizePolicy( QSizePolicy.Expanding, QSizePolicy.Expanding )

        tw = QTableWidget( 1, 2 )
        tw.setHorizontalHeaderLabels("Parameter;Value".split(';'))
        tw.setColumnWidth( 0, 350 )
        tw.horizontalHeader().setStretchLastSection( True )
        tw.itemChanged.connect(self.handle_parameter_change)
        self.parameter_table = tw

        tw_layout = QVBoxLayout()
        tw_layout.addWidget( tw )
        gb.setLayout( tw_layout )

        param_layout = QHBoxLayout()
        param_layout.addLayout( image_layout )
        param_layout.addWidget( gb )

        # Grab the global parameters.
        parameter_count = self.globals.getParameterCount()
        tw.setRowCount( parameter_count )
        for p in xrange(parameter_count):
            parameter_name = self.globals.getParameterName( p )
            tw.model().setData( tw.model().index( p, 0 ), parameter_name )
            tw.model().setData( tw.model().index( p, 1 ), self.globals.getParameterValue( parameter_name ) )
            index = tw.item( p, 0 )
            index.setFlags( index.flags() ^ Qt.ItemIsEditable )

        # Initialize a horizontal layout for the evolve button.
        btn_evolve = QPushButton( "Shuffle" )
        btn_evolve.released.connect(self.evolve_image)
        btn_evolve.setEnabled( False )
        self.btn_evolve = btn_evolve
        self.btn_evolve.setSizePolicy( QSizePolicy.Expanding, QSizePolicy.Preferred )

        self.spin_evolve_iterations = QSpinBox()
        self.spin_evolve_iterations.setRange( 1, 100 )
        self.spin_evolve_iterations.setValue( 1 )

        self.cb_cross_correlate = QCheckBox( "X-Corr" )
        self.cb_cross_correlate.setChecked( True )

        control_layout = QHBoxLayout()
        control_layout.addWidget( btn_evolve )
        control_layout.addWidget( self.spin_evolve_iterations )
        control_layout.addWidget( self.cb_cross_correlate )

        # Initialize vertical central layout.
        central_layout = QVBoxLayout()
        central_layout.addLayout( param_layout )
        central_layout.addWidget( lv )
        central_layout.addLayout( control_layout )
        central_widget = QFrame()
        central_widget.setLayout( central_layout )

        self.setCentralWidget( central_widget )

        # Create a menu
        self.image_menu = QMenu("Menu", self)
        self.image_menu_save_image = self.image_menu.addAction("Save Selected Images")
        self.image_menu_save_network = self.image_menu.addAction("Save Selected Neural Network")

        ### Initialization

        # Handle command line parameters.
        if len(sys.argv) >= 2:
            self.select_image(sys.argv[1])

        # Create progress dialog.
        self.progress_dialog = QProgressDialog( self );
        self.progress_dialog.setLabelText( "Evolving population..." )
        self.progress_dialog.setWindowModality( Qt.WindowModal );
        self.progress_dialog.setVisible( False )
        self.progress_dialog.setCancelButton( None )

        # Start evolver thread.
        self.evolve_thread = EvolveThread( self )
        self.evolve_thread.finished_job.connect( self.finish_evolution )
        self.evolve_thread.update_progress.connect( self.update_evolution_progress )
        self.evolve_thread.start()

        # Generate first population.
        self.population = self.experiment.pythonEvaluationSet()
        self.evolve_image()