随机森林图片分类
#os為了下面獲取圖片路徑
import os, glob
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
from sklearn.decomposition import PCA
import tensorflow
from tensorflow import keras
#total_num = 5970 # 訓練集總計和
#train_num = 5970 # 訓練集實際訓練數字,20的驗證集
dir_data = '/Users/mac/Desktop/Dataset2' # 訓練集路徑
dir_mask = os.path.join(dir_data, 'mask') # 戴口罩文件夾路徑
dir_nomask = os.path.join(dir_data, 'nomask') # 沒帶口罩文件夾路徑
#assert為斷言函數。判斷文件是否存在
assert os.path.exists(dir_mask), 'Could not find ' + dir_mask
assert os.path.exists(dir_nomask), 'Could not find ' + dir_nomask
# 定義了文件指針對整個文件夾遍歷一遍,將圖像讀出來
#os.path.abspath(fp) 獲取圖片的絕對路徑
#glob.glob獲取一個可以遍歷對象(隨機遍歷)
fpath_mask=[os.path.abspath(fp) for fp in glob.glob(os.path.join(dir_mask, '*.png'))]
fpath_nomask = [os.path.abspath(fp) for fp in glob.glob(os.path.join(dir_nomask, '*.png'))]
# 文件數
num_mask = len(fpath_mask)
num_nomask = len(fpath_nomask)
# 設置標簽。將num_mask變為0,將num_nomask變為1
label_mask = [0] * num_mask
label_nomask = [1] * num_nomask
print('#mask:', num_mask)
print('#nomask:', num_nomask)
# 劃分多少為驗證集
RATIO_TEST = 0.2
num_mask_test = int(num_mask * RATIO_TEST)
num_nomask_test = int(num_nomask * RATIO_TEST)
# 包括第十個的所有戴口罩和不帶口罩的路徑
fpath_train = fpath_mask[num_mask_test:] + fpath_nomask[num_nomask_test:]
#包括第十個的所有戴口罩和不帶口罩的標簽
label_train = label_mask[num_mask_test:] + label_nomask[num_nomask_test:]
# validation
fpath_vali = fpath_mask[:num_mask_test] + fpath_nomask[:num_nomask_test]
label_vali = label_mask[:num_mask_test] + label_nomask[:num_nomask_test]
ways=16
for i in range(ways):pil_img1 = Image.open(fpath_train[i])out1 = pil_img1.resize((16,16))
num_img2 = np.asarray(out1)#將圖片轉為80*80*3的數組
#將num_img1由3維降為2維數組
num_img2= (num_img2.reshape(num_img2.shape[0], num_img2.shape[1] * num_img2.shape[2]))
#使用0-1標準化
from sklearn import preprocessing
min_max_scaler = preprocessing.MinMaxScaler()
num_img4 = min_max_scaler.fit_transform(num_img2)
#n_components為降維后需要的維度
n_components = 4
#svd_solver='auto':使用奇異值分解器。auto:SVD模式中的隨機模式
#whiten=True:白化會去除變換信號中的一些信息(分量的相對方差尺度),但在數據有比較強的相關性的假設下,有時可以提高下游估計器的性能。
pca1 = PCA(n_components=n_components, svd_solver='auto',whiten=True).fit(num_img4)
#all_data_pca1維度的:80*16
all_data_pca1 = pca1.transform(num_img4)
#3進行l1正則化
all_data_pca3 = preprocessing.normalize(all_data_pca1, norm='l1')
ways=4
for i in range(ways):pil_img2 = Image.open(fpath_vali[i])out2 = pil_img2.resize((4,4))
num_img3 = np.asarray(out2)
num_img3= (num_img3.reshape(num_img3.shape[0], num_img3.shape[1] * num_img3.shape[2]))
from sklearn import preprocessing
min_max_scaler = preprocessing.MinMaxScaler()
num_img5 = min_max_scaler.fit_transform(num_img3)
n_components = 4
pca2 = PCA(n_components=n_components, svd_solver='auto',whiten=True).fit(num_img5)
#all_data_pca2維度為20*16
all_data_pca2 = pca2.transform(num_img5)
all_data_pca4 = preprocessing.normalize(all_data_pca2, norm='l1')
# 其中0.01為上面2.1小節提到的常數系數C,自己設置
from sklearn.ensemble import RandomForestClassifier
RF = RandomForestClassifier(n_estimators=10000, random_state=0, n_jobs=-1)RF.fit(all_data_pca3,label_train)
print("RandomForest",RF.score(all_data_pca4,label_vali))
總結
- 上一篇: 计算机辅助翻译入门编委,计算机辅助翻译入
- 下一篇: 将圆滑软件中的数据改写为用grapher