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

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

数据分析

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

犬种总数:133

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

最受欢迎的品种:阿拉斯加对应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. 我们对数据集进行了分析和预处理。机器学习算法需要单独的训练集、测试集和验证集来进行置信预测。

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

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

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

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

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

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

  1. python制作文字识别_用Python轻松进行图像文本识别

    用Python轻松进行图像文本识别 作者:梅朵 微信公众号:实用办公编程技能 微信号:Excel-Python 最近,办公室的同事小李在整理一份报告,很多材料的电子版找不到了,都是纸质版的,纸质版上的 ...

  2. python人脸深度识别_基于Python的深度学习人脸识别方法

    基于 Python 的深度学习人脸识别方法 薛同来 ; 赵冬晖 ; 张华方 ; 郭玉 ; 刘旭春 [期刊名称] <工业控制计算机> [年 ( 卷 ), 期] 2019(032)002 [摘 ...

  3. python猪脸识别_一种猪脸的识别方法与流程

    本发明涉及人工智能技术领域,特别涉及到一种用于猪脸的自动识别方法. 背景技术: 当前养猪场进行批量养猪的过程中,养殖者需要掌握每头猪只的饮食情况.健康状态.生长状况以及情绪等信息,因此识别每头猪只的身 ...

  4. python识图打怪_利用python进行识别相似图片(二)

    前言 和网上各种首先你要有一个女朋友的系列一样,想进行人脸判断,首先要有脸, 只要能靠确定人脸的位置,那么进行两张人脸是否相似的操作便迎刃而解了. 所以本篇文章着重讲述如何利用openCV定位人脸. ...

  5. python字符串去掉空行_从python中的字符串中删除空格

    python字符串去掉空行 如何在python中删除字符串中的空格 (How to remove whitespaces in a string in python) str.lstrip()str. ...

  6. python画交互式地图_使用Python构建交互式地图-入门指南

    python画交互式地图 Welcome to The Beginner's Guide to Building Interactive Maps in Python 欢迎使用Python构建交互式地 ...

  7. python图片字符分割_图像分割python

    常用的十大 python 图像处理工具 本文为 AI 研习社编译的技术博客,原标题 : 10 Python image manipulation tools. 作者 | Parul Pandey 翻译 ...

  8. python delimiter分隔符用法_使用Python文件读写,自定义分隔符(custom delimiter)

    众所周知,python文件读取文件的时候所支持的newlines(即换行符),是指定的.这一点不管是从python的doucuments上还是在python的源码中(作者是参考了python的io版本 ...

  9. python宝石与石头_学习python (2)

    Python 2.7.x 与 Python 3.x 的不同点 本文翻译自:<Key differences between Python 2.7.x and Python 3.x> 许多 ...

最新文章

  1. 报告 | 从20世纪70年代至今,自动驾驶汽车的发展经历了哪些历史性的变革?
  2. 鸿海拟收购韩国家电企业东洋美吉 价格或达4.5亿美元
  3. Linux命令行抓包及包解析工具tshark(wireshark)使用实例解析
  4. 科大星云诗社动态20210227
  5. 非刚性人脸跟踪 —— 实用工具
  6. Machine Learning on Spark——统计基础(二)
  7. c语言将pwd结果赋给变量,《网络系统管理linux实训》全套PPT电子课件教案-第4章 shell编程.ppt...
  8. qt中QHBoxLayout或QVBoxLayout布局内控件的动态生成与显示
  9. 关于服务器性能的一些思考
  10. 通过配置文件添加MIME类型
  11. Python print()重定向 不输出到屏幕
  12. MySQL常见的几种数据类型盘点
  13. 三星java手机播放器下载_8k视频播放器软件下载安卓-三星8k视频播放器KMPlayer下载v30.10.231 内置提取版-西西软件下载...
  14. matlab如何z变换,MATLAB第3章Z变换详解.ppt
  15. 【Linux 编程】线程绑定 CPU
  16. 断舍离------活成自己喜欢的样子
  17. HTML5 小组 北京站 沙龙
  18. 如何快速的开通公众号【原创】功能
  19. 堆、栈、队列的区别和联系
  20. 大数据时代网络舆情与社会治理研究

热门文章

  1. 毕达哥拉斯(勾股定理)
  2. 以圆桌骑士为例浅尝HTML5游戏开发
  3. TimeSpan设置Tick数
  4. 浏览器打开windows桌面应用
  5. Caffeine实战教程篇
  6. 阿里巴巴区块链防食品欺诈平台进入试点阶段
  7. i3 10110u和r5 4500u 哪个好
  8. 最好用的项目流程管理工具 OmniPlan Pro 4.3.2 Mac版(内附安装包链接)
  9. 《PTA——拼题A》之第1016题
  10. 为什么颤振不是下一件大事