BaseML辅助工具
内置图像处理模型ImageLoader
ImageLoader
是BaseML内置的图片处理模块,用于进行图像数字化处理,读取图片并提取其中的图像特征,如HOG特征和LBP特征,用以进行后续的机器学习任务。
其处理流程源码如下:
class ImageLoader(object):
# BaseML中的图像导入处理模块
def __init__(self, training_set_path, testing_set_path, label2id={}, size=128):
"""ImageLoader初始化函数
Args:
training_set_path (str): 图片训练集路径.
testing_set_path (str): 图片测试集路径.
label2id (dict, optional): 自定义的标签id字典. Defaults to {}.
size (int, optional): 图像被resize的大小,尽量不要改size,否则使用lbp或者hog可能会出错,
但是如果原始图像过小,可以调整size . Defaults to 128.
"""
super(ImageLoader, self).__init__()
self.X_train = []
self.y_train = []
self.X_test = []
self.y_test = []
# ImageNet格式的数据集才能被load
self.training_set_path = training_set_path
self.testing_set_path = testing_set_path
self.label2id = label2id
self.size = size
# 读取单张图片,进行预处理
def pre_process(self, img_path):
img = cv2.imread(img_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转为灰度图
img = cv2.resize(img, (self.size, self.size))
img.astype(np.uint8)
return img
def get_label2id(self):
# 如果为空,自己读取training_set中所有的类别,并且进行编号
if self.label2id == {}:
_id = 0
for label in os.listdir(self.training_set_path):
self.label2id[label] = _id
_id += 1
return self.label2id
def get_label_by_id(self, value):
return [k for k, v in self.label2id.items() if v == value]
# 提取hog描述符
def get_hog_descriptor(self, img):
# 采用默认值设置
window_Size = (128, 128) # setting the window size
block_Size = (32, 32) # setting the block size
block_Stride = (16, 16) # setting the block stride
cell_Size = (32, 32) # setting the cell size
no_bins = 9 # setting the number of bins
deriv_Aperture = 1
Sigma = -1. # setting the value of sigma
histogramNormType = 0
L2HysThreshold = 0.2
gamma = 1 # setting the value of gamma
no_levels = 64
signed_Gradients = True
# running Hog descriptor
hog = cv2.HOGDescriptor(window_Size, block_Size, block_Stride,
cell_Size, no_bins, deriv_Aperture, Sigma,
histogramNormType, L2HysThreshold, gamma, no_levels,
signed_Gradients)
return hog.compute(img).T
# 提取lbp描述符
def get_lbp_descriptor(self, img):
hist_size = 256
lbp_radius = 1
lbp_point = 8
# 使用LBP方法提取图像的纹理特征.
lbp = skif.local_binary_pattern(img, lbp_point, lbp_radius, 'default')
# 统计图像的直方图
max_bins = int(lbp.max() + 1)
# hist size:256
hist, _ = np.histogram(
lbp, normed=True, bins=max_bins, range=(0, max_bins))
return hist
# 获取图像特征
def get_feature(self, img, method): # 获取一张图片的描述子
if method == 'hog':
return self.get_hog_descriptor(img)
elif method == 'lbp':
# 返回是一维的,长度256的向量
return self.get_lbp_descriptor(img)
elif method == 'flatten':
# 转成灰度图后直接展平
return np.array(img).flatten().reshape(1, -1)
# 构建训练集和测试集
def get_data(self, method='hog'):
# 如果为空,自己读取training_set中所有的类别,并且进行编号
if self.label2id == {}:
_id = 0
for label in os.listdir(self.training_set_path):
self.label2id[label] = _id
_id += 1
# 读取训练集中的图片,并且进行处理
for train_label in os.listdir(self.training_set_path):
for image in os.listdir(os.path.join(self.training_set_path, train_label)):
image_url = os.path.join(
self.training_set_path, train_label, image)
img_processed = self.pre_process(image_url)
img_feature = self.get_feature(img_processed, method)
self.X_train.append(img_feature) # 转置后是一行的
self.y_train.append(self.label2id[train_label])
# 读取测试集中的图片,进行处理
for test_label in os.listdir(self.testing_set_path):
for image in os.listdir(os.path.join(self.testing_set_path, test_label)):
image_url = os.path.join(
self.testing_set_path, test_label, image)
img_processed = self.pre_process(image_url)
img_feature = self.get_feature(img_processed, method)
self.X_test.append(img_feature)
self.y_test.append(self.label2id[test_label])
# Convert train and test data to numpy arrays
self.X_train = np.array(self.X_train)
self.X_train = self.X_train.reshape(
(self.X_train.shape[0], -1)) # 转成二维数组
self.y_train = np.array(self.y_train)
self.X_test = np.array(self.X_test)
self.X_test = self.X_test.reshape((self.X_test.shape[0], -1)) # 转成二维数组
self.y_test = np.array(self.y_test)
return self.X_train, self.y_train, self.X_test, self.y_test
使用此模块,可在BaseML载入数据前,对图片进行快速批量处理后再载入,且能够完成单张图片的HOG特征提取(还可以更换为其他特征),示例代码如下。
# 导入BaseML的图像处理模块
from BaseML import IMGLoader
# 定义一个提取单张图片HOG特征的函数
def read_hog_feature_single(file_path):
# 创建ImageLoader实例并读取图片
img_set = IMGLoader.ImageLoader(file_path,file_path,size = 128)
# 对读取的图片进行预处理
img = img_set.pre_process(file_path)
# 提取图片的HOG特征
feature = img_set.get_feature(img,method = 'hog')
return feature
# 指定一张图片
img_path = 'test.jpg'
# 提取HOG特征
data = read_hog_feature_single(img_path)
# 打印HOG特征和其形状
print("HOG特征:",data)
print("图像形状:",data.shape)
自带可视化工具
在做机器学习项目的过程中,可视化能帮助我们了解模型训练状态,评估模型效果,还能了解数据,辅助了解算法模型,改善模型。
BaseML中提供两种可视化方法:模型可视化及评价指标可视化。模型可视化可以通过测试数据及线条勾勒模型的大致形状,有助于解释和理解模型的内部结构。评价指标可视化显示了模型对于数据的拟合程度,描述了模型的性能,方便用户进行模型选择。使用可视化部分的前提是已经对模型进行初始化并且训练完成,否则可视化部分无法正常使用。
1. 模型可视化
目前该模块只支持4类算法的可视化,分别为Classification中的KNN、SVM,Regression中的LinearRegression,Cluster中的Kmeans。调用方法为model.plot()
。
2. 评价指标可视化
目前该模块支持Classification、Regression中的所有算法及Cluster中的Kmeans算法,其他算法不支持。调用方法为model.metricplot()
。
3. 可视化调用限制
快速体验训练过程可视化全流程!
0. 引入包
# 导入库,从BaseML导入分类模块
from BaseML import Classification as cls
1. 实例化模型
# 实例化模型,模型名称选择KNN(K Nearest Neighbours)
model=cls('KNN')
2. 载入数据
# 载入数据集,并说明特征列和标签列
model.load_dataset('./lenses.csv', type ='csv', x_column = [1,2,3,4],y_column=[5])
3. 模型训练
# 模型训练
model.train()
4. 模型可视化
# 模型可视化
model.plot()
5. 评价指标可视化
# 评价指标可视化
model.metricplot()
快速体验推理过程可视化!
0. 引入包
# 导入库,从BaseML导入分类模块
from BaseML import Classification as cls
1. 实例化模型
# 实例化模型,模型名称选择KNN(K Nearest Neighbours)
model=cls('KNN')
2. 加载模型参数
# 加载保存的模型参数
model.load('mymodel.pkl')
3. 载入数据
# 载入数据集,并说明特征列和标签列
model.load_dataset('./lenses.csv', type ='csv', x_column = [1,2,3,4],y_column=[5])
4. 模型推理
# 模型推理
model.inference()
5. 模型可视化
# 模型可视化
model.plot()
6. 评价指标可视化
# 评价指标可视化
model.metricplot()
实际上,训练过程可视化使用的数据与推理过程可视化使用的数据是相同的,均为数据集经过划分后的测试集(model.x_test)。
其他数据可视化
0. 引入包
# 导入库,从BaseML导入分类模块
from BaseML import Classification as cls
1. 实例化模型
# 实例化模型,模型名称选择KNN(K Nearest Neighbours)
model=cls('KNN')
2. 加载模型参数
# 加载保存的模型参数
model.load('mymodel.pkl')
3. 模型推理
# 模型推理
# test_data = [[0.2,0.4,3.2,5.6],
# [2.3,1.8,0.4,2.3]]
model.inference(test_data)
4. 模型可视化
# 模型可视化
# test_true_data = [[0],
# [1]]
model.plot(X=test_data, y_true=test_true_data)
5. 评价指标可视化
# 评价指标可视化, 如果要使用其他数据进行测试,必须先加载之前的数据集
model.load_dataset('./lenses.csv', type ='csv', x_column = [1,2,3,4],y_column=[5])
model.metricplot(X=test_data, y_true=test_true_data)