简 介: 通过对于物品X射线数据集合的整理,挑选出15类体积比较大的物品,训练LeNet网络进行识别。

关键词X射线危险品识别LeNetPaddle

#mermaid-svg-wZUMACGQlsBkwyJU {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-wZUMACGQlsBkwyJU .error-icon{fill:#552222;}#mermaid-svg-wZUMACGQlsBkwyJU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-wZUMACGQlsBkwyJU .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-wZUMACGQlsBkwyJU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-wZUMACGQlsBkwyJU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-wZUMACGQlsBkwyJU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-wZUMACGQlsBkwyJU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-wZUMACGQlsBkwyJU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-wZUMACGQlsBkwyJU .marker.cross{stroke:#333333;}#mermaid-svg-wZUMACGQlsBkwyJU svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-wZUMACGQlsBkwyJU .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-wZUMACGQlsBkwyJU .cluster-label text{fill:#333;}#mermaid-svg-wZUMACGQlsBkwyJU .cluster-label span{color:#333;}#mermaid-svg-wZUMACGQlsBkwyJU .label text,#mermaid-svg-wZUMACGQlsBkwyJU span{fill:#333;color:#333;}#mermaid-svg-wZUMACGQlsBkwyJU .node rect,#mermaid-svg-wZUMACGQlsBkwyJU .node circle,#mermaid-svg-wZUMACGQlsBkwyJU .node ellipse,#mermaid-svg-wZUMACGQlsBkwyJU .node polygon,#mermaid-svg-wZUMACGQlsBkwyJU .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-wZUMACGQlsBkwyJU .node .label{text-align:center;}#mermaid-svg-wZUMACGQlsBkwyJU .node.clickable{cursor:pointer;}#mermaid-svg-wZUMACGQlsBkwyJU .arrowheadPath{fill:#333333;}#mermaid-svg-wZUMACGQlsBkwyJU .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-wZUMACGQlsBkwyJU .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-wZUMACGQlsBkwyJU .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-wZUMACGQlsBkwyJU .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-wZUMACGQlsBkwyJU .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-wZUMACGQlsBkwyJU .cluster text{fill:#333;}#mermaid-svg-wZUMACGQlsBkwyJU .cluster span{color:#333;}#mermaid-svg-wZUMACGQlsBkwyJU div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-wZUMACGQlsBkwyJU :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

作业准备
目 录
Contents
作业要求
数据库准备
测试数据库
构建网络
构建数据加载函数
训练数据加载
构建LeNet网络
构建训练过程
存储
网络训练
基本训练过程
作业总结
附录
数据库验证程序
LeNet网络与训练程序

§01 作业准备


1.1 作业要求

  由 2021年人工神经网络第四次作业 对于第五题的要求:

  ① 构造合适的神经网络,对于数据库中物品X射线图片进行识别分类。可以根据物品不同的大小,在训练网络之前对于图片进行预处理。

  ② 讨论实验结果中,造成识别错误的因素包括哪些。

  ③ 探讨如何利用图频的序列信息完成物品的识别的方法。根据自己的时间和经验,选做是否可以通过LSTM网络来利用图频的不同角度序列信息提高识别的精度。

  ④ 可以根据自己的时间和经验,选做一些目标定位的神经网络:比如YOLO3,SSD等来进行实验。

1.2 数据库准备

1.2.1 原始数据文件下载

  从网络学堂下载第四次作业的附加数据文件“ANN-DATASET”下载到自己电脑本地目录。将ZIP文件加压缩之后,形成如下数据目录:

├─CIFAR-10
├─FORBIDDEN
├─FruitAnimal
│  ├─动物
│  │  └─动物
│  └─水果
│      └─水果
├─MNIST
└─ROTATEDIGIT

  在FORBIDDEN 子目录中存在如下三个MATLAT数据文件。

    xraydata-120-100.matxraydata-240-200.matxraydata-96-80.mat

  这三个数据文件承载的都是相同的常见物品的X射线图片,只是相应的尺寸不同。在文件名称后面的两个数字表示这些数据图片的尺寸分别为:(120,100)、(240,200)、(96,80)。下面介绍对于xraydata-96-80.mat的操作,对于另外两个数据文件操作是相同的。

1.2.2 Studio中加载数据文件

  在AI Studio的 BML CodeLab环境下,领用界面左边管理界面,通过上载文件将xraydata-96-80.mat加载到工程的主目录下。

  注意,只有文件存储在项目主目录(/home/aistudio)下,下次启动的时候,该文件还是存在的。如果将文件存储在 data,work中,这两个目录都是临时目录,下次启动之后,其中的临时文件都会被清除。

▲ 图1.2.1 利用文件上载功能,将数据库文件上传到主目录下

1.2.3 安装mat4py

  根据 在Python中读取MATLAB的数据文件 介绍,通过mat4py 可以读取MATLAB的数据文件。在使用改软件包之前需要在当前的AI Studio中安装mat4py。

  在Notebook中执行下面的命令,安装mat4py软件包。

! pip install mat4py
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting mat4pyDownloading https://pypi.tuna.tsinghua.edu.cn/packages/e8/56/41b3ffd7b5f3eb3056979e0dc37de184c6e5dacd1a353e5de42323e7d138/mat4py-0.5.0-py2.py3-none-any.whl
Installing collected packages: mat4py
Successfully installed mat4py-0.5.0

1.2.4 加载数据

  执行下面代码片段,将xraydata-96-80.mat加载到Notebook环境中。

import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *
from mat4py                  import loadmatdatazipfile = '/home/aistudio/xraydata-96-80.mat'
data = loadmat(datazipfile)
printf(data.keys())

dict_keys(['images', 'labels', 'labeldir', 'imagesize'])

  在读入的data中包括有四个数据表格:

  • images : 物品X射线数据,个数:6401,数据长度 7680=98×80
  • labels:物品标签,个数:6401
  • labeldir :标签对于的字符形态;
  • imagesize:图片大小:98×80

  将图片数据和标号分别加载到数据 imgdata,labels中。

imgdata = data['images']
labels  = data['labels']print(type(imgdata), shape(imgdata))
print(type(labels), shape(labels))

<class 'list'> (6401, 7680)
<class 'list'> (6401,)

(1)图片种类

  在 labels 给出了图片的种类。

print(set(labels), "\n\n",  'Tatal Item :%d'%len(set(labels)))
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 600, 601, 602, 603, 604, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 500, 501, 502, 503, 504, 505, 506} Tatal Item :145

  总共有145个物品的图片。

1.2.5 显示数据图片

(1)随机挑选图片

  随机挑选6401个数据中24图片进行显示。

imgindex = list(range(len(labels)))
random.shuffle(imgindex)PIC_ROW = 4
PIC_COL = 6plt.figure(figsize=(12,8))for j in range(PIC_ROW):for i in range(PIC_COL):id = i + j*PIC_COLimg = array(imgdata[imgindex[id]]).reshape(80,96)plt.subplot(PIC_ROW, PIC_COL, id+1)plt.imshow(img, cmap=plt.cm.gray)

▲ 图1.2.2 数据库中的24个随机挑选图片

(2)显示特定种类物品

itemlabels = list(set(labels))
imgid = where(array(labels) == itemlabels[0])[0]print(imgid)PIC_ROW = 7
PIC_COL = 10
plt.figure(figsize=(12,8))
for j in range(PIC_ROW):for i in range(PIC_COL):id = i + j*PIC_COLif id >= len(imgid): breakimg = array(imgdata[imgid[id]]).reshape(80,96)plt.subplot(PIC_ROW, PIC_COL, id+1)plt.imshow(img, cmap=plt.cm.gray)plt.title('[%d]'%labels[imgid[id]])
 Ⅰ.第0号物品:锤子

  第0号物品:锤子。

▲ 图1.2.3 第0号物品:锤子。

 Ⅱ.第2号物品:尖嘴钳

  第2号物品:尖嘴钳。

▲ 图1.2.4 第2号物品:尖嘴钳

1.2.6 数据库物品

(1)挑选数据库物品

  数据路中物品有相同物品拍摄了两次,占用了两个编号的情况。其中有些物品非常小,在98×80分辨率下人眼也无法辨析其属性,下面挑选一些比较大的物品用于实验。

序号 物品名称 标号 总数
1 锤子 0 72
3 老虎嘴钳 3 54
3 圆把改锥 11 54
4 大砍刀 16 33
5 仿真手枪 22 53
6 水瓶 30 40
7 喷水壶 36 40
8 玻璃饭盒 42 40
9 方便面 69 40
10 拖鞋 92 40
11 耳机 107 40
12 手电筒 117 40
13 眼镜 113 60
14 塑料盒包含杂物 129 40
15 电动剃须刀 127 40

▲ 图1.2.5 不同标号对应的物品图片

▲ 图1.2.6 不同标号对应的物品图片

id = 13
itemlabels = list(set(labels))
imgid = where(array(labels) == itemlabels[id])[0]print(len(imgid))PIC_ROW = 6
PIC_COL = 6
StartID = 108plt.figure(figsize=(15,15))
for j in range(PIC_ROW):for i in range(PIC_COL):id = i + j*PIC_COLimgid = where(array(labels) == itemlabels[id+StartID])[0]img = array(imgdata[imgid[len(imgid)//2]]).reshape(80,96)plt.subplot(PIC_ROW, PIC_COL, id+1)plt.imshow(img, cmap=plt.cm.gray)plt.title('[%d]:%d'%(id+StartID, len(imgid)))

  将上面15中物品挑选出来作为作业分类问题的数据库。

▲ 图1.2.7 挑选出来用于实验的15种物品

selectdict = {0:'Hammer', 3:'Pliers', 11:'Screwdriver', 16:'Chopper', 22:'Pistol',30:'Bottle', 36:'Spray', 42:'LunchBox', 69:'Noodle', 92:'Slipper',107:'Earphone', 117:'Flashlight', 113:'Glassese', 129:'Boxes', 127:'Shaver'}PIC_ROW = 3
PIC_COL = 5
StartID = 108selkeys = list(selectdict.keys())plt.figure(figsize=(15,10))
for j in range(PIC_ROW):for i in range(PIC_COL):id = i + j*PIC_COLselid = selkeys[id]imgid = where(array(labels) == itemlabels[selid])[0]img = array(imgdata[imgid[len(imgid)//2]]).reshape(80,96)plt.subplot(PIC_ROW, PIC_COL, id+1)plt.imshow(img, cmap=plt.cm.gray)plt.title('[%s]:%d'%(selectdict[selid], len(imgid)))

(2)存储挑选出的物品

  将上面挑选15种,共686张,98×80图片数据存储在 numpy数据文件:xray96_80_15.npz中。

selectimage = []
selectlabels = []
for k in selkeys:imglabels = itemlabels[k]imgid = where(array(labels) == imglabels)[0]for id in imgid:selectlabels.append(imglabels)selectimage.append(imgdata[id])print(selectlabels)
print(shape(selectimage))#------------------------------------------------------------
savez('xray96_80_15', labels=selectlabels, images=selectimage)

1.3 测试数据库

1.3.1 调入数据

  调入numpy数据文件,可以看到其中包括有labels, images。

import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *datafile = 'xray96_80_15.npz'
loaddata = load(datafile)print(loaddata.files)

['labels', 'images']

  查看labels, images的数据类型以及尺寸。

labels = loaddata['labels']
images = loaddata['images']print(type(labels), shape(labels))
print(type(images), shape(images))

<class 'numpy.ndarray'> (686,)
<class 'numpy.ndarray'> (686, 7680)

1.3.2 显示数据图片

  显示15中用于训练和学习的物品图片。

▲ 图1.3.1 15种用于识别的物品

from headm import *                 # =datafile = 'xray96_80_15.npz'
loaddata = load(datafile)printf(loaddata.files)labels = loaddata['labels']
images = loaddata['images']print(type(labels), shape(labels))
print(type(images), shape(images))selectdict = {0:'Hammer', 3:'Pliers', 11:'Screwdriver', 16:'Chopper', 22:'Pistol',30:'Bottle', 36:'Spray', 42:'LunchBox', 69:'Noodle', 92:'Slipper',107:'Earphone', 117:'Flashlight', 113:'Glassese', 129:'Boxes', 127:'Shaver'}selkeys = list(selectdict.keys())
printf(selkeys)minnum = min([len(where(labels==k)[0]) for k in selkeys])
maxnum = max([len(where(labels==k)[0]) for k in selkeys])PIC_ROW = 3
PIC_COL = 5gifdir = '/home/aistudio/GIF'for drawid in range(maxnum):plt.figure(figsize=(15, 10))for j in range(PIC_ROW):for i in range(PIC_COL):id = i+j*PIC_COLplt.subplot(PIC_ROW, PIC_COL, id+1);k = selkeys[id]imgwhere = where(labels==k)[0]idid = drawid % len(imgwhere)imgid = imgwhere[idid]imgdata = images[imgid].reshape(80, 96)plt.imshow(imgdata, cmap=plt.cm.gray)plt.axis('off')plt.title(selectdict[k])plt.savefig(os.path.join(gifdir, '%02d.jpg'%drawid))print('\r%d'%drawid)plt.show()

§02 构建网络


2.1 构建数据加载函数

2.1.1 数据加载功能

  作为网络分类数据,需要把数据修改成以下格式:

  • image的数据由原来的 (7680,) 修改成(1,80,96),也就是变成单通道(灰白图像)的数据;

  • labels的数据都归一化到(0,1,2,…,14)

  • image的数据修改使用的命令:

img.reshape(80,96)[newaxis,:]
  • labels修改命令:
selectdict = {0:'Hammer', 3:'Pliers', 11:'Screwdriver', 16:'Chopper', 22:'Pistol',30:'Bottle', 36:'Spray', 42:'LunchBox', 69:'Noodle', 92:'Slipper',107:'Earphone', 117:'Flashlight', 113:'Glassese', 129:'Boxes', 127:'Shaver'}selkeys = list(selectdict.keys())
labels = [selkeys.index(d) for d in labels]

2.1.2 数据导入与预处理

import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *import paddle
from paddle.vision.transforms import Resizedatafile = 'xray96_80_15.npz'
loaddata = load(datafile)labels = loaddata['labels']
images = loaddata['images']images = array([img.reshape(80,96)[newaxis,:] for img in images])selectdict = {0:'Hammer', 3:'Pliers', 11:'Screwdriver', 16:'Chopper', 22:'Pistol',30:'Bottle', 36:'Spray', 42:'LunchBox', 69:'Noodle', 92:'Slipper',107:'Earphone', 117:'Flashlight', 113:'Glassese', 129:'Boxes', 127:'Shaver'}selkeys = list(selectdict.keys())
labels = [selkeys.index(d) for d in labels]

2.2 训练数据加载

  构建训练数据加载函数。设置批训练大小为100, 数据打乱处理。

class Dataset(paddle.io.Dataset):def __init__(self, num_samples):super(Dataset, self).__init__()self.num_samples = num_samplesdef __getitem__(self, index):data = images[index]label = labels[index]return paddle.to_tensor(data,dtype='float32'), paddle.to_tensor(label,dtype='int64')def __len__(self):return self.num_samples_dataset = Dataset(len(labels))
train_loader = paddle.io.DataLoader(_dataset, batch_size=100, shuffle=True)

2.3 构建LeNet网络

  网络结构与LeNet相同。

imgwidth = 96
imgheight = 80
inputchannel =1
kernelsize   = 5
featurewidth = ((imgwidth-kernelsize+1)//2-kernelsize+1)//2
featureheight = ((imgheight - kernelsize+1)//2-kernelsize+1)//2class lenet(paddle.nn.Layer):def __init__(self, ):super(lenet, self).__init__()self.conv1 = paddle.nn.Conv2D(in_channels=inputchannel, out_channels=6, kernel_size=kernelsize, stride=1, padding=0)self.conv2 = paddle.nn.Conv2D(in_channels=6, out_channels=16, kernel_size=kernelsize, 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=featurewidth*featureheight*16, out_features=120)self.L2     = paddle.nn.Linear(in_features=120, out_features=86)self.L3     = paddle.nn.Linear(in_features=86, out_features=15)def forward(self, x):x = self.conv1(x)x = paddle.nn.functional.relu(x)x = self.mp1(x)x = self.conv2(x)x = paddle.nn.functional.relu(x)x = self.mp2(x)x = paddle.flatten(x, start_axis=1, stop_axis=-1)x = self.L1(x)x = paddle.nn.functional.relu(x)x = self.L2(x)x = paddle.nn.functional.relu(x)x = self.L3(x)return x

  使用 paddle.summary()可以显示网络的基本结构。

paddle.summary(lenet(), (100,1,80,96))
---------------------------------------------------------------------------Layer (type)       Input Shape          Output Shape         Param #
===========================================================================Conv2D-39     [[100, 1, 80, 96]]    [100, 6, 76, 92]         156      MaxPool2D-39    [[100, 6, 76, 92]]    [100, 6, 38, 46]          0       Conv2D-40     [[100, 6, 38, 46]]   [100, 16, 34, 42]        2,416     MaxPool2D-40   [[100, 16, 34, 42]]   [100, 16, 17, 21]          0       Linear-55       [[100, 5712]]          [100, 120]          685,560    Linear-56        [[100, 120]]          [100, 86]           10,406     Linear-57        [[100, 86]]           [100, 15]            1,305
===========================================================================
Total params: 699,843
Trainable params: 699,843
Non-trainable params: 0
---------------------------------------------------------------------------
Input size (MB): 2.93
Forward/backward pass size (MB): 61.97
Params size (MB): 2.67
Estimated Total Size (MB): 67.57
---------------------------------------------------------------------------{'total_params': 699843, 'trainable_params': 699843}

2.4 构建训练过程

model = lenet()
optimizer = paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters())accdim = []
def train(model):model.train()epochs = 20for epoch in range(epochs):for batch, data in enumerate(train_loader()):out = model(data[0])loss = paddle.nn.functional.cross_entropy(out, data[1])acc = paddle.metric.accuracy(out, data[1])loss.backward()optimizer.step()optimizer.clear_grad()accdim.append(acc.numpy())print('Epoch:{}, Loss:{}, Accuracys:{}'.format(epoch, loss.numpy(), acc.numpy()))#------------------------------------------------------------
train(model)plt.figure(figsize=(10, 6))
plt.plot(accdim)
plt.xlabel("Step")
plt.ylabel("Accuracy")
plt.grid(True)
plt.tight_layout()
plt.show()

2.5 存储

model = lenet()
optimizer = paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters())accdim = []
def train(model):model.train()epochs = 20for epoch in range(epochs):for batch, data in enumerate(train_loader()):out = model(data[0])loss = paddle.nn.functional.cross_entropy(out, data[1])acc = paddle.metric.accuracy(out, data[1])loss.backward()optimizer.step()optimizer.clear_grad()accdim.append(acc.numpy())print('Epoch:{}, Loss:{}, Accuracys:{}'.format(epoch, loss.numpy(), acc.numpy()))#------------------------------------------------------------
train(model)plt.figure(figsize=(10, 6))
plt.plot(accdim)
plt.xlabel("Step")
plt.ylabel("Accuracy")
plt.grid(True)
plt.tight_layout()
plt.show()
paddle.save(model.state_dict(), './work/model.pdparams')

§03 网络训练


3.1 基本训练过程

  把所有的数据都用于网络的训练,训练过程识别准确性的变化为。

训练的参数

LeNet训练参数:
学习速率:0.01
训练批次:20
批次样本:100

训练精度变化曲线

进行了两次训练,在AI Studio CPU环境下,训练时间为33秒。

下面是两次训练识别精度的变化曲线。

▲ 图3.1.1 网络训练过程精度变化过程

▲ 图3.1.2 网络训练过程识别精度变化

§04 作业总结


  通过对于物品X射线数据集合的整理,挑选出15类体积比较大的物品,训练LeNet网络进行识别。

4.1 附录

4.1.1 数据库处理程序

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY                     -- by Dr. ZhuoQing 2021-12-17
#
# Note:
#============================================================from headm import *                 # =
from mat4py                  import loadmatdatazipfile = '/home/aistudio/xraydata-96-80.mat'
data = loadmat(datazipfile)printf(data.keys())#------------------------------------------------------------imgdata = data['images']
labels  = data['labels']print(type(imgdata), shape(imgdata))
print(type(labels), shape(labels))#------------------------------------------------------------
imgindex = list(range(len(labels)))
random.shuffle(imgindex)PIC_ROW = 4
PIC_COL = 6plt.figure(figsize=(12,8))for j in range(PIC_ROW):for i in range(PIC_COL):id = i + j*PIC_COLimg = array(imgdata[imgindex[id]]).reshape(80,96)plt.subplot(PIC_ROW, PIC_COL, id+1)plt.imshow(img, cmap=plt.cm.gray)plt.title('[%d]'%labels[imgindex[id]])#------------------------------------------------------------
printf(set(labels),, 'Tatal Item :%d'%len(set(labels)))
itemlabels = list(set(labels))#------------------------------------------------------------
id = 13
imgid = where(array(labels) == itemlabels[id])[0]print(len(imgid))PIC_ROW = 6
PIC_COL = 6
StartID = 108plt.figure(figsize=(15,15))
for j in range(PIC_ROW):for i in range(PIC_COL):id = i + j*PIC_COLimgid = where(array(labels) == itemlabels[id+StartID])[0]img = array(imgdata[imgid[len(imgid)//2]]).reshape(80,96)plt.subplot(PIC_ROW, PIC_COL, id+1)plt.imshow(img, cmap=plt.cm.gray)plt.title('[%d]:%d'%(id+StartID, len(imgid)))#------------------------------------------------------------selectdict = {0:'Hammer', 3:'Pliers', 11:'Screwdriver', 16:'Chopper', 22:'Pistol',30:'Bottle', 36:'Spray', 42:'LunchBox', 69:'Noodle', 92:'Slipper',107:'Earphone', 117:'Flashlight', 113:'Glassese', 129:'Boxes', 127:'Shaver'}PIC_ROW = 3
PIC_COL = 5
StartID = 108selkeys = list(selectdict.keys())plt.figure(figsize=(15,10))
for j in range(PIC_ROW):for i in range(PIC_COL):id = i + j*PIC_COLselid = selkeys[id]imgid = where(array(labels) == itemlabels[selid])[0]img = array(imgdata[imgid[len(imgid)//2]]).reshape(80,96)plt.subplot(PIC_ROW, PIC_COL, id+1)plt.imshow(img, cmap=plt.cm.gray)plt.title('[%s]:%d'%(selectdict[selid], len(imgid)))#------------------------------------------------------------selectimage = []
selectlabels = []
for k in selkeys:imglabels = itemlabels[k]imgid = where(array(labels) == imglabels)[0]for id in imgid:selectlabels.append(k)selectimage.append(imgdata[id])printf(selectlabels)
printf(shape(selectimage))#------------------------------------------------------------
savez('xray96_80_15', labels=selectlabels, images=selectimage)#------------------------------------------------------------
#        END OF FILE : TEST1.PY
#============================================================

4.2 数据库验证程序

import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *datafile = 'xray96_80_15.npz'
loaddata = load(datafile)print(loaddata.files)labels = loaddata['labels']
images = loaddata['images']print(type(labels), shape(labels))
print(type(images), shape(images))selectdict = {0:'Hammer', 3:'Pliers', 11:'Screwdriver', 16:'Chopper', 22:'Pistol',30:'Bottle', 36:'Spray', 42:'LunchBox', 69:'Noodle', 92:'Slipper',107:'Earphone', 117:'Flashlight', 113:'Glassese', 129:'Boxes', 127:'Shaver'}selkeys = list(selectdict.keys())
print(selkeys)minnum = min([len(where(labels==k)[0]) for k in selkeys])
maxnum = max([len(where(labels==k)[0]) for k in selkeys])PIC_ROW = 3
PIC_COL = 5gifdir = '/home/aistudio/GIF'for drawid in range(maxnum):plt.figure(figsize=(15, 10))for j in range(PIC_ROW):for i in range(PIC_COL):id = i+j*PIC_COLplt.subplot(PIC_ROW, PIC_COL, id+1);k = selkeys[id]imgwhere = where(labels==k)[0]idid = drawid % len(imgwhere)imgid = imgwhere[idid]imgdata = images[imgid].reshape(80, 96)plt.imshow(imgdata, cmap=plt.cm.gray)plt.axis('off')plt.title(selectdict[k])plt.savefig(os.path.join(gifdir, '%02d.jpg'%drawid))print('\r%d'%drawid)plt.show()

4.3 LeNet网络与训练程序

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST3.PY                     -- by Dr. ZhuoQing 2021-12-18
#
# Note:
#============================================================from headm import *                 # =import paddle
from paddle.vision.transforms import Resizedatafile = 'xray96_80_15.npz'
loaddata = load(datafile)labels = loaddata['labels']
images = loaddata['images']images = array([img.reshape(80,96)[newaxis,:] for img in images])selectdict = {0:'Hammer', 3:'Pliers', 11:'Screwdriver', 16:'Chopper', 22:'Pistol',30:'Bottle', 36:'Spray', 42:'LunchBox', 69:'Noodle', 92:'Slipper',107:'Earphone', 117:'Flashlight', 113:'Glassese', 129:'Boxes', 127:'Shaver'}selkeys = list(selectdict.keys())
labels = [selkeys.index(d) for d in labels]#printf(shape(images))
#printf(labels)#------------------------------------------------------------class Dataset(paddle.io.Dataset):def __init__(self, num_samples):super(Dataset, self).__init__()self.num_samples = num_samplesdef __getitem__(self, index):data = images[index]label = labels[index]return paddle.to_tensor(data,dtype='float32'), paddle.to_tensor(label,dtype='int64')def __len__(self):return self.num_samples_dataset = Dataset(len(labels))
train_loader = paddle.io.DataLoader(_dataset, batch_size=100, shuffle=True)#------------------------------------------------------------imgwidth = 96
imgheight = 80
inputchannel = 1
kernelsize   = 5
targetsize = 15
ftwidth = ((imgwidth-kernelsize+1)//2-kernelsize+1)//2
ftheight = ((imgheight-kernelsize+1)//2-kernelsize+1)//2class lenet(paddle.nn.Layer):def __init__(self, ):super(lenet, self).__init__()self.conv1 = paddle.nn.Conv2D(in_channels=inputchannel, out_channels=6, kernel_size=kernelsize, stride=1, padding=0)self.conv2 = paddle.nn.Conv2D(in_channels=6, out_channels=16, kernel_size=kernelsize, 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=ftwidth*ftheight*16, out_features=120)self.L2     = paddle.nn.Linear(in_features=120, out_features=86)self.L3     = paddle.nn.Linear(in_features=86, out_features=targetsize)def forward(self, x):x = self.conv1(x)x = paddle.nn.functional.relu(x)x = self.mp1(x)x = self.conv2(x)x = paddle.nn.functional.relu(x)x = self.mp2(x)x = paddle.flatten(x, start_axis=1, stop_axis=-1)x = self.L1(x)x = paddle.nn.functional.relu(x)x = self.L2(x)x = paddle.nn.functional.relu(x)x = self.L3(x)return xmodel = lenet()#------------------------------------------------------------paddle.summary(model, input_size=(100,1,80,96))
#paddle.flops(model, input_size=(100,1,86,96), print_detail=True)#-----------------------------------------------------------
optimizer = paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters())accdim = []
def train(model):model.train()epochs = 20for epoch in range(epochs):for batch, data in enumerate(train_loader()):out = model(data[0])loss = paddle.nn.functional.cross_entropy(out, data[1])acc = paddle.metric.accuracy(out, data[1])loss.backward()optimizer.step()optimizer.clear_grad()accdim.append(acc.numpy())#            if batch%2 == 0:
#                print('Epoch:{}, Loss:{}, Accuracys:{}'.format(epoch, loss.numpy(), acc.numpy()))print('Epoch:{}, Loss:{}, Accuracys:{}'.format(epoch, loss.numpy(), acc.numpy()))#------------------------------------------------------------
train(model)plt.figure(figsize=(10, 6))
plt.plot(accdim)
plt.xlabel("Step")
plt.ylabel("Accuracy")
plt.grid(True)
plt.tight_layout()
plt.show()#------------------------------------------------------------
paddle.save(model.state_dict(), './work/model.pdparams')#------------------------------------------------------------
#        END OF FILE : TEST3.PY
#============================================================

■ 相关文献链接:

  • 2021年人工神经网络第四次作业要求
  • 在Python中读取MATLAB的数据文件

● 相关图表链接:

  • 图1.2.1 利用文件上载功能,将数据库文件上传到主目录下
  • 图1.2.2 数据库中的24个随机挑选图片
  • 图1.2.3 第0号物品:锤子。
  • 图1.2.4 第2号物品:尖嘴钳
  • 图1.2.5 不同标号对应的物品图片
  • 图1.2.6 不同标号对应的物品图片
  • 图1.2.7 挑选出来用于实验的15种物品
  • 图1.3.1 15种用于识别的物品
  • 图3.1.1 网络训练过程精度变化过程

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

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

    简 介: 在Paddle下使用最基本的BP网络以及LeNet网络结构,测试了Cifar10数据集合.但实际运行在测试集合上的效果始终没有突破0.3,具体原因还需要进行查找. 后来经过测试,发现问题出现 ...

  2. 2021年人工神经网络第四次作业:基于MATLAB的求解

    简 介: 本文选取了2021年人工神经网络第四次作业学生提交的作业.供交流使用. 关键词: 人工神经网络 #mermaid-svg-ATqdYQemfmABj2Hj {font-family:&quo ...

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

    简 介: 对于MATLAB中的SimpleClass数据集合,对比了BP,RBF,SVM,SOFM,DHNN 等方法分类结果,可以看到BP,RBF,SVM,SOFM都具有非常好的分类效果.DHNN对于 ...

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

    简 介: ※MNIST数据集合是深度学习基础训练数据集合.改数据集合可以使用稠密前馈神经网络训练,也可以使用CNN.本文采用了单隐层BP网络和LeNet网络对于MNIST数据集合进行测试.实验结果标明 ...

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

    简 介: 本文对于作业中给定的机械数字字符识别问题进行了实验研究.通过对于采样1000样本的数据集合进行训练,经过增加DropOut的可以增加网络的泛化性能.对于网络规模的增加对训练精度没有明显的改进 ...

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

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

  7. 2021年人工神经网络第三次作业-第二题:遗传算法与人工神经网络-参考答案

    简 介: 给出了对于BP网络求解异或问题过程中,利用遗传算法完成网络演变的过程.所使用的遗传算法是最基本的遗传算法.利用遗传算法对于网络的系数进行演变,可以对网络系数初始化过程进行优化.对于不同的遗传 ...

  8. 2022年秋季学期人工神经网络第四次作业

    说明: 本次作业是针对这学期经典神经网络中的内容,主要涵盖竞争神经网络课程内容相关的算法. 完成作业可以使用你所熟悉的编程语言和平台,比如 C,C++.MATLAB.Python等. 作业要求链接: ...

  9. 合工大Java第四次作业第五题

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 题目描述 一.题目分析 二.难点及解决方案 1.文件读取出的字符串是一整行的数据,包含了学生的姓名.学号和成绩,如何处理数据 ...

最新文章

  1. ID--HANDLE--HWND三者之间的互相转换(转)
  2. php版 v2.0,KangPHP v2.0 正式版
  3. linux 虚拟机挂载本地,CentOS 在VMWare中挂载本地yum源
  4. 怎么配置 Oracle 侦听器来使用SQL操作ST_Geometry
  5. mongodb数据库显示obj_Mongodb使用
  6. intellij idea主题
  7. ArcEngine在个人地理数据库下创建要素类
  8. python自动化测试-五大自动化测试的Python框架
  9. No space left on device 磁盘空间提示不足解决办法
  10. PyRobot开辟 AI 机器人框架
  11. 好想看故乡夏夜的天空
  12. LintCode: Combination Sum
  13. Oracle 11g R2 RAC上配置TAF和Load balance
  14. GmId设计方法介绍及曲线仿真
  15. 解决删除文件时出现“无法读取源文件或磁盘”的办法
  16. 怎样快速修改论文格式-使用人工智能技术助手
  17. 随机分组c语言,用C/C++进行随机分组的实现教程,分组教程
  18. 一个Sqrt函数引发的血案
  19. Flutter 时间戳转换成时间 时间字符串转换成时间戳
  20. Google URL Shorter

热门文章

  1. 画原型时需要注意什么?
  2. 调用webservice 的时候没法输入参数
  3. 与用户登录有关的命令w who whoami last lastb lastlog
  4. 记一次数据库查询语句的优化
  5. 手机QQ会员H5加速方案——sonic技术内幕
  6. TYVJ P1053 字符串的展开 Label:字符 水
  7. intellij (org.jdom.input.JDOMParseException) Error on line 1: 前言中不允许有内容。
  8. linux下磁盘分区
  9. cidaemon.exe进程cpu占用率高及关闭cidaemon.exe进程方法
  10. java基础--集合Connection/Map