关键词搜索

源码搜索 ×
×

用Python图像识别技术打造一个小狗分类器,实现让机器自己去“学习”~

发布2021-08-19浏览543次

详情内容

工具使用

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

效果展示

训练集的准确率为0.925,但测试集只有0.7
说明过拟合了,可以再增加一些图片,或者使用数据增强,来减少过拟合。

图片

测试了两张图片,全都识别对了!

图片

思路分析

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

1、准备数据集

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

2 数据集的预处理

1 统一尺寸为1001003(RGB彩色图像)

  1. # 统一尺寸的核心代码
  2. img = Image.open(img_path)
  3. new_img = img.resize((100, 100), Image.BILINEAR)
  4. new_img.save(os.path.join('./dog_kinds_after/' + dog_name, jpgfile))

2 由于数据是自己下载的,需要制作标签(label),可提取图像名称的第一个数字作为类别。(重命名图片)

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

3 划分数据集

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

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

  1. # 只放了训练集的代码,测试集一样操作。
  2. ima_train = os.listdir('./train')
  3. # 图片其实就是一个矩阵(每一个像素都是0-255之间的数)(100*100*3
  4. # 1.把图片转换为矩阵
  5. def read_train_image(filename):
  6. img = Image.open('./train/' + filename).convert('RGB')
  7. return np.array(img)
  8. x_train = []
  9. # 2.把所有的图片矩阵放在一个列表里 (840, 100, 100, 3)
  10. for i in ima_train:
  11. x_train.append(read_train_image(i))
  12. x_train = np.array(x_train)
  13. # 3.提取kind类别作为标签
  14. y_train = []
  15. for filename in ima_train:
  16. y_train.append(int(filename.split('_')[0]))
  17. # 标签(0/1/2/3)(840,)
  18. y_train = np.array(y_train)
  19. # 我是因为重命名图片为(1/2/3/4),所以都减了1
  20. # 为了能够转化为独热矩阵
  21. y_train = y_train - 1
  22. # 4.把标签转换为独热矩阵
  23. # 将类别信息转换为独热码的形式(独热码有利于神经网络的训练)
  24. y_train = np_utils.to_categorical(y_train)
  25. y_test = np_utils.to_categorical(y_test)
  26. print(y_test)
  27. x_train = x_train.astype('float32')
  28. x_test = x_test.astype('float32')
  29. x_train /= 255
  30. x_test /= 255
  31. print(x_train.shape) # (840, 100, 100, 3)
  32. print(y_train.shape) # (840,)

3 搭建卷积神经网络

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

它是为了支持快速实践而对Tensorflow的再次封装,让我们可以不用关注过多的底层细节,能够把想法快速转换为结果。

  1. # 1.搭建模型(类似于VGG,直接拿来用就行)
  2. model = Sequential()
  3. # 这里搭建的卷积层共有32个卷积核,卷积核大小为3*3,采用relu的激活方式。
  4. # input_shape,字面意思就是输入数据的维度。
  5. #这里使用序贯模型,比较容易理解
  6. #序贯模型就像搭积木一样,将神经网络一层一层往上搭上去
  7. model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(100, 100, 3)))
  8. model.add(Conv2D(32, (3, 3), activation='relu'))
  9. model.add(MaxPooling2D(pool_size=(2, 2)))
  10. model.add(Dropout(0.25))
  11. model.add(Conv2D(64, (3, 3), activation='relu'))
  12. model.add(Conv2D(64, (3, 3), activation='relu'))
  13. model.add(MaxPooling2D(pool_size=(2, 2)))
  14. model.add(Dropout(0.25))
  15. #dropout层可以防止过拟合,每次有25%的数据将被抛弃
  16. model.add(Flatten())
  17. model.add(Dense(256, activation='relu'))
  18. model.add(Dropout(0.5))
  19. model.add(Dense(4, activation='softmax'))

4 训练

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

图片

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

  1. # 编译模型
  2. sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
  3. model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
  4. # 一共进行32
  5. # 也就是说840张图片,每次训练10张,相当于一共训练84
  6. model.fit(x_train, y_train, batch_size=10, epochs=32)
  7. # 保存权重文件(也就是相当于“房价问题的k和b两个参数”)
  8. model.save_weights('./dog_weights.h5', overwrite=True)
  9. # 评估模型
  10. score = model.evaluate(x_test, y_test, batch_size=10)
  11. print(score)

5 预测

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

  1. # 1.上传图片
  2. name = input('上传图片的名称(例如:XX.jpg)为:')
  3. # 2.预处理图片(代码省略)
  4. # 3.加载权重文件
  5. model.load_weights('dog_weights.h5')
  6. # 4.预测类别
  7. classes = model.predict_classes(x_test)[0]
  8. target = ['京巴', '拉布拉多', '柯基', '泰迪']
  9. # 3-泰迪 2-柯基 1-拉布拉多 0-京巴
  10. # 5.打印结果
  11. print("识别结果为:" + target[classes])

文章到这里就结束了,感谢你的观看,下个系列分享Python小技巧

为了感谢读者们,我想把我最近收藏的一些编程python教程干货分享给大家,回馈每一个读者,希望能帮到你们。

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载