第一步:定义问题
我们首先需要解决的是我们将面临一个什么问题,需要我们做什么,俗话说的磨刀不误砍柴工,首先看清对手是谁才能有的放矢。
今天我们要处理的问题是:给训练好的模型输入一张图片,模型返回这张图片是属于什么类型
第二步:收集数据
根据确定的数据分析对象,抽象出在数据分析中所需要的特征信息
今天这个示例的数据来源于网络,大家可以自行下载一些图片即可,本次示例中给出两组图片数据进行演示
第三步:准备数据
这一步将对数据进行清洗、整理,处理空值等一系列操作
from PIL import Image,ImageOps
import glob, os
src_source = 'E:\\All\\AllInHere\\AiProject\\photo\\' #原图片存放路径
src_target = 'E:\\All\\AllInHere\\AiProject\\pre_photo\\' #预处理后图片存放路径
#图片预处理
def preprocess(filename, name, t_path):
print(filename)
#设置缩略图大小
size = 128, 128
#glob.glob 返回所有匹配的文件路径列表(文件路径,
以字符串形式,构成的 list)
for infile in glob.glob(filename):
file, ext = os.path.splitext(infile)
im = Image.open(infile)
#z存储长边
z = 0
x,y = im.size
if x>y:
z = x
else:
z = y
try:
#用长边建立正方形
p = Image.new('RGB', (z,z), (255,255,255))
#查看图片rpg值
#print(np.array(p))
#粘贴
p.paste(im, (0, 0, x, y))
#缩略图
p.thumbnail(size)
#p.show()
#对比度拉伸(确保每个图像的像素范围从0到255)
p = ImageOps.autocontrast(p)
#p.show()
#判断路径是否存在,若不存在则创建
if not os.path.isdir(t_path):
os.makedirs(t_path)
#保存图片
p.save(t_path + '\\' + name + ".thumbnail.jpg",
"JPEG")
except Exception as e:
print(e)
#获取文件夹下所有文件,并调用预处理
def getfiles(dir):
s_path = src_source + dir
t_path = src_target + dir
# 输出所有文件和文件夹
for name in os.listdir(s_path):
filename = s_path + '\\' + name
#判断是否是文件
if os.path.isfile(filename) == True:
#去除扩展名
no_ext_name = os.path.splitext(name)[0]
preprocess(filename, no_ext_name, t_path)
if __name__ == '__main__':
getfiles('apple')
getfiles('banana')
第四步:图像特征和标签放入数组
这一步是为了将数据进行标示出来,进行监督性机器学习,示例代码如下:
img_features = []
img_labels = []
# 图像特征和标签放入数组
def Prepare_Image(filename, label):
im = Image.open(filename)
img_features.append(np.array(im).ravel())
img_labels.append(label)
# print(filename)
# print(label)
第五步:分离训练集和测试集
为了防止我们的模型发生过拟合或者欠拟合之类问题(具体定义自行百度),我们需要将数据进行拆分,用一部分数据进行训练,然后用剩余的数据进行准确性验证,这种也是监督学习模型特有的,这里我们用sklearn 库里现有的函数进行拆分,本示例中将数据集分成70%训练集30%测试集,示例代码如下:
def split_data(img_features, img_labels):
X_train, X_test, Y_train, Y_test = train_test_split(img_features, img_labels, test_size=0.30)#将数据集分成70%训练集30%测试集
train_model(X_train, Y_train, X_test, Y_test)
第六步:训练模型
基于训练数据集训练一个逻辑回归模型,示例代码如下:
def train_model(X_train, Y_train, X_test, Y_test):
# Set regularization rate
reg = 0.01
# print("*"*100)
# print(Y_train)
# 基于训练数据集训练一个逻辑回归模型
clf=LogisticRegression(C=1/reg,solver='lbfgs',multi_class='multinomial').fit(X_train, Y_train)
# print (clf)
#保存模型到本地
joblib.dump(clf, "train_model.m")
evaluate_model(X_test, Y_test, clf)
第七步:评估模型
用训练数据对模型进行训练之后,就可以用于预测数据,示例代码如下:
def evaluate_model(X_test, Y_test, clf):
predictions = clf.predict(X_test)
print('准确度: ', accuracy_score(Y_test, predictions))
第八步:使用模型
可以随机拿一张测试集中或者是其他类似的图片,输入模型中,让模型进行预计,观察模型预测的准确性如何,示例代码如下:
def use_model(clf):
img=Image.open("E:\\All\\AllInHere\\AiProject\\pre_photo\\banana\\41edw+BC UjL._AC_US436_QL65_.thumbnail.jpg") #在模型中输入一个banana的图片
img = np.array(img)
plt.imshow(img)
# 修改图像数据以匹配训练特征的格式
imgfeatures=np.array(ImageOps.equalize(Image.fromarray(img))). ravel().
reshape(1, -1)
pred = clf.predict(imgfeatures)
print('此图片是:', pred[0])
main 函数:
if __name__ == '__main__':
def getfiles(path , label): #数据特征与标签化处理
for name in os.listdir(path):
filename = path + '\\' + name
if os.path.isfile(filename) == True:
Prepare_Image(filename, label)
file_path = 'E:\\All\\AllInHere\\AiProject\\pre_photo'
#第一组图片测试数据
getfiles(file_path + '\\' + 'apple' , 'apple')
#第二组图片测试数据
getfiles(file_path + '\\' + 'banana' , 'banana')
split_data(np.array(img_features), np.array(img_labels))
执行后输出内容为:
准确度: 1.0
此图片是: banana