第9章 基于水色图像的水质评价

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_26978413/article/details/78400290
  1. 背景与挖掘目标

    根据数码相机采集的水色照片对水质进行自动评价。

    我个人对这个评价中的采样过程是有意见的,如果对周围环境不做严格限制,数码相机采样得到的结果本身差异度就很大,用来做样本是不合理的。不过做为练习题,也就只能这样了。

  2. 分析方法与过程

    对图像中心区域的抽取可以采用pillow库来完成。我编写了以下代码进行颜色矩的抽取。
    首先,看一下我从网络上面下载的一张图,由于没有找到水质的图,所以找了一张细菌培养的图。
    这里写图片描述

然后这是中间的100*100的区域。
这里写图片描述
以下是代码:

import pandas as pd
import numpy as np
from PIL import Image
# 取出中间100*100
pic = Image.open(r'E://pyj.jpg')
pic.c_x , pic.c_y = (int(i/2) for i in pic.size)
box = (pic.c_x-50,pic.c_y-50,pic.c_x+50,pic.c_y+50)
region = pic.crop(box)

# 切分为RGB
r,g,b = np.split(np.array(region),3,axis=2)

# 一阶矩
r_m1 = np.mean(r)
g_m1 = np.mean(g)
b_m1 = np.mean(b)
# 二阶矩
r_m2 = np.std(r)
g_m2 = np.std(g)
b_m2 = np.std(b)
# 三阶矩
r_m3 = np.mean(abs(r - r.mean())**3)**(1/3)
g_m3 = np.mean(abs(g - g.mean())**3)**(1/3)
b_m3 = np.mean(abs(b - b.mean())**3)**(1/3)

# 数据标准化 区间在[-1,1]之间
from sklearn import preprocessing
arr = np.array([h_m1,s_m1,v_m1,h_m2,s_m2,v_m2,h_m3,s_m3,v_m3])
df = pd.DataFrame(preprocessing.minmax_scale(arr,feature_range=(-1,1))).T

就会得到这样一组数据。仔细看你会发现和书上的并不完全一样。主要区别可能还是在于数据标准化上,书上采用的标准化方法没有注出来,我试验了zscore和maxmin法,感觉都不是很一致。但普遍来说,一阶矩的数值都比较大,三阶矩的数值相对比较小。不知道以上求颜色矩的过程中是否有不对的地方,如果有还请指出。

这里写图片描述

到这里,算是把书上没有做的事情给做了。下面就开始按照书上的步骤走了。

  1. 由于书上的代码本身是比较完善的,也没有什么错误。所以我没有完全使用书上的做法,在测试集的划分和模型保存上换用了一些更为常用的方法。代码如下:
# 划分训练集和测试集
from sklearn.cross_validation import train_test_split
train,test,train_target,test_target=train_test_split(data[:,2:],data[:,0],test_size = 0.2)
train_target = train_target.astype(int)
test_target = test_target.astype(int)

# SVC训练 
from sklearn import svm
model = svm.SVC()
model.fit(train*30, train_target)

# 保存模型
from sklearn.externals import joblib
joblib.dump(model,'E:\\svcmodel.pkl')

# 读取模型
# model = joblib.load('E:\\svcmodel.pkl')

# 混淆矩阵
from sklearn import metrics
cm_train = metrics.confusion_matrix(train_target, model.predict(train*30))
cm_test = metrics.confusion_matrix(test_target, model.predict(test*30))

tr = pd.DataFrame(cm_train, index=range(1,6), columns=range(1,6))
te = pd.DataFrame(cm_test, index=range(1,6), columns=range(1,6))

最后的结果如下图:
训练集:正确率为96.3%
这里写图片描述

测试集:正确率为90.2%
这里写图片描述

  • 个人体会:机器学习中,难点往往不在于训练的过程,如何找到特征值,并且进行特征提取往往是数据准备工作中的重点。而训练之后对模型进行评价和调参才是工作重点。
展开阅读全文

没有更多推荐了,返回首页