乐趣区

关于python3.x:用Python图像识别技术打造一个小狗分类器实现让机器自己去学习

前言

今日给大家带来的是图像识别技术——小狗分类器

工具应用

开发环境:win10、python3.6
开发工具:pycharm
工具包:keras,numpy, PIL

成果展现

训练集的准确率为 0.925,但测试集只有 0.7
阐明过拟合了,能够再减少一些图片,或者应用数据加强,来缩小过拟合。

测试了两张图片,全都辨认对了!

思路剖析

  • 1 筹备数据集
  • 2 数据集的预处理
  • 3 搭建卷积神经网络
  • 4 训练
  • 5 预测

1、筹备数据集

咱们能够通过爬虫技术,把 4 类图像(京巴、拉布拉多、柯基、泰迪)保留到本地。总共有 840 张图片做训练集,188 张图片做测试集。

2 数据集的预处理

1 对立尺寸为 1001003(RGB 彩色图像)

# 对立尺寸的外围代码
img = Image.open(img_path)
new_img = img.resize((100, 100), Image.BILINEAR)
new_img.save(os.path.join('./dog_kinds_after/' + dog_name, jpgfile))

2 因为数据是本人下载的,须要制作标签(label),可提取图像名称的第一个数字作为类别。(重命名图片)

kind = 0

# 遍历京巴的文件夹
images = os.listdir(images_path)
for name in images:
    image_path = images_path + '/'
    os.rename(image_path + name, image_path + str(kind) +'_' + name.split('.')[0]+'.jpg')

3 划分数据集

840 张图片做训练集,188 张图片做测试集。

4 把图片转换为网络须要的类型

# 只放了训练集的代码,测试集一样操作。ima_train = os.listdir('./train')

# 图片其实就是一个矩阵(每一个像素都是 0 -255 之间的数)(100*100*3)# 1. 把图片转换为矩阵
def read_train_image(filename):
    img = Image.open('./train/' + filename).convert('RGB')
    return np.array(img)

x_train = []
# 2. 把所有的图片矩阵放在一个列表里 (840, 100, 100, 3)
for i in ima_train:
    x_train.append(read_train_image(i))
x_train = np.array(x_train)
# 3. 提取 kind 类别作为标签
y_train = []
for filename in ima_train:
    y_train.append(int(filename.split('_')[0]))

# 标签(0/1/2/3)(840,)
y_train = np.array(y_train)

# 我是因为重命名图片为(1/2/3/4),所以都减了 1
# 为了可能转化为独热矩阵
y_train = y_train - 1  

# 4. 把标签转换为独热矩阵
# 将类别信息转换为独热码的模式(独热码有利于神经网络的训练)y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
print(y_test)

x_train = x_train.astype('float32')
x_test = x_test.astype('float32')

x_train /= 255
x_test /= 255
print(x_train.shape)  # (840, 100, 100, 3)
print(y_train.shape)  # (840,)

3 搭建卷积神经网络

Keras 是基于 TensorFlow 的深度学习库,是由纯 Python 编写而成的高层神经网络 API,也仅反对 Python 开发。

它是为了反对疾速实际而对 Tensorflow 的再次封装,让咱们能够不必关注过多的底层细节,可能把想法疾速转换为后果。

# 1. 搭建模型 (相似于 VGG,间接拿来用就行)
model = Sequential()
# 这里搭建的卷积层共有 32 个卷积核,卷积核大小为 3 *3,采纳 relu 的激活形式。# input_shape,字面意思就是输出数据的维度。#这里应用序贯模型,比拟容易了解
#序贯模型就像搭积木一样,将神经网络一层一层往上搭上去

model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(100, 100, 3)))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
#dropout 层能够避免过拟合,每次有 25% 的数据将被摈弃

model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(4, activation='softmax'))

4 训练

训练的过程,就是最优解的过程。

对上图来说,就是依据数据集,一直的迭代,找到一条最近似的直线(y = kx + b),把参数 k,b 保留下来,预测的时候间接加载。

# 编译模型
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])

# 一共进行 32 轮
# 也就是说 840 张图片,每次训练 10 张,相当于一共训练 84 次
model.fit(x_train, y_train, batch_size=10, epochs=32)


# 保留权重文件(也就是相当于“房价问题的 k 和 b 两个参数”)model.save_weights('./dog_weights.h5', overwrite=True)
# 评估模型
score = model.evaluate(x_test, y_test, batch_size=10)
print(score)

5 预测

此时 k、b(参数) 和 x(小狗的图像) 都是已知的了,求 k(类别) 就完了。

# 1. 上传图片
name = input('上传图片的名称(例如:XX.jpg)为:')

# 2. 预处理图片 (代码省略)

# 3. 加载权重文件
model.load_weights('dog_weights.h5')

# 4. 预测类别
classes = model.predict_classes(x_test)[0]

target = ['京巴', '拉布拉多', '柯基', '泰迪']
# 3- 泰迪 2- 柯基 1- 拉布拉多 0- 京巴

# 5. 打印后果
print("辨认后果为:" + target[classes])

文章到这里就完结了,感激你的观看,Python 数据分析系列,下个系列分享 Python 小技巧

为了感激读者们,我想把我最近珍藏的一些编程干货分享给大家,回馈每一个读者,心愿能帮到你们。

干货次要有:

① 2000 多本 Python 电子书(支流和经典的书籍应该都有了)

② Python 规范库材料(最全中文版)

③ 我的项目源码(四五十个乏味且经典的练手我的项目及源码)

④ Python 根底入门、爬虫、web 开发、大数据分析方面的视频(适宜小白学习)

⑤ Python 学习路线图(辞别不入流的学习)

⑥ 两天的 Python 爬虫训练营直播权限

All done~详见个人简介或者私信获取残缺源代码。。

往期回顾

Python 实现“假”数据

Python 爬虫鲁迅学生《经典语录》

Python 爬虫豆瓣热门话题

退出移动版