function varargout = image_dbr(varargin) %IMAGE_DBR M-file for image_dbr.fig % IMAGE_DBR, by itself, creates a new IMAGE_DBR or raises the existing % singleton*. % % H = IMAGE_DBR returns the handle to a new IMAGE_DBR or the handle to % the existing singleton*. % % IMAGE_DBR('Property','Value',...) creates a new IMAGE_DBR using the % given property value pairs. Unrecognized properties are passed via % varargin to image_dbr_OpeningFcn. This calling syntax produces a % warning when there is an existing singleton*. % % IMAGE_DBR('CALLBACK') and IMAGE_DBR('CALLBACK',hObject,...) call the % local function named CALLBACK in IMAGE_DBR.M with the given input % arguments. % % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)". % % See also: GUIDE, GUIDATA, GUIHANDLES % Edit the above text to modify the response to help image_dbr % Last Modified by GUIDE v2.5 16-Aug-2008 23:50:43 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @image_dbr_OpeningFcn, ... 'gui_OutputFcn', @image_dbr_OutputFcn, ... 'gui_LayoutFcn', [], ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT function image_dbr_OpeningFcn(hObject, eventdata, handles, varargin) % Main routine, this starts after creation of the guide % Handling of input parameters handles.output = hObject; h = my_handles(handles); if length(varargin) < 4 cclasf = meanc; % default combiner else cclasf = varargin{4}; end if length(varargin) < 3 clasf = knnc([],1); % default classifier else clasf = varargin{3}; end featsets = varargin{2}; % arrange feature sets in cells if ~iscell(featsets), featsets = {featsets}; end if ~iscell(clasf) clasf = repmat({clasf},1,length(featsets)); else if length(clasf) ~= length(featsets) error('Number of classifiers and number of feature sets do not match') end end database = varargin{1}; % dataset or datafile, just used for image display m = size(database,1); labels = zeros(1,m); % user give labels: 0 (no), 1 (target, 2 (outlier) S = randperm(m); % initial set of images to be shown for j=1:4 % feature weight slider bars default invisible set(h.feat_weight(j),'visible','off'); set(handles.(['text' num2str(j+2)]),'visible','off'); end % optimize location sliders in case of 2 or 3 sliders if length(featsets) == 1, feath = 2; end if length(featsets) == 2, feath = [2 3]; end if length(featsets) == 3, feath = [1 2 3]; end if length(featsets) == 4, feath = [1 2 3 4]; end for j=1:length(featsets) % initialize feature sets and related sliders if size(featsets{j},1) ~= m error('Feature set(s) have wrong size') end set(handles.(['text' num2str(feath(j)+2)]),'visible','on'); set(handles.(['text' num2str(feath(j)+2)]),'string',getname(featsets{j})); % re-arrange datasets with features, use 'target' and 'outlier' as labels featsets{j} = prdataset(featsets{j}); featsets{j} = featsets{j}*scalem(featsets{j},'variance'); featsets{j} = prdataset(+featsets{j}); featsets{j} = setlablist(featsets{j},char('target','outlier')); featsets{j} = setnlab(featsets{j},labels); set(h.feat_weight(feath(j)),'value',1); % initial weights: 1 set(h.feat_weight(feath(j)),'visible','on'); end if length(featsets) == 1 % no feature slider bar in case of one feature set set(h.feat_weight(feath(1)),'visible','off'); set(handles.(['text' num2str(feath(j)+2)]),'visible','off'); end % store useful data in figure user data field guidata(hObject,{h,database,featsets,clasf,cclasf}); set(h.classify,'userdata','reset'); % initial procedure: reset set(h.all,'value',0); % initial ranking: set(h.unlabeled,'value',2); % unlabeled objects labels_im = zeros(1,10); % labels of shown images weights = zeros(1,4); % weights of feature sets Targets = []; Outliers= []; show_targ_out(database,Targets,1,h,'Targets'); % initialise target / show_targ_out(database,Outliers,1,h,'Outliers');% outlier images S = randperm(m); waitstate = prwaitbar; prwaitbar off % main loop while(1) % S, images to be shown show_images(database,S,1,h); % show images on axes % wait for the user % .......... uiwait % uiresume is activated by one of the % CLASSIFY / LABEL / RESET / QUIT buttonS. % get labels and weights Targets = get(h.targets,'userdata'); % get Tagerts Outliers = get(h.outliers,'userdata');%abd Outliers if isempty(guidata(hObject)) % we need to stop (QUIT button is pressed) guidata(hObject,{S,Targets,Outliers});% prwaitbar(waitstate); return % return ranking S, Targets and Outliers. end proch = proc(h); % classify / label / reset if ~strcmp(proch,'reset'); for j=1:10 % labels are 1-2, convert from 0-1 check boxes labels_im(j) = 2 - get(h.handlab(j),'value'); end for j=1:length(featsets) % get feature weights from sliders weights(j) = get(h.feat_weight(feath(j)),'value'); end T = [1:m]; % potential trainingset % Targets = get(h.targets,'userdata'); % Outliers = get(h.outliers,'userdata'); t = get(h.next,'userdata'); n = t{2}; SS = []; % training set indices in case of 'label' procedure for j=1:10 % update labeling SAct = S(j-1+n); % object number j in S if labels_im(j) == 1 if isempty(find(Targets==SAct)), Targets = [Targets SAct]; end else if isempty(find(Outliers==SAct)), Outliers = [Outliers SAct]; end end SS = [SS SAct]; end set(h.targets,'userdata',Targets); % store indices of Targets set(h.outliers,'userdata',Outliers); % and outliers labels = zeros(1,m); % construct labels training set labels(Targets) = ones(1,length(Targets)); labels(Outliers) = 2*ones(1,length(Outliers)); if strcmp(proch,'label') % Label: learn from present set only if all(labels_im == labels_im(1)) % present set is uniformly labeled if labels_im(1) == 1 % no outliers, use remaining unlabeled dataset as outlier labels_train = ones(size(labels))*2; % Label entire set as outlier labels_train(SS) = ones(size(SS)); % Label present set as target else % no targets, use remaining dataset as target labels_train = ones(size(labels)); % Label entire set as target labels_train(SS) = 2*ones(size(SS)); % Label present set as outlier end else T = SS; labels_train = labels_im; end [S,W] = train_classify(featsets,T,labels_train,clasf,cclasf,weights); else % Classify procedure: T = find(labels > 0); % learn from all Targets and Outliers labels_train = labels(T); [S,W] = train_classify(featsets,T,labels_train,clasf,cclasf,weights); end U = find(labels(S) == 0); set(h.all,'userdata',{S,U}); if (get(h.all,'value') == 0) S = S(U); end else % reset S = randperm(m); end % S is the ranked set of indices, either for all objects, or for just % the unlabeled objects end return function h = my_handles(handles) % construct meaningfull handle names / numbers T = [1 2 3 4 7 8 9 10 11 12]; % correct checkbox numbering h.image = zeros(1,10); h.handlab = zeros(1,10); h.feat_weight = zeros(1,4); for j=1:10 h.image(j) = handles.(['axes' num2str(j)]); h.imnum(j) = handles.(['text' num2str(j+8)]); h.obnum(j) = handles.(['text' num2str(j+18)]); h.handlab(j) = handles.(['checkbox' num2str(T(j))]); end for j=1:4 h.feat_weight(j) = handles.(['slider' num2str(j)]); end h.all = handles.radiobutton4; h.unlabeled = handles.radiobutton5; h.classify = handles.pushbutton1; h.targets = handles.axes11; h.outliers = handles.axes12; h.target_slider = handles.slider5; h.outliert_slider = handles.slider6; h.target_title = handles.text1; h.outlier_title = handles.text2; h.target_obnum = handles.text29; h.outlier_obnum = handles.text30; h.target_delete = handles.pushbutton2; h.target_move = handles.pushbutton3; h.outlier_delete = handles.pushbutton5; h.outlier_move = handles.pushbutton4; h.next = handles.pushbutton8; h.previous = handles.pushbutton9; return function varargout = image_dbr_OutputFcn(hObject, eventdata, handles) % takes care of final return of main return varargout = guidata(hObject); delete(hObject); return function pushbutton1_Callback(hObject, eventdata, handles) % CLASSIFY button, this reactivates the UIWAIT function in the main loop s = guidata(hObject); h = s{1}; set(h.classify,'userdata','classify'); uiresume return function show_images(database,S,n,h) % show images on axes Targets = get(h.targets,'userdata'); Outliers = get(h.outliers,'userdata'); im = data2im(database,S(n:n+9)); % the new images for j=1:10 show_im(im,j,h.image(j)); set(h.handlab(j),'value',1); % set target default set(h.imnum(j),'string',num2str(n+j-1)); set(h.obnum(j),'string',num2str(S(n+j-1))); end set(h.next,'userdata',{S,n}); % set visibility of next / previous buttons if n > 1 set(h.previous,'visible','on'); else set(h.previous,'visible','off'); end if n < (length(S)-9) set(h.next,'visible','on'); else set(h.next,'visible','off'); end % the targets, show most recent one if ~isempty(Targets) show_targ_out(database,Targets,length(Targets),h,'Targets'); set(h.target_obnum,'string',num2str(Targets(end))); end % the outliers, show most recent one if ~isempty(Outliers) show_targ_out(database,Outliers,length(Outliers),h,'Outliers'); set(h.outlier_obnum,'string',num2str(Outliers(end))); end return function show_targ_out(database,Pointers,n,h,name) % show targets or outliers and update properties if strcmp(name,'Targets') % create single handle variable for targets and outliers h_axes = h.targets; h_slider = h.target_slider; h_title = h.target_title; h_delete = h.target_delete; h_move = h.target_move; h_obnum = h.target_obnum; else % Outliers h_axes = h.outliers; h_slider = h.outliert_slider; h_title = h.outlier_title; h_delete = h.outlier_delete; h_move = h.outlier_move; h_obnum = h.outlier_obnum; end if isempty(Pointers) % all Targets / Outliers deleted, make all related objects invisible set(h_title,'String',['No ' name ' defined']) set(get(h_axes,'children'),'visible','off') set(h_axes,'visible','off'); set(h_slider,'visible','off'); set(h_delete,'visible','off'); set(h_move,'visible','off'); set(h_obnum,'visible','off'); set(h_axes,'userdata',[]); else show_im(data2im(database,Pointers(n)),1,h_axes); % show image set(h_axes,'userdata',Pointers); num_pointers = length(Pointers); % number of images set(h_title,'String',[num2str(num_pointers) ' ' name]); % set title set(h_obnum,'String',num2str(Pointers(n))); set(h_slider,'Min',0.99999/num_pointers); % min (about 1/n) set(h_slider,'Max',1); % max if num_pointers > 1 % step size set(h_slider,'SliderStep',[1/(num_pointers-1) 1/(num_pointers-1)]); set(h_slider,'value',n/num_pointers); set(h_slider,'visible','on'); else % special case: one target/outlier image set(h_slider,'SliderStep',[1 1]); set(h_slider,'value',n/num_pointers); set(h_slider,'visible','off'); end % make image and buttons visible set(get(h_axes,'children'),'visible','on') set(h_delete,'visible','on'); set(h_move,'visible','on'); set(h_obnum,'visible','on'); end return function proch = proc(h) % get desired procedure proch = get(h.classify,'userdata'); % classify / label / reset return function show_im(im,n,h_axes) % low level display routine if iscell(im), y = im{n}; else, y = squeeze(im(:,:,:,n)); end if size(y,3) == 1 % reset gray images to color y = cat(3,y,y,y); end axes(h_axes); % activate the right axes image(y); % display % prepare for callback set(get(gca,'children'),'ButtonDownFcn',{@resetlab,n}) axis off % make axes invisible axis equal return function resetlab(hObject, eventdata,n) % Reset the image labels (target/outlier) by clicking in the image s = guidata(hObject); h = s{1}; get(h.handlab(n),'value'); set(h.handlab(n),'value',1 - get(h.handlab(n),'value')); get(h.handlab(n),'value'); return function [S,W] = train_classify(featsets,T,labels_train,clasf,cclasf,weights); % train, combine, classify and rank % S will be the ranked object indices of all or unlabeled objects d = []; W = []; for j=1:length(featsets) b = featsets{j}; trainset = setnlab(b(T,:),labels_train); %trainset = setprior(trainset,getprior(trainset,0)); trainset = setprior(trainset,0); if ~isvaldset(trainset,2) v = trainset*knnc([],1); else v = trainset*clasf{j}*classc; end d = [d featsets{j}*v*weights(j)]; W = [W;v]; end d = d*cclasf; d = +d(:,'target'); [dd,S] = sort(-d); % W = v*affine(weights)*cclasf; % to be corrected W = []; return function slider5_Callback(hObject, eventdata, handles) % target slider s = guidata(hObject); h = s{1}; database = s{2}; Targets = get(h.targets,'userdata'); n = round(get(h.target_slider,'value')*length(Targets)); show_im(data2im(database,Targets(n)),1,h.targets); set(h.targets,'userdata',Targets); % image() destroys userdata, restore it set(h.target_title,'String',[num2str(length(Targets)) ' Targets']); % needed??? set(h.target_obnum,'String',num2str(Targets(n))); return function slider6_Callback(hObject, eventdata, handles) % outlier slider s = guidata(hObject); h = s{1}; database = s{2}; Outliers = get(h.outliers,'userdata'); n = round(get(h.outliert_slider,'value')*length(Outliers)); show_im(data2im(database,Outliers(n)),1,h.outliers); set(h.outliers,'userdata',Outliers); % image() destroys userdata, restore it set(h.outlier_title,'String',[num2str(length(Outliers)) ' Outliers']); % needed??? set(h.outlier_obnum,'String',num2str(Outliers(n))); return function pushbutton2_Callback(hObject, eventdata, handles) % delete target s = guidata(hObject); h = s{1}; database = s{2}; Targets = get(h.targets,'userdata'); n = round(get(h.target_slider,'value')*length(Targets)); Targets(n) = []; n = max(n-1,1); show_targ_out(database,Targets,n,h,'Targets'); return function pushbutton3_Callback(hObject, eventdata, handles) % move target to outlier s = guidata(hObject); h = s{1}; database = s{2}; Targets = get(h.targets,'userdata'); Outliers = get(h.outliers,'userdata'); n = round(get(h.target_slider,'value')*length(Targets)); Outliers = [Outliers Targets(n)]; Targets(n) = []; n = max(n-1,1); show_targ_out(database,Outliers,length(Outliers),h,'Outliers'); show_targ_out(database,Targets,n,h,'Targets'); return function pushbutton4_Callback(hObject, eventdata, handles) % move outlier to target s = guidata(hObject); h = s{1}; database = s{2}; Outliers = get(h.outliers,'userdata'); Targets = get(h.targets,'userdata'); n = round(get(h.outliert_slider,'value')*length(Outliers)); Targets = [Targets Outliers(n)]; Outliers(n) = []; n = max(n-1,1); show_targ_out(database,Targets,length(Targets),h,'Targets'); show_targ_out(database,Outliers,n,h,'Outliers'); return function pushbutton5_Callback(hObject, eventdata, handles) % delete outlier s = guidata(hObject); h = s{1}; database = s{2}; Outliers = get(h.outliers,'userdata'); n = round(get(h.outliert_slider,'value')*length(Outliers)); Outliers(n) = []; n = max(n-1,1); show_targ_out(database,Outliers,n,h,'Outliers'); return function pushbutton6_Callback(hObject, eventdata, handles) % Reset s = guidata(hObject); h = s{1}; database = s{2}; set(h.targets,'userdata',[]); set(h.outliers,'userdata',[]); show_targ_out(database,[],0,h,'Targets'); show_targ_out(database,[],0,h,'Outliers'); set(h.classify,'userdata','reset'); uiresume return function pushbutton7_Callback(hObject, eventdata, handles) % Quit guidata(hObject,[]); uiresume return function radiobutton4_Callback(hObject, eventdata, handles) % All s = guidata(hObject); h = s{1}; database = s{2}; if (get(h.all,'value') == 0) set(h.unlabeled,'value',2); else set(h.unlabeled,'value',0); end t = get(h.all,'userdata'); S = t{1}; show_images(database,S,1,h) return function radiobutton5_Callback(hObject, eventdata, handles) % unlabeled s = guidata(hObject); h = s{1}; database = s{2}; if (get(h.unlabeled,'value') == 0) set(h.all,'value',2); else set(h.all,'value',0); end t = get(h.all,'userdata'); S = t{1}; U = t{2}; S = S(U); show_images(database,S,1,h) return function pushbutton8_Callback(hObject, eventdata, handles) % Next s = guidata(hObject); h = s{1}; database = s{2}; t = get(h.next,'userdata'); S = t{1}; n = t{2}; n = min(length(S)-9,n+10); show_images(database,S,n,h); return function pushbutton9_Callback(hObject, eventdata, handles) % Previous s = guidata(hObject); h = s{1}; database = s{2}; t = get(h.next,'userdata'); S = t{1}; n = t{2}; n = max(1,n-10); show_images(database,S,n,h); return function pushbutton10_Callback(hObject, eventdata, handles) % Label s = guidata(hObject); h = s{1}; set(h.classify,'userdata','label'); uiresume return function pushbutton11_Callback(hObject, eventdata, handles) % All Target s = guidata(hObject); h = s{1}; for j=1:10 set(h.handlab(j),'value',1); end return function pushbutton12_Callback(hObject, eventdata, handles) % All Outlier s = guidata(hObject); h = s{1}; for j=1:10 set(h.handlab(j),'value',0); end return