python狗品种识别_使用python+keras来识别狗的品种
在这篇文章中,将教大家实现一个网页应用程序,该程序可以接收狗的图片,然后输出其品种,其准确率超过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来识别狗的品种相关推荐
- python制作文字识别_用Python轻松进行图像文本识别
用Python轻松进行图像文本识别 作者:梅朵 微信公众号:实用办公编程技能 微信号:Excel-Python 最近,办公室的同事小李在整理一份报告,很多材料的电子版找不到了,都是纸质版的,纸质版上的 ...
- python人脸深度识别_基于Python的深度学习人脸识别方法
基于 Python 的深度学习人脸识别方法 薛同来 ; 赵冬晖 ; 张华方 ; 郭玉 ; 刘旭春 [期刊名称] <工业控制计算机> [年 ( 卷 ), 期] 2019(032)002 [摘 ...
- python猪脸识别_一种猪脸的识别方法与流程
本发明涉及人工智能技术领域,特别涉及到一种用于猪脸的自动识别方法. 背景技术: 当前养猪场进行批量养猪的过程中,养殖者需要掌握每头猪只的饮食情况.健康状态.生长状况以及情绪等信息,因此识别每头猪只的身 ...
- python识图打怪_利用python进行识别相似图片(二)
前言 和网上各种首先你要有一个女朋友的系列一样,想进行人脸判断,首先要有脸, 只要能靠确定人脸的位置,那么进行两张人脸是否相似的操作便迎刃而解了. 所以本篇文章着重讲述如何利用openCV定位人脸. ...
- python字符串去掉空行_从python中的字符串中删除空格
python字符串去掉空行 如何在python中删除字符串中的空格 (How to remove whitespaces in a string in python) str.lstrip()str. ...
- python画交互式地图_使用Python构建交互式地图-入门指南
python画交互式地图 Welcome to The Beginner's Guide to Building Interactive Maps in Python 欢迎使用Python构建交互式地 ...
- python图片字符分割_图像分割python
常用的十大 python 图像处理工具 本文为 AI 研习社编译的技术博客,原标题 : 10 Python image manipulation tools. 作者 | Parul Pandey 翻译 ...
- python delimiter分隔符用法_使用Python文件读写,自定义分隔符(custom delimiter)
众所周知,python文件读取文件的时候所支持的newlines(即换行符),是指定的.这一点不管是从python的doucuments上还是在python的源码中(作者是参考了python的io版本 ...
- python宝石与石头_学习python (2)
Python 2.7.x 与 Python 3.x 的不同点 本文翻译自:<Key differences between Python 2.7.x and Python 3.x> 许多 ...
最新文章
- 报告 | 从20世纪70年代至今,自动驾驶汽车的发展经历了哪些历史性的变革?
- 鸿海拟收购韩国家电企业东洋美吉 价格或达4.5亿美元
- Linux命令行抓包及包解析工具tshark(wireshark)使用实例解析
- 科大星云诗社动态20210227
- 非刚性人脸跟踪 —— 实用工具
- Machine Learning on Spark——统计基础(二)
- c语言将pwd结果赋给变量,《网络系统管理linux实训》全套PPT电子课件教案-第4章 shell编程.ppt...
- qt中QHBoxLayout或QVBoxLayout布局内控件的动态生成与显示
- 关于服务器性能的一些思考
- 通过配置文件添加MIME类型
- Python print()重定向 不输出到屏幕
- MySQL常见的几种数据类型盘点
- 三星java手机播放器下载_8k视频播放器软件下载安卓-三星8k视频播放器KMPlayer下载v30.10.231 内置提取版-西西软件下载...
- matlab如何z变换,MATLAB第3章Z变换详解.ppt
- 【Linux 编程】线程绑定 CPU
- 断舍离------活成自己喜欢的样子
- HTML5 小组 北京站 沙龙
- 如何快速的开通公众号【原创】功能
- 堆、栈、队列的区别和联系
- 大数据时代网络舆情与社会治理研究