In questo post faccio vedere come creare un dataset in matlab in modo automatizzato, avendo a disposizione delle annotazioni in estensione “.mat”.
Nel mio caso sono un insieme di registrazioni fetali Doppler perchè, essendo un dottorando nel settore della biomedica, mi sono capitati recording di questo tipo.
Quello che faccio in questo codice è:
- Creare una struttura con tutte le immagini presenti nella cartella corrente (nel mio caso le registrazioni Doppler) e che hanno un ending tag noto (nel mio caso ‘*filtered.bmp’)
- Decidere dei labels coerenti con le annotazioni di cui dispongo (le mie annotazioni avevano, nella terza colonna della matrice “annotations”, numeri da 1 a 3, indicanti la tipologia del ciclo fetale: ciclo, flip di ciclo cardiaco o non ciclo)
- Creare delle cartelle in cui inserire i sample una volta estratti
- Fase di estrazione dei sample e inserimento nella cartella opportuna
Qui di seguito la prima fase:
% select all images with the desired ending and create the struct TAG_EndNameImgs = '*filtered.bmp'; % choose the correct ending for you imgs = dir(endNameImgs); %% Load annotation on your workspace and prepare. load('annotations.mat') imgsStruct=imgs; period=128; % my period was of 128 sample approximatively imagesLabeled (1:size(annotations, 1)) = struct ('Image', [], 'Label', '');
Bisogna caricare nel workspace le annotazioni (erano un .mat). Nel mio caso la colonna tre della matrice delle annotazioni conteneva gli indici di inizio di un ciclo cardiaco o non cardiaco (annotazioni prese da un medico).
Qui di seguito la seconda fase:
%% choose your own labels labels = ["heart_cicle" "heart_cicle_flipped" "NOT_heart_cicle"];
Terza fase:
%% here I'm dividing the folders that will contain the samples if (~exist(pwd + "\heart_cicle", 'dir')||~exist(pwd + "\heart_cicle", 'dir')) mkdir(pwd + "\heart_cicle"); mkdir(pwd + "\NOT_heart_cicle"); else disp("the folders already exist"); end
Quarta fase:
%% Go through each record in imgsStruct (for me was the doppler) % and cut selectively. % Insert all the cut images in imgsStruct disp("Now, from all records, I'll build sample images. Please be patient..."); for i=1:size(imgsStruct, 1) % find all the annotations for that file indexes = find(annotations(:,3)==i); imgTmp = imread(imgsStruct(i,1).name); for j = 1:size(indexes,1) beg_col =annotations(indexes(j),1); % annotated index tells the begin end_col = annotations(indexes(j),1)+ period; % end on period imgTmpSplitted = imageDopplerSplitter(imgTmp, beg_col, end_col); % establish the labels and insert the sample into the appropriate folder if ((annotations(indexes(j),2)==1)) % heart_cicle imagesLabeled(indexes(j)).Label = labels(1); imagesLabeled(indexes(j)).Image = imgTmpSplitted; baseFileName = "sample" + int2str(indexes(j)) + ".bmp"; % Whatever.... fullFileName = fullfile(pwd + "\" + labels(1), baseFileName); imwrite(imagesLabeled(indexes(j)).Image, fullFileName); elseif ((annotations(indexes(j),2)==2)) % heart_cicle_flipped imagesLabeled(indexes(j)).Label = labels(2); imagesLabeled(indexes(j)).Image = imgTmpSplitted; baseFileName = "sample" + int2str(indexes(j)) + ".bmp"; % Whatever.... fullFileName = fullfile(pwd + "\" + labels(1), baseFileName); imwrite(imagesLabeled(indexes(j)).Image, fullFileName); elseif ((annotations(indexes(j),2)==3)) % NOT_heart_cicle imagesLabeled(indexes(j)).Label = labels(3); imagesLabeled(indexes(j)).Image = imgTmpSplitted; baseFileName = "sample" + int2str(indexes(j)) + ".bmp"; % Whatever.... fullFileName = fullfile(pwd + "\" + labels(3), baseFileName); imwrite(imagesLabeled(indexes(j)).Image, fullFileName); end end end disp ("Now samples are separated into the folder heart_cycle and NOT_heart_cycle");
In questo post è stato presentato un esempio di codice Matlab per la creazione di un dataset esempio (nel mio caso un Doppler). Questa creazione di dataset può essere adattata ai propri scopi.
Non posso fornire il dataset su cui sto lavorando in quanto proprietà dell’Università per la quale lavoro e non posso neanche fornire i dettagli delle elaborazioni successive degli studi correlati. Nessuna domanda in tal senso verrà presa in considerazione e/o riceverà delle risposte.