2021年人工神经网络第四次作业-第一题:LeNet对于水果与动物进行分类
Posted 卓晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021年人工神经网络第四次作业-第一题:LeNet对于水果与动物进行分类相关的知识,希望对你有一定的参考价值。
简 介: 对于有五种动物和五中水果组成的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 = [2021年人工神经网络第四次作业要求