系列文章目录
对图像进行识别并分类
前言
本文是对水色图像进行识别
提示:以下是本篇文章正文内容,下面案例可供参考
二、步骤
1.读取一张图片
from PIL import Image
path='D:/shujuwajue/基于水色图像的水质识别/water_images/'
#图片路径
image=Image.open(path+'1_1.jpg')
2.数据清洗:图片分割
观察图片,发现水出现集中在图片中间,故切割图片中间观察
M,N=image.size
image_mid=image.crop(box=(M/2-50,N/2-50,M/2+50,N/2+50))
r,g,b=image_mid.split()#图片分割
3.特征提取
3.1将图像数据转成数组数据
import numpy as np
rd=np.array(r)/225# 数据归一化
gd=np.array(g)/255
bd=np.array(b)/255
3.2提取水质图像的特征
观察图片得出颜色的特征体现较为明显,故提取颜色矩作为颜色特征
r1=rd.mean()#一阶颜色矩
g1=gd.mean()
b1=bd.mean()
r2=rd.std()#二阶颜色矩
g2=gd.std()
b2=bd.std()
#自定义三阶颜色矩函数
def Var(data=None):
x1=data-data.mean()
x2=x1**3
x3=np.mean(x2)
x4=np.sign(x3)*abs(x3)**(1/3)
return x4
#三阶颜色矩
r3=Var(rd)
g3=Var(gd)
b3=Var(bd)
4.批量读取所有图片
4.1自定义函数读取图片
import os
import re
def get_img_name(path=None):
'''获取指定路径中的所图片
param path:指定路径
return:图片名称列表
'''
filenames=os.listdir(path)#获取路径下图片的名称
imName=[]
for i in filenames:
if re.findall('^\d_\d+.jpg$',i)!=[]: #获取是图片的文件
imName.append(i)
return imName
4.2批量处理图片
imnames=get_img_name(path)#图片名字
n=len(imnames)#图片张数
data=np.zeros([n,9])#用来存放样本特征,进行模型训练
labels=np.zeros(n)#用来存放样本标签(专家样本),进行模型评估
for i in range(n):
img=Image.open(path+imnames[i])
M,N=img.size#获取图片大小
img=img.crop((M/2-50,N/2-50,M/2+50,N/2+50))#图像裁剪
data[i,0]=rd.mean()#一阶颜色矩
data[i,1]=gd.mean()
data[i,2]=bd.mean()
data[i,3]=rd.std()#二阶颜色矩
data[i,4]=gd.std()
data[i,5]=bd.std()
data[i,6]=Var(rd)#三阶颜色矩
data[i,7]=Var(gd)
data[i,8]=Var(bd)
labels[i]=imnames[i][0]
5.划分数据集
from sklearn.model_selection import train_test_split
data_train,data_test,labels_train,labels_test=train_test_split(data,labels,test_size=0.2)
6.模型构建和预测
from sklearn.neural_network import MLPClassifier#从sklearn中导入神经网络模型
from sklearn.model_selection import GridSearchCV #导入网格搜索,搜索最优参数
from sklearn.metrics import r2_score#导入r2评分模型
import warnings
warnings.filterwarnings("ignore")#忽略警告
#模型超参数选择
params={
'hidden_layer_sizes':[*range(1,10)],#hidden_layer_sizes=隐藏层大小
'max_iter':[10,100,1000],#最大跌代次数
'solver':('adam','lbfgs','sgd'),#优化方法
'activation':('identity','logistic','tanh','relu')#激活函数,映射函数
}
mlp=MLPClassifier()
GS = GridSearchCV(mlp,params,cv=5,scoring='r2')#cv:(交叉验证)次数为5,评价指标为r2_score
GS.fit(data_train,labels_train)
print(GS.best_params_) #最佳参数
print(GS.best_score_) #最优评分(对应最佳参数)
model=MLPClassifier(activation='relu', hidden_layer_sizes=7, max_iter=100, solver='lbfgs')#模型构建
model.fit(data_train,labels_train)#模型训练
7.模型预测评估
pre=model.predict(data_test)
pre
print('自带模型评分',model.score(data_test,labels_test))#模型评分
print('r2评分',r2_score(labels_test,pre))
from sklearn.metrics import mean_absolute_error,mean_squared_error#导入平均误差和均方误差
from sklearn.metrics import confusion_matrix,classification_report#导入混淆矩阵和分类报告
print('平均绝对误差',mean_absolute_error(labels_test,pre))
print('均方误差为',mean_squared_error(labels_test,pre))
print('混淆矩阵为\n',confusion_matrix(labels_test,pre))
print('分类报告为\n',classification_report(labels_test,pre))
总结
此文仅是作者个人的做法,若有异议,欢迎评论