在進行機器學習時,根據處理問題的不同,所需要的訓練樣本不同,並不是所有的訓練樣本都可以在網絡上搜索到,所有,有時需要根據自己要解決的問題的實際需要,制作自己的樣本數據集。
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');
