Advertisement

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

阅读量:
  1. 背景与挖掘目标

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

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

  1. 分析方法与过程

对图像中心区域的抽取可以采用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%
这里写图片描述

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

全部评论 (0)

还没有任何评论哟~