• 训练样本集的制作


    在进行机器学习时,根据处理问题的不同,所需要的训练样本不同,并不是所有的训练样本都可以在网络上搜索到,所有,有时需要根据自己要解决的问题的实际需要,制作自己的样本数据集。

    matlab是半自动制作样本训练集的一个较强大的工具。

    1运行matlab自带的trainingImageLabeler函数

    1.1运行trainingImageLabeler

    程序会弹出training image labeler操作框

    1.2 利用add images打开要截图的图像

    1.3点击ROI开始框图,同时可以截取多个ROI区域

    1.4 结束截图,保存截图结果

    当需要结束截图时,点击Export ROIs,此时会弹出Export variable name,输入变量名称,如poritiveInstances,并点击OK。

    1.5 得到结构体positiveInstances

    结构体中包含两个元素,分别为imageFilename和objectBoundingBoxes

    imageFilename存储的是截图对象的名字

    ObjectBoundingBoxes存放的是截图所对应的ROI的矩形框的左上角坐标和长宽

    (即第i行表示第i个ROI的矩形框的左上角坐标和该矩形框的长宽)

    2 从截取的原始图像中提取每个ROI对应的子图,从而得到样本子图(运行SamplesMaker.m函数)

    2.1 读取该组截图的原始图像

    2.2 将读入的非灰度图像转化为灰度图像

    2.3 得到该组截图的所有ROI参数

    2.4得到该组截图的所有ROI对应的子图,存储在元胞中

    2.5 如果需要对截取的子图进行可视化,再将得到的子图利用imwrite函数保存

    下面是制作样本的完整程序,包括三个m文件,运行时依次实现

    第一个运行的程序(SamplesMaker)

    %% 改程序实现对第一幅子图的截图
    
    %% 调用matlab的样本制作函数(在运行该函数之前运行)
    % trainingImageLabeler
    
    %% 读取改组截图所对应的原始图像
    % 截图的原始图像的名字(路径已经加入了)
    imgName = positiveInstances.imageFilename;
    % read the image
    imgInput= imread(imgName); %读入图像
    % convert to the gray image
    if ndims(imgInput)==3
        imgInput = rgb2gray(imgInput);
    end
    
    %% 得到改组截图的所有ROI的参数rectPosition(每一行元素为每个ROI的左上角坐标和该矩形的长宽)
    rectPosition=positiveInstances.objectBoundingBoxes;
    NumROI=size(rectPosition,1);%ROI个数
    img=cell(NumROI,1);%存放每个image子图的元胞
    for k=1:NumROI
        %左上角(x0,y0),x方向长度xl,y方向长度yl
        x0=fix(rectPosition(k,1));y0=fix(rectPosition(k,2));xl=rectPosition(k,3);yl=rectPosition(k,4);
        % 第k个ROI所对应子图
        img{k}=imgInput(y0:y0+yl-1,x0:x0+xl-1);
        % 保存第k个ROI所对应子图
        imwrite(img{k},[num2str(k),'.jpg'],'jpg');
    end
    
    %% 将该目标图像的所有ROI信息保存在元胞rectPositionCell的第k个元胞中(k表示该目标图像是第几个图像)
    numImg=1;%本程序的目标图像即为第一个图像
    sampleData.rectPositionCell{numImg}=rectPosition;
    %% 将该目标提取到的所有ROI对应的子图保存在元胞imgCell的第k个元胞中(k表示该目标图像是第几个图像)
    sampleData.imgCell{numImg}=img;
    save('sampleData.mat','sampleData')
    

    第二个运行的程序(SamplesMaker_Add)

    %% 该程序是对SamplesMaker的补充
    %{
    SamplesMaker实现的是单一图像的子图截取,现在需要对另外一幅对象进行子图截取,并需要将截图结果
    与上一幅截图结果保存在一起,所以,需要对程序进行改进
    对于第二幅以后的子图截图,应该利用本程序
    %}
    
    %% 调用matlab的样本制作函数(在运行该函数之前运行)
    % trainingImageLabeler
    
    %% 读取该组截图所对应的原始图像
    % 截图的原始图像的名字(路径已经加入了)
    imgName = positiveInstances.imageFilename;
    % read the image
    imgInput= imread(imgName); %读入图像
    % convert to the gray image
    if ndims(imgInput)==3
        imgInput = rgb2gray(imgInput);
    end
    
    %% 载入以前的截图数据
    load('sampleData.mat');
    numImg_before=size(sampleData.rectPositionCell,2);
    numImg=numImg_before+1;%该次截图对应的图像编号
    % 该次截图之前已具有的ROI个数
    numRO_before=0;
    for i=1:numImg_before
        numRO_before=numRO_before+size(sampleData.rectPositionCell{i},1);
    end
    
    
    %% 提取该次截图的所有子图,并保存所有子图
    % 当前截图得到的ROI个数
    rectPosition=positiveInstances.objectBoundingBoxes;
    numROI=size(rectPosition,1);
    for k=1:numROI
        %左上角(x0,y0),x方向长度xl,y方向长度yl
        x0=fix(rectPosition(k,1));y0=fix(rectPosition(k,2));xl=rectPosition(k,3);yl=rectPosition(k,4);
        % 第k个ROI所对应子图
        img{k}=imgInput(y0:y0+yl-1,x0:x0+xl-1);
        % 保存第k个ROI所对应子图
        imwrite(img{k},[num2str(numRO_before+k),'.jpg'],'jpg');    
    end
    %% 将本次的ROI数据保存在元胞rectPositionCell中
    sampleData.rectPositionCell{numImg}=positiveInstances.objectBoundingBoxes;
    sampleData.imgCell{numImg}=img;
    save('sampleData.mat','sampleData')
    

    第三个运行的程序(SamplesMaker_All)

    %% 本程序将所有截取的img整合为一个数据组imgData(元胞,每一个元胞存放一个图像)
    
    
    %% 载入以前的截图数据
    load('sampleData.mat');
    % 总子样本截取的源图像个数
    numImg=size(sampleData.rectPositionCell,2);
    % 总采样图像个数
    numSamples=0;
    for i=1:numImg
        % 第i个截图源图像包含的采样子图个数
        n=size(sampleData.rectPositionCell{i},1);
        % 保存第第i个截图源图像包含的采样子图
        for k=1:n
            imgData(numSamples+k)=sampleData.imgCell{i}(k,1);
        end
        % 总采样图像个数
        numSamples=numSamples+n;      
    end
    imgLabels=ones(numSamples,1);
    
    save('imgData.mat','imgData','imgLabels');
    

      

    最后,所有截取的样本图像保存在元胞imgData中,标签保存在imgLabels中

    在进行样本子图提取后,接下来,需要对所有的样本子图进行统一大小

    可以按照如下代码进行

    %% 将图像统一大小
    clc
    clear
    close all
    
    %% 导入样本数据
    load('imgData.mat');
    imgData_sizeChange=cell(size(imgData));
    for k=1:numel(imgData)
        imgData_sizeChange{k}=imresize(imgData{k},[36,36]);%指出将图像统一为多大  
        imwrite(imgData_sizeChange{k},[num2str(k),'.jpg'],'jpg');
    end
    save('imgData_sizeChange.mat','imgData_sizeChange');
    

      

    ------------------------------------------------------------------------------------------------------------------------------- 博主为菜鸟一枚,发表博客的主要目的是为了记录科研中的点滴,方便自己以后查阅,如果有错误的地方,还请大家多提宝贵意见,如果有何侵犯到其他博主的内容,还请告知博主,将会及时处理! 另外,对于未标注转载的文章,均为博主自己整理,如需转载,请注明出处,谢谢!
  • 相关阅读:
    atitit。wondows 右键菜单的管理与位置存储
    Atitit mac os 版本 新特性 attilax大总结
    Atitit。木马病毒原理机密与概论以及防御
    Atitit。木马病毒原理机密与概论以及防御
    Atitit Atitit.软件兼容性原理----------API兼容 Qa7
    Atitit Atitit.软件兼容性原理----------API兼容 Qa7
    Atitit j2ee5 jee5 j2ee6 j2ee7 jee6 jee7 新特性
    Atitit j2ee5 jee5 j2ee6 j2ee7 jee6 jee7 新特性
    mysql只显示表名和备注
    phpmyadmin 在服务起上检测到错误,请查看窗口底部
  • 原文地址:https://www.cnblogs.com/lutingting/p/4788300.html
Copyright © 2020-2023  润新知