在这篇文章中,将教大家实现一个网页应用程序,该程序可以接收狗的图片,然后输出其品种,其准确率超过80%!

我们将使用深度学习来训练一个识别狗品种的模型,数据集是狗图像与他们的品种信息,通过学习图像的特征来区分狗的品种。

数据分析

数据集可以从这里下载(https://s3-us-west-1.amazonaws.com/udacity-aind/dog-project/dogImages.zip)。以下是关于数据的一些介绍:

  1. 犬种总数:133

  2. 狗图片总数:8351(训练集:6680,验证集:835,测试集:836)

  3. 最受欢迎的品种:阿拉斯加对应96个样本,博德牧羊犬对应93个样本

按图片数量排序的前30个品种如下:

我们还可以在这里看到一些狗的图片和它们的品种:

数据预处理

我们会把每个图像作为一个numpy数组进行加载,并将它们的大小调整为224x224,这是大多数传统神经网络接受图像的默认大小,另外我们为图像的数量添加为另一个维度。

from keras.preprocessing import image                  from tqdm import tqdm
def path_to_tensor(img_path):    '''将给定路径下的图像转换为张量'''    img = image.load_img(img_path, target_size=(224, 224))    x = image.img_to_array(img)    return np.expand_dims(x, axis=0)
def paths_to_tensor(img_paths):    '''将给定路径中的所有图像转换为张量'''    list_of_tensors = [path_to_tensor(img_path) for img_path in tqdm(img_paths)]    return np.vstack(list_of_tensors)

最后,我们使用ImageDataGenerator对图像进行动态缩放和增强

train_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255,                                                horizontal_flip=True,                                                vertical_flip=True,                                                rotation_range=20)
valid_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255.)
test_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255.)train_generator = train_datagen.flow(train_tensors, train_targets, batch_size=32)valid_generator = train_datagen.flow(valid_tensors, valid_targets, batch_size=32)test_generator = train_datagen.flow(test_tensors, test_targets, batch_size=32)

CNN

我们将在预处理数据集上从头开始训练卷积神经网络(CNN),如下所示:

model = tf.keras.models.Sequential([    tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(224, 224, 3)),    tf.keras.layers.MaxPooling2D(2, 2),    tf.keras.layers.Conv2D(32, (3,3), activation='relu'),    tf.keras.layers.MaxPooling2D(2,2),    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),    tf.keras.layers.MaxPooling2D(2,2),    tf.keras.layers.Conv2D(128, (3,3), activation='relu'),    tf.keras.layers.MaxPooling2D(2,2),    tf.keras.layers.Conv2D(256, (3,3), activation='relu'),    tf.keras.layers.MaxPooling2D(2,2),    tf.keras.layers.Flatten(),    tf.keras.layers.Dense(2048, activation='softmax'),    tf.keras.layers.Dropout(0.5),    tf.keras.layers.Dense(1024, activation='softmax'),    tf.keras.layers.Dropout(0.5),    tf.keras.layers.Dense(133, activation='softmax')])model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
checkpointer = tf.keras.callbacks.ModelCheckpoint(filepath='../saved_models/weights_best_custom.hdf5',                                verbose=1, save_best_only=True)
model.fit(train_generator, epochs=5, validation_data=valid_generator, callbacks=[checkpointer])

我们使用一个ModelCheckpoint的回调来保存验证分数较高的模型。通过测试模型,我们得到的准确率只有1%左右

使用迁移学习

现在,我们使用迁移学习来实现更高的准确率。首先我们下载ResNet-50,可以通过运行下面的代码来提取相应的训练集、测试和验证集:

bottleneck_features = np.load('Data/bottleneck_features/DogResnet50Data.npz')train_Resnet50 = bottleneck_features['train']valid_Resnet50 = bottleneck_features['valid']test_Resnet50 = bottleneck_features['test']

我们现在再次定义模型,并对提取的特征使用GlobalAveragePooling2D,它将一组特征平均为一个值。最后,如果验证损失在两个连续的epoch内没有增加,我们使用额外的回调来降低学习率;如果验证损失在连续的5个epoch内没有增加,可以提前停止训练。

Resnet50_model = tf.keras.models.Sequential()Resnet50_model.add(tf.keras.layers.GlobalAveragePooling2D(input_shape=train_Resnet50.shape[1:]))Resnet50_model.add(tf.keras.layers.Dense(1024, activation='relu'))Resnet50_model.add(tf.keras.layers.Dense(133, activation='softmax'))
Resnet50_model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
checkpointer = tf.keras.callbacks.ModelCheckpoint(filepath='saved_models/weights_best_Resnet50.hdf5',                                verbose=1, save_best_only=True)early_stopping = tf.keras.callbacks.EarlyStopping(patience=5, monitor='val_loss')
reduce_lr = tf.keras.callbacks.ReduceLROnPlateau(patience=2, monitor='val_loss')Resnet50_model.fit(train_Resnet50, train_targets,           validation_data=(valid_Resnet50, valid_targets),          epochs=50, batch_size=20, callbacks=[checkpointer, early_stopping, reduce_lr], verbose=1)### 训练模型

最后在测试集上的准确率为82.65%,这与我们白手起家训练的模型相比,是一个巨大的进步。

构建web应用程序

对于web应用程序,我们首先编写了一个helper函数,该函数接受图像路径并返回品种。label_to_cat字典将每个数字标签映射到它的狗品种。

def predict_breed(img_path):    '''预测给定图像的品种'''    # 提取特征    bottleneck_feature = extract_Resnet50(path_to_tensor(img_path))    bottleneck_feature = tf.keras.models.Sequential([                            tf.keras.layers.GlobalAveragePooling2D(input_shape=bottleneck_feature.shape[1:])                        ]).predict(bottleneck_feature).reshape(1, 1, 1, 2048)    # 获得预测向量    predicted_vector = Resnet50_model.predict(bottleneck_feature)    # 模型预测的犬种    return label_to_cat[np.argmax(predicted_vector)]

对于web应用程序,我们将使用flaskweb框架来帮助我们用最少的代码创建web应用程序。我们定义一个接受图像的路由,并用狗的品种呈现一个输出模板

@app.route('/upload', methods=['POST','GET'])def upload_file():    if request.method == 'GET':        return render_template('index.html')    else:        file = request.files['image']        full_name = os.path.join(UPLOAD_FOLDER, file.filename)        file.save(full_name)        dog_breed = dog_breed_classifier(full_name)    return render_template('predict.html', image_file_name = file.filename, label = dog_breed)

predict.html是分别显示图像及其犬种的模板。

结论

祝贺你!你已经成功地实现了一个狗品种分类器,并且可以准确地分辨出狗的品种。让我们总结一下我们在这里学到的知识:

  1. 我们对数据集进行了分析和预处理。机器学习算法需要单独的训练集、测试集和验证集来进行置信预测。

  2. 我们从零开始使用CNN,由于未能提取特征,所以表现不佳。

  3. 然后我们使用了迁移学习,准确度大大提高

  4. 最后,我们构建了一个Flask web应用程序来实现我们的项目封装

我们确实学到了很多东西,但你还可以尝试很多其他的事情。你可以在heroku上部署web应用程序,也可以尝试使用不同的层(如Dropout层)来提高准确性。

参考链接:https://towardsdatascience.com/dont-know-the-breed-of-your-dog-ml-can-help-6558eb5f7f05

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 mthler」,每日朋友圈更新一篇高质量博文。

扫描二维码添加小编↓

使用python+keras来识别狗的品种相关推荐

  1. python狗品种识别_使用python+keras来识别狗的品种

    在这篇文章中,将教大家实现一个网页应用程序,该程序可以接收狗的图片,然后输出其品种,其准确率超过80%! 我们将使用深度学习来训练一个识别狗品种的模型,数据集是狗图像与他们的品种信息,通过学习图像的特 ...

  2. python狗图像识别_python+keras:识别狗的品种,准确率超过80%!

    model.fit(train_generator, epochs=5, validation_data=valid_generator, callbacks=[checkpointer])我们使用一 ...

  3. 使用深度学习识别狗的品种

    作者|Nouman 编译|VK 来源|Towards Data Science 在这篇文章中,我将教你建立你自己的网页应用程序,它将接受你的狗的图片,并输出其品种.准确率超过80%! 我们将使用深度学 ...

  4. python狗品种识别_卷积神经网络(CNN)项目,给你一个狗的图像,你的算法将会识别并估计狗的品种...

    广告:Udacity课程优惠券:邀请码: 67D6DA2E,立减 300 元 项目概述 欢迎来到卷积神经网络(CNN)项目!在这一项目中,你将学到如何建立一个处理现实生活中的,用户提供的图像的算法.给 ...

  5. 基于Keras的卷积神经网络模型预测--狗的品种识别

    基于Keras的卷积神经网络模型预测–狗的品种识别 from sklearn.datasets import load_files from keras.utils import np_utils i ...

  6. python狗品种识别_kaggle之本地运行识别狗品种

    在搭建了深度学习环境后,第一件事就是试试行不行,最简单的当然是使用已经训练好的模型拿来预测新样本了.这里我们使用kaggle上面训练好的狗狗品种预测模型进行使用说明.(后面有完整的数据和脚本,下载到本 ...

  7. 狗的品种识别实战(tf2.0)

      在深度学习之猫VS狗中,学习了猫和狗识别的分类算法,这能很好的区分猫和狗,那如果我们想做猫的品种识别或者狗的品种识别呢?比如给一只狗的图片,我们想知道它属于斗牛犬,还是柯基,还是中华田园犬?    ...

  8. 【Deep Learning】基于 Keras 的猫狗分类识别

    基于 Keras 的猫狗分类识别 更新: 本文代码github连接:https://github.com/Sdamu/Keras_pratice    本篇主要实现利用 Keras 来实现 Kaggl ...

  9. 沐神《动手学深度实战Kaggle比赛:狗的品种识别(ImageNet Dogs)

    沐神<动手学深度学习>飞桨版课程公开啦! hello各位飞桨的开发者,大家好!李沐老师的<动手学深度学习>飞桨版课程已经公开啦.本课程由PPSIG和飞桨工程师共同建设,将原书中 ...

最新文章

  1. Thread系列——Thread.Sleep(0)
  2. c语言坐标扫雷程序,用C语言写一个扫雷程序
  3. Spring Aop 日志管理及配置文件的详细配置
  4. oracle 查询各科前3名_2020年山东高校排行榜前3无悬念,山东理工大学省内第17全国250名...
  5. SAP CRM WebClient UI cross workcenter的context cleanup
  6. 最新.NET MAUI有什么惊喜?
  7. SpringBoot2.x整合Redis 分布式集群_01
  8. java 包装类_Java中的包装类
  9. Android开发笔记(六十一)文件下载管理DownloadManager
  10. phoenix timestamp字段查询
  11. Objective-C原理系列(一)
  12. Proteus仿真:流水灯
  13. wpsppt放映时间_利用WPS演示制作PPT计时器的两种方法
  14. html input限制输入小数,限制input输入小数只能到3位或者只能输入正整数(兼容ios)...
  15. 安装UWP版网易云音乐
  16. 百读不厌《破窑赋》!真正的千古奇文!
  17. matlab鸢尾花的数据可视化,matplotlib可视化练习 -- 鸢尾花数据集
  18. Excel取当前工作表名称
  19. 计组学习笔记(四):高速缓冲存储器Cache
  20. 国家基本比例尺分幅土地利用现状图制作

热门文章

  1. 万全系列服务器,联想7款万全服务器
  2. 外企面试官最爱提的10个问题(附答案)
  3. MP3、AAC、WMA、Ogg、MPC、WAV、FLAC、APE、WV、CD、MIDI、RealVideo等音频格式解析及对比
  4. c语言过河小游戏代码,闲来没事撸了一个控制台小游戏
  5. 北京计算机软件图片,[组图]计算机软件呈现动物眼中的多彩世界
  6. ffmpeg播放器教程
  7. 电商前端工程师:国内WEB前端开发经验之路
  8. komodo edit 支持java么_Komodo Edit for Mac(多语言集成开发环境)
  9. [TPAMI-2023] Learning to Extract Building Footprints From Off-Nadir Aerial Images
  10. oruxmaps离线地图下载(制作离线地图包)(全国任意地方的离线地图制作)