利用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文件即可

查看原文>>

猜你喜欢

转载自blog.csdn.net/cys119/article/details/83715037