1.基于水色圖像的水質評價
-
背景
- 有經驗的漁業生産的從業者可以通過觀察水質變化調控水質,來維持養殖水體生态系統中的浮遊植物、微生物、浮遊動物等的動态平衡,然而這些判斷是通過經驗和肉眼觀察得出的,存在主觀性引起的觀察性偏差,使觀察結果的可比性、可重複性降低,不易推廣使用。
- 數字圖像處理技術為計算機監控技術在水産養殖業的應用提供了更大的空間。在水質線上監測方面,數字圖像處理技術是基于計算機視覺的,以專家經驗為基礎,對水色進行優劣分級,實作對水色的準确快速判别。
-
目标
- 利用給出的已經分類的資料,利用圖像處理技術實作水質自動評價。
-
分析
- 通過拍攝得到的圖像資料次元太大,不易分析,需要提取圖像的特征,提取反映圖像本質的關鍵名額,以達到自動進行圖像識别或者分類的目的。
- 顯然,圖像特征提取是圖像識别和分類的關鍵步驟,提取的結果直接關系到圖像識别和分類的好壞。
-
圖像特征
- 主要包括顔色特征、紋理特征、形狀特征和空間關系特征等。
-
與幾何特征相比,顔色特征更為穩健,對物體的大小和方向不敏感,表現出較強的魯棒性。
由于本案例中的水色圖像是均勻的,是以主要關注顔色特征。
顔色特征是一種全局特征,描述圖像或者圖像對應景物的表明性質。一般顔色特征是基于像素點的特征,是以圖像區域的像素點都有自己的貢獻。
-
在利用圖像顔色特征進行分析的研究中,實作方法上已經有啦很多研究成果,主要采用直方圖法和顔色矩方法。
其中直方圖法反映顔色分布,即哪些顔色及其出現機率,優點是适合描述難以自動分割的圖像和不需要考慮物體空間位置的圖像;缺點是無法描述顔色的局部分布及每種色彩所處的空間位置,也就是無法描述圖像中的某一具體的對象和物體。
-
其中顔色矩法的數字基礎為圖像中的任何顔色分布均可以用它道德矩來表示。根據機率論,随機變量的機率分布可以由其各階矩唯一描述和表示。一個圖像的顔色分布完全可以看做是一種機率分布,圖像就可以由各階矩描述。顔色矩包含各個顔色的一階矩、二階矩和三階矩,一個RGB圖像有R、G、B三個通道,共9個分量。
直方圖法産生的特征維數一般會大于顔色矩産生的,為了避免過多變量幹擾分類結果,使用顔色矩法。
-
處理過程
-
資料擷取
- 給定分量圖像集。
-
資料探索
- 由于是圖像資料,進行觀察探索即可。
-
資料預處理
- 圖像切割
- 不難發現,圖像中的盛水容器幹擾了特征分析,需要提取中心部分有意義的圖像(定位101*101像素大小)。
- 使用MATLAB等工具切割圖像,得到切割後的圖像。
- 圖像切割
-
特征提取
提取切割後的圖像顔色矩,作為顔色特征,提取顔色矩時提取檔案名中的類别和編号,得到資料集。- 資料挖掘模組化
- 按照傳統機器學習中的82比劃分訓練集和測試集,使用支援向量機進行分類。
- 同時應該注意到資料特征的區間極為接近[0-1],,直接輸入SVM中區分度很小,這裡就應該走歸一化的反路,将資料統一乘一個數值擴大區分度。
- 這個數值過大過小都是不合适的。過小區分度過低,模型精确度差;過大則容易導緻模型在訓練樣本中過拟合(這是很煩的一個問題)。可以根據測試準确率來選擇合适的取值,經過反複測試選擇30。
- 資料挖掘模組化
-
後續處理
- 建立模型後立業訓練樣本進行回判,得到混淆矩陣,判斷是否可用。
- 取測試樣本輸入,代入模型得到輸出,得到混淆矩陣,判斷模型可用價值。
-
-
補充說明
- 沒有數字圖像處理過程,直接使用分析圖像所得資料集的。
參考書《Python資料分析與挖掘實戰》
2.劃分資料集
# -*- coding:utf-8 -*-
# 9.2.2 模型建構
### 1 模型輸入 # 80% 做訓練集、20% 做測試集
# 資料抽樣代碼
import pandas as pd
from pandas import DataFrame,Series
import random
import numpy as np
inputfile = 'moment.csv'
data = pd.read_csv(inputfile, encoding='gbk')
# 注意,此處不能用shuffle
sampler = np.random.permutation(len(data))
d = data.take(sampler).as_matrix()
data_train = d[:int(0.8*len(data)),:] #選取前80%做訓練集
data_test = d[int(0.8*len(data)):,:] #選取後20%做測試集
print(data_train.shape)
print(data_test.shape)
3.建立模型并評價模型
# 建構支援向量機模型代碼
x_train = data_train[:, 2:]*30 #放大特征
y_train = data_train[:,0].astype(int)
x_test = data_test[:, 2:]*30 #放大特征
y_test = data_test[:,0].astype(int)
print(x_train.shape)
print(x_test.shape)
# 導入模型相關的支援向量機函數 建立并且訓練模型
from sklearn import svm
model = svm.SVC()
model.fit(x_train, y_train)
import pickle
pickle.dump(model, open('svcmodel.model','wb'))# model = pickle.load(open('svcmodel.model','rb'))
# 導入輸出相關的庫,生成混淆矩陣
from sklearn import metrics
cm_train = metrics.confusion_matrix(y_train, model.predict(x_train)) # 訓練樣本的混淆矩陣
cm_test = metrics.confusion_matrix(y_test, model.predict(x_test)) # 測試樣本的混淆矩陣
print(cm_train.shape)
print(cm_test.shape)
df1 = DataFrame(cm_train, index = range(1,6), columns=range(1,6))
df2 = DataFrame(cm_test, index = range(1,5), columns=range(1,5))
df1.to_excel('trainPre.xlsx')
df2.to_excel('testPre.xlsx')
print(model.score(x_train,y_train)) # 評價模型訓練的準确率
print(model.score(x_test,y_test)) # 評價模型測試的準确率
4.混淆矩陣
cm_plot.py
# -*- coding:utf-8 -*-
def cm_plot(y, yp):
from sklearn.metrics import confusion_matrix #導入混淆矩陣函數
cm = confusion_matrix(y, yp) #混淆矩陣
import matplotlib.pyplot as plt #導入作圖庫
plt.matshow(cm, cmap=plt.cm.Greens) #畫混淆矩陣圖,配色風格使用cm.Greens,更多風格請參考官網。
plt.colorbar() #顔色标簽
for x in range(len(cm)): #資料标簽
for y in range(len(cm)):
plt.annotate(cm[x,y], xy=(x, y), horizontalalignment='center', verticalalignment='center')
plt.ylabel('True label') #坐标軸标簽
plt.xlabel('Predicted label') #坐标軸标簽
return plt
from cm_plot import *
cm_plot(y_train, model.predict(x_train)).show() # cm_plot是自定義的畫混淆矩陣的函數