import skimage
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
from sklearn import svm, metrics, datasets
from sklearn.utils import Bunch
from sklearn.svm import SVR
from skimage.io import imread # abc
from skimage.transform import resize
from sklearn.model_selection import train_test_split
from skimage.feature import hog
from sklearn.model_selection import RandomizedSearchCV
def load_image_files(container_path, dimension=(64, 64)):
image_dir = Path(container_path)
folders = [directory for directory in image_dir.iterdir() if directory.is_dir()]
categories = [fo.name for fo in folders]
descr = "A image classification dataset"
images = []
flat_data = []
target = []
features=[]
for i, direc in enumerate(folders): # enumerate()函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
for file in direc.iterdir():
img = skimage.io.imread(file) #以numpy格式读取图片,(height,width,channel)
img_resized = resize(img, dimension, anti_aliasing=True, mode='reflect') #改变图像尺寸
fd = hog(img_resized, orientations=12, block_norm='L1', pixels_per_cell=[8, 8], cells_per_block=[4, 4],
visualize=False,
transform_sqrt=True)
features.append(fd)
flat_data.append(img_resized.flatten())
images.append(img_resized)
target.append(i)
flat_data = np.array(flat_data)
target = np.array(target)
images = np.array(images)
features=np.array(features)
return Bunch(data=flat_data,
target=target,
target_names=categories,
images=images,
features=features,
DESCR=descr)
image_dataset = load_image_files("E:\images")
X_train, X_test, y_train, y_test = train_test_split(
image_dataset.data, image_dataset.target, test_size=0.3, random_state=109)
param_grid = [
{'C': list(range(0, 100)), 'gamma': (0.0001, 0.001), 'kernel': ['rbf']}
]
n_iter_search = 50
svc = svm.SVC()
clf = RandomizedSearchCV(svc, param_grid, n_iter=n_iter_search, cv=3)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print("Classification report for - \n{}:\n{}\n".format(
clf, metrics.classification_report(y_test, y_pred)))
print(clf.best_score_)
print(clf.best_params_)
print('模型在训练集得分:{:.3f}'.format(clf.score(X_train,y_train)))
print('模型在测试集得分:{:.3f}'.format(clf.score(X_test,y_test)))