Home > SuperSegger > trainingConstants > trainingGui.m

trainingGui

PURPOSE ^

modifyConstValuesGUI : gui to train for region and segment scores.

SYNOPSIS ^

function varargout = trainingGui(varargin)

DESCRIPTION ^

 modifyConstValuesGUI : gui to train for region and segment scores.

 Copyright (C) 2016 Wiggins Lab
 Written by Connor Brennan and Stella Styliandou.
 University of Washington, 2016
 This file is part of SuperSegger.

 SuperSegger is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.

 SuperSegger is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with SuperSegger.  If not, see <http://www.gnu.org/licenses/>.
 Last Modified by GUIDE v2.5 06-Jul-2016 12:38:17

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SUBFUNCTIONS ^

SOURCE CODE ^

0001 function varargout = trainingGui(varargin)
0002 % modifyConstValuesGUI : gui to train for region and segment scores.
0003 %
0004 % Copyright (C) 2016 Wiggins Lab
0005 % Written by Connor Brennan and Stella Styliandou.
0006 % University of Washington, 2016
0007 % This file is part of SuperSegger.
0008 %
0009 % SuperSegger is free software: you can redistribute it and/or modify
0010 % it under the terms of the GNU General Public License as published by
0011 % the Free Software Foundation, either version 3 of the License, or
0012 % (at your option) any later version.
0013 %
0014 % SuperSegger is distributed in the hope that it will be useful,
0015 % but WITHOUT ANY WARRANTY; without even the implied warranty of
0016 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0017 % GNU General Public License for more details.
0018 %
0019 % You should have received a copy of the GNU General Public License
0020 % along with SuperSegger.  If not, see <http://www.gnu.org/licenses/>.
0021 % Last Modified by GUIDE v2.5 06-Jul-2016 12:38:17
0022 
0023 % Begin initialization code - DO NOT EDIT
0024 
0025 gui_Singleton = 1;
0026 gui_State = struct('gui_Name',       mfilename, ...
0027     'gui_Singleton',  gui_Singleton, ...
0028     'gui_OpeningFcn', @trainingGui_OpeningFcn, ...
0029     'gui_OutputFcn',  @trainingGui_OutputFcn, ...
0030     'gui_LayoutFcn',  [] , ...
0031     'gui_Callback',   []);
0032 if nargin && ischar(varargin{1})
0033     gui_State.gui_Callback = str2func(varargin{1});
0034 end
0035 
0036 if nargout
0037     [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
0038 else
0039     gui_mainfcn(gui_State, varargin{:});
0040 end
0041 % End initialization code - DO NOT EDIT
0042 
0043 % --- Executes just before trainingGui is made visible.
0044 function trainingGui_OpeningFcn(hObject, eventdata, handles, varargin)
0045 global settings_train;
0046 
0047 handles.output = hObject;
0048 set(handles.figure1, 'units', 'normalized', 'position', [0.1 0.1 0.8 0.8])
0049 handles.directory.String = pwd;
0050 
0051 settings_train.trainFun = @neuralNetTrain; % options : @ trainLasso, @trainTree, @neuralNetTrain
0052 settings_train.axisFlag = 4;
0053 settings_train.frameNumber = 1;
0054 settings_train.loadFiles = [];
0055 settings_train.loadDirectory = [];
0056 settings_train.currentDirectory = [];
0057 settings_train.currentData = [];
0058 settings_train.handles = handles;
0059 settings_train.oldData = [];
0060 settings_train.oldFrame = [];
0061 settings_train.maxData = 10;
0062 settings_train.firstPosition = [];
0063 settings_train.errorHandle = [];
0064 settings_train.numFrames = 0;
0065 settings_train.saveFolder = '';
0066 settings_train.dataSegmented = 0;
0067 settings_train.CONST = [];
0068 settings_train.nameCONST = 'none';
0069 settings_train.frameSkip = 1;
0070 settings_train.imagesLoaded = 0;
0071 settings_train.imageDirectory = 0;
0072 settings_train.hasBadRegions = 0;
0073 settings_train.currentIsBad = 0;
0074 settings_train.constantModified = 0;
0075 settings_train.recalculateSegs = 1;
0076 settings_train.segsInfo = @segInfoCurv;
0077 settings_train.numSegsInfo = 25;
0078 settings_train.recalculateRegs = 0;
0079 settings_train.regsInfo = @cellprops3;
0080 settings_train.numRegsInfo = 21;
0081 settings_train.cropTime = 0;
0082 setWorkingDirectory(handles.directory.String, 1, 0);
0083 
0084 updateUI(handles);
0085 guidata(hObject, handles);
0086 
0087 % --- Outputs from this function are returned to the command line.
0088 function varargout = trainingGui_OutputFcn(hObject, eventdata, handles)
0089 varargout{1} = handles.output;
0090 
0091 % --- Executes on button press in cut_and_seg.
0092 function cut_and_seg_Callback(hObject, eventdata, handles)
0093 % set constants
0094 global settings_train;
0095 
0096 if handles.viewport_train.XLim(2) - handles.viewport_train.XLim(1) > 500 || handles.viewport_train.YLim(2) - handles.viewport_train.YLim(1) > 500
0097     answer = questdlg('Your training set is very large (Viewport size). This will take a long time. Do you wish to continue?', 'Continue?', 'Yes', 'No', 'No');
0098     if strcmp(answer, 'No')
0099         return;
0100     end
0101 end
0102 
0103 trainingFrames = dir([settings_train.imageDirectory, '*c1*.tif']);
0104 numTrainingFrames = numel(trainingFrames);
0105 
0106 if numTrainingFrames > 50
0107     answer = questdlg('Your training set is very large (Number of frames). This will take a long time. Do you wish to continue?', 'Continue?', 'Yes', 'No', 'No');
0108     if strcmp(answer, 'No')
0109         return;
0110     end
0111 end
0112 
0113 %strip xy positions
0114 for i = 1:numTrainingFrames
0115     originalName = [settings_train.imageDirectory, trainingFrames(i).name];
0116     saveName = [settings_train.imageDirectory, strrep(trainingFrames(i).name, 'xy', '')];
0117     if ~strcmp(originalName,saveName)
0118         movefile(originalName, saveName);
0119     end
0120 end
0121 
0122 skip = 1;
0123 clean_flag = 1;
0124 start_end_steps =  [2 3]; % runs only segmentation, no linking
0125 CONSTtemp = settings_train.CONST;
0126 CONSTtemp.parallel.verbose = 1;
0127 CONSTtemp.align.ALIGN_FLAG = 0;
0128 CONSTtemp.seg.OPTI_FLAG = 1;
0129 BatchSuperSeggerOpti(settings_train.imageDirectory, skip, clean_flag, CONSTtemp, start_end_steps, 1);
0130 mkdir([settings_train.loadDirectory(1:end-1),'_backup'])
0131 copyfile ([settings_train.loadDirectory,'*seg.mat'],[settings_train.loadDirectory(1:end-1),'_backup'],'f')
0132 settings_train.frameNumber = 1;
0133 setWorkingDirectory(settings_train.loadDirectory(1:end-9));
0134 updateUI(handles);
0135 
0136 % --- Executes on button press in try_const.
0137 function try_const_Callback(hObject, eventdata, handles)
0138 global settings_train;
0139 
0140 dirname = fixDir(handles.directory.String);
0141 images = dir([dirname,'*.tif']);
0142 if isempty(images) && ~isempty(dir([dirname, filesep, 'raw_im', filesep, '*.tif']))
0143     dirname = [dirname, filesep, 'raw_im', filesep];
0144 end
0145 
0146 tryDifferentConstants(dirname)
0147 
0148 
0149 
0150 function previous_Callback(hObject, eventdata, handles)
0151 global settings_train;
0152 settings_train.frameNumber = settings_train.frameNumber - 1;
0153 settings_train.frameNumber = max(settings_train.frameNumber, 1);
0154 loadData(settings_train.frameNumber)
0155 updateUI(handles);
0156 
0157 
0158 function undo_Callback(hObject, eventdata, handles)
0159 global settings_train;
0160 if numel(settings_train.oldData) > 0
0161     settings_train.currentData = settings_train.oldData(1);
0162     settings_train.frameNumber = settings_train.oldFrame(1);
0163     
0164     if numel(settings_train.oldData) > 1
0165         settings_train.oldData = settings_train.oldData(2:end);
0166         settings_train.oldFrame = settings_train.oldFrame(2:end);
0167     else
0168         settings_train.oldData = [];
0169         settings_train.oldFrame = [];
0170     end
0171     updateUI(handles);
0172     saveData();
0173 else
0174     dispError('Reached undo limit');
0175 end
0176 
0177 function dispError(message)
0178 global settings_train;
0179 if ~isempty(settings_train.errorHandle)
0180     delete(settings_train.errorHandle)
0181 end
0182 settings_train.errorHandle = errordlg(message);
0183 
0184 function del_areas_Callback(hObject, eventdata, handles)
0185 global settings_train;
0186 if  hObject.Value
0187     if settings_train.dataSegmented
0188         settings_train.cropTime = 1;
0189         settings_train.firstPosition = [];
0190         updateUI(handles);
0191         hObject.Value
0192     else
0193         warning(['Plese segment files first']);
0194     end
0195 else
0196     settings_train.cropTime = 0;
0197 end
0198 
0199 function del_reg_Callback(hObject, eventdata, handles)
0200 global settings_train
0201 if settings_train.dataSegmented
0202     settings_train.axisFlag = 6;
0203     settings_train.firstPosition = [];
0204     updateUI(handles);
0205 else
0206     warning(['Plese segment files first']);
0207 end
0208 
0209 function train_segs_Callback(hObject, eventdata, handles)
0210 global settings_train;
0211 if isempty(settings_train.CONST)
0212     dispError('You must load a CONST file to create bad regions')
0213     return;
0214 end
0215 set(handles.figure1,'Pointer','watch');
0216 h = msgbox('Training segments, this will take a bit.' );
0217 handles.tooltip.String = 'Training segments... Please wait.';
0218 drawnow;
0219 saveData_Callback();
0220 
0221 % hack to put a new segm info calculation - change your pointer
0222 settings_train.CONST.seg.segScoreInfo = settings_train.segsInfo;
0223 settings_train.CONST.superSeggerOpti.NUM_INFO = settings_train.numSegsInfo;
0224 
0225 disp('loading the segments'' data');
0226 [Xsegs,Ysegs] = getInfoScores (settings_train.loadDirectory,'segs',...
0227     settings_train.recalculateSegs,settings_train.CONST);
0228 save([settings_train.currentDirectory,filesep,'segs_training_data'],'Xsegs','Ysegs');
0229 disp('training the segments ..');
0230 [settings_train.CONST.superSeggerOpti.A,...
0231     settings_train.CONST.seg.segmentScoreFun] = settings_train.trainFun (Xsegs, Ysegs);
0232 settings_train.constantModified = 1;
0233 
0234 % update scores and save data files again
0235 disp('updating the segments'' raw scores with the new coefficients..');
0236 updateScores(settings_train.loadDirectory,'segs', ...
0237     settings_train.CONST.superSeggerOpti.A, settings_train.CONST.seg.segmentScoreFun);
0238 set(handles.figure1,'Pointer','arrow');
0239 try
0240     close(h);
0241 catch
0242 end
0243 
0244 updateUI(handles);
0245 
0246 
0247 function bad_regs_Callback(hObject, eventdata, handles)
0248 global settings_train;
0249 
0250 if settings_train.dataSegmented
0251     if settings_train.hasBadRegions
0252         answer = questdlg('Are you sure you want to remove bad region frames?.', 'Clear bad regions?', 'Yes', 'No', 'No');
0253         if strcmp(answer, 'No')
0254             return;
0255         end
0256         delete([settings_train.loadDirectory, '*seg_*_mod.mat']);
0257     else
0258         handles.tooltip.String = 'Adding bad regions, please wait.';
0259         drawnow;
0260         makeBadRegions( settings_train.loadDirectory, settings_train.CONST)
0261         settings_train.numFrames = numel(dir([settings_train.loadDirectory,'*seg.mat']));
0262         settings_train.loadFiles = dir([settings_train.loadDirectory,'*seg*.mat']);
0263         loadData(settings_train.frameNumber);
0264     end
0265     
0266     setWorkingDirectory(handles.directory.String, 0, 0);
0267     updateUI(handles);
0268 else
0269     dispError('You must load a CONST file to create bad regions')
0270 end
0271 
0272 
0273 
0274 function train_regs_Callback(hObject, eventdata, handles)
0275 global settings_train;
0276 
0277 if isempty(settings_train.CONST)
0278     dispError('You must load a CONST file to create bad regions')
0279     return;
0280 end
0281 
0282 if ~settings_train.hasBadRegions
0283     answer = questdlg(...
0284         ['You have not added bad regions. Do you wish to continue?'], ...
0285         'Continue?', 'Yes', 'No', 'No');
0286     if strcmp(answer, 'No')
0287         return;
0288     end
0289 end
0290 set(handles.figure1,'Pointer','watch');
0291 h = msgbox('Training regions, this will take a bit.' );
0292 handles.tooltip.String = 'Training regions... Please wait.';
0293 
0294 drawnow;
0295 saveData_Callback();
0296 settings_train.CONST.regionScoreFun.props = settings_train.regsInfo;
0297 settings_train.CONST.regionScoreFun.NUM_INFO = settings_train.numRegsInfo;
0298 [Xregs,Yregs] = getInfoScores (settings_train.loadDirectory,'regs',...
0299     settings_train.recalculateRegs, settings_train.CONST);
0300 save([settings_train.currentDirectory,filesep,'regs_training_data'],'Xregs','Yregs');
0301 [settings_train.CONST.regionScoreFun.E,...
0302     settings_train.CONST.regionScoreFun.fun] = settings_train.trainFun (Xregs, Yregs);
0303 
0304 settings_train.constantModified = 1;
0305 
0306 % 7) Calculates new scores for regions
0307 disp ('Calculating regions'' scores with new coefficients...');
0308 updateScores(settings_train.loadDirectory,'regs', ...
0309     settings_train.CONST.regionScoreFun.E, settings_train.CONST.regionScoreFun.fun);
0310 
0311 try
0312     close(h);
0313 catch
0314 end
0315 
0316 set(handles.figure1,'Pointer','arrow');
0317 loadData(settings_train.frameNumber);
0318 updateUI(handles);
0319 
0320 function directory_Callback(hObject, eventdata, handles)
0321 setWorkingDirectory(handles.directory.String);
0322 updateUI(handles);
0323 
0324 % --- Executes during object creation, after setting all properties.
0325 function directory_CreateFcn(hObject, eventdata, handles)
0326 if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
0327     set(hObject,'BackgroundColor','white');
0328 end
0329 
0330 % --- Executes on button press in save.
0331 function save_Callback(hObject, eventdata, handles)
0332 global settings_train;
0333 CONST = settings_train.CONST;
0334 [~, ~, constantsPath] = getConstantsList();
0335 [FileName,PathName] = uiputfile('newCONST.mat', 'Save CONST file', [constantsPath, 'newConst']);
0336 if ~isempty(strfind(FileName, '.'))
0337     FileName = FileName(1:(max(strfind(FileName, '.')) - 1));
0338 end
0339 
0340 if FileName ~= 0
0341     save([PathName, FileName, '.mat'],'-STRUCT','CONST');
0342     
0343     settings_train.constantModified = 0;
0344     
0345     if exist('hObject', 'var') && ~isempty(hObject)
0346         updateUI(handles);
0347     end
0348 end
0349 
0350 % --------------------------------------------------------------------
0351 function image_folder_ClickedCallback(hObject, eventdata, handles)
0352 newDir = uigetdir;
0353 if newDir ~= 0
0354     handles.directory.String = newDir;
0355     setWorkingDirectory(handles.directory.String);
0356     updateUI(handles);
0357 end
0358 
0359 % --- Executes on button press in next.
0360 function next_Callback(hObject, eventdata, handles)
0361 global settings_train;
0362 settings_train.frameNumber = settings_train.frameNumber + 1;
0363 settings_train.frameNumber = min(settings_train.frameNumber, numel(settings_train.loadFiles));
0364 loadData(settings_train.frameNumber)
0365 updateUI(handles);
0366 
0367 
0368 function updateUI(handles)
0369 global settings_train;
0370 
0371 set(gca,'xcolor',get(gcf,'color'));
0372 set(gca,'ycolor',get(gcf,'color'));
0373 set(gca,'ytick',[]);
0374 set(gca,'xtick',[]);
0375 handles.currentConstants.String = ['Current: ', settings_train.nameCONST];
0376 
0377 firstFrame = 0;
0378 if numel(handles.viewport_train.Children) == 0
0379     firstFrame = 1;
0380 end
0381 
0382 while numel(handles.viewport_train.Children) > 0
0383     delete(handles.viewport_train.Children(1))
0384 end
0385 
0386 if settings_train.dataSegmented
0387     if settings_train.axisFlag == 1 || settings_train.axisFlag == 2
0388         % 1 for segments view, 2 for phase view.
0389         FLAGS.im_flag = settings_train.axisFlag;
0390         FLAGS.S_flag = settings_train.handles.show_score.Value;
0391         FLAGS.index_score = str2num(settings_train.handles.score_txt.String);
0392         FLAGS.t_flag = 0;
0393         showSegRuleGUI(settings_train.currentData, FLAGS, handles.viewport_train);
0394         if numel(handles.viewport_train.Children) > 0
0395             set(handles.viewport_train.Children(1),'ButtonDownFcn',@imageButtonDownFcn);
0396         end
0397         
0398     elseif settings_train.axisFlag == 4
0399         % showing phase image
0400         axes(handles.viewport_train);
0401         imshow(settings_train.currentData.phase, []);
0402     elseif settings_train.axisFlag == 5
0403         % mask image
0404         maskFigure()
0405     elseif settings_train.axisFlag == 6
0406         % deleting regions
0407         maskFigure()
0408         if numel(handles.viewport_train.Children) > 0
0409             set(handles.viewport_train.Children(1),'ButtonDownFcn',@imageButtonDownFcn);
0410         end
0411         
0412         if numel(settings_train.firstPosition) > 0
0413             hold on;
0414             plot( settings_train.firstPosition(1), settings_train.firstPosition(2), 'w+','MarkerSize', 30)
0415         end
0416     end
0417 elseif settings_train.imagesLoaded
0418     axes(handles.viewport_train);
0419     imshow(settings_train.currentData, []);
0420 end
0421 
0422 
0423 if settings_train.cropTime
0424     % deleting areas in square
0425     if numel(handles.viewport_train.Children) > 0
0426         set(handles.viewport_train.Children(1),'ButtonDownFcn',@imageButtonDownFcn);
0427     end
0428     
0429     if numel(settings_train.firstPosition) > 0
0430         hold on;
0431         plot( settings_train.firstPosition(1), settings_train.firstPosition(2), 'w+','MarkerSize', 30)
0432     end
0433 end
0434 
0435 handles.regions_radio.Value = 0;
0436 handles.phase_radio.Value = 0;
0437 handles.segs_radio.Value = 0;
0438 handles.mask_radio.Value = 0;
0439 if settings_train.axisFlag == 5 ||  settings_train.axisFlag == 6
0440     handles.mask_radio.Value = 1;
0441 elseif settings_train.axisFlag == 4
0442     handles.phase_radio.Value = 1;
0443 elseif settings_train.axisFlag == 2
0444     handles.regions_radio.Value = 1;
0445 elseif settings_train.axisFlag == 1
0446     handles.segs_radio.Value = 1;
0447 end
0448 
0449 if firstFrame
0450     axis tight;
0451 end
0452 hold on;
0453 
0454 if settings_train.imagesLoaded == 1 || settings_train.dataSegmented == 1
0455     handles.frameNumber.Visible = 'on';
0456     handles.frame_text.Visible = 'on';
0457     handles.frameNumber.String = num2str(settings_train.frameNumber);
0458 else
0459     handles.frameNumber.Visible = 'off';
0460     handles.frame_text.Visible = 'off';
0461     if numel(handles.viewport_train.Children) > 0
0462         set(handles.viewport_train.Children(1),'Visible', 'off');
0463     end
0464 end
0465 
0466 if settings_train.currentIsBad
0467     badString = ' "Bad regions"';
0468 else
0469     badString = '';
0470 end
0471 
0472 if settings_train.axisFlag == 5
0473     handles.tooltip.String = ['Mask.', badString, ' Num frames: ', num2str(settings_train.numFrames), ', Test data: ', num2str(numel(settings_train.loadFiles))];
0474 elseif settings_train.axisFlag == 4
0475     handles.tooltip.String = ['Phase image.', badString, ' Num frames: ', num2str(settings_train.numFrames), ', Test data: ', num2str(numel(settings_train.loadFiles))];
0476 elseif settings_train.axisFlag == 3
0477     handles.tooltip.String = ['Click to the two corners to delete the regions inside a square', badString, ' Num frames: ', num2str(settings_train.numFrames), ', Test data: ', num2str(numel(settings_train.loadFiles))];
0478 elseif settings_train.axisFlag == 1
0479     handles.tooltip.String = ['Click to toggle segments.', badString, ' Num frames: ', num2str(settings_train.numFrames), ', Test data: ', num2str(numel(settings_train.loadFiles))];
0480 elseif settings_train.axisFlag == 2
0481     handles.tooltip.String = ['Click to toggle regions.', badString, ' Num frames: ', num2str(settings_train.numFrames), ', Test data: ', num2str(numel(settings_train.loadFiles))];
0482 elseif settings_train.imagesLoaded == 1
0483     handles.tooltip.String = ['Phase image. Zoom in to the part of the image you want to train on.', badString, ' Num frames: ', num2str(settings_train.numFrames)];
0484 elseif settings_train.axisFlag == 0
0485     handles.tooltip.String = 'Load a file with images or segmented files.';
0486 end
0487 
0488 handles.currentConstants.String = ['Current: ', settings_train.nameCONST];
0489 handles.frameSkip.String = num2str(settings_train.frameSkip);
0490 handles.directory.String = settings_train.currentDirectory;
0491 numTrainingFrames = floor(numel(dir([settings_train.imageDirectory, '*c1*.tif'])) / settings_train.frameSkip);
0492 handles.totalFrames.String = ['Total frames: ', num2str(numTrainingFrames), ' / ', num2str(numel(dir([settings_train.imageDirectory, '*c1*.tif'])))];
0493 
0494 if numel(settings_train.oldData) > 0
0495     makeActive(handles.undo);
0496 else
0497     makeInactive(handles.undo);
0498 end
0499 
0500 if settings_train.hasBadRegions
0501     handles.bad_regs.String = 'Clear bad regions';
0502 else
0503     handles.bad_regs.String = 'Create bad regions';
0504 end
0505 
0506 if settings_train.constantModified
0507     makeActive(handles.save);
0508 else
0509     makeInactive(handles.save);
0510 end
0511 
0512 if exist(settings_train.saveFolder, 'dir') && numel(dir(settings_train.saveFolder)) > 2
0513     makeActive(handles.saveData);
0514 else
0515     makeInactive(handles.saveData);
0516 end
0517 
0518 if settings_train.imagesLoaded
0519     makeActive(handles.try_const);
0520     makeActive(handles.makeData);
0521 else
0522     makeInactive(handles.try_const);
0523     makeInactive(handles.makeData);
0524 end
0525 
0526 if settings_train.imagesLoaded || settings_train.dataSegmented == 1
0527     makeActive(handles.previous);
0528     makeActive(handles.next);
0529 else
0530     makeInactive(handles.previous);
0531     makeInactive(handles.next);
0532 end
0533 
0534 % No CONST file selected
0535 if isempty(settings_train.CONST)
0536     makeInactive(handles.cut_and_seg);
0537 else
0538     makeActive(handles.cut_and_seg);
0539 end
0540 
0541 if settings_train.dataSegmented == 0
0542     handles.train_actions.Visible = 'off';
0543     handles.seg_actions.Visible = 'on';
0544     handles.cut_and_seg.Visible = 'on';
0545 else
0546     handles.train_actions.Visible = 'on';
0547     handles.seg_actions.Visible = 'off';
0548     handles.cut_and_seg.Visible = 'off';
0549 end
0550 
0551 
0552 function maskFigure()
0553 global settings_train;
0554 cell_mask = settings_train.currentData.mask_cell;
0555 cc = bwconncomp(cell_mask, 4);
0556 labeled = labelmatrix(cc);
0557 RGB_label = label2rgb(labeled,'lines',[0 0 0]);%,'shuffle');
0558 imshow(RGB_label);
0559 
0560 
0561 function saveData()
0562 global settings_train
0563 
0564 try
0565     data = settings_train.currentData;
0566     save([settings_train.saveFolder, settings_train.loadFiles(settings_train.frameNumber).name],'-STRUCT','data');
0567 catch ME
0568     warning(['Could not save changes: ', ME.message]);
0569 end
0570 
0571 
0572 function addUndo()
0573 global settings_train
0574 
0575 try
0576     settings_train.oldData = [settings_train.currentData(1), settings_train.oldData(1)];
0577 catch
0578     settings_train.oldData = [settings_train.currentData(1)];
0579 end
0580 if numel(settings_train.oldData) > settings_train.maxData
0581     settings_train.oldData = settings_train.oldData(1:settings_train.maxData);
0582 end
0583 
0584 settings_train.oldFrame = [settings_train.frameNumber, settings_train.oldFrame];
0585 if numel(settings_train.oldFrame) > settings_train.maxData
0586     settings_train.oldFrame = settings_train.oldFrame(1:settings_train.maxData);
0587 end
0588 
0589 
0590 function setWorkingDirectory(directory, clearCONST, checkSave)
0591 global settings_train;
0592 
0593 if ~exist('checkSave') || isempty(checkSave)
0594     checkSave = 1;
0595 end
0596 
0597 if checkSave == 1 && checkIfSave()
0598     return;
0599 end
0600 
0601 if ~exist('clearCONST') || isempty(clearCONST)
0602     clearCONST = 1;
0603 end
0604 
0605 settings_train.frameNumber = 1;
0606 settings_train.axisFlag = 0;
0607 settings_train.dataSegmented = 0;
0608 settings_train.loadDirectory = [];
0609 
0610 %Is in seg folder
0611 settings_train.currentDirectory = [directory,filesep];
0612 settings_train.currentDirectory = settings_train.currentDirectory(1:(max(regexp(settings_train.currentDirectory, [filesep, '*$']))));
0613 isSegFolder = numel(dir([directory,filesep,'*seg.mat'])) > 0;
0614 
0615 
0616 if isSegFolder
0617     settings_train.loadDirectory = [directory,filesep];
0618 else
0619     xyPositions = dir([directory,filesep,'xy*',filesep]);
0620     if numel(xyPositions) > 0
0621         settings_train.loadDirectory = [directory,filesep,xyPositions(1).name,filesep,'seg',filesep];
0622         settings_train.currentDirectory = settings_train.loadDirectory(1:end-9);
0623     else
0624         settings_train.loadDirectory = [directory,filesep,'xy1/seg/'];
0625     end
0626 end
0627 
0628 hasCONST = ~isSegFolder && exist([settings_train.loadDirectory, '..', filesep, '..', filesep, 'CONST.mat'], 'file');
0629 if clearCONST == 1 || hasCONST == 1
0630     settings_train.CONST = [];
0631     settings_train.nameCONST = 'none';
0632     settings_train.constantModified = 0;
0633     if hasCONST
0634         settings_train.CONST = loadConstants([settings_train.loadDirectory, '..', filesep, '..', filesep, 'CONST.mat'], 0, 0);
0635         settings_train.nameCONST = 'local';
0636     end
0637 end
0638 
0639 settings_train.imagesLoaded = 0;
0640 settings_train.imageDirectory = [];
0641 if numel(dir([settings_train.loadDirectory(1:end-8), filesep, '*.tif'])) > 0
0642     settings_train.imagesLoaded = 1;
0643     settings_train.imageDirectory = settings_train.loadDirectory(1:end-8);
0644 elseif numel(dir([settings_train.loadDirectory(1:end-8), filesep, 'raw_im', filesep, '*.tif'])) > 0
0645     settings_train.imagesLoaded = 1;
0646     settings_train.imageDirectory = [settings_train.loadDirectory(1:end-8), filesep, 'raw_im', filesep];
0647 end
0648 
0649 if exist(settings_train.loadDirectory, 'dir')
0650     settings_train.numFrames = numel(dir([settings_train.loadDirectory,'*seg.mat']));
0651     
0652     % get files with right names
0653     loadFiles = dir([settings_train.loadDirectory,'*seg*.mat']);
0654     filenames = {loadFiles.name}';
0655     pass_names= regexp(filenames,'seg.mat|seg_\d+_mod.mat');
0656     pass_flag = ~cellfun('isempty',pass_names);
0657     loadFiles(~pass_flag) = [];
0658     settings_train.loadFiles = loadFiles;
0659     
0660     if settings_train.numFrames > 0
0661         settings_train.dataSegmented = 1;
0662         settings_train.axisFlag = 4;
0663         loadData(settings_train.frameNumber);
0664         
0665         settings_train.hasBadRegions = 0;
0666         if settings_train.numFrames < numel(settings_train.loadFiles)
0667             settings_train.hasBadRegions = 1;
0668         end
0669         
0670         if isempty(settings_train.CONST)
0671             loadConstants_Callback([], [], settings_train.handles)
0672         end
0673         
0674         %Make save folder
0675         try
0676             settings_train.saveFolder = [settings_train.loadDirectory(1:end-1), '_tmp', filesep];
0677             if ~exist(settings_train.saveFolder, 'dir')
0678                 mkdir(settings_train.saveFolder);
0679             else
0680                 delete([settings_train.saveFolder, '*']);
0681             end
0682         catch ME
0683             warning(['Could not back up files: ', ME.message]);
0684         end
0685     end
0686 elseif settings_train.imagesLoaded
0687     settings_train.numFrames = numel(dir([settings_train.imageDirectory,'*.tif']));
0688     settings_train.loadFiles = dir([settings_train.imageDirectory,'*.tif']);
0689     loadData(settings_train.frameNumber);
0690 else
0691     settings_train.numFrames = 0;
0692     settings_train.loadFiles = [];
0693 end
0694 
0695 %Clear viewport_train
0696 if isfield(settings_train.handles,'viewport_train') && isvalid(settings_train.handles.viewport_train)
0697     while numel(settings_train.handles.viewport_train.Children) > 0
0698         delete(settings_train.handles.viewport_train.Children(1))
0699     end
0700 end
0701 
0702 % --- Executes on mouse press over axes background.
0703 function imageButtonDownFcn(hObject, eventdata, handles)
0704 global settings_train;
0705 if settings_train.cropTime
0706     if numel(settings_train.firstPosition) == 0
0707         settings_train.firstPosition = eventdata.IntersectionPoint;
0708     else
0709         plot(eventdata.IntersectionPoint(1), eventdata.IntersectionPoint(2), 'w+','MarkerSize', 30)
0710         drawnow;
0711         addUndo();
0712         settings_train.currentData = killRegionsGUI(settings_train.currentData, settings_train.CONST, settings_train.firstPosition, eventdata.IntersectionPoint(1:2));
0713         saveData();
0714         settings_train.firstPosition = [];
0715     end
0716 elseif settings_train.axisFlag == 1 || settings_train.axisFlag == 2
0717     FLAGS.im_flag = settings_train.axisFlag;
0718     FLAGS.S_flag = 0;
0719     FLAGS.t_flag = 0;
0720     
0721     addUndo();
0722     [settings_train.currentData, list] = updateTrainingImage(settings_train.currentData, FLAGS, eventdata.IntersectionPoint(1:2));
0723     if settings_train.axisFlag == 1 && numel(list) > 0
0724         settings_train.currentData = intMakeRegs( settings_train.currentData, settings_train.CONST, [], [] );
0725     end
0726     saveData();
0727 elseif settings_train.axisFlag == 6
0728     plot(eventdata.IntersectionPoint(1), eventdata.IntersectionPoint(2), 'w+','MarkerSize', 30)
0729     drawnow;
0730     addUndo();
0731     settings_train.currentData = killRegionsGUI(settings_train.currentData, settings_train.CONST, [eventdata.IntersectionPoint(1),eventdata.IntersectionPoint(2)],[]);
0732     saveData();
0733 end
0734 
0735 updateUI(settings_train.handles);
0736 
0737 function loadData(frameNumber)
0738 global settings_train;
0739 
0740 if settings_train.dataSegmented
0741     if exist([settings_train.saveFolder,settings_train.loadFiles(frameNumber).name], 'file')
0742         settings_train.currentData = load([settings_train.saveFolder,settings_train.loadFiles(frameNumber).name]);
0743     else
0744         settings_train.currentData = load([settings_train.loadDirectory,settings_train.loadFiles(frameNumber).name]);
0745     end
0746 else
0747     settings_train.currentData = imread([settings_train.imageDirectory,settings_train.loadFiles(frameNumber).name]);
0748 end
0749 settings_train.currentIsBad = strfind(settings_train.loadFiles(frameNumber).name, '_mod.mat');
0750 
0751 function shouldCancel = checkIfSave()
0752 global settings_train;
0753 shouldCancel = 0;
0754 if exist(settings_train.saveFolder, 'dir')
0755     if numel(dir(settings_train.saveFolder)) > 2
0756         answer = questdlg('You have unsaved changes to the data.', 'Save data changes?', 'Save', 'Ignore', 'Cancel', 'Save');        
0757         if strcmp(answer, 'Save')
0758             saveData_Callback();
0759         elseif strcmp(answer, 'Cancel')
0760             shouldCancel = 1;
0761             
0762             return;
0763         end
0764     end    
0765     delete([settings_train.saveFolder, '*']);
0766     rmdir(settings_train.saveFolder);
0767 end
0768 
0769 if settings_train.constantModified == 1
0770     answer = questdlg('You have unsaved changes to the constants.', 'Save constants changes?', 'Save', 'Ignore', 'Cancel', 'Save');   
0771     if strcmp(answer, 'Save')
0772         save_Callback();
0773     elseif strcmp(answer, 'Cancel')
0774         shouldCancel = 1;
0775         
0776         return;
0777     end
0778 end
0779 
0780 function frameNumber_Callback(hObject, eventdata, handles)
0781 global settings_train;
0782 settings_train.frameNumber = str2num(handles.frameNumber.String);
0783 settings_train.frameNumber = max(1, min(settings_train.frameNumber, numel(settings_train.loadFiles)));
0784 loadData(settings_train.frameNumber);
0785 updateUI(handles);
0786 
0787 % --- Executes during object creation, after setting all properties.
0788 function frameNumber_CreateFcn(hObject, eventdata, handles)
0789 if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
0790     set(hObject,'BackgroundColor','white');
0791 end
0792 
0793 function saveData_Callback(hObject, eventdata, handles)
0794 global settings_train;
0795 try
0796     if numel(dir(settings_train.saveFolder)) > 2
0797         movefile([settings_train.saveFolder, '*'], settings_train.loadDirectory)
0798     end
0799 catch ME
0800     warning(['Could not back up files: ', ME.message]);
0801 end
0802 
0803 if exist('hObject', 'var') && ~isempty(hObject)
0804     updateUI(handles);
0805 end
0806 
0807 
0808 function figure1_DeleteFcn(hObject, eventdata, handles)
0809 checkIfSave();
0810 
0811 function modifyConstants_Callback(hObject, eventdata, handles)
0812 modifyConstValuesGUI();
0813 
0814 function makeData_Callback(hObject, eventdata, handles)
0815 global settings_train;
0816 
0817 xSize = handles.viewport_train.XLim(2) - handles.viewport_train.XLim(1);
0818 ySize = handles.viewport_train.YLim(2) - handles.viewport_train.YLim(1);
0819 if xSize > 800 || ySize > 800
0820     answer = questdlg(['Your training set is very large (Viewport size: ', num2str(ySize), ', ', num2str(xSize), '). This will take a long time. Do you wish to continue?'], 'Continue?', 'Yes', 'No', 'No');
0821     if strcmp(answer, 'No')
0822         return;
0823     end
0824 end
0825 
0826 numTrainingFrames = floor((numel(dir([settings_train.imageDirectory, '*c1*.tif']))) / settings_train.frameSkip);
0827 if numTrainingFrames < 5
0828     answer = questdlg('Your training set is very small (Number of frames). This will be hard to train well. Do you wish to continue?', 'Continue?', 'Yes', 'No', 'No');
0829     if strcmp(answer, 'No')
0830         return;
0831     end
0832 end
0833 
0834 if numTrainingFrames > 50
0835     answer = questdlg('Your training set is very large (Number of frames). This will take a long time. Do you wish to continue?', 'Continue?', 'Yes', 'No', 'No');
0836     if strcmp(answer, 'No')
0837         return;
0838     end
0839 end
0840 
0841 maxFrames = numel(dir([settings_train.imageDirectory, '*c1*.tif']));
0842 newDir = uigetdir([settings_train.imageDirectory, '..', filesep], ...
0843     'Select empty folder for training data');
0844 
0845 if newDir ~= 0
0846     if ~exist(newDir, 'dir')
0847         mkdir(newDir);
0848     else
0849         if numel(dir(newDir)) > 2
0850             dispError('You must select an empty directory.');
0851             return;
0852         end
0853     end
0854     
0855     cropX = ceil(handles.viewport_train.XLim(1):handles.viewport_train.XLim(2) - 1);
0856     cropY = ceil(handles.viewport_train.YLim(1):handles.viewport_train.YLim(2) - 1);
0857     
0858     for i = 1:settings_train.frameSkip:maxFrames
0859         tempImage = imread([settings_train.imageDirectory,settings_train.loadFiles(i).name]);
0860         saveName = [newDir, filesep, settings_train.loadFiles(i).name];
0861         imwrite( tempImage(cropY, cropX), saveName, 'TIFF' );
0862     end
0863     
0864     setWorkingDirectory([newDir, filesep], 0);
0865     updateUI(handles);
0866 end
0867 
0868 
0869 function frameSkip_Callback(hObject, eventdata, handles)
0870 global settings_train;
0871 settings_train.frameSkip = str2num(handles.frameSkip.String);
0872 updateUI(handles);
0873 
0874 function frameSkip_CreateFcn(hObject, eventdata, handles)
0875 if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
0876     set(hObject,'BackgroundColor','white');
0877 end
0878 
0879 
0880 function loadConstants_Callback(hObject, eventdata, handles)
0881 global settings_train;
0882 [~, ~, constantsPath] = getConstantsList();
0883 [FileName,PathName] = uigetfile('.mat', 'Load CONST file', constantsPath);
0884 if FileName ~= 0
0885     settings_train.CONST = loadConstants([PathName, FileName],0,0);
0886     settings_train.nameCONST = settings_train.CONST.ResFlag;
0887     settings_train.nameCONST = settings_train.nameCONST((max(strfind(settings_train.nameCONST, filesep)) + 1):end);   
0888     updateUI(handles);
0889 end
0890 
0891 
0892 function makeActive(button)
0893 button.Enable = 'on';
0894 button.ForegroundColor = [0, 0, 0];
0895 
0896 function makeInactive(button)
0897 button.Enable = 'inactive';
0898 button.ForegroundColor = [.5, .5, .5];
0899 
0900 function makeGoodRegions_Callback(hObject, eventdata, handles)
0901 global settings_train;
0902 settings_train.axisFlag = 2;
0903 addUndo();
0904 settings_train.currentData.regs.score = ones( settings_train.currentData.regs.num_regs, 1 );
0905 saveData();
0906 updateUI(handles);
0907 
0908 function phase_radio_Callback(hObject, eventdata, handles)
0909 
0910 global settings_train
0911 if get(hObject,'Value')
0912     settings_train.axisFlag = 4;
0913     handles.regions_radio.Value = 0;
0914     handles.segs_radio.Value = 0;
0915     handles.mask_radio.Value = 0;
0916 end
0917 updateUI(handles);
0918 
0919 function regions_radio_Callback(hObject, eventdata, handles)
0920 global settings_train
0921 if get(hObject,'Value')
0922     settings_train.axisFlag = 2;
0923     handles.phase_radio.Value = 0;
0924     handles.segs_radio.Value = 0;
0925     handles.mask_radio.Value = 0;    
0926     if isempty(settings_train.CONST)
0927         loadConstants_Callback([], [], settings_train.handles)
0928     end
0929     if isempty(settings_train.CONST)
0930         questdlg('You must load a CONST file to update the regions', 'Error', 'Okay', 'Okay');
0931     end
0932 end
0933 updateUI(handles);
0934 
0935 % --- Executes on button press in segs_radio.
0936 function segs_radio_Callback(hObject, eventdata, handles)
0937 global settings_train
0938 if get(hObject,'Value')
0939     settings_train.axisFlag = 1;
0940     handles.mask_radio.Value = 0;
0941     handles.regions_radio.Value = 0;
0942     handles.phase_radio.Value = 0;
0943 end
0944 updateUI(handles);
0945 
0946 function frame_text_CreateFcn(hObject, eventdata, handles)
0947 
0948 function mask_radio_Callback(hObject, eventdata, handles)
0949 global settings_train
0950 if get(hObject,'Value')
0951     settings_train.axisFlag = 5;
0952     handles.regions_radio.Value = 0;
0953     handles.segs_radio.Value = 0;
0954     handles.phase_radio.Value = 0;
0955 end
0956 updateUI(handles);
0957 
0958 function crop_Callback(hObject, eventdata, handles)
0959 
0960 
0961 function save_cut_Callback(hObject, eventdata, handles)
0962 global settings_train;
0963 
0964 xSize = handles.viewport_train.XLim(2) - handles.viewport_train.XLim(1);
0965 ySize = handles.viewport_train.YLim(2) - handles.viewport_train.YLim(1);
0966 cropX = ceil(handles.viewport_train.XLim(1):handles.viewport_train.XLim(2) - 1);
0967 cropY = ceil(handles.viewport_train.YLim(1):handles.viewport_train.YLim(2) - 1);
0968 i = settings_train.frameNumber;
0969 filename =[ settings_train.imageDirectory,filesep,settings_train.loadFiles(i).name];
0970 
0971 tempImage = imread([filename]);
0972 saveName = [filename];
0973 imwrite( tempImage(cropY, cropX), saveName, 'TIFF' );
0974 
0975 function figure1_KeyPressFcn(hObject, eventdata, handles)
0976 if strcmpi(eventdata.Key,'leftarrow')
0977     previous_Callback(hObject, eventdata, handles);
0978 end
0979 if strcmpi(eventdata.Key,'rightarrow')
0980     next_Callback(hObject, eventdata, handles);
0981 end
0982 
0983 % --------------------------------------------------------------------
0984 function debug_ClickedCallback(hObject, eventdata, handles)
0985 % hObject    handle to debug (see GCBO)
0986 % eventdata  reserved - to be defined in a future version of MATLAB
0987 % handles    structure with handles and user data (see GUIDATA)
0988 global settings_train;
0989 keyboard;
0990 
0991 % --- Executes on button press in show_score.
0992 function show_score_Callback(hObject, eventdata, handles)
0993 % hObject    handle to show_score (see GCBO)
0994 % eventdata  reserved - to be defined in a future version of MATLAB
0995 % handles    structure with handles and user data (see GUIDATA)
0996 
0997 % Hint: get(hObject,'Value') returns toggle state of show_score
0998 updateUI(handles);
0999 
1000 function score_txt_Callback(hObject, eventdata, handles)
1001 % hObject    handle to score_txt (see GCBO)
1002 % eventdata  reserved - to be defined in a future version of MATLAB
1003 % handles    structure with handles and user data (see GUIDATA)
1004 
1005 % Hints: get(hObject,'String') returns contents of score_txt as text
1006 %        str2double(get(hObject,'String')) returns contents of score_txt as a double
1007 updateUI(handles);
1008 
1009 % --- Executes during object creation, after setting all properties.
1010 function score_txt_CreateFcn(hObject, eventdata, handles)
1011 % hObject    handle to score_txt (see GCBO)
1012 % eventdata  reserved - to be defined in a future version of MATLAB
1013 % handles    empty - handles not created until after all CreateFcns called
1014 
1015 % Hint: edit controls usually have a white background on Windows.
1016 %       See ISPC and COMPUTER.
1017 if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
1018     set(hObject,'BackgroundColor','white');
1019 end

Generated on Thu 19-Jan-2017 13:55:21 by m2html © 2005