class InterfaceWindow(QWidget): def __init__(self): super(InterfaceWindow,self).__init__() self.setGeometry(1,1,1350,800) self.layout=QGridLayout() self.layout.setColumnStretch(0,2) self.layout.setRowStretch(0,2) self.layout.setRowStretch(1,2) self.layout.setColumnStretch(1,2) self.layout.setRowStretch(0,2) self.layout.setRowStretch(1,2) self.setLayout(self.layout) self.initialize() self.updateTimer=QTimer(self) self.interval=1000 self.updateTimer.setInterval(self.interval) self.updateTimer.start() self.updateTimer.timeout.connect(self.updateSat) self.updateTimer.timeout.connect(self.updateIntensity) self.updateTimer.timeout.connect(self.HMM_update) self.type='tied' self.show() def initialize(self): self.fusion=Fusion() self.frame=0 self.obs=[] self.hmm=HMM_Classification() modelFileName = 'HMM/hmm_train.npy' self.hmm_models = np.load(modelFileName).item() self.names = ['Cumuliform0','Cumuliform1','Cumuliform2','Cumuliform3','Cumuliform4'] self.alphas={} self.obs_group=QWidget(self) self.obs_group_layout=QVBoxLayout() self.obs_group.setLayout(self.obs_group_layout) obs_label=QLabel("Human Observations") obs_label.setAlignment(Qt.AlignCenter) self.obs_group_layout.addWidget(obs_label) self.layoutStratiform = QHBoxLayout() self.widgetStratiform = QWidget(self) self.widgetStratiform.setLayout(self.layoutStratiform) self.obs_group_layout.addWidget(self.widgetStratiform) self.layoutStratiform.addWidget(QWidget()) self.lStratiform = QLabel('Genus 0:') self.layoutStratiform.addWidget(self.lStratiform) self.stratiformGroup = QButtonGroup(self.widgetStratiform) self.rStratiformYes = QRadioButton('Yes') self.stratiformGroup.addButton(self.rStratiformYes) self.rStratiformNo = QRadioButton('No') self.stratiformGroup.addButton(self.rStratiformNo) self.layoutStratiform.addWidget(self.rStratiformYes) self.layoutStratiform.addWidget(self.rStratiformNo) self.layoutStratiform.addWidget(QWidget()) self.layoutCirriform = QHBoxLayout() self.widgetCirriform = QWidget(self) self.widgetCirriform.setLayout(self.layoutCirriform) self.obs_group_layout.addWidget(self.widgetCirriform) self.layoutCirriform.addWidget(QWidget()) self.lCirriform = QLabel('Genus 1:') self.layoutCirriform.addWidget(self.lCirriform) self.CirriformGroup = QButtonGroup(self.widgetCirriform) self.rCirriformYes = QRadioButton('Yes') self.CirriformGroup.addButton(self.rCirriformYes) self.rCirriformNo = QRadioButton('No') self.CirriformGroup.addButton(self.rCirriformNo) self.layoutCirriform.addWidget(self.rCirriformYes) self.layoutCirriform.addWidget(self.rCirriformNo) self.layoutCirriform.addWidget(QWidget()) self.layoutStratoCumuliform = QHBoxLayout() self.widgetStratoCumuliform = QWidget(self) self.widgetStratoCumuliform.setLayout(self.layoutStratoCumuliform) self.obs_group_layout.addWidget(self.widgetStratoCumuliform) self.layoutStratoCumuliform.addWidget(QWidget()) self.lStratoCumuliform = QLabel('Genus 2:') self.layoutStratoCumuliform.addWidget(self.lStratoCumuliform) self.StratoCumuliformGroup = QButtonGroup(self.widgetStratoCumuliform) self.rStratoCumuliformYes = QRadioButton('Yes') self.StratoCumuliformGroup.addButton(self.rStratoCumuliformYes) self.rStratoCumuliformNo = QRadioButton('No') self.StratoCumuliformGroup.addButton(self.rStratoCumuliformNo) self.layoutStratoCumuliform.addWidget(self.rStratoCumuliformYes) self.layoutStratoCumuliform.addWidget(self.rStratoCumuliformNo) self.layoutStratoCumuliform.addWidget(QWidget()) self.layoutCumuliform = QHBoxLayout() self.widgetCumuliform = QWidget(self) self.widgetCumuliform.setLayout(self.layoutCumuliform) self.obs_group_layout.addWidget(self.widgetCumuliform) self.layoutCumuliform.addWidget(QWidget()) self.lCumuliform = QLabel('Genus 3:') self.layoutCumuliform.addWidget(self.lCumuliform) self.CumuliformGroup = QButtonGroup(self.widgetCumuliform) self.rCumuliformYes = QRadioButton('Yes') self.CumuliformGroup.addButton(self.rCumuliformYes) self.rCumuliformNo = QRadioButton('No') self.CumuliformGroup.addButton(self.rCumuliformNo) self.layoutCumuliform.addWidget(self.rCumuliformYes) self.layoutCumuliform.addWidget(self.rCumuliformNo) self.layoutCumuliform.addWidget(QWidget()) self.layoutCumulonibiform = QHBoxLayout() self.widgetCumulonibiform = QWidget(self) self.widgetCumulonibiform.setLayout(self.layoutCumulonibiform) self.obs_group_layout.addWidget(self.widgetCumulonibiform) self.layoutCumulonibiform.addWidget(QWidget()) self.lCumulonibiform = QLabel('Genus 4:') self.layoutCumulonibiform.addWidget(self.lCumulonibiform) self.CumulonibiformGroup = QButtonGroup(self.widgetCumulonibiform) self.rCumulonibiformYes = QRadioButton('Yes') self.CumulonibiformGroup.addButton(self.rCumulonibiformYes) self.rCumulonibiformNo = QRadioButton('No') self.CumulonibiformGroup.addButton(self.rCumulonibiformNo) self.layoutCumulonibiform.addWidget(self.rCumulonibiformYes) self.layoutCumulonibiform.addWidget(self.rCumulonibiformNo) self.layoutCumulonibiform.addWidget(QWidget()) self.layoutspacing = QHBoxLayout() self.updateContainer=QWidget() self.updateContainer.setLayout(self.layoutspacing) self.layoutspacing.addWidget(QWidget()) self.updatebutton=QPushButton("Update",self) # self.updatebutton.setFixedWidth(100) self.layoutspacing.addWidget(self.updatebutton) self.layoutspacing.addWidget(QWidget()) self.obs_group_layout.addWidget(self.updateContainer) self.obs_group_layout.addWidget(QWidget()) self.obs_group_layout.addWidget(QWidget()) self.obs_group_layout.addWidget(QWidget()) self.layout.addWidget(self.obs_group,1,1) # Probability graph self.figure_prob=Figure() self.probability=FigureCanvas(self.figure_prob) self.prob_ax=self.probability.figure.subplots() names = ['Cumuliform0','Cumuliform1','Cumuliform2','Cumuliform3','Cumuliform4'] self.graph_names=['0','Genus0','Genus1','Genus2','Genus3','Genus4',] self.fusion.probs={} for i in names: self.alphas[i]=[-1,-1] self.fusion.probs[i]=.2 # self.probs[i]=np.random.uniform() for i in names: self.fusion.probs[i]/=sum(self.fusion.probs.values()) self.prob_ax.bar(range(5),self.fusion.probs.values()) self.prob_ax.set_ylim(0,1) self.prob_ax.set_ylabel('Probability') self.prob_ax.set_xticklabels(self.graph_names) self.prob_ax.figure.canvas.draw() self.layout.addWidget(self.probability,1,0) # Intensity and Data on same tab self.tabs_top=QTabWidget(self) # Intensity graph self.figure_int=Figure() self.intensity=FigureCanvas(self.figure_int) self.int_ax=self.intensity.figure.subplots() self.intensity_data=self.get_intensity() self.int_ax.plot([0],self.intensity_data[0]) self.int_ax.set_ylim(0,np.max(self.intensity_data)+1) self.int_ax.set_xlabel('Time Steps') self.figure_int.tight_layout() self.int_ax.figure.canvas.draw() self.tabs_top.addTab(self.intensity,'Intensity') self.reference=QLabel(self) self.reference.setPixmap(QPixmap('data_clean.png')) self.tabs_top.addTab(self.reference,'Reference') self.layout.addWidget(self.tabs_top,0,1) # Satellite image self.figure_sat=Figure() self.satellite=FigureCanvas(self.figure_sat) self.sat_ax=self.satellite.figure.subplots() self.satellite_data=self.make_some_data() self.maxsig=np.amax(self.satellite_data) self.sat_ax.imshow(self.satellite_data[0],vmax=self.maxsig,cmap='Greys_r') self.sat_ax.axis('off') self.sat_ax.figure.canvas.draw() self.layout.addWidget(self.satellite,0,0) self.table=self.fusion.DirPrior(5) self.give_advice=np.random.choice([1,0],p=[0.30,0.70]) self.help=False self.updatebutton.clicked.connect(self.getObs) if self.type=='tied': self.updatebutton.clicked.connect(lambda: self.fusion.moment_matching(self.obs)) elif self.tpye=='full': self.updatebutton.clicked.connect(lambda: self.fusion.moment_matching_full(self.obs)) elif self.type=='ind': pass self.updatebutton.clicked.connect(self.reset) def HMM_update(self): if not self.help: data=self.intensity_data[self.frame] #forward algorithm for i in self.names: self.alphas[i]=self.hmm.continueForward(data,self.hmm_models[i],self.alphas[i]) self.fusion.probs[i]=self.fusion.probs[i]*sum(self.alphas[i]) #noramlize suma=sum(self.fusion.probs.values()) for i in self.names: self.fusion.probs[i]/=suma post_probs=self.fusion.probs.values() self.updateProbGraph(post_probs) def getObs(self): self.help=True if(self.rStratiformYes.isChecked()): self.obs.append(0) elif(self.rStratiformNo.isChecked()): self.obs.append(1) if(self.rCirriformYes.isChecked()): self.obs.append(2) elif(self.rCirriformNo.isChecked()): self.obs.append(3) if(self.rStratoCumuliformYes.isChecked()): self.obs.append(4) elif(self.rStratoCumuliformNo.isChecked()): self.obs.append(5) if(self.rCumuliformYes.isChecked()): self.obs.append(6) elif(self.rCumuliformNo.isChecked()): self.obs.append(7) if(self.rCumulonibiformYes.isChecked()): self.obs.append(8) elif(self.rCumulonibiformNo.isChecked()): self.obs.append(9) # reset all buttons self.stratiformGroup.setExclusive(False) self.CirriformGroup.setExclusive(False) self.StratoCumuliformGroup.setExclusive(False) self.CumuliformGroup.setExclusive(False) self.CumulonibiformGroup.setExclusive(False) self.rStratiformYes.setChecked(False) self.rStratiformNo.setChecked(False) self.rCirriformYes.setChecked(False) self.rCirriformNo.setChecked(False) self.rStratoCumuliformYes.setChecked(False) self.rStratoCumuliformNo.setChecked(False) self.rCumuliformYes.setChecked(False) self.rCumuliformNo.setChecked(False) self.rCumulonibiformYes.setChecked(False) self.rCumulonibiformNo.setChecked(False) if self.type=='tied': post_probs=self.fusion.updateProbs(self.obs) elif self.tpye=='full': post_probs=self.fusion.sampling_full(self.obs) elif self.type=='ind': pass self.updateProbGraph(post_probs) def reset(self): if self.fusion.reset: self.give_advice=np.random.choice([1,0],p=[0.30,0.70]) self.help=False self.frame=0 self.obs=[] self.alphas={} self.int_ax.clear() self.intensity_data=self.get_intensity() self.int_ax.plot([0],self.intensity_data[0]) self.int_ax.set_ylim(0,np.max(self.intensity_data)+1) self.int_ax.set_xlabel('Time Steps') self.figure_int.tight_layout() self.int_ax.figure.canvas.draw() self.sat_ax.clear() self.sat_ax.imshow(self.satellite_data[0],vmax=self.maxsig,cmap='Greys_r') self.sat_ax.axis('off') self.sat_ax.figure.canvas.draw() self.prob_ax.clear() self.fusion.probs={} for i in self.names: self.alphas[i]=[-1,-1] self.fusion.probs[i]=.2 # self.probs[i]=np.random.uniform() for i in self.names: self.fusion.probs[i]/=sum(self.fusion.probs.values()) self.prob_ax.bar(range(5),self.fusion.probs.values()) #DEBUG # self.prob_ax.bar(range(2),self.probs.values()) self.prob_ax.set_ylim(0,1) self.prob_ax.set_ylabel('Probability') self.prob_ax.set_xticklabels(self.graph_names) self.prob_ax.figure.canvas.draw() else: pass def make_some_data(self): img_path="data_sim/boulder.png" region_coordinates={'latmin':0,'latmax':0,'lonmin':0,'lonmax':0} Boulder=Region('Boulder',img_path,region_coordinates) Boulder.initPointTargets() Boulder.generateLayers() total_targets=np.zeros((100,100,100)) for i, (gt_layer,sb_layer,pb_layer) in enumerate(zip(Boulder.ground_truth_layers,Boulder.shake_base_layers,Boulder.pixel_bleed_layers)): total_targets=total_targets+gt_layer+sb_layer+pb_layer total=total_targets+Boulder.noise_layer+Boulder.structured_noise_layer+Boulder.shotgun_noise_layer return total def get_intensity(self): genus=np.random.randint(5) print genus self.genus=genus model=Cumuliform(genus=genus,weather=False) intensity_data=model.intensityModel+np.random.normal(0,2,(len(model.intensityModel))) for j in range(len(intensity_data)): intensity_data[j]=max(intensity_data[j],1e-5) return intensity_data def updateSat(self): self.sat_ax.clear() self.sat_ax.imshow(self.satellite_data[self.frame],vmax=self.maxsig,cmap='Greys_r') self.sat_ax.axis('off') self.sat_ax.figure.canvas.draw() self.frame+=1 if (self.frame==10) and (self.give_advice): self.advice() def updateIntensity(self): self.int_ax.clear() self.int_ax.plot(range(self.frame),self.intensity_data[:self.frame]) self.int_ax.set_ylim(0,np.max(self.intensity_data)+1) self.int_ax.set_xlabel('Time Steps') self.int_ax.figure.canvas.draw() def updateProbGraph(self,post_probs): self.prob_ax.clear() self.prob_ax.set_ylim(0,1) self.prob_ax.bar(range(5),post_probs) # print self.probs.values() self.prob_ax.set_xticklabels(self.graph_names) self.prob_ax.set_ylabel('Probability') self.prob_ax.figure.canvas.draw() def advice(self): message="Targets in this region are known to be of type %d" % self.genus QMessageBox.about(self,'Heads Up!',message)