• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

中药图像识别系统: 中药图像识别系统(APP端+服务器端)

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

中药图像识别系统

开源软件地址:

https://gitee.com/xiaohaoo/medicine-identification

开源软件介绍:

中药图片拍照识别系统-移动端+后端

项目说明

中药识别系统主要采用APP端拍照上传的方式,构建卷积神经网络(CNN)对图像进行识别,具有识别效率高,准确度高的特点。APP端的功能包括但不限于拍照识别、中药问答(付费咨询)、检索查询、中药性状以及功效查看、方剂智能推荐【开发中】等;本系统包含APP端以及服务器端。

版本说明 3.x

  1. APP端使用Flutter重写界面,使用体验得到提升。
  2. 深度学习运行时框架采用ONNX Runtime计算速度得到明显加快,同时深度学习框架依赖部署文件减小到40M

项目介绍

本项目包含六个模块:

项目预览

开发文档

阅读文档

技术简介

  1. medicine-app APP端
  • Flutter开发
  1. medicine-server服务器端工程

    Gradle构建

    SpringBoot框架,一键启动与部署

    文档数据库:MongoDB

    全文检索:Elasticsearch + IK分词器

    数据库:MySQL

    深度学习运行时架构:ONNX Runtime(ONNX Runtime is a cross-platform inference and training machine-learning accelerator)

  2. medicine-crawler爬虫工程

    爬虫主要用来爬取训练集以及中药的详细信息,包含但不限于:中药名称、中药形态、图片、别名、英文名、配伍药方、功效与作用、临床应用、产地分布、药用部位、性味归经、药理研究、主要成分、使用禁忌、采收加工、药材性状等信息。

    爬虫框架:WebMagic(参考代码

    数据持久化:MongoDB

    数据结构(简略展示)

    • 中药一级分类信息

    • 中药详细信息

  3. medicine-model卷积神经网络工程

  • Language: Python

  • 使用TensorFlow 深度学习框架,使用Keras会大幅缩减代码量

  • 数据集

  • 常用的卷积网络模型及在ImageNet上的准确率

    模型大小Top-1准确率Top-5准确率参数数量深度
    Xception88 MB0.7900.94522,910,480126
    VGG16528 MB0.7130.901138,357,54423
    VGG19549 MB0.7130.900143,667,24026
    ResNet5098 MB0.7490.92125,636,712168
    ResNet101171 MB0.7640.92844,707,176-
    ResNet152232 MB0.7660.93160,419,944-
    ResNet50V298 MB0.7600.93025,613,800-
    ResNet101V2171 MB0.7720.93844,675,560-
    ResNet152V2232 MB0.7800.94260,380,648-
    ResNeXt5096 MB0.7770.93825,097,128-
    ResNeXt101170 MB0.7870.94344,315,560-
    InceptionV392 MB0.7790.93723,851,784159
    InceptionResNetV2215 MB0.8030.95355,873,736572
    MobileNet16 MB0.7040.8954,253,86488
    MobileNetV214 MB0.7130.9013,538,98488
    DenseNet12133 MB0.7500.9238,062,504121
    DenseNet16957 MB0.7620.93214,307,880169
    DenseNet20180 MB0.7730.93620,242,984201
    NASNetMobile23 MB0.7440.9195,326,716-
    NASNetLarge343 MB0.8250.96088,949,818-

    由于硬件条件限制,综合考虑模型的准确率、大小以及复杂度等因素,采用了Xception模型,该模型是134层(包含激活层,批标准化层等)拓扑深度的卷积网络模型。

  • Xception函数定义:

    def Xception(include_top=True,    weights='imagenet',    input_tensor=None,    input_shape=None,    pooling=None,    classes=1000,    **kwargs)  # 参数# include_top:是否保留顶层的全连接网络# weights:None代表随机初始化,即不加载预训练权重。'imagenet’代表加载预训练权重# input_tensor:可填入Keras tensor作为模型的图像输入tensor# input_shape:可选,仅当include_top=False有效,应为长为3的tuple,指明输入图片的shape,图片的宽高必须大于71,如(150,150,3)# pooling:当include_top=False时,该参数指定了池化方式。None代表不池化,最后一个卷积层的输出为4D张量。‘avg’代表全局平均池化,‘max’代表全局最大值池化。# classes:可选,图片分类的类别数,仅当include_top=True并且不加载预训练权重时可用
  • 构建代码

    基于Xception的模型微调,详细请参考代码

    1. 设置Xception参数

      迁移学习参数权重加载:xception_weights

      # 设置输入图像的宽高以及通道数img_size = (299, 299, 3)  base_model = keras.applications.xception.Xception(include_top=False,                                                weights='..\\resources\\keras-model\\xception_weights_tf_dim_ordering_tf_kernels_notop.h5',                                                input_shape=img_size,                                                pooling='avg')  # 全连接层,使用softmax激活函数计算概率值,分类大小是628model = keras.layers.Dense(628, activation='softmax', name='predictions')(base_model.output)model = keras.Model(base_model.input, model)  # 锁定卷积层for layer in base_model.layers:  layer.trainable = False
    2. 全连接层训练(v1.0)

      from base_model import model # 设置训练集图片大小以及目录参数img_size = (299, 299)dataset_dir = '..\\dataset\\dataset'img_save_to_dir = 'resources\\image-traing\\'log_dir = 'resources\\train-log'  model_dir = 'resources\\keras-model\\' # 使用数据增强train_datagen = keras.preprocessing.image.ImageDataGenerator(    rescale=1. / 255,    shear_range=0.2,    width_shift_range=0.4,    height_shift_range=0.4,    rotation_range=90,    zoom_range=0.7,    horizontal_flip=True,    vertical_flip=True,    preprocessing_function=keras.applications.xception.preprocess_input)  test_datagen = keras.preprocessing.image.ImageDataGenerator(    preprocessing_function=keras.applications.xception.preprocess_input)  train_generator = train_datagen.flow_from_directory(    dataset_dir,    save_to_dir=img_save_to_dir,    target_size=img_size,    class_mode='categorical')  validation_generator = test_datagen.flow_from_directory(    dataset_dir,    save_to_dir=img_save_to_dir,    target_size=img_size,    class_mode='categorical')  # 早停法以及动态学习率设置early_stop = EarlyStopping(monitor='val_loss', patience=13)reduce_lr = ReduceLROnPlateau(monitor='val_loss', patience=7, mode='auto', factor=0.2)tensorboard = keras.callbacks.tensorboard_v2.TensorBoard(log_dir=log_dir)  for layer in model.layers:    layer.trainable = False # 模型编译model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])  history = model.fit_generator(train_generator,                              steps_per_epoch=train_generator.samples // train_generator.batch_size,                              epochs=100,                              validation_data=validation_generator,                              validation_steps=validation_generator.samples // validation_generator.batch_size,                              callbacks=[early_stop, reduce_lr, tensorboard])# 模型导出model.save(model_dir + 'chinese_medicine_model_v1.0.h5')
    3. 对于顶部的6层卷积层,我们使用数据集对权重参数进行微调

       # 加载模型 model=keras.models.load_model('resources\\keras-model\\chinese_medicine_model_v2.0.h5')    for layer in model.layers:    layer.trainable = False for layer in model.layers[126:132]:    layer.trainable = True   history = model.fit_generator(train_generator,                               steps_per_epoch=train_generator.samples // train_generator.batch_size,                               epochs=100,                               validation_data=validation_generator,                               validation_steps=validation_generator.samples // validation_generator.batch_size,                               callbacks=[early_stop, reduce_lr, tensorboard]) model.save(model_dir + 'chinese_medicine_model_v2.0.h5')
    4. 服务器端,使用ONNX Runtime调用训练好的模型

  • 模型概览

    模型详细结构

  • 训练过程正确率以及损失函数可视化展示

    正确率损失函数

  1. medicine-dataset数据集
  1. medicine-util公用工具类

依赖环境说明

依赖版本
JDK11+
Python3.6
Gradle6.5
TensorFlow2.0
MongoDB4.2.2
MySQL8.0+
Spring Boot2.2.2
Elasticsearch7.4.2
IK分词器7.4.2
ONNX Runtime1.8.1

开源软件使用须知

  • 允许用于个人学习;
  • 开源版不适合商用;
  • 禁止将本项目的代码和资源进行任何形式的出售,产生的一切任何后果责任由侵权者自负;
  • LICENSE

交流、反馈与参与贡献

  • 如需关注项目最新动态,请Watch、Star项目,同时也是对项目最好的支持
  • 欢迎参与技术讨论、二次开发等咨询、问题和建议!
  • QQ:993021993
  • 微信:WECHAT

开源不易,感谢各位朋友的star! ^_^


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap