0001 function varargout = trainingGui(varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
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
0042
0043
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;
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
0088 function varargout = trainingGui_OutputFcn(hObject, eventdata, handles)
0089 varargout{1} = handles.output;
0090
0091
0092 function cut_and_seg_Callback(hObject, eventdata, handles)
0093
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
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];
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
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
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
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
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
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
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
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
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
0400 axes(handles.viewport_train);
0401 imshow(settings_train.currentData.phase, []);
0402 elseif settings_train.axisFlag == 5
0403
0404 maskFigure()
0405 elseif settings_train.axisFlag == 6
0406
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
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
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]);
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
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
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
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
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
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
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
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
0986
0987
0988 global settings_train;
0989 keyboard;
0990
0991
0992 function show_score_Callback(hObject, eventdata, handles)
0993
0994
0995
0996
0997
0998 updateUI(handles);
0999
1000 function score_txt_Callback(hObject, eventdata, handles)
1001
1002
1003
1004
1005
1006
1007 updateUI(handles);
1008
1009
1010 function score_txt_CreateFcn(hObject, eventdata, handles)
1011
1012
1013
1014
1015
1016
1017 if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
1018 set(hObject,'BackgroundColor','white');
1019 end