其他分享
首页 > 其他分享> > 图像识别1:基于相似性度量的二分类实验

图像识别1:基于相似性度量的二分类实验

作者:互联网

图像识别1:基于相似性度量的二分类实验

一、实验目的:

进行基于相似性度量的二分类实验,并绘制相关ROC曲线。以方便对两种或两种以上不同相似度试验,进行算法性能的比较。

二、实验内容:

1.将MIT室内场景数据库中卧室、浴室作为正负样本,利用留出法完成训练集与测试集的划分(比例2:1),并使用测量夹角余弦的方式进行二分类(0为负,1为正),最后给出分类错误率和准确率,并绘制ROC曲线。 2.在1基础上对测试集添加噪声,给出噪声情况下的分类错误率、准确率、ROC曲线。

(1)算法设计

首先对部分参数设置。
针对问题一,1.首先完成图像数据的提取,2.数据矩阵归一化,3.留出法划分训练样本Xtrain与测试样本Xtest,同时给出训练样本的标签Xlabel,4.保存二划分数据集并保存,5. 夹角余弦相似度训练,并与原数据集标签进行比对,计算十次二划分错误率均值,6.绘制ROC曲线。
针对问题二,采用imnoise 函数得到0.2椒盐噪声图像,当图像中存在椒盐噪声时,获得训练样本Xtrnoise和测试样本Xtenoise。然后处理步骤与问题一完全一致。

(2)算法实现

0.1 参数设置

为了提高程序的复用性,在最前面对程序的部分参数进行设置。
在这里插入图片描述

1.1 图像数据的提取

通过for循环读取指定路径下单个文件夹的所有图像,通过rgb2gray函数将有颜色的RGB图像转灰度图像。由于图像大小可能不一致,因此需要使用imresize函数调整为统一大小,本文采用[64,64]格式存储。之后将64*64的数据拉成1行,方便后面数据处理。
由于本文为分别对机场和卧室的数据进行提取,因此在读取文件夹下所有图片后,可以直接在1行的数据基础上,增加1列。该列为标签栏,浴室和卧室分别作为正1、负0样本。
对该算法进行实现,以机场为例。
在这里插入图片描述

1.2 矩阵拼接和归一化

为了(1)避免具有不同物理意义和量纲的输入变量不能平等使用,(2)bp中常采用sigmoid函数作为转移函数,归一化能够防止净输入绝对值过大引起的神经元输出饱和现象,(3)保证输出数据中数值小的不被吞食,采用归一化的简化计算方式,即将有量纲的表达式,经过变换化为无量纲的表达式,成为纯量。
先将上面提取后的两个矩阵列拼接成一个矩阵,然后对合并后的矩阵进行归一化处理。这里需要注意的是,矩阵最后一列作为标签栏不参与归一化处理。
在这里插入图片描述

1.3 留出法划分互斥的训练集和测试集

在实验一中,学习了如何划分互斥的训练集和测试集,在这里稍作修改即可套用。
首先通过randperm函数得到一个打乱序列的b,该序列包含(1,n),本文中n为合并后矩阵的行数。由于题目要求的2:1划分容易出现不完美分割的情况,因此对划分的数量进行取整操作。然后c,d两个序列分别取打乱序列的前60%、后40%,根据c,d两个序列的数值取原矩阵对应的列数,最后将按顺序将每次划分结果对应保存于对应的训练集和测试集中,完成随机划分为训练样本Xtrain与测试样本Xtest,同时给出训练样本的标签Xlabel
此处数据变化较多,可以写两行代码打印一次变量,方便及时对已写代码进行检验。
在这里插入图片描述

1.4 保存二划分的数据集并重新读取

为了提高算法的健壮性,方便后面代码报错后重跑,这里设计了一个保存并重新读取的环节。该操作的意义为:将图片读取并划分数据集的板块,与后面训练的步骤分开。
在这里插入图片描述

1.5 夹角余弦相似度训练

新建元胞数组读取数据集,不在保存数据集上直接操作。夹角余弦相似度训练需要两层循环,第一层为测试集数据的遍历,第二层为测试集数据与训练集的夹角余弦相似度比对,以将更相似的训练集标签赋值给测试集,如果余弦值越接近1,则两个向量越相似。其中,通过pdist(B,‘cosine’)函数计算夹角余弦。
然后将得到的赋值结果与原数据集标签进行比对,计算错误个数,方便计算错误率绘制ROC曲线,以将不同处理方式得到的不同结果进行比对。如实验三的欧式距离。
最后计算十次二划分的错误率均值,并将其作为错误率计算结果,采用sprintf函数进行结构化打印。
在这里插入图片描述
在这里插入图片描述

1.6 绘制ROC曲线

灵敏度是指正样本标记为正的百分率,特异度是负样本标记为负的百分率。将连续变量设定出多个不同的临界值,在每个临界值处计算出相应的灵敏度TPR(sensitivity)和特异度FTR(specificity),再以灵敏度为纵坐标,以1—特异度为横坐标绘制成ROC曲线。
ROC曲线下与坐标轴围成的面积AUC(Area Under Curve), 这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间。AUC越接近1.0,检测方法真实性越高;等于0.5时,则真实性最低,无应用价值。

在这里插入图片描述
在这里插入图片描述

2.1 椒盐噪声图片的处理

椒盐噪声与问题一的区别,只在于图像的处理部分。
本文采用imnoise 函数得到0.2椒盐噪声图像,这里如果复用问题一的代码,发现会报有关3*的错误。因此需要判断是否为RGB图像(是否为三维图像),如果是RGB图像则将其转为灰度图像(二维图像),然后进行与问题一相同的处理。
在这里插入图片描述

三、实验结果:

问题一得到结果为:
ans =

‘错误率为:0.23 正确率为:0.77’

问题二(加入噪声后)得到结果为:
ans =

'错误率为:0.44   正确率为:0.56'

ROC结果图分别为:
在这里插入图片描述
在这里插入图片描述

四、实验心得:

通过本次实验,熟练掌握了留出法对测试数据集与训练集的划分,基本了解了机器学习的基本流程,欧式距离和夹角余弦两种方法对测试集标签的赋值方式。对数学与编程的应用中有了更深的理解,在老师和同学的帮助下,代码的时空复杂度降低,并且复用性得到了较大的提升。

五、实验源码

实验一

%% 二维数组二划分
clear,clc
a=1:160; %生成列序列
aa=rand(1000,160); %随机生成数组
% 五次二划分
for i=1:5
    % 划分训练集和测试集比例(6:4划分)
    b=randperm(160); %打乱列序列
    c=b(1:length(b)*0.6); %取打乱序列的前60%
    d=b(length(b)*0.6:end); %取打乱序列的后40% %end直到数组结尾
    
    atrain=aa(:,c); %(:,:)为取原矩阵行和列,(:,1:50)为取原矩阵行,列取前五十个
    atest=aa(:,d); %(:,d)为取原矩阵行,列取随机40%的列
    train{1,i}=atrain; %保存在train的(1,1)cell
    test{1,i}=atest;
end
%% 保存五次二划分的数据集
save ('train.mat','train');
save ('test.mat','test');
%% 读取五次二划分
clear;clc
load train.mat
load test.mat

实验二

% 1.根据ABERDEEN人脸数据库,FERET人脸数据库中的部分人脸图像,完成图像数据的提取,
% 并将其随机划分为训练样本Xtrain与测试样本Xtest,同时给出训练样本的标签Xlabel。
% 若图像大小不一致,使用imresize函数调整为统一大小。
%% 设置参数
clc;clear;close all; 
ObjDir='D:\Desktop\大三上\神经网络\实验二\人脸库\ABERDEEN人脸数据库';
ObjDir1='D:\Desktop\大三上\神经网络\实验二\人脸库\FERET人脸库';
OutPutDir='D:\Desktop\大三上\神经网络\实验二\人脸库\2\';
OutPutDir1='D:\Desktop\大三上\神经网络\实验二\人脸库\3\';

%% 读取指定路径下单个文件夹所有图像
cd (ObjDir); %切换到指定路径下 
allfigs=struct2cell(dir('*.jpg')); %只处理jpg文件 
[w,img_num]=size(allfigs); %获得文件的个数 
phi=zeros(img_num,64*64);

for pn=1:img_num %逐次取出图片 % 将图像数据保存于phi
    image_name=allfigs{1,pn}; %allfigs{1,pn}存储每个图片的名字 
    img_origin=imread(image_name); %读取图片 
    % 加载样本图像到30*(64*64)的矩阵中,每一行代表一幅图像
    % 注意!!!读图之前需要进行灰度二值化
    I1=rgb2gray(img_origin); % RGB图像转灰度图像
    Image=imresize(I1,[64,64]);
    phi(pn,:)=double(reshape(Image,1,[]));
%     fprintf('%d %s\n',pn,strcat(ObjDir,image_name)); %显示正在处理的图像
%     I1=rgb2gray(img_origin); % RGB图像转灰度图像
%     figure('name','灰度图'),imshow(I1);
%     saveas(gcf,[OutPutDir,num2str(pn),'.jpg']);%将处理后的图片保存到目标文件夹
    % gcf 当前图像
end
% 增加XLable,第一位为1,第二位为2
XLable=[1;1;1;1;1;2;2;2;2];
phi=[phi XLable];
%% 读取指定路径下多个文件夹全部图像
% p = genpath(ObjDir1); % 获得文件夹下所有子文件的路径,这些路径存在字符串p中,以';'分割
% length_p = size(p,2);%字符串p的长度
% path = {};%建立一个单元数组,数组的每个单元中包含一个目录
% temp = [];
% % 'D:\Desktop\神经网络\EduRecivedFiles\人脸库\FERET人脸库;
% % D:\Desktop\神经网络\EduRecivedFiles\人脸库\FERET人脸库\FERET-001;
% % D:\Desktop\神经网络\EduRecivedFiles\人脸库\FERET人脸库\FERET-002;
% % D:\Desktop\神经网络\EduRecivedFiles\人脸库\FERET人脸库\FERET-003;'
% for i = 1:length_p %寻找分割符';',一旦找到,则将路径temp写入path数组中
%     if p(i) ~= ';'
%         temp = [temp p(i)];
%     else 
%         temp = [temp '\']; %在路径的最后加入 '\'
%         path = [path ; temp];
%         temp = [];
%     end
% end  
% clear p length_p temp;
% %至此获得data文件夹及其所有子文件夹(及子文件夹的子文件夹)的路径,并存于数组path中
% %下面逐一文件夹中读取图像
% file_num = size(path,1);% 子文件夹的个数
% for i = 1:file_num
%     file_path =  path{i}; % 图像文件夹路径
%     cd (file_path); %切换到指定路径下
%     allfigs=struct2cell(dir('*.tif')); %只处理tif文件
%     [w,img_num]=size(allfigs); %获得文件的个数
%     if img_num > 0
%         for pn=1:img_num %逐次取出图片 
%             image_name=allfigs{1,pn}; %allfigs{1,pn}存储每个图片的名字
%             img_origin=imread(image_name); %读取图片
%             % 加载样本图像到30*(64*64)的矩阵中,每一行代表一幅图像
%             % 注意!!!读图之前需要进行灰度二值化
%             I1=uint8(img_origin); % 转灰度图像
%             % 注意:图像是二维图形,rgb2gray是针对三维图像的。直接将图像转成 uint8
%             Image=imresize(I1,[64,64]);
%             phi(pn,:)=double(reshape(Image,1,[]));
%             %     fprintf('%d %s\n',pn,strcat(ObjDir,image_name)); %显示正在处理的图像
%             %     I1=rgb2gray(img_origin); % RGB图像转灰度图像
%             %     figure('name','灰度图'),imshow(I1);
%             %     saveas(gcf,[OutPutDir,num2str(pn),'.jpg']);%将处理后的图片保存到目标文件夹
%             % gcf 当前图像
%         end
%         % 将图像数据保存于phi
%     end
% end
%% 划分训练集
% 二维数组五次二划分
for i=1:5
    % 划分训练集和测试集比例(6:4划分)
    b=randperm(img_num); %打乱列序列
    c=b(1:round(img_num*0.6)); %取打乱序列的前60%
    d=b(round(img_num*0.6):end); %取打乱序列的后40% %end直到数组结尾
    
    atrain=phi(c,:); %(:,:)为取原矩阵行和列,(:,1:50)为取原矩阵列,行取前60%
    atest=phi(d,:); %(:,d)为取原矩阵列,行取随机40%的行
    Xtrain{1,i}=atrain; %保存在train的(1,1)cell
    Xtest{1,i}=atest;
end
% 保存五次二划分的数据集
save ('Xtrain.mat','Xtrain');
save ('Xtest.mat','Xtest');
%% 读取五次二划分
% clear;clc
% load Xtrain.mat
% load Xtest.mat
% 2.图像中存在椒盐噪声时,获得训练样本Xtrnoise和测试样本Xtenoise
%% 设置参数
clc;clear;close all; 
ObjDir='D:\Desktop\神经网络\EduRecivedFiles\人脸库\ABERDEEN人脸数据库';
ObjDir1='D:\Desktop\神经网络\EduRecivedFiles\人脸库\FERET人脸库';
OutPutDir='D:\Desktop\神经网络\EduRecivedFiles\人脸库\2\';
OutPutDir1='D:\Desktop\神经网络\EduRecivedFiles\人脸库\3\';
%% 读取指定路径下单个文件夹所有图像
cd (ObjDir); %切换到指定路径下 
allfigs=struct2cell(dir('*.jpg')); %只处理jpg文件 
[w,img_num]=size(allfigs); %获得文件的个数 
phi=zeros(img_num,64*64);

for pn=1:img_num %逐次取出图片 % 将图像数据保存于phi
    image_name=allfigs{1,pn}; %allfigs{1,pn}存储每个图片的名字 
    img_origin=imread(image_name); %读取图片 
    % 加载样本图像到30*(64*64)的矩阵中,每一行代表一幅图像
    I0=imnoise(img_origin,'salt & pepper',0.2); %加入噪声密度:0.2的椒盐噪声
    % 注意!!!读图之前需要进行灰度二值化
    I1=rgb2gray(I0); % RGB图像转灰度图像
    I1=imnoise(I1,'salt & pepper',0.2); %加入噪声密度:0.2的椒盐噪声
    Image=imresize(I1,[64,64]);
    phi(pn,:)=double(reshape(Image,1,[]));
end
% 增加XLable,第一位为1,第二位为2
XLable=[1;1;1;1;1;2;2;2;2];
phi=[phi XLable];
%% 划分训练集
% 二维数组五次二划分
for i=1:5
    % 划分训练集和测试集比例(6:4划分)
    b=randperm(img_num); %打乱列序列
    c=b(1:round(img_num*0.6)); %取打乱序列的前60%
    d=b(round(img_num*0.6):end); %取打乱序列的后40% %end直到数组结尾
    
    atrain=phi(:,c); %(:,:)为取原矩阵行和列,(:,1:50)为取原矩阵行,列取前五十个
    atest=phi(:,d); %(:,d)为取原矩阵行,列取随机40%的列
    Xtrnoise{1,i}=atrain; %保存在train的(1,1)cell
    Xtenoise{1,i}=atest;
end
%% 保存五次二划分的数据集
save ('Xtrnoise.mat','Xtrnoise');
save ('Xtenoise.mat','Xtenoise');

实验三

注:本实验源码过于繁冗,后请教老师和同学后代码得到较大提升。具体可参考实验五源码。
本源码无学习参考价值,仅做自我成长路径的反思用。

% 1.根据ABERDEEN人脸数据库,先完成图像数据的提取,
% 利用留出法划分为训练样本Xtrain与测试样本Xtest,
% 将男士和女士分别作为正1、负-1样本,给出训练样本的标签Xlabel。
% 若图像大小不一致,使用imresize函数调整为统一大小,二灰度处理
% 然后使用测量最短距离的方式进行二分类,最后给出分类错误率和准确率。
%% 设置参数
clc;clear;close all; 
ObjDir='D:\Desktop\大三上\神经网络\实验三\数据\ABERDEEN人脸数据库';
OutPutDir='D:\Desktop\神经网络\EduRecivedFiles\人脸库\2\';
a=10; %留出法划分次数
%% 读取指定路径下单个文件夹所有图像
cd (ObjDir); %切换到指定路径下 
allfigs=struct2cell(dir('*.jpg')); %只处理jpg文件 
[w,img_num]=size(allfigs); %获得文件的个数 
phi=zeros(img_num,64*64);

for pn=1:img_num %逐次取出图片 % 将图像数据保存于phi
    image_name=allfigs{1,pn}; %allfigs{1,pn}存储每个图片的名字 
    img_origin=imread(image_name); %读取图片 
    % 加载样本图像到30*(64*64)的矩阵中,每一行代表一幅图像
    % 注意!!!读图之前需要进行灰度二值化
    % fprintf('%d %s\n',pn,strcat(ObjDir,image_name)); %显示正在处理的图像
    I1=rgb2gray(img_origin); % RGB图像转灰度图像
    Image=imresize(I1,[64,64]);
    phi(pn,:)=double(reshape(Image,1,[]));
end
% 将男士和女士分别作为正1、负-1样本,给出训练样本的标签Xlabel
XLable=[1;1;1;1;1;-1;-1;-1;-1];
phi=[phi XLable];
%% 留出法划分互斥的训练集和测试集
% 二维数组五次二划分
for i=1:a
    % 划分训练集和测试集比例(2:1划分)
    b=randperm(img_num); %打乱列序列
    e=round(img_num*2/3);
    c=b(1:e); %取打乱序列的前60%
    d=b(e+1:end); %取打乱序列的后40% %end直到数组结尾
    
    atrain=phi(c,:); %(:,:)为取原矩阵行和列,(:,1:50)为取原矩阵列,行取前60%
    atest=phi(d,:); %(:,d)为取原矩阵列,行取随机40%的行
    Xtrain{1,i}=atrain; %保存在train的(1,1)cell
    Xtest{1,i}=atest;
end
% 保存五次二划分的数据集
save ('Xtrain.mat','Xtrain');
save ('Xtest.mat','Xtest');
save('A.mat','a');
%% 读取五次二划分
clear;clc
load Xtrain.mat
load Xtest.mat
load A.mat
%% 欧式距离判断测试集和哪个训练集最相似,然后把该训练集的标签给该测试集
for i=1:a % a为二划分次数
    % {}为元胞数组
    btrain=Xtrain{1,i}; %读取保存在train的(1,1)cell
    btest=Xtest{1,i};
    tempdis=inf;tempj=0;
    Xlable=zeros(1,size(btest,1));
    flag=0; % 记录错误个数
    for j=1:size(btest,1) % 测试集的3行数据逐一进行比对
        test{1,j}=ones(size(btest,2),1); % size(A,2)得到A的列数
        test{1,j}=btest(j,:);
        Xlable(j)=test{1,j}(1,end);  % 读取测试集标签
        for k=1:size(btrain,1) % 分别与训练集的5行数据一一比对
            train{1,k}=ones(size(btrain,2),1); 
            train{1,k}=btrain(k,:);
            % 计算两者之间的欧式距离
            distance=sqrt(sum(abs(test{1,j}-train{1,k})).^2);  %sum(x.^2)计算数组的平方和
            if(distance<tempdis)
                tempdis=distance;tempj=k; % 如果距离最小则判断为同一类型
                train{1,j}(1,end)=train{1,k}(1,end); % 将最短距离的训练集标签赋值给测试集
            end
        end
        % 计算错误个数
        if(train{1,j}(1,end)~=Xlable(j))
            flag=flag+1;
        end
    end
    % 计算每个测试集的错误率和准确率
    rateerrors(i)=flag/size(btest,1);
    rateture(i)=1-rateerrors(i);
    % sprintf('错误率为:%.2f   正确率为:%.2f',rateerrors,rateture)
end
% 计算五次划分的错误率和准确率均值
meanerrors=mean(rateerrors(:));
meanture=mean(rateture(:));
sprintf('错误率为:%.2f   正确率为:%.2f',meanerrors,meanture)

% 2.将MIT室内场景数据库中机场、面包房作为正负样本,
% 利用留出法完成训练集与测试集的划分,并使用测量最短距离的方式进行二分类,
% 最后给出分类错误率和准确率。
%% 设置参数
clc;clear;close all; 
path='D:\Desktop\大三上\神经网络\实验三\数据\MIT室内场景';
ObjDir1='\airport_inside';
ObjDir2='\bakery';
a=10; %留出法划分次数
%% 读取指定路径下单个文件夹所有图像
% 读取机场的图片并处理
cd ([path,ObjDir1]); %切换到指定路径下 
allfigs=struct2cell(dir('*.jpg')); %只处理jpg文件 
[w,img_num]=size(allfigs); %获得文件的个数 
phi1=zeros(img_num,64*64);

for pn=1:img_num %逐次取出图片 % 将图像数据保存于phi1
    image_name=allfigs{1,pn}; %allfigs{1,pn}存储每个图片的名字 
    img_origin=imread(image_name); %读取图片
    I1=rgb2gray(img_origin); % RGB图像转灰度图像
    Image=imresize(I1,[64,64]);
    phi1(pn,:)=double(reshape(Image,1,[]));
end
% 将机场和面包房分别作为正1、负-1样本,给出训练样本的标签Xlabel
XLable=ones(img_num,1);
phi1=[phi1 XLable];

% 读取面包房的图片并处理
cd ([path,ObjDir2]); %切换到指定路径下 
allfigs=struct2cell(dir('*.jpg')); %只处理jpg文件 
[w,img_num]=size(allfigs); %获得文件的个数 
phi2=zeros(img_num,64*64);

for pn=1:img_num %逐次取出图片 % 将图像数据保存于phi
    image_name=allfigs{1,pn}; %allfigs{1,pn}存储每个图片的名字 
    img_origin=imread(image_name); %读取图片
    I1=rgb2gray(img_origin); % RGB图像转灰度图像
    Image=imresize(I1,[64,64]);
    phi2(pn,:)=double(reshape(Image,1,[]));
end
% 将机场和面包房分别作为正1、负-1样本,给出训练样本的标签Xlabel
XLable=-1*ones(img_num,1);
phi2=[phi2 XLable];

% 列拼接两个矩阵
phi=[phi1;phi2];
%% 留出法划分互斥的训练集和测试集
% 二维数组五次二划分
for i=1:a
    % 划分训练集和测试集比例(2:1划分)
    b=randperm(length(phi(:,1))); %打乱列序列
    e=round(length(phi(:,1))*2/3);
    c=b(1:e); %取打乱序列的前60%
    d=b(e+1:end); %取打乱序列的后40% %end直到数组结尾
    
    atrain=phi(c,:); %(:,:)为取原矩阵行和列,(:,1:50)为取原矩阵列,行取前60%
    atest=phi(d,:); %(:,d)为取原矩阵列,行取随机40%的行
    Xtrain{1,i}=atrain; %保存在train的(1,1)cell
    Xtest{1,i}=atest;
end
% 保存五次二划分的数据集
save ('Xtrain.mat','Xtrain');
save ('Xtest.mat','Xtest');
save('A.mat','a');
%% 读取五次二划分
% clear;clc
% load Xtrain.mat
% load Xtest.mat
% load A.mat
%% 欧式距离判断测试集和哪个训练集最相似,然后把该训练集的标签给该测试集
for i=1:a % a为二划分次数
    % {}为元胞数组
    btrain=Xtrain{1,i}; %读取保存在train的(1,1)cell
    btest=Xtest{1,i};
    tempdis=inf;tempj=0;
    Xlable=zeros(1,size(btest,1));
    flag=0; % 记录错误个数
    for j=1:size(btest,1) % 测试集的3行数据逐一进行比对
        test{1,j}=ones(size(btest,2),1); % size(A,2)得到A的列数
        test{1,j}=btest(j,:);
        Xlable(j)=test{1,j}(1,end);  % 读取测试集标签
        for k=1:size(btrain,1) % 分别与训练集的5行数据一一比对
            train{1,k}=ones(size(btrain,2),1); 
            train{1,k}=btrain(k,:);
            % 计算两者之间的欧式距离
            distance=sqrt(sum(abs(test{1,j}-train{1,k})).^2);  %sum(x.^2)计算数组的平方和
            if(distance<tempdis)
                tempdis=distance;tempj=k; % 如果距离最小则判断为同一类型
                train{1,j}(1,end)=train{1,k}(1,end); % 将最短距离的训练集标签赋值给测试集
            end
        end
        % 计算错误个数
        if(train{1,j}(1,end)~=Xlable(j))
            flag=flag+1;
        end
    end
    % 计算每个测试集的错误率和准确率
    rateerrors(i)=flag/size(btest,1);
    rateture(i)=1-rateerrors(i);
    % sprintf('错误率为:%.2f   正确率为:%.2f',rateerrors,rateture)
end
% 计算五次划分的错误率和准确率均值
meanerrors=mean(rateerrors(:));
meanture=mean(rateture(:));
sprintf('错误率为:%.2f   正确率为:%.2f',meanerrors,meanture)

% 3.对MIT室内场景数据库中的测试集添加噪声,
% 然后使用测量最短距离的方式进行二分类,给出噪声情况下的分类错误率和准确率。
%% 设置参数
clc;clear;close all; 
path='D:\Desktop\大三上\神经网络\实验三\数据\MIT室内场景';
ObjDir1='\airport_inside';
ObjDir2='\bakery';
a=10; %留出法划分次数
%% 读取指定路径下单个文件夹所有图像
% 读取机场的图片并处理
cd ([path,ObjDir1]); %切换到指定路径下 
allfigs=struct2cell(dir('*.jpg')); %只处理jpg文件 
[w,img_num]=size(allfigs); %获得文件的个数 
phi1=zeros(img_num,64*64);

for pn=1:img_num %逐次取出图片 % 将图像数据保存于phi1
    image_name=allfigs{1,pn}; %allfigs{1,pn}存储每个图片的名字 
    img_origin=imread(image_name); %读取图片 
    % 加载样本图像到30*(64*64)的矩阵中,每一行代表一幅图像
    I0=imnoise(img_origin,'salt & pepper',0.2); %加入噪声密度:0.2的椒盐噪声
    % 注意!!!读图之前需要进行灰度二值化
    I1=rgb2gray(I0); % RGB图像转灰度图像
    I1=imnoise(I1,'salt & pepper',0.2); %加入噪声密度:0.2的椒盐噪声
    Image=imresize(I1,[64,64]);
    phi1(pn,:)=double(reshape(Image,1,[]));
end
% 将机场和面包房分别作为正1、负-1样本,给出训练样本的标签Xlabel
XLable=ones(img_num,1);
phi1=[phi1 XLable];

% 读取面包房的图片并处理
cd ([path,ObjDir2]); %切换到指定路径下 
allfigs=struct2cell(dir('*.jpg')); %只处理jpg文件 
[w,img_num]=size(allfigs); %获得文件的个数 
phi2=zeros(img_num,64*64);

for pn=1:img_num %逐次取出图片 % 将图像数据保存于phi2
    image_name=allfigs{1,pn}; %allfigs{1,pn}存储每个图片的名字 
    img_origin=imread(image_name); %读取图片 
    % 加载样本图像到30*(64*64)的矩阵中,每一行代表一幅图像
    I0=imnoise(img_origin,'salt & pepper',0.2); %加入噪声密度:0.2的椒盐噪声
    % 注意!!!读图之前需要进行灰度二值化
    I1=rgb2gray(I0); % RGB图像转灰度图像
    I1=imnoise(I1,'salt & pepper',0.2); %加入噪声密度:0.2的椒盐噪声
    Image=imresize(I1,[64,64]);
    phi2(pn,:)=double(reshape(Image,1,[]));
end

% 将机场和面包房分别作为正1、负-1样本,给出训练样本的标签Xlabel
XLable=-1*ones(img_num,1);
phi2=[phi2 XLable];

% 列拼接两个矩阵
phi=[phi1;phi2];
%% 留出法划分互斥的训练集和测试集
% 二维数组五次二划分
for i=1:a
    % 划分训练集和测试集比例(2:1划分)
    b=randperm(length(phi(:,1))); %打乱列序列
    e=round(length(phi(:,1))*2/3);
    c=b(1:e); %取打乱序列的前60%
    d=b(e+1:end); %取打乱序列的后40% %end直到数组结尾
    
    atrain=phi(c,:); %(:,:)为取原矩阵行和列,(:,1:50)为取原矩阵列,行取前60%
    atest=phi(d,:); %(:,d)为取原矩阵列,行取随机40%的行
    Xtrain{1,i}=atrain; %保存在train的(1,1)cell
    Xtest{1,i}=atest;
end
% 保存五次二划分的数据集
save ('Xtrain.mat','Xtrain');
save ('Xtest.mat','Xtest');
save('A.mat','a');
%% 读取五次二划分
% clear;clc
% load Xtrain.mat
% load Xtest.mat
% load A.mat
%% 欧式距离判断测试集和哪个训练集最相似,然后把该训练集的标签给该测试集
for i=1:a % a为二划分次数
    % {}为元胞数组
    btrain=Xtrain{1,i}; %读取保存在train的(1,1)cell
    btest=Xtest{1,i};
    tempdis=inf;tempj=0;
    Xlable=zeros(1,size(btest,1));
    flag=0; % 记录错误个数
    for j=1:size(btest,1) % 测试集的3行数据逐一进行比对
        test{1,j}=ones(size(btest,2),1); % size(A,2)得到A的列数
        test{1,j}=btest(j,:);
        Xlable(j)=test{1,j}(1,end);  % 读取测试集标签
        for k=1:size(btrain,1) % 分别与训练集的5行数据一一比对
            train{1,k}=ones(size(btrain,2),1); 
            train{1,k}=btrain(k,:);
            % 计算两者之间的欧式距离
            distance=sqrt(sum(abs(test{1,j}-train{1,k})).^2);  %sum(x.^2)计算数组的平方和
            if(distance<tempdis)
                tempdis=distance;tempj=k; % 如果距离最小则判断为同一类型
                train{1,j}(1,end)=train{1,k}(1,end); % 将最短距离的训练集标签赋值给测试集
            end
        end
        % 计算错误个数
        if(train{1,j}(1,end)~=Xlable(j))
            flag=flag+1;
        end
    end
    % 计算每个测试集的错误率和准确率
    rateerrors(i)=flag/size(btest,1);
    rateture(i)=1-rateerrors(i);
    % sprintf('错误率为:%.2f   正确率为:%.2f',rateerrors,rateture)
end
% 计算五次划分的错误率和准确率均值
meanerrors=mean(rateerrors(:));
meanture=mean(rateture(:));
sprintf('错误率为:%.2f   正确率为:%.2f',meanerrors,meanture)

实验四

% 1.将MIT室内场景数据库中卧室、浴室作为正负样本,利用留出法完成训练集与测试集的划分(比例2:1),
% 并使用测量夹角余弦的方式进行二分类(0为负,1为正),
% 最后给出分类错误率和准确率,并绘制ROC曲线。
%% 设置参数
clc;clear;close all; 
path='D:\Desktop\大三上\神经网络\实验四\MIT室内场景2';
ObjDir1='\bathroom';
ObjDir2='\bedroom';
a=10; %留出法划分次数
%% 读取指定路径下单个文件夹所有图像
% 读取机场的图片并处理
cd ([path,ObjDir1]); %切换到指定路径下 
allfigs=struct2cell(dir('*.jpg')); %只处理jpg文件 
[w,img_num]=size(allfigs); %获得文件的个数 
phi1=zeros(img_num,64*64);
for pn=1:img_num %逐次取出图片 % 将图像数据保存于phi1
    image_name=allfigs{1,pn}; %allfigs{1,pn}存储每个图片的名字 
    img_origin=imread(image_name); %读取图片
    I1=rgb2gray(img_origin); % RGB图像转灰度图像
    Image=imresize(I1,[64,64]);
    phi1(pn,:)=double(reshape(Image,1,[]));
end
% 将浴室和卧室分别作为正1、负0样本,给出训练样本的标签Xlabel
XLable=ones(img_num,1);
phi1=[phi1 XLable];

% 读取卧室的图片并处理
cd ([path,ObjDir2]); %切换到指定路径下 
allfigs=struct2cell(dir('*.jpg')); %只处理jpg文件 
[w,img_num]=size(allfigs); %获得文件的个数 
phi2=zeros(img_num,64*64);
for pn=1:img_num %逐次取出图片 % 将图像数据保存于phi
    image_name=allfigs{1,pn}; %allfigs{1,pn}存储每个图片的名字 
    img_origin=imread(image_name); %读取图片
    % I1=rgb2gray(img_origin); % RGB图像转灰度图像
    Image=imresize(I1,[64,64]);
    phi2(pn,:)=double(reshape(Image,1,[]));
end
% 将浴室和卧室分别作为正1、负0样本,给出训练样本的标签Xlabel
XLable=zeros(img_num,1);
phi2=[phi2 XLable];
%% 列拼接两个矩阵并归一化
phi=[phi1;phi2];
% 矩阵归一化
phihead=phi(:,1:end-1);
[phihead,PS]=mapminmax(phihead); %[phi,PS]中phi为归一化后数值,PS为一种对应关系
% phi(1:end-1,:)为除标签栏(最后一列)之外归一化
phi=[phihead,phi(:,end)];
%% 留出法划分互斥的训练集和测试集
% 二维数组a次二划分
for i=1:a
    % 划分训练集和测试集比例(2:1划分)
    b=randperm(length(phi(:,1))); %打乱列序列
    e=round(length(phi(:,1))*2/3);
    c=b(1:e); %取打乱序列的前60%
    d=b(e+1:end); %取打乱序列的后40% %end直到数组结尾
    
    atrain=phi(c,:); %(:,:)为取原矩阵行和列,(:,1:50)为取原矩阵列,行取前60%
    atest=phi(d,:); %(:,d)为取原矩阵列,行取随机40%的行
    Xtrain{1,i}=atrain; %保存在train的(1,1)cell
    Xtest{1,i}=atest;
end
%% 保存五次二划分的数据集
save ('Xtrain.mat','Xtrain');
save ('Xtest.mat','Xtest');
save('A.mat','a');
% 读取五次二划分
clear;clc
load Xtrain.mat
load Xtest.mat
load A.mat
%% 夹角余弦判断测试集和哪个训练集最相似,然后把该训练集的标签给该测试集
for i=1:a % a为二划分次数
    % {}为元胞数组
    btrain=Xtrain{1,i}; %读取保存在train的(1,1)cell
    btest=Xtest{1,i};
    tempdis=-inf;tempj=0;
    Xlable{1,i}=zeros(1,size(btest,1));
    count=0; % 记录错误个数
    for j=1:size(btest,1) % 测试集的几行数据逐一进行比对
        test{1,j}=ones(size(btest,2),1); % size(A,2)得到A的列数
        test{1,j}=btest(j,:);
        Xlable{1,i}(j)=test{1,j}(1,end);  % 读取测试集标签
        for k=1:size(btrain,1) % 分别与训练集的几行数据一一比对
            train{1,k}=ones(size(btrain,2),1); 
            train{1,k}=btrain(k,:);
            % 计算两者之间的夹角余弦
            B=[test{1,j};train{1,k}]; %将后续进行计算的两行代码放到一个矩阵
            distance=1-pdist(B,'cosine'); %计算夹角余弦
            if(distance>tempdis) %余弦值越接近1,两个向量越相似
                tempdis=distance;tempj=k; % 如果距离最大则判断为同一类型
                % test{1,j}(1,end)=train{1,k}(1,end); % 将夹角余弦最短的训练集标签赋值给测试集
                res=train{1,k}(1,end);
            end
        end
        ress(j)=res;
        % 计算错误个数
        if(res~=Xlable{1,i}(j))
            count=count+1;
        end
        % 将分类器对测试集的分类结果合并成一行
        Xlable{1,i}(j)=test{1,j}(1,end);  % 读取分类器对测试集的分类结果标签
    end
    % 计算每个测试集的错误率和准确率
    rateerrors(i)=count/size(btest,1);
    rateture(i)=1-rateerrors(i);
    % sprintf('错误率为:%.2f   正确率为:%.2f',rateerrors,rateture)
end
% 计算a次划分的错误率和准确率均值
meanerrors=mean(rateerrors(:));
meanture=mean(rateture(:));
sprintf('错误率为:%.2f   正确率为:%.2f',meanerrors,meanture)
%% 绘制ROC曲线
title('ROC曲线')
for i=1:a % a为二划分次数
    subplot(2,5,i);
    auc=plot_roc(ress,btest(:,end)');
end
% 2.对测试集添加噪声,给出噪声情况下的分类错误率、准确率、ROC曲线
%% 设置参数
clc;clear;close all; 
path='F:\study\机器学习\机器学习实验四\MIT室内场景2';
ObjDir1='\bathroom';
ObjDir2='\bedroom';
a=10; %留出法划分次数
%% 读取指定路径下单个文件夹所有图像
% 读取机场的图片并处理
cd ([path,ObjDir1]); %切换到指定路径下 
allfigs=struct2cell(dir('*.jpg')); %只处理jpg文件 
[w,img_num]=size(allfigs); %获得文件的个数 
phi1=zeros(img_num,64*64);
for pn=1:img_num %逐次取出图片 % 将图像数据保存于phi1
    image_name=allfigs{1,pn}; %allfigs{1,pn}存储每个图片的名字 
    img_origin=imread(image_name); %读取图片
    I0=imnoise(img_origin,'salt & pepper',0.2); %加入噪声密度:0.2的椒盐噪声
    I1=rgb2gray(I0); % RGB图像转灰度图像
    Image=imresize(I1,[64,64]);
    phi1(pn,:)=double(reshape(Image,1,[]));
end
% 将浴室和卧室分别作为正1、负0样本,给出训练样本的标签Xlabel
XLable=ones(img_num,1);
phi1=[phi1 XLable];

% 读取卧室的图片并处理
cd ([path,ObjDir2]); %切换到指定路径下 
allfigs=struct2cell(dir('*.jpg')); %只处理jpg文件 
[w,img_num]=size(allfigs); %获得文件的个数 
phi2=zeros(img_num,64*64);
for pn=1:img_num %逐次取出图片 % 将图像数据保存于phi
    image_name=allfigs{1,pn}; %allfigs{1,pn}存储每个图片的名字 
    img_origin=imread(image_name); %读取图片
    if(ndims(img_origin)==3)
        img_origin=rgb2gray(img_origin); % RGB图像转灰度图像
    end
    I1=imnoise(img_origin,'salt & pepper',0.2); %加入噪声密度:0.2的椒盐噪声
    Image=imresize(I1,[64,64]);
    phi2(pn,:)=double(reshape(Image,1,[]));
end
% 将浴室和卧室分别作为正1、负0样本,给出训练样本的标签Xlabel
XLable=zeros(img_num,1);
phi2=[phi2 XLable];
%% 列拼接两个矩阵并归一化
phi=[phi1;phi2];
% 矩阵归一化
phihead=phi(:,1:end-1);
[phihead,PS]=mapminmax(phihead); %[phi,PS]中phi为归一化后数值,PS为一种对应关系
% phi(1:end-1,:)为除标签栏(最后一列)之外归一化
phi=[phihead,phi(:,end)];
%% 留出法划分互斥的训练集和测试集
% 二维数组a次二划分
for i=1:a
    % 划分训练集和测试集比例(2:1划分)
    b=randperm(length(phi(:,1))); %打乱列序列
    e=round(length(phi(:,1))*2/3);
    c=b(1:e); %取打乱序列的前60%
    d=b(e+1:end); %取打乱序列的后40% %end直到数组结尾
    
    atrain=phi(c,:); %(:,:)为取原矩阵行和列,(:,1:50)为取原矩阵列,行取前60%
    atest=phi(d,:); %(:,d)为取原矩阵列,行取随机40%的行
    Xtrain{1,i}=atrain; %保存在train的(1,1)cell
    Xtest{1,i}=atest;
end
%% 保存五次二划分的数据集
save ('Xtrain.mat','Xtrain');
save ('Xtest.mat','Xtest');
save('A.mat','a');
% 读取五次二划分
clear;clc
load Xtrain.mat
load Xtest.mat
load A.mat
%% 夹角余弦判断测试集和哪个训练集最相似,然后把该训练集的标签给该测试集
for i=1:a % a为二划分次数
    % {}为元胞数组
    btrain=Xtrain{1,i}; %读取保存在train的(1,1)cell
    btest=Xtest{1,i};
    tempdis=-inf;tempj=0;
    Xlable{1,i}=zeros(1,size(btest,1));
    count=0; % 记录错误个数
    for j=1:size(btest,1) % 测试集的几行数据逐一进行比对
        test{1,j}=ones(size(btest,2),1); % size(A,2)得到A的列数
        test{1,j}=btest(j,:);
        Xlable{1,i}(j)=test{1,j}(1,end);  % 读取测试集标签
        for k=1:size(btrain,1) % 分别与训练集的几行数据一一比对
            train{1,k}=ones(size(btrain,2),1); 
            train{1,k}=btrain(k,:);
            % 计算两者之间的夹角余弦
            B=[test{1,j};train{1,k}]; %将后续进行计算的两行代码放到一个矩阵
            distance=1-pdist(B,'cosine'); %计算夹角余弦
            if(distance>tempdis) %余弦值越接近1,两个向量越相似
                tempdis=distance;tempj=k; % 如果距离最大则判断为同一类型
                % test{1,j}(1,end)=train{1,k}(1,end); % 将夹角余弦最短的训练集标签赋值给测试集
                res=train{1,k}(1,end);
            end
        end
        ress(j)=res;
        % 计算错误个数
        if(res~=Xlable{1,i}(j))
            count=count+1;
        end
        % 将分类器对测试集的分类结果合并成一行
        Xlable{1,i}(j)=test{1,j}(1,end);  % 读取分类器对测试集的分类结果标签
    end
    % 计算每个测试集的错误率和准确率
    rateerrors(i)=count/size(btest,1);
    rateture(i)=1-rateerrors(i);
    % sprintf('错误率为:%.2f   正确率为:%.2f',rateerrors,rateture)
end
% 计算a次划分的错误率和准确率均值
meanerrors=mean(rateerrors(:));
meanture=mean(rateture(:));
sprintf('错误率为:%.2f   正确率为:%.2f',meanerrors,meanture)
%% 绘制ROC曲线
title('噪声处理后的ROC曲线')
for i=1:a % a为二划分次数
    subplot(2,5,i);
    auc=plot_roc(ress,btest(:,end)');
end

标签:phi,end,img,num,64,图像,相似性,图像识别,度量
来源: https://blog.csdn.net/wtyuong/article/details/122626337