ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-01-21 18:00:03  阅读:193  来源: 互联网

标签:phi end img num 64 图像 相似性 图像识别 度量


图像识别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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有