微信小程序+中草药分类+爬虫+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 个分…

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

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

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

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

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

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

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

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

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

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

【运维】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…

前端面试灵魂提问

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

工具及方法 - 如何阅读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 晶体闸流…

【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…

建筑木模板厂家批发

在建筑施工中,木模板是一种常见且重要的施工材料,用于搭建混凝土浇筑的支撑结构。选择合适的建筑木模板厂家进行批发,对于施工质量和效率至关重要。本文将介绍建筑木模板厂家批发的重要性,并推荐贵港市能强优品木业作为专业的建筑…

MVVM 模式与 MVC 模式:构建高效应用的选择

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

【SQL SERVER】定时任务

oracle是定时JOB,sqlserver是创建作业,通过sqlserver代理实现 先看SQL SERVER代理得服务有没有开 选择计算机右键——>管理——>服务与应用程序——>服务——>SQL server 代理 然后把SQL server 代理(MSSQLSERVER)启…

开源vs闭源,大模型的未来在哪一边?

开源和闭源,两种截然不同的开发模式,对于大模型的发展有着重要影响。开源让技术共享,吸引了众多人才加入,推动了大模的创新。而闭源则保护了商业利益和技术优势,为大模型的商业应用提供了更好的保障。 那么&#xff0c…

Vue3+java开发组队功能

Vue3java开发系统组队功能 需求分析 创建用户可以创建一个队伍(一个房间队长),设置队伍人数,队伍名称(标题),描述,超时时间。搜索加入,用户可以加入未满的队伍&#xf…

github新建项目

参考链接:Github上建立新项目超详细方法过程 在这里新建一个repositories 接下来就选择相关的信息: 然后create a new就行了 接下来需要创建文件:(同时通过upload上传文件) 每次最多上传100个文件,然后保…

OpenGL笔记:纹理的初次使用

说明 纹理的代码写完后,一直出不来结果,原因是没有设置GL_TEXTURE_MIN_FILTER, 它的默认值为GL_NEAREST_MIPMAP_LINEAR, 因为这里我还没用到Mipmap,所以使用这个默认值,结果是错误的,关于mipma…

软著项目推荐 深度学习二维码识别

文章目录 0 前言2 二维码基础概念2.1 二维码介绍2.2 QRCode2.3 QRCode 特点 3 机器视觉二维码识别技术3.1 二维码的识别流程3.2 二维码定位3.3 常用的扫描方法 4 深度学习二维码识别4.1 部分关键代码 5 测试结果6 最后 0 前言 🔥 优质竞赛项目系列,今天…

正点原子linux应用编程——提高篇1

在之前的入门篇学习中,都是直接在Ubuntu中进行验证的,对于嵌入式Linux系统来说,也是可以直接移植的,只需要使用嵌入式硬件平台对应的交叉编译工具编译应用程序即可运行。 在嵌入式Linux系统中,编写的应用程序通常需要…