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

在这篇文章中,将教大家实现一个网页应用程序,该程序可以接收狗的图片,然后输出其品种,其准确率超过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是分别显示图像及其犬种的模板。
结论
祝贺你!你已经成功地实现了一个狗品种分类器,并且可以准确地分辨出狗的品种。让我们总结一下我们在这里学到的知识:我们对数据集进行了分析和预处理。机器学习算法需要单独的训练集、测试集和验证集来进行置信预测。我们从零开始使用cnn,由于未能提取特征,所以表现不佳。然后我们使用了迁移学习,准确度大大提高最后,我们构建了一个flask web应用程序来实现我们的项目封装我们确实学到了很多东西,但你还可以尝试很多其他的事情。你可以在heroku上部署web应用程序,也可以尝试使用不同的层(如dropout层)来提高准确性。
参考链接:https://towardsdatascience.com/dont-know-the-breed-of-your-dog-ml-can-help-6558eb5f7f05
责编ajx

基于WiFi及无线遥控技术的地下铲运机远程控制设计详解
如何安装手机驱动 怎么样安装手机驱动(图解)
人工智能怎样解决网络欺凌
步进电动机的工作原理是什么?怎样设计一个基于单片机和L297/L298芯片的步进电机控制驱动器?
自动化和AI对亚洲有着怎样的影响?
利用Python实现网页应用程序,可图片识别狗的类型(附源码)
纳微半导体发布2022第一季度财务业绩
鸿蒙将成为第五大操作系统,所有设备开启鸿蒙时代
专业存储卡SD如何选购?
Lecan IO这种iPhone基座你会买吗?
国内VR销量大爆发 3月全球达成22笔VR/AR行业投融资
立得将采用电力巡检机器人为智能化电网发展提供新的技术力量
KeenOpt调优算法框架实现对调优对象和配套工具的快速适配
汉城相约丨纳特通信邀您参加2022华中地区汽车电磁兼容技术研讨会
PFC的CCM控制策略
基于PIC16C63单片微机和模糊控制器实现新型电机调速系统的设计
梯度提升算法
接线端子有几种,接线端子规格大全型号
FSK调制器
高通联手恩智浦:NFC市场大口夺食