2021年人工神经网络第四次作业-第一题:LeNet对于水果与动物进行分类

Posted 卓晴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021年人工神经网络第四次作业-第一题:LeNet对于水果与动物进行分类相关的知识,希望对你有一定的参考价值。

简 介: 对于有五种动物和五中水果组成的FAMNIST数据集合的图像分类问题进行了测试。本文主要是集中在前期的数据库的准备和网络的构建方面。对于网络的详细测试参见在 对于FAMNIST中的十种动物和水果进行识别测试 中的测试结果。

关键词 FAMNISTLENET人工神经网络

作业准备
文章目录
作业要求
数据预处理
数据文件整理
FAMNIST数据库
构建CNN
LeNet识别
作业总结
程序代码

 

§01 业准备


1.1 作业要求

  根据 2021年人工神经网络第四次作业要求 对于第一题的要求:设计一个卷积神经网络(CNN)完成对于给定水果(五类)和动物(五类)总共十类物体的识别。

1.1.1 数据库

  数据是 第十六届智能视觉组 中的比赛数据库。五种动物和五种水果彩色图片,大小为283×283,分别存储在是个目录中:

├─FruitAnimal
│ ├─动物
│ │ └─动物
│ │ ├─牛
│ │ ├─狗
│ │ ├─猪
│ │ ├─猫
│ │ └─马
│ └─水果
│ └─水果
│ ├─榴莲
│ ├─橙子
│ ├─苹果
│ ├─葡萄
│ └─香蕉

  数据库可以在 AI Studio 数据库下载

▲ 图1.1.1 AI Studio 中的数据库

 

§02 据预处理


  将原始的图片转换成一定尺寸的彩色、灰度图片,用于网络的训练。

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年人工神经网络第四次作业要求

2021年人工神经网络第四次作业-第四题:旋转的数字

2021年人工神经网络第四次作业要求:第七题

2021年人工神经网络第四次作业 - 第三题Cifar10

2021年人工神经网络第四次作业-第五题:危险品识别

2021年人工神经网络第四次作业 - 第二题MNIST手写体识别