微信小程序+中草药分类+爬虫+keras

目录

  • 1 介绍
  • 2 数据爬虫
  • 3 模型训练和验证
    • 3.1 模型训练
    • 3.2 导入一张图片进行验证
  • 4 后台flask部署
  • 5 微信小程序

1 介绍

本项目使用深度学习模型,训练5种中药材数据集,然后将其集成到微信小程序,通过微信小程序拍照,将图片传输给后端,后端将返回的结果展示到前端页面,项目主要包含以下内容:

  • 数据爬取:使用爬虫爬取百度图片,可以自己定义要爬取的中草药种类、数量等信息。
  • 模型训练使用基于keras训练分类模型,模型可以修改,例如:ResNet50系列,MobileNet系列等,支持在gpu、cpu训练。
  • 后台flask部署:使用flask将模型部署到后台,提供ip地址和端口号
  • 前端微信小程序:制作前端的微信小程序页面,将图片传输给后端,并且将分类结果返回到前端展示

2 数据爬虫

使用requests进行爬虫
示例:

  for i in range(30):image_url = result['data'][i]['middleURL']image_name = "%d.jpg" % countresponse = requests.get(image_url, headers=headers, stream=True, timeout=10)with open(os.path.join(download_path, image_name), 'wb') as f:f.write(response.content)count += 1

爬取输入参数,可以自己输入爬取哪些中草药,输入到list里面即可,下面展示只爬取两种中草药。

# 设置搜索关键字和爬取图片的数量
name_list = ['枸杞','金银花']
save_path = "data_爬虫"
page_num = 1 #爬取多少页,每页30个
for keyword in name_list:get_images(save_path, keyword, page_num)

在这里插入图片描述
在这里插入图片描述

3 模型训练和验证

此处,我们分别使用keras版本进行训练和验证,具体代码和结果展示如下:

3.1 模型训练

导入必要的包

from keras.preprocessing.image import ImageDataGenerator
from keras.optimizers import Adam
from keras.applications import MobileNetV2
from keras.layers import GlobalAveragePooling2D, Dense
from keras.models import Sequential
import json
# 定义ImageDataGenerator
datagen = ImageDataGenerator(rescale=1./255,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,validation_split=0.2  # 设置验证集的比例
)
base_model = MobileNetV2(weights='imagenet', include_top=False, input_shape=(224, 224, 3))model = Sequential([base_model,GlobalAveragePooling2D(),Dense(128, activation='relu'),Dense(num_classes, activation='softmax')
])
# 训练模型
model.fit(train_generator,steps_per_epoch=train_generator.samples // batch_size,epochs=10,validation_data=validation_generator,validation_steps=validation_generator.samples // batch_size)# 步骤6: 评估模型性能
eval_result = model.evaluate(validation_generator)
print(f"Test accuracy: {eval_result[1]*100:.2f}%")

部分结果截图

36/36 [==============================] - 22s 449ms/step - loss: 0.7144 - accuracy: 0.7664 - val_loss: 0.7706 - val_accuracy: 0.7278
Epoch 2/10
36/36 [==============================] - 13s 352ms/step - loss: 0.1504 - accuracy: 0.9601 - val_loss: 0.5325 - val_accuracy: 0.8278
Epoch 3/10
36/36 [==============================] - 13s 352ms/step - loss: 0.0959 - accuracy: 0.9829 - val_loss: 0.2743 - val_accuracy: 0.9222
Epoch 4/10
36/36 [==============================] - 13s 351ms/step - loss: 0.0896 - accuracy: 0.9758 - val_loss: 0.3960 - val_accuracy: 0.8500
Epoch 5/10
36/36 [==============================] - 13s 354ms/step - loss: 0.0743 - accuracy: 0.9758 - val_loss: 0.2853 - val_accuracy: 0.9111
Epoch 6/10
36/36 [==============================] - 13s 351ms/step - loss: 0.0525 - accuracy: 0.9829 - val_loss: 0.2473 - val_accuracy: 0.9222

3.2 导入一张图片进行验证

导入图片

import cv2
import numpy as np
import json
from keras.models import load_modeldef get_img(img_path,img_width, img_height ):img = cv2.imread(img_path)img = cv2.resize(img, (img_width, img_height))  # 调整图像大小img = img.astype("float") / 255.0  # 数据预处理,确保与训练时一致img = np.expand_dims(img, axis=0)return imgimg_width = 224
img_height = 224
model = load_model(r'E:\project\1-zhongcaoyao\model-keras.h5')
print(class_indict)
img_file_path = 'data_all/baihe/b (20).jpg'
classify_img = get_img(img_file_path,img_width, img_height)
results = np.squeeze(model.predict(classify_img)).astype(np.float64)  # 获得预测结果(注意:1.降维2.json中的小数类型为float)
predict_class = np.argmax(results)  # 获得预测结果中置信度最大值所对应的下标

例如:我们导入一张百合的图片,下面是输出结果。
在这里插入图片描述

注意,可能会出现如下错误,原因是模型路径包含中文名称,只需要把模型放到全英文路径下就行。

DecodeError: 'utf-8' codec can't decode byte 0xc6 in position 10: invalid continuation byte

4 后台flask部署

app = flask.Flask(__name__)
idx2class = {0:"百合",1:"党参",2:"枸杞",3:"槐花",4:"金银花"}idx2info ={}
# 导入药效信息
with open("info.txt", "r", encoding="UTF-8") as fin:lines = fin.readlines()for line in lines:idx = int(line.strip().split(":")[0])info = line.strip().split(":")[1]idx2info[idx] = info
img_bytes = flask.request.form.get('picture') # 获取值
image = base64.b64decode(img_bytes)# 编码转换
image = Image.open(io.BytesIO(image))
classify_img = prepare_image(image,224,224) # 预处理图像
results = np.squeeze(model.predict(classify_img)).astype(np.float64)  # 获得预测结果(注意:1.降维2.json中的小数类型为float)
predicted_idx = np.argmax(results)  # 获得预测结果中置信度最大值所对应的下标
score = results[predicted_idx]
label_name = idx2class[predicted_idx]
label_info = idx2info[predicted_idx]

在这里插入图片描述

5 微信小程序

我们使用一个界面,完成图片的上传,结果展示等
在这里插入图片描述
核心代码,将图片传输到后台,并且将data结果拿回来,再解析里面的各个字段,最后将字段展示出来。

wx.request({url: 'http://127.0.0.1:8080/predict', //本地服务器地址method: 'POST',header: {'content-type': 'application/x-www-form-urlencoded'},data: {"picture": that.data.picture,},success: (res)=>{that.setData({class_name: res.data['class_name'],prob: res.data['prob'],info:res.data['info']})

以上就是所有的内容,包含了前端后端、模型训练、数据爬取等功能,详细咨询完整代码:https://docs.qq.com/doc/DWEtRempVZ1NSZHdQ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/180502.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MIT_线性代数笔记:第 08 讲 求解 Ax=b:可解性与结构

目录 可解的条件 Solvability conditions on b特解 A particular solution通解 Complete solution与零空间进行线性组合 Combined with nullspace 秩 Rank 可解的条件 Solvability conditions on b 矩阵 A 的第三行为第一行和第二行的加和,因此 Axb 中 b 的第 3 个分…

git常规使用方法,常规命令

Git是一种分布式版本控制系统,它可以记录软件的历史版本,并提供了多人协作开发、版本回退等功能。以下是Git的基本使用方法: 安装Git:下载安装包并进行安装,安装完成后在命令行中输入 git --version 进行验证。 初始化…

海翔云平台 getylist_login.do SQL 注入漏洞复现

0x01 产品简介 海翔云平台一站式整体解决方案提供商,业务涵盖 批发、连锁、零售行业ERP解决方案、wms仓储解决方案、电商、外勤、移动终端(PDA、APP、小程序)解决方案。 0x02 漏洞概述 海翔云平台getylist_login.do接口处存在SQL注入漏洞&am…

Android 13 - Media框架(14)- OpenMax(四)

这一节继续了解 openmax 目录下的内容。 1、OMX_Core.h 1.1、OMX_BUFFERHEADERTYPE 这是一个比较关键的结构体,上层ACodec/MediaCodec用到的 buffer id、OMXNode 与 OMX component 进行 buffer 传递都是通过该结构体完成,这里将会初步了解结构体中的部…

SVG图片选择库组件封装及使用

需求 需求: 在项目中通常需要做菜单管理,想要让左侧菜单好看一点,一般都会选择添加图标,需要自定义选择喜欢的图标,得提供一个有选择项的图标库 延伸需求:在项目中通常可能有好几个图标选择库,可…

CentOS 系列:CentOS 7文件系统的组成

CentOS 7文件系统的组成 文件系统的组成Linux的一些重要目录文件和目录名主机名文件权限绝对路径和相对路径绝对路径相对路径 文件系统的组成 一切从根开始 文件路径中只有第一个/是根目录,后面的/是分隔符 文件名区分大小写 除斜线(/)以外,其他的字符…

ruoyi-plus使用Statistic统计组件升级element-plus

原本使用的就是gitee上lionli的ruoyi-plus版本的代码。但是在使用过程中作首页数据看板时想使用elementui的Statistic统计组件。结果在浏览器控制台报错找不到组件el-statistic 于是查看elementui的历史版本,发现是在新版中才有这个组件,旧版本是没这个组…

第六届传智杯第四题(abb)

描述 leafee 最近爱上了 abb 型语句,比如“叠词词”、“恶心心” leafee 拿到了一个只含有小写字母的字符串,她想知道有多少个 "abb" 型的子序列? 定义: abb 型字符串满足以下条件: 字符串长度为 3 。字符…

高防CDN可以起到什么作用?

高防CDN相对于普通的CDN加速,除了具备基础的加速功效外,高防CDN在每一节点上均有相应配置的防御功效,不仅具备了隐藏源站不被攻击的优势,也具备了访问加速,多节点防御的功效。随着互联网的不断发展,网络上的…

网络安全技术

网络安全概述 网络安全基础要素 机密性,完整性,可用性,可控性,可审查性 常见网络攻击和特点 1.网络监听 使用sniffer软件或主机接口设置成混杂模式,监听网络中的报文 使用加密技术防范 2.重放攻击 攻击者发送一…

【运维】hive 高可用详解: Hive MetaStore HA、hive server HA原理详解;hive高可用实现

文章目录 一. hive高可用原理说明1. Hive MetaStore HA2. hive server HA 二. hive高可用实现1. 配置2. beeline链接测试3. zookeeper相关操作 一. hive高可用原理说明 1. Hive MetaStore HA Hive元数据存储在MetaStore中,包括表的定义、分区、表的属性等信息。 hi…

软件工程 课堂测验 选择填空

系统流程图用图形符号表示系统中各个元素,表达了系统中各个元素之间的 信息流动 喷泉模型是一种以用户需求为动力,以 对象 为驱动的模型。 软件生存周期中最长的是 维护 阶段。 变换流的DFD由三部分组成,不属于其中一部分的是 事务中心 软…

前端面试灵魂提问

1.自我介绍 2.在实习中,你负责那一模块 3.any与unknow的异同 相同点:any和unkonwn 可以接受任何值 不同点:any会丢掉类型限制,可以用any 类型的变量随意做任何事情。unknown 变量会强制执行类型检查,所以在使用一个…

Python 多层级导包

假如我的项目层级结构如下,project文件夹为项目根路径: project/ ├── first/ │ ├── __init__.py │ ├── second/ │ │ ├── __init__.py │ │ └── second_test.py │ └── first_test.py └── main.py假设项目入口文…

工具及方法 - 如何阅读epub文件:使用Adobe Digital Editions

EPUB(Electronic Publication的缩写,电子出版)是一种电子图书标准,由国际数字出版论坛(IDPF)提出;其中包括3种文件格式标准(文件的扩展名为.epub),这个格式已…

【模电】晶闸管

晶闸管 结构和等效模型工作原理晶闸管的伏安特性晶闸管的主要参数额定正向平均电流 I F I\tiny F IF维持电流 I H I\tiny H IH触发电压 U G U\tiny G UG和触发电流 I G I\tiny G IG正向重复峰值电压 U D R M U\tiny DRM UDRM反向重复峰值电压 U R R M U\tiny RRM URRM 晶体闸流…

对Laxcus分布式操作系统的认知、价值、痛点解决的回答

下面是一位网友的提问,回答贴出来供大家参考,欢迎在下方留言评论。 问: Laxcus分布式操作系统有哪些与众不同的地方?它的价值在哪里?解决了哪些市场痛点?我公司现在已经使用Linux操作系统部署了一堆服务器…

设计模式-模板方法模式

定义 模板方法模式是一种行为型设计模式,它定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。这种模式允许子类在不改变算法结构的情况下,重新定义算法的特定步骤。 模板方法模式的结构包括抽象类和具体子类。抽象类负责…

android 内存分析(待续)

/proc/meminfo memory状态解读 命令:adb shell cat /proc/meminfo内存分布log 查看方式 命令:adb shell cat /proc/meminfo 用途:可以整体的了解memory使用情况 我们说的可用memory一般以MemAvailable的数据为准。所以了解MemAvailable的组成可以帮助…

【LeetCode刷题-链表】--86.分隔链表

86.分隔链表 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ class…