0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

利用Python实现网页应用程序,可图片识别狗的类型(附源码)

如意 来源:OFweek电子工程网 作者:磐创AI 2020-10-08 14:45 次阅读

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

我们将使用深度学习来训练一个识别狗品种的模型,数据集是狗图像与他们的品种信息,通过学习图像的特征来区分狗的品种。数据分析数据集可以从这里下载(https://s3-us-west-1.amazonaws.com/udacity-aind/dog-project/dogImages.zip)。以下是关于数据的一些介绍:犬种总数:133狗图片总数:8351(训练集:6680,验证集:835,测试集:836)最受欢迎的品种:阿拉斯加对应96个样本,博德牧羊犬对应93个样本按图片数量排序的前30个品种如下:

利用Python实现网页应用程序,可图片识别狗的类型(附源码)

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

数据预处理我们会把每个图像作为一个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是分别显示图像及其犬种的模板。

结论

祝贺你!你已经成功地实现了一个狗品种分类器,并且可以准确地分辨出狗的品种。让我们总结一下我们在这里学到的知识:我们对数据集进行了分析和预处理。机器学习算法需要单独的训练集、测试集和验证集来进行置信预测。我们从零开始使用CNN,由于未能提取特征,所以表现不佳。然后我们使用了迁移学习,准确度大大提高最后,我们构建了一个Flask web应用程序来实现我们的项目封装我们确实学到了很多东西,但你还可以尝试很多其他的事情。你可以在heroku上部署web应用程序,也可以尝试使用不同的层(如Dropout层)来提高准确性。

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4599

    浏览量

    92617
  • 应用程序
    +关注

    关注

    37

    文章

    3240

    浏览量

    57594
  • python
    +关注

    关注

    55

    文章

    4778

    浏览量

    84439
收藏 人收藏

    评论

    相关推荐

    用C#编写一个抓网页应用程序

    用C#编写一个抓网页应用程序本文利用C#和.NET提供的类来轻松创建一个抓取网页内容源代码的程序 。HTTP是WWW进行数据访问最基本的协
    发表于 12-26 12:25

    python实现网页爬虫爬取图片

    打开一个URL地址;read()方法用于读取URL上的数据;向getHtml()函数传递一个网址,并把整个页面下载下来。执行程序就会把整个网页打印输出。二. 筛选页面中想要的数据 Python 提供了
    发表于 04-05 15:32

    在线客服源码C++、ASP、PHP等的比较

    ASP、PHP、JSP类在线客服源码都是基于网页源码,虽然它们基本也有一个应用程序外观,但是都是在软件窗口内嵌的网页,从技术角度来说,其本
    发表于 04-13 21:05 44次下载

    利用FTP实现应用程序的远程更新

    FTP (File Transfer Protocol),是用于Internet上的控制文件的双向传输的协议。同时,它也是一个应用程序。本方案主要介绍如何利用网络(以太网、GPRS上网),通过FTP协议来实现
    发表于 06-09 16:08 46次下载

    奥迪quattro coaster AR应用程序识别”具体的奥迪电视广告

    奥迪quattro coaster AR应用程序识别”具体的奥迪电视广告,是广告民众参与式扩展体验! 奥迪发布了一款由他们的电视广告触发的,新的AR智能手机
    发表于 02-08 07:43 1695次阅读

    STM32和TFT彩屏显示图片程序取模软件)免费下载

    本文档的主要内容详细介绍的是STM32和TFT彩屏显示图片程序取模软件)免费下载。
    发表于 09-19 17:21 175次下载
    STM32和TFT彩屏显示<b class='flag-5'>图片</b><b class='flag-5'>程序</b>(<b class='flag-5'>附</b>取模软件)免费下载

    python3.3抓取网页数据的程序资料免费下载

    本文档的主要内容详细介绍的是python3.3抓取网页数据的程序资料免费下载。
    发表于 01-29 15:19 21次下载
    <b class='flag-5'>python</b>3.3抓取<b class='flag-5'>网页</b>数据的<b class='flag-5'>程序</b>资料免费下载

    如何利用Python和函数库进行简单的人脸识别?(源码

    本文将介绍图像处理中的一些重要概念,除了具体解释每个步骤之外,还将提供一个在Python中使用Cv2和DLib库轻松进行人脸识别的项目。
    的头像 发表于 09-04 14:06 3118次阅读
    如何<b class='flag-5'>利用</b><b class='flag-5'>Python</b>和函数库进行简单的人脸<b class='flag-5'>识别</b>?(<b class='flag-5'>附</b><b class='flag-5'>源码</b>)

    使用Python实现车牌识别程序免费下载

    本文档的主要内容详细介绍的是使用Python实现车牌识别程序免费下载。
    发表于 09-11 16:12 35次下载
    使用<b class='flag-5'>Python</b><b class='flag-5'>实现</b>车牌<b class='flag-5'>识别</b>的<b class='flag-5'>程序</b>免费下载

    不同应用程序的存储IO类型解析

    的数据访问类型有所不同。 本文描述典型的不同应用程序的存储IO类型。帮助读者了解不同应用程序存储IO类型的同时,提供的数据也可以为存储模拟和
    的头像 发表于 11-30 15:21 2220次阅读
    不同<b class='flag-5'>应用程序</b>的存储IO<b class='flag-5'>类型</b>解析

    python v3.8.0应用程序免费下载

    本文档的主要内容详细介绍的是python v3.8.0应用程序免费下载。
    发表于 12-29 08:00 0次下载
    <b class='flag-5'>python</b> v3.8.0<b class='flag-5'>应用程序</b>免费下载

    电机正反转互锁控制应用程序源码下载

    电机正反转互锁控制应用程序源码下载
    发表于 04-06 17:23 42次下载
    电机正反转互锁控制<b class='flag-5'>应用程序</b><b class='flag-5'>源码</b>下载

    蜂鸣器播放音乐设计与实现源码

    蜂鸣器播放音乐设计与实现源码
    发表于 04-24 11:00 87次下载
    蜂鸣器播放音乐设计与<b class='flag-5'>实现</b>(<b class='flag-5'>附</b><b class='flag-5'>源码</b>)

    基于51单片机的图书管理系统实现与设计(源码)

    基于51单片机的图书管理系统实现与设计(源码)
    发表于 04-26 10:52 18次下载

    什么是网页应用程序测试?

    网页app测试,或网页测试,是一种软件测试实践,有助于根据要求确保应用程序的质量和功能。网页测试必须在交付之前检测所有潜在问题,例如功能差异、安全漏洞、集成问题、网络环境问题或流量压力
    的头像 发表于 05-11 14:09 804次阅读