当前位置:   article > 正文

Python基于Oxford-IIIT Pet Dataset实现宠物识别系统_数据集包含宠物的面部图像和声音录音

数据集包含宠物的面部图像和声音录音

         先看效果:

       Oxford-IIIT Pet Dataset是一个不错的数据集,牛津官方整理出来的一个关于各种猫和狗的数据集,可以很方便被我们用来做图像识别或者是图像分割类型的任务,这里我们主要是做图像识别的应用。

        官方介绍如下所示:

        除了这些以外,官方还对数据集下各个类别中的数据量进行了统计,如下所示:

          从数据统计结果上来看,狗的图像数据量是猫的两倍以上。

         这里我们要做的是图像识别的任务,由于原始数据集是混在一起的,这里我首先将其拆分开来,归类到不同的目录中,核心代码实现如下所示:

  1. #!usr/bin/env python
  2. # encoding:utf-8
  3. from __future__ import division
  4. """
  5. 功能: 数据处理模块
  6. """
  7. import os
  8. import shutil
  9. def splitImg2Category(dataDir="images/",resDir="dataset/"):
  10. '''
  11. 归类图像到不同目录中
  12. '''
  13. for one_pic in os.listdir(dataDir):
  14. one_path=dataDir+one_pic
  15. oneDir=resDir+one_pic.split('_')[0].strip()+"/"
  16. if not os.path.exists(oneDir):
  17. os.makedirs(oneDir)
  18. shutil.copy(one_path,oneDir+one_pic)

        归类处理之后得到如下目录:

        随机看几个目录:

【Abyssinian】

 【Egyptian】

 【miniature】

 【shiba】

       接下来对总的数据集进行随机划分,得到训练集-测试集,核心代码实现如下:

  1. def random2Dataset(dataDir='data/original/',ratio=0.3):
  2. '''
  3. 对原始数据集进行划分,得到:训练集和测试集
  4. '''
  5. label_list=os.listdir(dataDir)
  6. for one_label in label_list:
  7. oneDir=dataDir+one_label+'/'
  8. pic_list=os.listdir(oneDir)
  9. testNum=int(len(pic_list)*ratio)
  10. oneTrainDir='data/train/'+one_label+'/'
  11. oneTestDir='data/test/'+one_label+'/'
  12. if not os.path.exists(oneTrainDir):
  13. os.makedirs(oneTrainDir)
  14. if not os.path.exists(oneTestDir):
  15. os.makedirs(oneTestDir)
  16. #创建测试集
  17. for i in range(testNum):
  18. one_path=oneDir+random.choice(os.listdir(oneDir))
  19. name=str(len(os.listdir(oneTestDir))+1)
  20. new_path=oneTestDir+one_label+'_'+name+'.jpg'
  21. shutil.move(one_path,new_path)
  22. #创建训练集
  23. for one_pic in os.listdir(oneDir):
  24. one_path=oneDir+one_pic
  25. name=str(len(os.listdir(oneTrainDir))+1)
  26. new_path=oneTrainDir+one_label+'_'+name+'.jpg'
  27. shutil.move(one_path,new_path)

       接下来搭建CNN模型

  1. def buildModel(h=16, w=10, way=1):
  2. """
  3. 构建模型
  4. """
  5. model = Sequential()
  6. input_shape = (h, w, way)
  7. model.add(Conv2D(64, (3, 3), input_shape=input_shape))
  8. model.add(Activation("relu"))
  9. model.add(Dropout(0.3))
  10. model.add(Conv2D(64, (3, 3)))
  11. model.add(Activation("relu"))
  12. model.add(MaxPooling2D(pool_size=(2, 2)))
  13. model.add(Flatten())
  14. model.add(Dense(1024))
  15. model.add(Activation("relu"))
  16. model.add(Dropout(0.3))
  17. model.add(Dense(35))
  18. model.add(Activation("sigmoid"))
  19. lrate = 0.01
  20. decay = lrate / 100
  21. sgd = SGD(lr=lrate, momentum=0.9, decay=decay, nesterov=False)
  22. model.compile(loss="categorical_crossentropy", optimizer=sgd, metrics=["accuracy"])
  23. print(model.summary())
  24. return model

        之后就可以训练模型了,核心代码实现如下:

  1. #数据加载
  2. X_train, X_test, y_train, y_test = load()
  3. X_train = X_train.astype("float32")
  4. X_test = X_test.astype("float32")
  5. #数据归一化
  6. X_train /= 255
  7. X_test /= 255
  8. # 模型
  9. model = buildModel(h=h, w=w, way=way)
  10. # 拟合训练
  11. checkpoint = ModelCheckpoint(
  12. filepath=saveDir + "best.h5",
  13. monitor="val_loss",
  14. verbose=1,
  15. mode="auto",
  16. save_best_only="True",
  17. period=1,
  18. )
  19. history = model.fit(
  20. X_train,
  21. y_train,
  22. validation_data=(X_test, y_test),
  23. callbacks=[checkpoint],
  24. epochs=nepochs,
  25. batch_size=32,
  26. )
  27. print(history.history.keys())
  28. #可视化
  29. plt.clf()
  30. plt.plot(history.history["acc"])
  31. plt.plot(history.history["val_acc"])
  32. plt.title("model accuracy")
  33. plt.ylabel("accuracy")
  34. plt.xlabel("epochs")
  35. plt.legend(["train", "test"], loc="upper left")
  36. plt.savefig(saveDir + "train_validation_acc.png")
  37. plt.clf()
  38. plt.plot(history.history["loss"])
  39. plt.plot(history.history["val_loss"])
  40. plt.title("model loss")
  41. plt.ylabel("loss")
  42. plt.xlabel("epochs")
  43. plt.legend(["train", "test"], loc="upper left")
  44. plt.savefig(saveDir + "train_validation_loss.png")
  45. scores = model.evaluate(X_test, y_test, verbose=0)
  46. print("Accuracy: %.2f%%" % (scores[1] * 100))
  47. model_json = model.to_json()
  48. with open(saveDir + "structure.json", "w") as f:
  49. f.write(model_json)
  50. model.save_weights(saveDir + "weights.h5")
  51. model.save(saveDir + "model.h5")
  52. print("=====================Finish=========================")
  53. # 持久化
  54. lossdata, vallossdata = history.history["loss"], history.history["val_loss"]
  55. accdata, valaccdata = history.history["acc"], history.history["val_acc"]
  56. history = {}
  57. history["loss"], history["val_loss"] = lossdata, vallossdata
  58. history["acc"], history["val_acc"] = accdata, valaccdata
  59. with open(saveDir + "history.json", "w") as f:
  60. f.write(json.dumps(history))

        训练完成结果如下所示:

        准确率曲线如下:

        损失值曲线如下所示:

         同样,这里开发对应的界面,方便使用,效果图如下:

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/741807
推荐阅读
相关标签
  

闽ICP备14008679号