题目简述
今有砾岩(Conglomerate)、安山岩(Andesite)、石灰岩(Limestone)、石英岩(Quartzite)和花岗岩(Granite)5种岩石图片,每张图片的大小不一。试建立卷积神经模型,利用训练数据集进行训练,并对测试集进行分类识别。
数据集 CSDN 下载.
如果资源失效可以再我的发布资源里找对应链接
个人项目运行环境
- PyCharm 2017.1
- Python 3.8.6
- numpy 1.19.5
- TensorFlow 2.5.0
- scikit-learn 0.24.2
导入模块
import os
import numpy as np
from PIL import Image
from tensorflow.keras import layers,models
from sklearn.model_selection import train_test_split
数据处理
这里我们构造卷积神经网络模型所需要的输入数据和输出数据,其中输入数据为所有彩图数据。我所展示的样例共有300张图片,统一取图像中心点100×100
像素,共有R、G、B三个通道,并对每个通道像素值归一化,彩色图片有3个通道(也可以使用OpenCV的函数查看自己使用图片的通道数),故所有彩图数据可以用一个四维数组来存储,其形态为 (300,100,100,3)。记为X。输出数据为岩石类型,依次为砾岩、安山岩、石灰岩、石英岩和花岗岩(不确定顺序,我也不能分清具体岩石是哪个类,按照图片的类别来分不同岩石),类型编号为0、1、2、3、4,记为Y。代码如下:
# 数据处理
def DataDispose(X,Y,ImgList):
for i in range(len(ImgList)):
# 读取第一张图片,img有R、G、B(三色)三个通道
img = Image.open(ImgPath + "\\" +ImgList[i])
# 分离R、G、B通道
sep = img.split()
# R 通道
R = np.array(sep[0])
# 注意中心点
row_1 = int(R.shape[0]/2) - 50
row_2 = int(R.shape[0]/2) + 50
con_1 = int(R.shape[1]/2) - 50
con_2 = int(R.shape[1]/2) + 50
R = R[row_1:row_2,con_1:con_2]
# G 通道
G = np.array(sep[1])
G = G[row_1:row_2,con_1:con_2]
# B 通道
B = np.array(sep[2])
B = B[row_1:row_2,con_1:con_2]
# 获取R、G、B通道即可,并归一化
X[i,:,:,0] = R/255
X[i,:,:,1] = G/255
X[i,:,:,2] = B/255
# 构造输出数据,岩石类别编号
S = ImgList[i]
I = S.find('_',0,