CIFAR-10的Matlab可视化与转化

本文介绍如何使用Matlab对CIFAR-10数据集进行读取及可视化处理,包括导入数据、读写图像、图像展示等步骤,并提供了完整的Matlab代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进来研究dl4j-examples里面的相关实例,经常用到例如MNIST、CIFAR等二进制图像集合。原程序用到的是二进制文件格式的读取,而如果想要看到里面数值具体的含义,需要对二进制文件进行可视化。

Matlab使用方便、编程简单,且无论在数值计算,还是在图像处理、模拟过程等方面都非常具有优势,缺点就是软件不开源、价格昂贵,因此滋生了如博主一样的广大盗版软件使用者_^_ 。

Matlab基础

1、导入数据:

load('you data path')
%获取文件名称、路径
[filename,filepath]=uigetfile()

2、读写图像:

[X, map] = imread(filename,format);%读入操作
imgray = rgb2gray(X);%转化为灰度图像
imwrite(image,filename);%图像写入文件操作

3、图像展示:

imshow(X,map);%显示图像
% 同一界面中显示多个图像
figure%假设显示四个图像
subplot(221),imshow(image1)
subplot(222),imshow(image2)
subplot(223),imshow(image3)
subplot(224),imshow(image4)

4、其它常识:

clear all%清空所有变量
close all%关闭所有Figure界面
quit/exit%退出Matlab

CIFAR-10数据集

该数据集的访问地址为http://www.cs.toronto.edu/~kriz/cifar.html,其中Python版本的图像显示可以参考python实现cifar10数据集的可视化

Matlab版本的数据集中包含以下文件:

  • batchs.meta.mat
  • data_batch_1.mat
  • data_batch_2.mat
  • data_batch_3.mat
  • data_batch_4.mat
  • data_batch_5.mat
  • readme.html
  • test_batch.mat

其中data_batch_i(1,2,3,4,5).mat中包含10000个32 32图片,共有50000张图片;test_batch.mat为测试集数据,共有10000张图片。

Matlab代码

for j=1:5,%读取训练集数据
    %读入第j个batch的数据
    load(['data_batch_' num2str(j) '.mat'])
    for i=1:size(data,1),%循环转化并写入文件
        p=data(i,:);
        label=labels(i);

        fig=zeros(32,32,3);
        fig(:,:,1)=reshape(p(1:1024),32,32)';
        fig(:,:,2)=reshape(p(1025:2048),32,32)';
        fig(:,:,3)=reshape(p(2049:end),32,32)';

        %将数据保存为PNG格式
        imwrite(fig/256,['image/batch_' num2str(j) '_label_' num2str(label) '_' num2str(i)  '.png'])
    end;
end;
% 功能:数据库抽样可视化 %% 加载 cifar10 数据 close all;clear;clc load (‘D:\myprojects\datasets\old\cifar-10-batches-mat\data_batch_1.mat’); data1=data; labels1=labels; clear data labels; load (‘D:\myprojects\datasets\old\cifar-10-batches-mat\data_batch_2.mat’); data2=data; labels2=labels; clear data labels; load (‘D:\myprojects\datasets\old\cifar-10-batches-mat\data_batch_3.mat’); data3=data; labels3=labels; clear data labels; load (‘D:\myprojects\datasets\old\cifar-10-batches-mat\data_batch_4.mat’); data4=data; labels4=labels; clear data labels; load (‘D:\myprojects\datasets\old\cifar-10-batches-mat\data_batch_5.mat’); data5=data; labels5=labels; clear data labels; load (‘D:\myprojects\datasets\old\cifar-10-batches-mat\test_batch.mat’); data6=data; labels6=labels; clear data labels; % 图片数据以及对应的labels database = [data1 labels1; data2 labels2; data3 labels3; data4 labels4; data5 labels5; data6 labels6]; cifar10labels = [labels1; labels2; labels3;labels4; labels5; labels6]; %% 可视化方案1:按类别进行抽样展示 [sortedLabels, index] = sort(cifar10labels); % 类别从小到达排序 dataInClass = database(index, :); % 根据类别对数据排序 % clear database; numImg = length(cifar10labels); % 统计图片总数目 numPerClass = numImg/length(unique(cifar10labels)); % 统计每类含有的图片数目 numShow = 100; % 设定抽样展示的图片总数 numInRow = 10; % 设定每行展示的图片总数 % 3232:图像大小 % 3:图像是RGB三通道 % I2: 4维的矩阵,前三维是 32323 的图片,第四维度是图像数目 I2 = uint8(zeros(32, 32, 3, numShow)); for i=1:numInRow randID = randi(numPerClass, numInRow, 1); % 随机生成 numInRow 个索引 index = randID + (i-1)numPerClass; % 每类被选取出来的图片索引 for j=1:length(index) image_r=dataInClass(index(j,:),1:1024); % 红色通道:1024位 image_g=dataInClass(index(j,:),1025:2048); % 绿色通道:1024维 image_b=dataInClass(index(j,:),2049:end-1); % 蓝色通道:1024维 image_rer = reshape(image_r, 32, 32); % 红色通道变形成 3232 大小 image_reg = reshape(image_g, 32, 32); % 绿色通道变形成 3232 大小 image_reb = reshape(image_b, 32, 32); % 蓝色通道变形成 32*32 大小 % R、G、B三通道融合,变成RGB彩色图片 image(:, :, 1) = image_rer’; image(:, :, 2) = image_reg’; image(:, :, 3) = image_reb’; % 将数据类型转换成:无符号8位整型 image = uint8(image); % 将处理好的图片存放在I2变量中 I2(:, :, :, j+(i-1)*numInRow) = image; end end % 画图 figure(‘Color’, [1 1 1]); hold on; montage(I2(:, :, :, :)); xlabel(‘sampling by labels’); set(get(gca,‘xlabel’),‘FontName’,‘Times New Roman’); %% 可视化方案2:随机进行抽样展示 numImg = length(cifar10labels); % 统计图片总数目 numPerClass = numImg/length(unique(cifar10labels)); % 统计每类含有的图片数目 numShow = 100; % 设定抽样展示的图片总数 numInRow = 10; % 设定每行展示的图片总数 numInColum = numShow/numInRow; % 设定每列展示的图片总数 % 3232:图像大小 % 3:图像是RGB三通道 % I2: 4维的矩阵,前三维是 3232*3 的图片,第四维度是图像数目 I2 = uint8(zeros(32, 32, 3, numShow)); randID = randi(numImg, numShow, 1); % 随机生成 numShow 个索引 for i=1:numInRow for j=1:numInColum image_r=database(randID(j+(i-1)*numInRow,:),1:1024); image_g=database(randID(j+(i-1)*numInRow,:),1025:2048); image_b=database(randID(j+(i-1)*numInRow,:),2049:end-1); image_rer=reshape(image_r, 32, 32); image_reg=reshape(image_g, 32, 32); image_reb=reshape(image_b, 32, 32); image(:, :,1)=image_rer’; image(:, :, 2)=image_reg’; image(:, :, 3)=image_reb’; image=uint8(image); I2(:, :, :, j+(i-1)*numInRow) = image; end end % 画图 figure(‘Color’, [1 1 1]); hold on; montage(I2(:, :, :, :)); xlabel(‘sampling by random’); set(get(gca,‘xlabel’),‘FontName’,‘Times New Roman’); % 功能:GIST特征的可视化 close all;clear;clc addpath ‘tools/gist’ %% 示例1 % 加载测试图片1 img11 = imread(‘test1.jpg’); % 调整图片大小 img1 = imresize(img11,[256,256]); % 设定参数: param.imageSize = [256 256]; % 图片大小:256*256 param.orientationsPerScale = [8 8 8 8]; % 4 尺度 8方向 param.numberBlocks = 4; % 图片分块数目 param.fc_prefilt = 4; % 计算 GIST 特征 [gist1, param] = LMgist(img1, ‘’, param); % 特征可视化 figure subplot(121) imshow(img1) title(‘Input image’) subplot(122) showGist(gist1, param) title(‘Descriptor’) %% 示例2 img22 = imread(‘test2.jpg’); img2 = imresize(img22,[256,256]); clear param param.imageSize = [256 256]; param.orientationsPerScale = [8 8 8 8]; param.numberBlocks = 4; param.fc_prefilt = 4; % 计算 GIST 特征 [gist2, param] = LMgist(img2, ‘’, param); % 特征可视化 figure subplot(121) imshow(img2) title(‘Input image’) subplot(122) showGist(gist2, param) title(‘Descriptor’) %% 示例3 img33 = imread(‘test3.jpg’); img3 = imresize(img33,[256,256]); clear param param.imageSize = [256 256]; param.orientationsPerScale = [8 8 8 8]; param.numberBlocks = 4; param.fc_prefilt = 4; % 计算 GIST 特征 [gist3, param] = LMgist(img3, ‘’, param); % 特征可视化 figure subplot(121) imshow(img3) title(‘Input image’) subplot(122) showGist(gist3, param) title(‘Descriptor’) % 功能:数据库特征提取 %% 加载 cifar10 数据 close all;clear;clc addpath ‘tools/gist’ load (‘D:\myprojects\datasets\old\cifar-10-batches-mat\data_batch_1.mat’); data1=data; labels1=labels; clear data labels; load (‘D:\myprojects\datasets\old\cifar-10-batches-mat\data_batch_2.mat’); data2=data; labels2=labels; clear data labels; load (‘D:\myprojects\datasets\old\cifar-10-batches-mat\data_batch_3.mat’); data3=data; labels3=labels; clear data labels; load (‘D:\myprojects\datasets\old\cifar-10-batches-mat\data_batch_4.mat’); data4=data; labels4=labels; clear data labels; load (‘D:\myprojects\datasets\old\cifar-10-batches-mat\data_batch_5.mat’); data5=data; labels5=labels; clear data labels; load (‘D:\myprojects\datasets\old\cifar-10-batches-mat\test_batch.mat’); data6=data; labels6=labels; clear data labels; % 图片数据以及对应的labels database = [data1 labels1; data2 labels2; data3 labels3; data4 labels4; data5 labels5; data6 labels6]; cifar10labels = [labels1; labels2; labels3;labels4; labels5; labels6]; %% 提取GIST特征 numImg = size(database,1); % 统计图片总数目 % 特征特征:512 CIFAR10 = zeros(numImg,512); % 遍历处理 for index = 1:numImg disp (['正在处理第',num2str(index),'张图片...']) image_r=database(index,1:1024); % 红色分量 image_g=database(index,1025:2048); % 绿色分量 image_b=database(index, 2049:end-1); % 蓝色分量 image_rer = reshape(image_r, 32, 32); % 红色分量变形成 32*32 大小 image_reg = reshape(image_g, 32, 32); % 绿色分量变形成 32*32 大小 image_reb = reshape(image_b, 32, 32); % 蓝色分量变形成 32*32 大小 % R、G、B三通道融合,变成RGB彩色图片 image(:, :, 1) = image_rer'; image(:, :, 2) = image_reg'; image(:, :, 3) = image_reb'; % 将数据类型转换成:无符号8位整型 image = uint8(image); % 图像水平翻转(为了官网图片保持一致) for k = 1:3 image_tmp(:,:,k) = fliplr(image(:,:,k)); end % GIST 参数 clear param param.orientationsPerScale = [8 8 8 8]; param.numberBlocks = 4; param.fc_prefilt = 4; % 计算 GIST 特征 [gist, param] = LMgist(image_tmp, '', param); CIFAR10(index,:) = gist; end CIFAR10 = [CIFAR10 double(cifar10labels)]; save(‘D:\myprojects\datasets\new\CIFAR10_GIST_512.mat’,‘CIFAR10’,‘-v7.3’); disp(‘GIST特征提取完毕!’); % 功能:特征预处理 close all;clear;clc; addpath 'tools\utils' 'datasets\new' load('D:\myprojects\datasets\new\CIFAR10_GIST_512.mat'); [num_sample,num_dimension] = size(CIFAR10(:,1:end-1)); Data = CIFAR10(:,1:num_dimension); % gist 特征 Labels = CIFAR10(:,end); % label信息 %% 训练集测试集划分 index = randsample(num_sample,1000); % 抽取1000个样本作为测试集 testdata = Data(index,:); testgnd = Labels(index,:); traindata = Data; % 剩余59000个样本作为训练集 traingnd = Labels; traindata(index,:)=[]; traingnd(index,:) =[]; %% 去均值 mm = mean(traindata,1); traindata = traindata-repmat(mm,size(traindata,1),1); testdata = testdata - repmat(mm,size(testdata,1),1); %% 归一化 traindata = normr(traindata); % 训练集归一化 testdata = normr(testdata); % 测试集归一化 db_data = [traindata;testdata]; % 将训练样本特征和测试样本特征合并 db_datagnd = [traingnd;testgnd]; % 将训练样本label和测试样本label合并 %% 方法一:使用 label 信息定义 groudtruth cateTrainTest = bsxfun(@eq, traingnd, testgnd'); % traingnd 和 testgnd 是对应训练样本和测试样本的labels. exp_data.index = index; exp_data.train_data = traindata; exp_data.test_data = testdata; exp_data.traingnd = traingnd; exp_data.testgnd = testgnd; exp_data.db_data = db_data; exp_data.db_datagnd = db_datagnd; exp_data.cateTrainTest = cateTrainTest; %% 方法二:使用 欧式距离/ topk 定义 groudtruth num_test = size(testdata,1); % 统计测试样本数目 num_train = size(traindata,1); % 统计训练样本数目 topK_Neighbors = 0.02*num_train; % ground truth:设置为 the top k percent points closet to the query; % topK_Neighbors = 50; DtrueTestTraining = distMat(testdata,traindata); % 测试样本训练样本之间的距离 [Dball, I] = sort(DtrueTestTraining,2); % 按行排列,每一行表示测试样本数据点训练样本数据点的距离 KNN.knn_index = I(:,1:topK_Neighbors); % 保存测试数据点的 0.02*num_train 个近邻索引 KNN.knn_dis = Dball(:,1:topK_Neighbors); % 保存测试数据点的 0.02*num_train 个近邻的欧式距离 exp_data.KNN = KNN; save('D:\myprojects\datasets\new\CIFAR10.mat','exp_data', '-v7.3'); disp('数据特征预处理完毕!'); % 功能:数据库特征提取 %% 加载 cifar10 数据 close all;clear;clc load ('D:\myprojects\datasets\old\cifar-10-batches-mat\data_batch_1.mat'); data1=data; clear data; load ('D:\myprojects\datasets\old\cifar-10-batches-mat\data_batch_2.mat'); data2=data; clear data; load ('D:\myprojects\datasets\old\cifar-10-batches-mat\data_batch_3.mat'); data3=data; clear data; load ('D:\myprojects\datasets\old\cifar-10-batches-mat\data_batch_4.mat'); data4=data; clear data; load ('D:\myprojects\datasets\old\cifar-10-batches-mat\data_batch_5.mat'); data5=data; clear data; load ('D:\myprojects\datasets\old\cifar-10-batches-mat\test_batch.mat'); data6=data; clear data; % 图片数据 database = [data1; data2; data3; data4; data5; data6]; numImg = size(database,1); % 统计图片总数目 if exist('D:\myprojects\datasets\old\img') rmdir('D:\myprojects\datasets\old\img','s'); end if exist('D:\myprojects\datasets\new\img_train') rmdir('D:\myprojects\datasets\new\img_train','s'); end if exist('D:\myprojects\datasets\new\img_test') rmdir('D:\myprojects\datasets\new\img_test','s'); end mkdir('D:\myprojects\datasets\old\img'); % 创建img文件夹,用于存放图片 mkdir('D:\myprojects\datasets\new\img_train'); % 创建img_train文件夹,存放训练图片 mkdir('D:\myprojects\datasets\new\img_test'); % 创建img_test 文件夹,存放测试图片 % 遍历处理 for index = 1:numImg disp (['正在处理第',num2str(index),'张图片...']) image_r=database(index,1:1024); % 红色分量 image_g=database(index,1025:2048); % 绿色分量 image_b=database(index, 2049:end); % 蓝色分量 image_rer = reshape(image_r, 32, 32); % 红色分量变形成 32*32 大小 image_reg = reshape(image_g, 32, 32); % 绿色分量变形成 32*32 大小 image_reb = reshape(image_b, 32, 32); % 蓝色分量变形成 32*32 大小 % R、G、B三通道融合,变成RGB彩色图片 image(:, :, 1) = image_rer'; image(:, :, 2) = image_reg'; image(:, :, 3) = image_reb'; % 将数据类型转换成:无符号8位整型 image = uint8(image); % 图像水平翻转(为了官网图片保持一致) for k = 1:3 image_tmp(:,:,k) = fliplr(image(:,:,k)); end % 保存图片 img_name = ['D:\myprojects\datasets\old\img\',num2str(index),'.jpg']; imwrite(image_tmp,img_name); end disp('图片保存完毕,下面进行训练数据测试数据的分割......'); load('D:\myprojects\datasets\new\CIFAR10.mat'); idx_test = exp_data.index; % 测试图片的索引 idx_train = (1:60000)'; idx_train(idx_test,:) = []; % 训练图片的索引 clear exp_data; disp('正在移动测试数据集...') for k = 1:length(idx_test); test_img = ['D:\myprojects\datasets\old\img\',num2str(idx_test(k)),'.jpg']; movefile(test_img,'D:\myprojects\datasets\new\img_test'); end disp('正在移动训练数据集...') for k = 1:length(idx_train); train_img = ['D:\myprojects\datasets\old\img\',num2str(idx_train(k)),'.jpg']; movefile(train_img,'D:\myprojects\datasets\new\img_train'); end rmdir('D:\myprojects\datasets\old\img'); disp('数据集分割完毕,存放在D:\myprojects\datasets\new文件夹下!') 使用局部敏感哈希(LSH)和K近邻(KNN)算法对CIFAR-10数据集进行分类
06-07
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值