天天看點

第9章 基于水色圖像的水質評價

  1. 背景與挖掘目标

    根據數位相機采集的水色照片對水質進行自動評價。

    我個人對這個評價中的采樣過程是有意見的,如果對周圍環境不做嚴格限制,數位相機采樣得到的結果本身差異度就很大,用來做樣本是不合理的。不過做為練習題,也就隻能這樣了。

  2. 分析方法與過程

    對圖像中心區域的抽取可以采用pillow庫來完成。我編寫了以下代碼進行顔色矩的抽取。

    首先,看一下我從網絡上面下載下傳的一張圖,由于沒有找到水質的圖,是以找了一張細菌培養的圖。

    第9章 基于水色圖像的水質評價

然後這是中間的100*100的區域。

第9章 基于水色圖像的水質評價

以下是代碼:

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/) for i in pic.size)
box = (pic.c_x-,pic.c_y-,pic.c_x+,pic.c_y+)
region = pic.crop(box)

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

# 一階矩
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())**)**(/)
g_m3 = np.mean(abs(g - g.mean())**)**(/)
b_m3 = np.mean(abs(b - b.mean())**)**(/)

# 資料标準化 區間在[-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=(-,))).T
           

就會得到這樣一組資料。仔細看你會發現和書上的并不完全一樣。主要差別可能還是在于資料标準化上,書上采用的标準化方法沒有注出來,我試驗了zscore和maxmin法,感覺都不是很一緻。但普遍來說,一階矩的數值都比較大,三階矩的數值相對比較小。不知道以上求顔色矩的過程中是否有不對的地方,如果有還請指出。

第9章 基于水色圖像的水質評價

到這裡,算是把書上沒有做的事情給做了。下面就開始按照書上的步驟走了。

  1. 由于書上的代碼本身是比較完善的,也沒有什麼錯誤。是以我沒有完全使用書上的做法,在測試集的劃分和模型儲存上換用了一些更為常用的方法。代碼如下:
# 劃分訓練集和測試集
from sklearn.cross_validation import train_test_split
train,test,train_target,test_target=train_test_split(data[:,:],data[:,],test_size = .)
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(,), columns=range(,))
te = pd.DataFrame(cm_test, index=range(,), columns=range(,))
           

最後的結果如下圖:

訓練集:正确率為96.3%

第9章 基于水色圖像的水質評價

測試集:正确率為90.2%

第9章 基于水色圖像的水質評價
  • 個人體會:機器學習中,難點往往不在于訓練的過程,如何找到特征值,并且進行特征提取往往是資料準備工作中的重點。而訓練之後對模型進行評價和調參才是工作重點。