训练样本集的制作

news/2024/6/17 18:01:33 标签: 人工智能, c#, matlab

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

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;gutter:true;">%% 改程序实现对第一幅子图的截图

%% 调用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)

matlab;gutter:true;">%% 该程序是对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)

matlab;gutter:true;">%% 本程序将所有截取的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中

 

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

可以按照如下代码进行

matlab;gutter:true;">%% 将图像统一大小
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');

  

转载于:https://www.cnblogs.com/lutingting/p/4788300.html


http://www.niftyadmin.cn/n/1348200.html

相关文章

python实现base64和图片相互转换

目录 1.图片转换base64编码脚本 2.base64编码转换image图片脚本 1.图片转换base64编码脚本 img_Transbase64.py: #!/usr/bin/python # Env: python3 # -*- coding:utf-8 -*- # Author:afei_0and1 绝大部分采用base64编码,base32和base16同理。base64编码方法:base64…

atitit.js javascript 调用c# java php后台语言api html5交互的原理与总结p97

atitit.js javascript 调用c# java php后台语言api html5交互的原理与总结p97 1. 实现html5化界面的要解决的策略 1 1.1. Js交互 1 1.2. 动态参数个数 2 1.3. 事件监听 2 1.4. 异常转换 2 2. dwrC.exec 3 2.1. 支持 ajax 与browExt模式 支持反射,直接继承调用后台a…

Nginx实现负载均衡并进行压力测试

目录 1.负载均衡介绍 2.负载均衡的应用场景 3.负载均衡的作用 4.Nginx实现负载均衡的两种方式

文件读写时常见的一些问题

文件读写时的流程 1,打开文件 sopen(filename,mode‘rt’) #filename指的是文件名,mode指的是文件读取的模式,默认是“rt”,意思是以文本文件模式读写。还有“w”“x”“a”“b”""等一些就不一一介绍了。 有以下几种情…

计算等差数列之和

题目:求12…n,要求:不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。 先来看看解题的算法过程: 解释一下吧! 学过计算机技术的人都知道,书上…

python3中关于浅拷贝和深拷贝的见解

之前有朋友问过我这方面的问题,当时只是回答说浅拷贝只是复制一层变量,不复制变量里嵌套的变量;深拷贝就是复制整个变量。 回头想想,感觉解释的有点模糊。写些例子来说明下: 拷贝(赋值)的种类 …

MySQL添加用户、删除用户与授权

MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户 1.1 登录MYSQL: >mysql -u root -p >密码 1.2 创建用户: mysql> insert into mysql.user(Host,User,Password) values("lo…

聊聊关于使用逻辑斯蒂回归的使用方法

逻辑斯蒂回归是个什么东西? 逻辑蒂斯函数 按数学的思维解读就是求逻辑函数的反函数。 以下是逻辑斯蒂的函数 百度百科上对这个函数的解释是: 逻辑斯谛模型是关于人口或种群增长的模型。它发现人口/种群增长会因为受到资源限制而达到某个极限。 这个在…