简 介: 对于有五种动物和五中水果组成的FAMNIST数据集合的图像分类问题进行了测试。本文主要是集中在前期的数据库的准备和网络的构建方面。对于网络的详细测试参见在 对于FAMNIST中的十种动物和水果进行识别测试 中的测试结果。
关键词
: FAMNIST,LENET,人工神经网络
§01 作业准备
1.1 作业要求
根据 2021年人工神经网络第四次作业要求 对于第一题的要求:设计一个卷积神经网络(CNN)完成对于给定水果(五类)和动物(五类)总共十类物体的识别。
1.1.1 数据库
数据是 第十六届智能视觉组 中的比赛数据库。五种动物和五种水果彩色图片,大小为283×283,分别存储在是个目录中:
├─FruitAnimal
│ ├─动物
│ │ └─动物
│ │ ├─牛
│ │ ├─狗
│ │ ├─猪
│ │ ├─猫
│ │ └─马
│ └─水果
│ └─水果
│ ├─榴莲
│ ├─橙子
│ ├─苹果
│ ├─葡萄
│ └─香蕉
数据库可以在 AI Studio 数据库下载 。
▲ 图1.1.1 AI Studio 中的数据库
§02 数据预处理
将原始的图片转换成一定尺寸的彩色、灰度图片,用于网络的训练。
- 处理后的图片下载地址: 飞桨AI Studio - 人工智能学习与实训社区
2.1 数据文件整理
2.1.1 Studio项目
在AI Stdio中建立基于BML CodeLab工作环境的训练项目,添加“五种动物和水果数据库”。进入环境之后,可以在环境中找到数据库:
▲ 图2.1.1 建立AI Studio工程项目
data/data120001/FruitAnimal.zip
2.1.2 下载数据文件
由于原来给定的数据文件存在目录是汉字,在AI studio环境操作有一定的困难。
▲ 图2.1.2 原始的压缩包中的目录是汉字
因此将该压缩包下载到本地,经过解压缩之后,将所有的子目录的名称修改成对应的英文。然后在重新压缩上载到AI Studio中的 “/data” 字母中。
├─animal
│ ├─cat
│ ├─cow
│ ├─dog
│ ├─horse
│ └─pig
└─fruit
├─apple
├─banana
├─durian
├─grape
└─orange
2.1.3 加压缩文件
可以利用AI Studio中的“抽取压缩文件” 鼠标右键功能对于上载数据文件 FruitAnimal.zip文件进行解压缩。也可以通过 Python中读取ZIP文件 ,对于压缩文件进行解压缩。
2.1.4 整理成faMNIST数据库
总共有十种图片(五种动物,五种水果),下面将这些图片整理成不同规格图片数据库。
(1)文件命名规范
Ⅰ.动物水果排序
十种动物和水果的种类按照下面的 dict中的定义顺序:
afname = {'cat':0, 'cow':1, 'dog':2, 'horse':3, 'pig':4,
'apple':5, 'banana':6, 'durian':7, 'grape':8, 'orange':9}
Ⅱ.文件名结构
文件名称包括有:排序号,原文件名称信息,如下所示:
排序_01.png
下面是经过处理之后,FAMNIST目录中部分文件名称:
0_01.png 1_39.png 2_67.png 4_03.png 5_45.png 6_87.png 8_49.png
0_02.png 1_3.png 2_68.png 4_04.png 5_46.png 6_88.png 8_50.png
0_03.png 1_40.png 2_69.png 4_05.png 5_47.png 6_89.png 8_51.png
0_04.png 1_41.png 2_70.png 4_06.png 5_48.png 6_90.png 8_52.png
0_05.png 1_42.png 2_71.png 4_07.png 5_49.png 6_91.png 8_53.png
0_06.png 1_43.png 2_72.png 4_08.png 5_50.png 6_92.png 8_54.png
0_07.png 1_44.png 2_73.png 4_09.png 5_51.png 6_93.png 8_55.png
0_08.png 1_45.png 2_74.png 4_10.png 5_52.png 7_01.png 8_56.png
0_09.png 1_46.png 2_75.png 4_11.png 5_53.png 7_02.png 8_57.png
0_10.png 1_47.png 2_76.png 4_12.png 5_54.png 7_03.png 8_58.png
0_11.png 1_48.png 2_77.png 4_13.png 5_55.png 7_04.png 8_59.png
0_12.png 1_49.png 2_78.png 4_14.png 5_56.png 7_05.png 8_60.png
0_13.png 1_4.png 2_79.png 4_15.png 5_57.png 7_06.png 8_61.png
0_14.png 1_50.png 2_80.png 4_16.png 5_58.png 7_07.png 8_62.png
0_15.png 1_51.png 2_81.png 4_17.png 5_59.png 7_08.png 8_63.png
0_16.png 1_52.png 2_82.png 4_18.png 5_60.png 7_09.png 8_64.png
0_17.png 1_53.png 2_83.png 4_19.png 5_61.png 7_10.png 8_65.png
十种动物水果每个小类的数量如下:
1.cow:93
2.pig:88
3.cat:99
4.horse:95
5.dog:101
6.apple:88
7.durian:75
8.orange:86
9.grape:89
10.banana:93
All file: 907
- 文件数量: 907
(2)处理程序
下面是将原有的文件进行拷贝,重新命名的程序:
import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *
import shutil
homepath = '/home/aistudio'
originpath = 'data/afmnist'
fapath = os.path.join(homepath, originpath)
def scanallpath(fpath):
subpath = []
fs1 = os.listdir(fpath)
for p in fs1[:2]:
scanfs = os.listdir(os.path.join(fpath,p))
sp = os.path.join(fpath, p)
for s in scanfs:
subpath.append(os.path.join(sp, s))
return subpath
allpath = scanallpath(fapath)
afname = {'cat':0, 'cow':1, 'dog':2, 'horse':3, 'pig':4,
'apple':5, 'banana':6, 'durian':7, 'grape':8, 'orange':9}
outpath = os.path.join(homepath, 'data/FAMNIST/FAMNIST-ALL')
allcount = 0
passid = 0
for p in allpath:
passid += 1
fdim = os.listdir(p)
pname = afname[p.split('/')[-1]]
subcount = 0
for fn in fdim:
if fn.find('png') < 0: continue
fname = os.path.join(p, fn)
newname = '%d_%s'%(pname, fn)
outname = os.path.join(outpath, newname)
shutil.copy(fname, outname)
allcount += 1
subcount += 1
print('{}.{}:{}'.format(passid, p.split('/')[-1], subcount))
print('All file: {}'.format(allcount))
2.2 FAMNIST数据库
为了作业中的实验,将动物水果数据集合进行整理:
- 将图片Resize成不同尺寸的小图;
- 将图片进行增强;
2.2.1 原始图片库
这是最初时的图片数据库。
-
数据库参数:
-
种类
:10类
色彩
:彩色图片
尺寸
:283×283
▲ 图2.2.1 原始数据中集中典型物品
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# SHOWPIC.PY -- by Dr. ZhuoQing 2021-12-16
#
# Show some pictures in the FAMNIST directory in shuffle order.
#
# Usage : showpic directory
#
# Note:
#============================================================
from headm import * # =*
import cv2
famnist = '/home/aistudio/data/famnist'
dirstr = 'famnist-all'
#------------------------------------------------------------
dirall = os.path.join(famnist, dirstr)
filedim = os.listdir(dirall)
random.shuffle(filedim)
#------------------------------------------------------------
ROW_NUM = 3
COL_NUM = 5
plt.figure(figsize=(10,6))
for j in range(ROW_NUM):
for i in range(COL_NUM):
id = j*COL_NUM + i
fn = os.path.join(dirall, filedim[id])
img = cv2.imread(fn).T[::-1].T
plt.subplot(ROW_NUM, COL_NUM, id+1)
plt.imshow(img)
plt.axis('off')
plt.title(filedim[id])
plt.show
#------------------------------------------------------------
# END OF FILE : SHOWPIC.PY
#============================================================
2.2.2 FAMNIST10
这是将原来的图片都变成32×32大小的彩色图片。
-
图片库参数:
-
存储目录
:FAMNIST10
色彩
:彩色图片
尺寸
:32×32
(1)转换程序
import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *
import cv2
famnist = '/home/aistudio/data/famnist'
alldir = 'famnist-all'
outdir = 'famnist10'
allpath = os.path.join(famnist, alldir)
filedim = os.listdir(allpath)
outdir = os.path.join(famnist, outdir)
imgWidth = 32
imgHeight = 32
for id, f in enumerate(filedim):
infile = os.path.join(allpath, f)
outfile = os.path.join(outdir, f)
img = cv2.imread(infile)
imgsize = cv2.resize(img, (imgWidth, imgHeight), cv2.INTER_LINEAR)
cv2.imwrite(outfile, imgsize)
print("Process %d, %s"%(id, f))
(2)图片样例
▲ 图2.2.2 FAMNIST10 32×32彩色图片
2.2.3 FAMNIST10-gray
这是将上面的FAMNIST10转换成灰度图片。
-
图片库参数:
-
存储目录
:FAMNIST10-gray
色彩
:灰度图片
尺寸
:32×32
imgWidth = 32
imgHeight = 32
for id, f in enumerate(filedim):
infile = os.path.join(allpath, f)
outfile = os.path.join(outdir, f)
img = cv2.imread(infile, cv2.IMREAD_GRAYSCALE)
imgsize = cv2.resize(img, (imgWidth, imgHeight), cv2.INTER_LINEAR)
▲ 图2.2.3 famnist10-gray 数据库
2.2.4 FAMNIST10-64
这是尺寸为64×64的图片库。
-
图片库参数:
-
存储目录
:famnist10-64
色彩
:彩色图片
尺寸
:64×64
▲ 图2.2.4 famnist10-64 图片样例
2.2.5 FAMNIST10-64-gray
这是上面famnist10-64图片存储成灰度图片。
图片库参数:
: 存储目录
:famnist10-64-gray
色彩
:灰度图片
尺寸
:64×64
▲ 图2.2.5 famnist10-64-gray
§03 构建CNN
3.1 LeNet识别
3.1.1 构建训练数据
将图片数据从存储目录读入内存,用于网络的训练。
(1)读入图片数据和标签
根据【2.1.4.1:文件命名规范】中对于文件名的定义,在读入图片数据的过程中,也可以获得图片的种类标签。
Ⅰ.读取程序
import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *
import cv2
#------------------------------------------------------------
famnist = '/home/aistudio/data/famnist'
imgdir = 'famnist10-gray'
#------------------------------------------------------------
def loadimgdata(imgdir):
'''
loadimgdata: Load test image data into RAM
Param imgdir: Directory for storing the image picture .
Return: imgdata,imglabel
'''
imgfile = os.listdir(imgdir)
imgdata = []
imglabel = []
for f in imgfile:
img = cv2.imread(os.path.join(imgdir, f))
imgdata.append(img.T)
imglabel.append(int(f[:1]))
return array(imgdata), array(imglabel)
imgdata,imglabel = loadimgdata(os.path.join(famnist,imgdir))
Ⅱ.数据结果
print(imgdata.shape)
print(imglabel)
(906, 3, 32, 32)
[6 6 3 4 9 6 0 6 3 2 2 3 2 0 4 3 8 9 2 9 9 9 0 4 0 3 9 4 1 3 8 4 0 4 2 8 6
4 9 0 0 4 9 2 3 7 8 7 9 5 6 0 7 2 3 6 5 3 0 9 8 6 0 0 3 0 4 0 9 4 0 4 3 6
0 5 7 9 3 3 1 8 2 4 6 4 6 5 2 9 9 2 3 0 5 8 3 7 6 0 2 4 5 7 8 5 6 9 3 4 8
4 8 1 8 9 2 4 8 7 3 2 6 8 9 0 5 1 8 3 5 4 3 6 8 1 6 9 0 0 9 0 5 5 8 9 9 7
7 5 4 7 1 3 8 9 5 2 2 6 6 1 6 6 7 7 6 4 4 5 4 0 1 3 5 3 6 9 1 6 2 0 6 2 3
9 8 2 8 5 5 9 5 2 0 2 4 1 5 6 1 7 2 0 0 5 7 8 1 4 0 1 3 4 9 1 6 8 8 9 1 9
9 8 2 4 8 3 9 6 7 6 2 6 5 4 4 0 4 2 3 3 3 1 3 1 1 8 0 2 8 4 8 3 3 6 9 0 8
7 2 7 7 9 0 3 2 2 3 2 2 0 4 5 5 3 7 0 7 0 9 4 4 5 6 2 2 0 9 7 3 6 4 0 4 1
0 0 1 2 5 6 6 3 5 6 6 1 3 0 5 3 2 6 9 2 0 7 5 2 2 0 4 3 5 4 7 0 5 2 1 3 4
2 5 2 9 4 9 4 2 1 7 6 2 5 1 0 6 0 0 4 9 6 4 7 3 4 9 4 8 2 7 8 2 3 8 6 6 6
4 0 3 3 7 8 8 4 9 6 9 7 3 8 5 2 1 8 8 4 9 2 0 8 6 5 1 4 8 1 7 6 1 5 8 8 0
0 0 1 1 3 5 0 8 3 3 6 8 7 6 7 4 8 6 7 8 7 3 0 3 1 8 5 5 4 2 8 4 0 2 9 6 2
0 2 1 7 4 8 5 1 4 2 6 9 3 1 1 2 1 1 1 5 4 9 5 0 1 7 5 8 0 3 3 0 2 1 5 7 1
7 0 8 3 9 6 8 0 2 9 8 1 6 3 7 7 2 3 3 1 2 2 9 5 4 3 9 3 1 5 2 6 2 5 2 8 0
3 9 7 1 7 7 7 7 4 6 1 3 9 4 0 3 7 0 5 8 8 9 7 1 1 9 8 1 1 0 7 3 8 3 2 0 9
1 7 7 8 4 1 1 0 8 2 5 5 2 7 1 9 2 8 6 1 9 6 6 6 9 2 5 4 1 9 5 2 3 8 6 5 2
8 9 1 6 6 5 0 2 5 7 1 6 0 1 6 7 6 5 8 0 9 6 0 3 0 4 2 9 3 1 2 7 3 6 1 4 3
4 7 2 6 5 4 8 0 6 2 5 8 8 2 6 1 8 0 4 6 4 9 0 4 8 7 1 6 9 4 8 1 3 5 5 5 1
2 9 4 2 1 5 6 4 0 0 3 1 1 9 8 4 1 2 7 2 5 5 3 7 6 0 4 0 1 0 7 1 4 5 3 8 6
5 9 1 6 4 7 1 9 7 3 1 7 5 7 7 1 5 6 9 2 6 5 7 3 9 3 5 5 4 8 5 6 9 0 3 2 8
0 1 0 6 9 2 4 2 3 8 4 0 5 8 0 7 9 5 9 0 6 7 4 2 6 6 9 1 8 1 0 7 0 9 9 2 3
0 2 3 9 8 8 3 3 3 8 7 5 2 8 2 1 0 2 2 0 9 3 3 0 1 9 8 2 0 4 1 6 5 3 6 0 8
3 9 5 1 4 1 8 5 2 2 8 1 1 1 4 6 0 4 8 5 4 0 6 2 1 5 6 0 2 5 7 5 6 8 9 5 0
0 1 8 4 1 3 4 1 7 8 6 5 7 9 4 5 3 3 3 2 9 6 3 5 3 5 5 2 7 0 1 2 9 2 6 9 4
7 0 2 8 6 9 4 8 0 7 7 2 2 4 3 2 5 1]
在数据读入过程中,通过矩阵转置操作,将数据转换成了RGB分层的数据结构。
(2)构建Dataset
class famnist(paddle.io.Dataset):
def __init__(self, num_samples):
super(famnist, self).__init__()
self.num_samples = num_samples
def __getitem__(self, index):
data = TT(imgdata[index].astype('float64'))
label = TT(imglabel[index].astype('int64'))
return data, label
def __len__(self):
return self.num_samples
_dataset = famnist(800)
train_loader = paddle.io.DataLoader(_dataset, batch_size=20, shuffle=True)
Ⅰ.测试Dataloader
对train_loader获得数据的结构以及显示图片,验证上述程序工作正常。
data = train_loader().next()
print(data)
[Tensor(shape=[20, 3, 32, 32], dtype=float64, place=CPUPlace, stop_gradient=True,
[[[[69. , 19. , 79. , ..., 178., 140., 173.],
[16. , 13. , 54. , ..., 214., 194., 153.],
[30. , 29. , 28. , ..., 201., 179., 191.],
...,
[254., 254., 254., ..., 254., 254., 254.],
[253., 253., 253., ..., 253., 253., 253.],
[253., 253., 253., ..., 253., 253., 253.]]]]), Tensor(shape=[20, 1], dtype=int64, place=CPUPlace, stop_gradient=True,
[[1],
[6],
[9],
[7],
[0],
[4],
[5],
[4],
[5],
[9],
[5],
[3],
[0],
[4],
[6],
[0],
[9],
[9],
[8],
[0]])]
使用图形显示train_loader所获得图片。
data = train_loader().next()
ROW_NUM = 3
COL_NUM = 5
plt.figure(figsize=(10,6))
for j in range(ROW_NUM):
for i in range(COL_NUM):
id = j*COL_NUM + i
img = data[0].numpy()[id].T
print(img.shape)
plt.subplot(ROW_NUM, COL_NUM, id+1)
plt.imshow(img, cmap='gray')
plt.axis('off')
▲ 图3.1.1 通过Database Loader获得的图片数据
从上面结果可以看到,所构造的训练数据加载函数是出正确的。
3.1.2 构建LeNet网络
imageSize = 64
ks = 5
L = ((imageSize-ks+1)//2-ks+1)//2
class mnist(paddle.nn.Layer):
def __init__(self, ):
super(mnist, self).__init__()
self.conv1 = paddle.nn.Conv2D(in_channels=1, out_channels=6, kernel_size=ks, stride=1, padding=0)
self.conv2 = paddle.nn.Conv2D(in_channels=6, out_channels=16, kernel_size=ks, stride=1, padding=0)
self.mp1 = paddle.nn.MaxPool2D(kernel_size=2, stride=2)
self.mp2 = paddle.nn.MaxPool2D(kernel_size=2, stride=2)
self.L1 = paddle.nn.Linear(in_features=16*L*L, out_features=120)
self.L2 = paddle.nn.Linear(in_features=120, out_features=86)
self.L3 = paddle.nn.Linear(in_features=86, out_features=10)
def forward(self, x):
x = self.conv1(x)
x = F.relu(x)
x = self.mp1(x)
x = self.conv2(x)
x = F.relu(x)
x = self.mp2(x)
x = paddle.flatten(x, start_axis=1, stop_axis=-1)
x = self.L1(x)
x = F.relu(x)
x = self.L2(x)
x = F.relu(x)
x = self.L3(x)
return x
3.1.3 训练LeNet网络
net = mnist()
EPOCH_NUM = 100
optimizer = paddle.optimizer.Adam(learning_rate=0.001, parameters=net.parameters())
for epoch in range(EPOCH_NUM):
for batchid, data in enumerate(train_loader()):
out = net(data[0])
loss = F.cross_entropy(out, data[1])
acc = paddle.metric.accuracy(out, data[1])
loss.backward()
optimizer.step()
optimizer.clear_grad()
if batchid %100==0:
print("Pass:{}, Loss:{}, Acc:{}".format(epoch,loss.numpy(), acc.numpy()))
▲ 图3.1.2 训练过程中精度变化曲线
from headm import *
strid = 12
tspgetdopstring(-strid)
strall = clipboard.paste().split('\r\n')
accdim = []
for s in strall:
ss = s.split(',')
acc = ss[-1].replace('Acc:[','').replace(']','')
accdim.append(float(acc.strip(' ')))
printf(accdim)
plt.plot(accdim)
plt.xlabel("Step")
plt.ylabel("Accuracy")
plt.grid(True)
plt.title("Train Accuracy")
plt.tight_layout()
plt.show()
§04 作业总结
对于有五种动物和五中水果组成的FAMNIST数据集合的图像分类问题进行了测试。本文主要是集中在前期的数据库的准备和网络的构建方面。对于网络的详细测试参见在 对于FAMNIST中的十种动物和水果进行识别测试 中的测试结果。
▲ 图4.1 对于FAMNIST中的始终动物和水果进行分类测试
4.1 程序代码
4.1.1 LENET程序
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# LENET.PY -- by Dr. ZhuoQing 2021-12-16
#
# Note:
#============================================================
from headm import * # =
import cv2
import paddle
import paddle.nn.functional as F
from paddle import to_tensor as TT
from paddle.nn.functional import square_error_cost as sqrc
#------------------------------------------------------------
famnist = '/home/aistudio/data/famnist'
imgdir = 'famnist10-64-gray'
#------------------------------------------------------------
def loadimgdata(imgdir):
'''
loadimgdata: Load test image data into RAM
Param imgdir: Directory for storing the image picture .
Return: imgdata,imglabel
'''
imgfile = os.listdir(imgdir)
imgdata = []
imglabel = []
for f in imgfile:
img = cv2.imread(os.path.join(imgdir, f))
imgdata.append(img.T[0][newaxis,:])
imglabel.append(int(f[:1]))
return array(imgdata), array(imglabel)
imgdata,imglabel = loadimgdata(os.path.join(famnist,imgdir))
print(len(imglabel))
print(imgdata.shape)
#------------------------------------------------------------
'''
printf(imgdata.shape)
printf(imglabel)
'''
#------------------------------------------------------------
class famnist(paddle.io.Dataset):
def __init__(self, num_samples):
super(famnist, self).__init__()
self.num_samples = num_samples
def __getitem__(self, index):
data = imgdata[index]/255
label = imglabel[index]
return TT(data, dtype='float32'), TT(label, dtype='int64')
def __len__(self):
return self.num_samples
_dataset = famnist(800)
train_loader = paddle.io.DataLoader(_dataset, batch_size=100, shuffle=True)
#------------------------------------------------------------
#data = train_loader().next()
#print(data[0].numpy())
'''
ROW_NUM = 3
COL_NUM = 5
plt.figure(figsize=(10,6))
for j in range(ROW_NUM):
for i in range(COL_NUM):
id = j*COL_NUM + i
img = data[0].numpy()[id][0].T
# print(img.shape)
plt.subplot(ROW_NUM, COL_NUM, id+1)
plt.imshow(img, cmap='gray')
plt.axis('off')
'''
#------------------------------------------------------------
imageSize = 64
ks = 5
L = ((imageSize-ks+1)//2-ks+1)//2
class mnist(paddle.nn.Layer):
def __init__(self, ):
super(mnist, self).__init__()
self.conv1 = paddle.nn.Conv2D(in_channels=1, out_channels=6, kernel_size=ks, stride=1, padding=0)
self.conv2 = paddle.nn.Conv2D(in_channels=6, out_channels=16, kernel_size=ks, stride=1, padding=0)
self.mp1 = paddle.nn.MaxPool2D(kernel_size=2, stride=2)
self.mp2 = paddle.nn.MaxPool2D(kernel_size=2, stride=2)
self.L1 = paddle.nn.Linear(in_features=16*L*L, out_features=120)
self.L2 = paddle.nn.Linear(in_features=120, out_features=86)
self.L3 = paddle.nn.Linear(in_features=86, out_features=10)
def forward(self, x):
x = self.conv1(x)
x = F.relu(x)
x = self.mp1(x)
x = self.conv2(x)
x = F.relu(x)
x = self.mp2(x)
x = paddle.flatten(x, start_axis=1, stop_axis=-1)
x = self.L1(x)
x = F.relu(x)
x = self.L2(x)
x = F.relu(x)
x = self.L3(x)
return x
#------------------------------------------------------------
net = mnist()
EPOCH_NUM = 100
optimizer = paddle.optimizer.Adam(learning_rate=0.001, parameters=net.parameters())
for epoch in range(EPOCH_NUM):
for batchid, data in enumerate(train_loader()):
out = net(data[0])
loss = F.cross_entropy(out, data[1])
acc = paddle.metric.accuracy(out, data[1])
loss.backward()
optimizer.step()
optimizer.clear_grad()
if batchid %100==0:
print("Pass:{}, Loss:{}, Acc:{}".format(epoch,loss.numpy(), acc.numpy()))
#------------------------------------------------------------
# END OF FILE : LENET.PY
#============================================================
4.1.2 图片处理程序
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# FAMNIST10.PY -- by Dr. ZhuoQing 2021-12-16
#
# Note:
#============================================================
from headm import * # =*
import cv2
famnist = '/home/aistudio/data/famnist'
alldir = 'famnist-all'
outdir = 'famnist10-64-gray'
#------------------------------------------------------------
allpath = os.path.join(famnist, alldir)
filedim = os.listdir(allpath)
#print(filedim)
#------------------------------------------------------------
outdir = os.path.join(famnist, outdir)
imgWidth = 64
imgHeight = 64
for id, f in enumerate(filedim):
infile = os.path.join(allpath, f)
outfile = os.path.join(outdir, f)
img = cv2.imread(infile, cv2.IMREAD_GRAYSCALE)
# img = cv2.imread(infile, cv2.IMREAD_COLOR)
imgsize = cv2.resize(img, (imgWidth, imgHeight), cv2.INTER_LINEAR)
# printf(imgsize.shape)
# break
cv2.imwrite(outfile, imgsize)
print("Process %d, %s"%(id, f))
#------------------------------------------------------------
# END OF FILE : FAMNIST10.PY
#============================================================
4.1.3 显示目录照片
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# SHOWPIC.PY -- by Dr. ZhuoQing 2021-12-16
#
# Show some pictures in the FAMNIST directory in shuffle order.
#
# Usage : showpic directory
#
# Note:
#============================================================
from headm import * # =*
import cv2
famnist = '/home/aistudio/data/famnist'
dirstr = 'famnist10-64-gray'
#------------------------------------------------------------
dirall = os.path.join(famnist, dirstr)
filedim = os.listdir(dirall)
random.shuffle(filedim)
#------------------------------------------------------------
ROW_NUM = 3
COL_NUM = 5
plt.figure(figsize=(10,6))
for j in range(ROW_NUM):
for i in range(COL_NUM):
id = j*COL_NUM + i
fn = os.path.join(dirall, filedim[id])
img = cv2.imread(fn).T[::-1].T
plt.subplot(ROW_NUM, COL_NUM, id+1)
plt.imshow(img)
plt.axis('off')
plt.title(filedim[id])
plt.show
#------------------------------------------------------------
# END OF FILE : SHOWPIC.PY
#============================================================
4.1.4 生成原始图片集合
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# FAMNIST.PY -- by Dr. ZhuoQing 2021-12-16
#
# Note:
#============================================================
from headm import * # =*
import shutil
homepath = '/home/aistudio'
originpath = 'data/afmnist'
fapath = os.path.join(homepath, originpath)
#------------------------------------------------------------
def scanallpath(fpath):
subpath = []
fs1 = os.listdir(fpath)
for p in fs1[:2]:
scanfs = os.listdir(os.path.join(fpath,p))
sp = os.path.join(fpath, p)
for s in scanfs:
subpath.append(os.path.join(sp, s))
return subpath
#------------------------------------------------------------
allpath = scanallpath(fapath)
#printf(allpath)
#------------------------------------------------------------
afname = {'cat':0, 'cow':1, 'dog':2, 'horse':3, 'pig':4,
'apple':5, 'banana':6, 'durian':7, 'grape':8, 'orange':9}
outpath = os.path.join(homepath, 'data/FAMNIST/FAMNIST-ALL')
allcount = 0
passid = 0
for p in allpath:
passid += 1
fdim = os.listdir(p)
pname = afname[p.split('/')[-1]]
subcount = 0
for fn in fdim:
if fn.find('png') < 0: continue
fname = os.path.join(p, fn)
newname = '%d_%s'%(pname, fn)
outname = os.path.join(outpath, newname)
shutil.copy(fname, outname)
allcount += 1
subcount += 1
# printf(outname)
printf('{}.{}:{}'.format(passid, p.split('/')[-1], subcount))
printf('All file: {}'.format(allcount))
#------------------------------------------------------------
# END OF FILE : FAMNIST.PY
#============================================================
■ 相关文献链接:
● 相关图表链接: