昇思学习打卡营第32天|基于ResNet50的中药炮制饮片质量判断模型

背景介绍

        中药炮制是根据中医药理论,依照临床用药需求,通过调剂和制剂要求,将中药材制备成中药饮片的过程。老百姓日常使用的中药饮片,是中药炮制技术的成果。中药炮制过程中,尤其是涉及到水火处理时,必须注重“程度适中”。如果炮制火候不足,则无法发挥最好的药效;而火候过度则会使药效丧失。因此,判断炮制程度的准确性直接影响中药的质量和疗效。

        传统上,中药炮制程度主要依赖于经验丰富的老药工判断。然而,随着老药工的减少,经验传承面临挑战。人工智能的兴起为这一问题提供了解决方案,通过图像分类技术,尤其是使用深度学习中的ResNet50模型,我们能够有效判断饮片的炮制状态,智能化再现药工的经验。

ResNet50网络简介

        ResNet50网络由何恺明等人在2015年提出,是ILSVRC 2015年图像分类竞赛的冠军模型。传统的卷积神经网络随着层数加深会出现退化问题,而ResNet网络通过引入残差结构,成功训练了数百甚至上千层的深度神经网络。ResNet50则是基于Bottleneck残差块的50层深度网络,在多种图像分类任务中展现了优异的性能。

准备阶段
配置实验环境

        本实验基于MindSpore框架和华为Ascend平台进行。以下是环境配置的必要步骤:

!pip install mindspore==2.3.0
数据集介绍

        我们使用的中药炮制饮片数据集由成都中医药大学提供,包含三类药材(蒲黄、山楂、王不留行)的不同炮制程度图片:生品、不及、适中、太过。每种状态下包含500张图片,总共12类5000张图像。

数据预处理

        我们将原始4K的图片缩放到1000x1000像素,以适应ResNet50的输入需求。

from PIL import Image
import osdef resize_images(data_dir, target_size=(1000, 1000)):for root, dirs, files in os.walk(data_dir):for file in files:if file.endswith('.jpg'):img = Image.open(os.path.join(root, file))img = img.resize(target_size)img.save(os.path.join(root, file))resize_images('dataset/zhongyiyao/')
数据加载与划分

        为了训练和验证模型,我们将数据集分为训练集、验证集和测试集。通过使用sklearn中的train_test_split函数,我们将数据按比例分配,并保证每类样本均匀分布。

from sklearn.model_selection import train_test_splitdef split_dataset(data_dir):classes = os.listdir(data_dir)for class_name in classes:images = os.listdir(os.path.join(data_dir, class_name))train, test = train_test_split(images, test_size=0.2, random_state=42)# 进一步划分验证集train, val = train_test_split(train, test_size=0.2, random_state=42)# 保存划分后的数据# ...split_dataset('dataset1/zhongyiyao/')
ResNet50模型构建

        在处理完数据后,我们选择了ResNet50作为基础网络,并对其进行微调。我们将最后的全连接层调整为输出12个类别,以适应中药饮片的分类任务。

from mindspore import nn
from mindspore import Modeldef build_resnet50(num_classes=12):network = resnet50(pretrained=True)in_channels = network.fc.in_channelsnetwork.fc = nn.Dense(in_channels, num_classes)return networknetwork = build_resnet50()
数据加载函数定义

        为了训练模型,我们需要定义一个数据加载器。此函数加载图片并执行图像增强等预处理步骤。

from mindspore.dataset import GeneratorDataset
import mindspore.dataset.vision as vision
import mindspore.dataset.transforms as transforms
from mindspore import dtype as mstypeclass Iterable:def __init__(self,data_path):self._data = []self._label = []if data_path.endswith(('JPG','jpg','png','PNG')):# 用作推理,所以没有labelimage = Image.open(data_path)self._data.append(image)self._label.append(0)else:classes = os.listdir(data_path)if '.ipynb_checkpoints' in classes:classes.remove('.ipynb_checkpoints')for (i,class_name) in enumerate(classes):new_path =  data_path+"/"+class_namefor image_name in os.listdir(new_path):try:image = Image.open(new_path + "/" + image_name)self._data.append(image)self._label.append(i)except:passdef __getitem__(self, index):return self._data[index], self._label[index]def __len__(self):return len(self._data)def create_dataset_zhongyao(dataset_dir,usage,resize,batch_size,workers):data = Iterable(dataset_dir)data_set = GeneratorDataset(data,column_names=['image','label'])trans = []if usage == "train":trans += [vision.RandomCrop(700, (4, 4, 4, 4)),vision.RandomHorizontalFlip(prob=0.5)]trans += [vision.Resize((resize,resize)),vision.Rescale(1.0 / 255.0, 0.0),vision.Normalize([0.4914, 0.4822, 0.4465], [0.2023, 0.1994, 0.2010]),vision.HWC2CHW()]target_trans = transforms.TypeCast(mstype.int32)data_set = data_set.map(operations=trans,input_columns='image',num_parallel_workers=workers)data_set = data_set.map(operations=target_trans,input_columns='label',num_parallel_workers=workers)data_set = data_set.batch(batch_size,drop_remainder=True)return data_set
模型训练

      我们采用交叉熵作为损失函数,Momentum优化器进行模型参数优化。通过MindSpore的Model接口进行训练。

from mindspore import Model
from mindspore import nnloss_fn = nn.SoftmaxCrossEntropyWithLogits(sparse=True)
optimizer = nn.Momentum(network.trainable_params(), learning_rate=0.001, momentum=0.9)
model = Model(network, loss_fn=loss_fn, optimizer=optimizer, metrics={"accuracy"})dataset_train = create_dataset_zhongyao('dataset1/zhongyiyao/train', 'train', 224, 32, 4)
dataset_val = create_dataset_zhongyao('dataset1/zhongyiyao/valid', 'valid', 224, 32, 4)model.train(epochs=50, train_dataset=dataset_train, valid_dataset=dataset_val)
模型评估与推理

        在训练过程中,我们可以实时评估模型的性能,并保存训练效果最好的模型。

from mindspore import save_checkpoint, load_checkpoint, load_param_into_netdef evaluate_and_save_best_model(model, dataset_val, best_ckpt_path):best_acc = 0for epoch in range(50):acc = model.eval(dataset_val, dataset_sink_mode=False)['accuracy']print(f"Epoch {epoch}, Accuracy: {acc}")if acc > best_acc:best_acc = accsave_checkpoint(network, best_ckpt_path)print("Best model saved.")evaluate_and_save_best_model(model, dataset_val, 'best_model.ckpt')

        推理部分代码如下,加载训练好的最佳模型,并对新的图片进行分类:

best_ckpt_path = 'best_model.ckpt'
net = resnet50(num_classes=12)
param_dict = load_checkpoint(best_ckpt_path)
load_param_into_net(net, param_dict)
model = Model(net)def predict_one(input_img):dataset_one = create_dataset_zhongyao(input_img, 'test', 224, 1, 1)data = next(dataset_one.create_tuple_iterator())output = model.predict(ms.Tensor(data[0]))pred = output.asnumpy().argmax(axis=1)return predprint(predict_one('dataset1/zhongyiyao/test/sz_tg/IMG_0001.JPG'))
结果可视化

        我们可以通过可视化训练过程中准确率和损失的变化,直观展示模型的训练效果。

import matplotlib.pyplot as pltdef plot_training_results(acc_list, loss_list):epochs = range(1, len(acc_list) + 1)plt.subplot(1, 2, 1)plt.plot(epochs, acc_list, label="Accuracy")plt.title("Accuracy over Epochs")plt.subplot(1, 2, 2)plt.plot(epochs, loss_list, label="Loss")plt.title("Loss over Epochs")plt.show()plot_training_results(acc_list, loss_list)
结语

        通过本次实验,我们成功构建并应用了ResNet50模型,对中药炮制饮片的质量进行了精准的智能化分类判断。中药炮制作为中医药的重要组成部分,其炮制火候的判断历来依赖老药工的丰富经验。然而,随着人工智能技术的迅速发展,我们借助深度学习模型有效地实现了这一经验的传承和智能化,解决了传统经验判断可能失传的问题。通过数据集的准备、网络的构建、模型的训练与验证,我们发现ResNet50在中药饮片分类任务中展现了出色的表现,准确率极高,进一步验证了其在图像分类领域的优势。

        未来,我们将继续探索更多深度学习模型的应用与改进,优化网络结构和算法,进一步提升模型在多样化炮制饮片中的判断能力。同时,也将尝试引入其他先进的算法,例如Transformer等新兴模型,探索它们在中药智能化领域的应用潜力。希望在这个过程中,能够与大家一起不断学习和进步,共同推动中医药智能化发展的新前景,助力中药现代化与人工智能的深度融合,实现更广泛的创新应用。

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!

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

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

相关文章

电器自动化入门08:隔离变压器、行程开关介绍及选型

视频链接:3.4 电工知识:三相交流异步电动机自动往返行程控制及控制变压器选型_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1PJ41117PW?p8&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.隔离(控制)变压器 2.行程开…

【AI】AIOT简介

随着技术的快速发展,人工智能AI和物联网IoT已经成为当今最热门的技术领域。AIOT是人工智能和物联网的结合,使物联网设备更加智能化,能够进行自主决策和学习的技术。 通过物联网产生、收集来自不同维度的、海量的数据存储于云端、边缘端&#…

828华为云征文|部署个人文档管理系统 Docspell

828华为云征文|部署个人文档管理系统 Docspell 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 Docspell3.1 Docspell 介绍3.2 Docspell 部署3.3 Docspell 使用…

深度学习基础—目标定位与特征点检测

1.目标定位 (1)定义 目标定位就是在图片中,定位对象的位置,对于对象的位置可以用框圈住显示。如下图所示: 假设正在进行图片分类工作,那么这个汽车图片很有可能被分类为汽车类别。对于目标定位,…

螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习01(环境准备)

1 准备工作 由于创建数据中心需要安装很多服务器,这些服务器要耗费很所物理物理计算资源、存储资源、网络资源和软件资源,作为穷学生只有几百块的n手笔记本,不可能买十几台服务器来搭建数据中心,也不愿意跑实验室,想躺…

Pikachu-Cross-Site Scripting-xss之htmlspecialchars

首先输入各种字符 查看页面元素,可以看到这里对一些符号做了转换,但是 单引号等几个符号没处理; 从代码上看;使用单引号做闭合; 构造payload a onclickalert(11) 提交,得到xss攻击

网约班车升级手机端退票

背景 作为老古董程序员,不,应该叫互联网人员,因为我现在做的所有的事情,都是处于爱好,更多的时间是在和各行各业的朋友聊市场,聊需求,聊怎么通过IT互联网 改变实体行业的现状,准确的…

【Qt】控件概述(2)—— 按钮类控件

控件概述(2) 1. PushButton2. RadioButton——单选按钮2.1 使用2.2 区分信号 clicked,clicked(bool),pressed,released,toggled(bool)2.3 QButtonGroup分组 3. CheckBox——复选按钮 1. PushButton QPushB…

《15分钟轻松学 Python》教程目录

为什么要写这个教程呢,主要是因为即使是AI技术突起的时代,想要用好AI做开发,那肯定离不开Python,就算最轻量级的智能体都有代码块要写,所以不一定要掌握完完整整的Python,只要掌握基础就能应对大部分场景。…

【机器学习】ID3、C4.5、CART 算法

目录 常见的决策树算法 1. ID3 2. C4.5 3. CART 决策树的优缺点 优点: 缺点: 决策树的优化 常见的决策树算法 1. ID3 ID3(Iterative Dichotomiser 3)算法使用信息增益作为特征选择的标准。它是一种贪心算法,信…

【D3.js in Action 3 精译_027】3.4 让 D3 数据适应屏幕(下)—— D3 分段比例尺的用法

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一部分 D3.js 基础知识 第一章 D3.js 简介(已完结) 1.1 何为 D3.js?1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践(上)1.3 数据可…

python实现单例模式的常用三种方法-基于__new__/使用装饰器以及Python中的值类型、引用类型以及类的静态变量、读取进程和线程ID

一、python实现单例模式的常用三种方法-基于__new__,使用装饰器 涉及到类的使用就会有类的实例化,就会有类单例实现的需求,因为重复实例化会浪费资源。python中的单例模式与别的语言相比,单例实现的方法更丰富。虽然python实现单例的模式的方…

一文掌握Harbor镜像同步公有云镜像仓库实践

一文掌握Harbor镜像同步公有云镜像仓库实践 目录 1 引言2 概念 2.1 Harbor2.2 阿里云的镜像仓库ACR2.3 华为云的镜像仓库SWR2.4 Harbor复制管理同步镜像 2.4.1 复制管理的工作原理 2.5 Harbor同步镜像到公有云镜像仓库的优势 3 实验:通过Harbor 将容器镜像同步到公…

win7怎么禁用驱动强制数字签名?win7驱动程序强制数字签名禁用方法

在Windows 7 64位操作系统中,安装驱动程序时可能会遇到“数字签名”的问题,这是微软为了确保驱动程序的安全性和可靠性而引入的一项安全机制。本文将深入探讨这个问题,并提供有效的解决方案。 理解数字签名的概念是至关重要的。数字签名是一…

C语言复习概要(二)

本文目录 C语言中的数组与函数详解1. 引言2. 数组2.1. 什么是数组?语法:示例: 2.2. 数组的初始化示例 1:在声明时初始化示例 2:部分初始化示例 3:运行时赋值 2.3. 数组的访问与修改示例: 2.4. 多…

【Python游戏开发】贪吃蛇游戏demo

准备步骤 项目开发使用【Mu 编辑器】 1.新建项目,并导入游戏图片 游戏编写 1.创建场景 SIZE 15 # 每个格子的大小 WIDTH SIZE * 30 # 游戏场景总宽度 HEIGHT SIZE * 30 # 游戏场景总高度def draw():screen…

LabVIEW裂纹深度在线监测系统

随着铁路运输技术的快速发展,火车安全问题成为重中之重,尤其是轮面裂纹的检测和管理。裂纹的出现可能导致严重的列车事故,因此,建立可靠的在线监测系统,实时掌握裂纹情况,对保障铁路运输安全至关重要。 La…

在线JSON可视化工具--支持缩放

先前文章提到的超好用的JSON可视化工具,收到反馈,觉得工具好用,唯一不足就是不能缩放视图,其实是支持的,因为滚轮有可能是往下滚动,会与缩放冲突,所以这个工具设计为需要双击视图来触发打开缩放…

选择网络安全模式启动Windows系统,解决PC无法连接网络问题

目录 1、电脑无法连接网络 2、发现C:\Windows\System32\drivers路径下的很多文件不见了 3、使用360安全卫士中的断网急救箱工具修复,也就解决不了问题 4、重启系统,以网络安全模式启动系统,修复系统网络模块,完美解决问题 5、…

AI不可尽信

看到某项目有类似这样的一段代码 leaves : make([]int, 10) leaves leaves[:0]没理解这样的连续两行,有何作用? 初始化一个长度和容量都为10的切片,接着把切片长度设置为0 即如下demo: (在线地址) package mainimport "fmt"func main() {leaves : make([]int, 1…