利用MATLAB Training Image Labeler標記樣本並儲存
在做機器學習任務的時候,需要標記大量樣本。之前找了好久實用的工具,一直沒找到,後來發現竟然MATLAB就有這個功能,用起來還比較順手。但美中不足是匯出的樣本標記只有記錄了源影象路徑和興趣區位置的mat資料檔案,筆者寫了一些處理指令碼,完成了 標記→儲存ROI區域位置→影象分割儲存的流程。本文分為兩部分,Part 1為MATLAB樣本標記工具的使用方法,Part 2為筆者寫的後續處理指令碼,完成了影象儲存任務。
Part 1:MATLAB Training Image Labeler工具的使用
Training Image Labeler 工具使用方法
1. 在MATLAB主頁面APPS標籤下開啟 Training Image Labeler
2. 點選New Session開啟一個新對話
3. 點選Add Images新增某個資料夾下的所有待標記圖片
4. 點選ROI按鈕來進行興趣區標記
5. 逐張標記ROI區域,在標記視窗的左側和左下角均有已標記ROI數量的提示
注意:不一定每張影象都需要被標記,每張影象的ROI區域也可以重合,在後續的處理中也不會有任何影響
6. 點選Export ROIs,會提示 you have unlaveled images,不用理,繼續Export ROIs
然後會問你輸出的變數名,如果用我後文提供的後續處理指令碼的話,千萬不要改,預設就好。
這個操作會有兩個影響
(1)在當前的Workspace建立一個名為positiveinstances的變數。儲存著ROI資訊
(2)在儲存的labelingSession檔案內儲存這一變數
7. 點選Save Session 儲存當前的會話,輸出的是一個mat檔案。裡面儲存著當前Session載入的所有影象路徑,所有ROI位置資訊。再此用Training ImageLabeler開啟這個Session檔案就可以繼續編輯。
注意:如果這時你改變了之前影象的檔名或目錄路徑名的話,這個mat檔案是無法正常讀取影象的。
----------------------------------------------------------------
Part 2:影象ROI區域切割儲存
到這裡,這個ROI mat檔案已經可以在MATLAB內部使用了。但有時我們希望可以把這些ROI區域儲存為實實在在的影象檔案,便於儲存以及在其他環境下使用。筆者寫了一些指令碼來做後續處理,主要功能如下
逐個讀取在同一目錄下的labelingSession mat檔案,將其中的ROI區域影象做提取,存入另一指定目錄。
程式碼如下:
%作者:史丹利複合田 %日期:2016年3月 %函式說明:讀取通過MATLAB Training Image標記並儲存的labelingSession資料,將 %這些標記的ROI區域轉換成bmp圖片並存儲。圖片的名稱採用了時間+序號的儲存方式, %所以多次讀取這一函式並將結果存入同一資料夾也不會造成命名衝突 %示例呼叫方式 Save_Raw_Samples_ROIs('E:\TSY\Code\labelingSession.mat','G:\Samples\2016-3-5'); %************************************************************************** %第一個引數:通過MATLAB Training Image %Labeler工具匯出的labelingSession資料,為mat格式,這裡只需輸入其全路徑即可,如'C:\labelingSession.mat' %第二個引數:為待匯出的檔案儲存的資料夾,如'G:\Samples\2016-3-1' %所有標記過的影象從0開始索引為檔名進行儲存 function Save_Raw_Samples_ROIs(labelingsession_data_path,output_path) roi_info = load(labelingsession_data_path); image_counts = size(roi_info.labelingSession.ImageSet.ROIBoundingBoxes,2);%struct結構與普通矩陣的索引方式不同,第一個為列,第二個為行 roi_index = 0; pause(1);%延時1s,確保不會出現重新命名 current_time = datestr(now,'yyyy-mm-dd-HH-MM-SS_'); if ~isdir(output_path) %判斷路徑是否存在 mkdir(output_path); end for i = 1:image_counts%對每張圖依次處理,提取ROI區域 image_info = roi_info.labelingSession.ImageSet.ROIBoundingBoxes(i); image = imread(image_info.imageFilename); box_rows = size(image_info.objectBoundingBoxes,1); for j = 1:box_rows%對每張圖的所有ROI區域進行提取 box =image_info.objectBoundingBoxes(j,:); cropped_roi = imcrop(image,box); %imshow(cropped_roi); image_full_name = strcat(output_path,'\',current_time,num2str(roi_index),'.bmp'); imwrite(cropped_roi,image_full_name); roi_index=roi_index + 1; end end
save_raw_sample_images.m
session_folder = 'E:\TSY\Data\SlabSession\Crack';%session目錄 output_folder = 'G:\Samples\Slab\Crack';%輸出目錄 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fileFolder=fullfile(session_folder); dirOutput=dir(fullfile(fileFolder,'*.mat')); fileNames={dirOutput.name}; for fileName = fileNames file_full_name = strcat(session_folder,'\',fileName); Save_Raw_Samples_ROIs(char(file_full_name),output_folder); end
程式碼打包下載地址:影象樣本標記儲存MATLAB程式碼
直接執行save_raw_sample_images.m檔案即可