首页 游戏 软件 资讯 排行榜 专题
首页
AI
【药智甄选】PaddlePaddle3.0助力实现ResNet50中药分拣

【药智甄选】PaddlePaddle3.0助力实现ResNet50中药分拣

热心网友
18
转载
2025-07-24
本文介绍基于ResNet50网络判断中药炮制饮片质量的研究。使用成都中医药大学提供的蒲黄、山楂、王不留行3个品种,各含生品、不及、适中、太过4种状态的共6097张图片数据集,经预处理后划分训练集和测试集。构建含预训练ResNet50和全连接层的模型,用Adam优化器等训练,最终准确率达97.3%,实现炮制经验智能化传承。

【药智甄选】paddlepaddle3.0助力实现resnet50中药分拣 - 游乐网

ResNet50中药炮制饮片质量判断

背景介绍

中药炮制是根据中医药理论,依照临床辨证施治用药的需要和药物自身性质,以及调剂、制剂的不同要求,将中药材制备成中药饮片所采取的一项制药技术。平时我们老百姓能接触到的中药,主要指自己回家煎煮或者请医院代煎煮的中药,都是中药饮片,也就是中药炮制这个技术的结果。而中药炮制饮片,大部分涉及到水火的处理,一定需要讲究“程度适中”,炮制火候不够达不到最好药效,炮制火候过度也会丧失药效。

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

“生品”一般是指仅仅采用简单净选得到的饮片,通常没有经过火的处理,也是后续用火加工的原料。“不及”就是“炮制不到位”,没有达到规定的程度,饮片不能发挥最好的效果。“适中”是指炮制程度刚刚好,正是一个最佳的炮制点位,也是通常炮制结束的终点。“太过”是指炮制程度过度了,超过了“适中”的最佳状态,这时候的饮片也会丧失药效,不能再使用了。

过去的炮制饮片程度的判断,都是采用的老药工经验判断,但随着老药工人数越来越少,这种经验判断可能存在“失传”的风险。而随着人工智能的发展,使用深度神经网络模型对饮片状态进行判断能达到很好的效果,可以很好的实现经验的“智能化”和经验的传承。本产品基于PaddlePaddle3.0通过使用ResNet50网络进行中药分拣,对饮片状态进行自动判断,实现经验的“智能化”和经验的传承。

数据准备

数据集介绍

我们使用“中药炮制饮片”数据集,该数据集由成都中医药大学提供,共包含中药炮制饮片的 3 个品种,分别为:蒲黄、山楂、王不留行,每个品种又有着4种炮制状态:生品、不及适中、太过,每类包含 500 张图片共12类5000张图片,图片格式为 jpg。 下面是数据集中的一些样例图片:

【药智甄选】PaddlePaddle3.0助力实现ResNet50中药分拣 - 游乐网    In [ ]
!unzip data/data298711/images.zip -d work/images
登录后复制    

单例数据可视化查看

In [40]
import paddlefrom paddle.io import Datasetimport matplotlib.pyplot as pltimport PIL.Image as Imagepath='/home/aistudio/work/images/ph_bj/IMG_1762.JPG'img = Image.open(path)plt.imshow(img)          #根据数组绘制图像plt.show()               #显示图像print(img.size)
登录后复制        
登录后复制                
(1000, 1000)
登录后复制        

数据集整理

本部分地建立了图像文件路径与其对应标签索引之间的映射关系,并将数据集打乱以消除顺序相关性,为后续的训练准备了去序列化的样本数据;

同时通过打印输出,确认了样本数据的有效性和数量;

由于平台字体问题,无法正确显示中文,这里给出英文标签对应的类别:

ph-sp:蒲黄-生品ph_bj:蒲黄-不及ph_sz:蒲黄-适中ph_tg:蒲黄-太过sz_sp:山楂-生品sz_bj:山楂-不及sz_sz:山楂-适中sz_tg:山楂-太过wblx_sp:王不留行-生品wblx_bj:王不留行-不及wblx_sz:王不留行-适中wblx_tg:王不留行-太过In [54]
#以下代码用于建立样本数据读取路径与样本标签之间的关系import osimport randomdata_list = [] #用个列表保存每个样本的读取路径、标签#获取work目录下的所有子目录名称,保存进一个列表之中class_list = os.listdir("/home/aistudio/work/images")class_label_list=['ph_bj','ph_sp','ph_sz','ph_tg','sz_bj','sz_sp','sz_sz','sz_tg','wblx_bj','wblx_sp','wblx_sz','wblx_tg']for each in class_list:    for f in os.listdir("/home/aistudio/work/images/"+each):        label=each        label_index=class_label_list.index(label)        # print(label,label_index)        data_list.append(["/home/aistudio/work/images/"+each+'/'+f,label_index])#按文件顺序读取,可能造成很多属种图片存在序列相关,用random.shuffle方法把样本顺序彻底打乱。random.shuffle(data_list)#打印前十个,可以看出data_list列表中的每个元素是[样本读取路径, 样本标签]。print(data_list[0:10])#打印样本数量,一共有2340个样本。print("样本数量是:{}".format(len(data_list)))
登录后复制        
[['/home/aistudio/work/images/ph_bj/IMG_20241212_203008.webp', 0], ['/home/aistudio/work/images/ph_sp/IMG_20241212_194947.JPG', 1], ['/home/aistudio/work/images/ph_sz/IMG_3606.JPG', 2], ['/home/aistudio/work/images/sz_tg/IMG_5979.JPG', 7], ['/home/aistudio/work/images/wblx_sp/IMG_20240220_151228.webp', 9], ['/home/aistudio/work/images/wblx_tg/IMG_20240220_112000.webp', 11], ['/home/aistudio/work/images/sz_sp/IMG_5390.JPG', 5], ['/home/aistudio/work/images/wblx_sp/IMG_20240220_103938_3.JPG', 9], ['/home/aistudio/work/images/sz_sz/IMG_3225.JPG', 6], ['/home/aistudio/work/images/ph_tg/IMG_3983.JPG', 3]]样本数量是:6097
登录后复制        

数据集可视化展示

本部分操作通过计算每个类别的样本数量并使用matplotlib库绘制条形图,直观展示了数据集中各类别的分布情况;

首先统计了每个标签的频次,然后创建了一个条形图,其中横轴表示标签,纵轴表示对应的样本数量;

【药智甄选】PaddlePaddle3.0助力实现ResNet50中药分拣 - 游乐网        

In [ ]
import matplotlib.pyplot as plt# 计算每个标签的样本数量label_counts = {}for _, label_index in data_list:    if label_index in label_counts:        label_counts[label_index] += 1    else:        label_counts[label_index] = 1# 将标签索引转换回标签名称label_names = class_label_listlabel_counts = {label_names[key]: value for key, value in label_counts.items()}# 创建条形图plt.figure(figsize=(10, 8))plt.bar(label_counts.keys(), label_counts.values(), tick_label=label_counts.keys())plt.xlabel('Label')plt.ylabel('Count')plt.title('Dataset Distribution')plt.xticks(rotation=45)plt.show()
登录后复制    

数据迭代器构建

本部分代码先是定义了一个数据预处理函数和一个自定义的数据读取器类,用于构造数据读取器和进行数据预处理;

通过Reader类,将数据集划分为训练集和测试集,并实现了数据的加载、预处理和标签转换,输出处理后的图像和标签供模型训练和评估使用;

同时,打印了训练集和测试集的大小以及一个样本的图像形状和标签,验证了数据读取器的正确性;

In [55]
#以下代码用于构造读取器与数据预处理#首先需要导入相关的模块import paddlefrom paddle.vision.transforms import Compose, ColorJitter, Resize,Transpose, Normalizeimport cv2import numpy as npfrom PIL import Imagefrom paddle.io import Dataset# 自定义的数据预处理函数,输入原始图像,输出处理后的图像,可以借用paddle.vision.transforms的数据处理功能def preprocess(img):    transform = Compose([        Resize(size=(224, 224)), # 把数据长宽像素调成224*224        Normalize(mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], data_format='HWC'), # 标准化        Transpose(), # 原始数据形状维度是HWC格式,经过Transpose,转换为CHW格式        ])    img = transform(img).astype("float32")    return img# 自定义数据读取器class Reader(Dataset):    def __init__(self, data, is_val=False):        super().__init__()        # 在初始化阶段,把数据集划分训练集和测试集。        # 由于在读取前样本已经被打乱顺序,取20%的样本作为测试集,80%的样本作为训练集。        self.samples = data[-int(len(data)*0.2):] if is_val else data[:-int(len(data)*0.2)]    def __getitem__(self, idx):        #处理图像        img_path = self.samples[idx][0] #得到某样本的路径        img = Image.open(img_path)        if img.mode != 'RGB':            img = img.convert('RGB')        img = preprocess(img) #数据预处理--这里仅包括简单数据预处理,没有用到数据增强        #处理标签        label = self.samples[idx][1] #得到某样本的标签        label = np.array([label],dtype='int64') #把标签数据类型转成int64        return img, label    def __len__(self):        #返回每个Epoch中图片数量        return len(self.samples)#生成训练数据集实例train_dataset = Reader(data_list, is_val=False)#生成测试数据集实例eval_dataset = Reader(data_list, is_val=True)#打印一个训练样本print(len(train_dataset)) # 1872#打印一个测试样本print(len(eval_dataset)) # 234print(train_dataset[1136][0].shape)print(train_dataset[1136][1])print(type(train_dataset[1136][1]))
登录后复制        
48781219(3, 224, 224)[11]
登录后复制        

模型训练

网络简介

网络背景

ResNet50网络是2015年由微软实验室的何恺明提出,获得ILSVRC2015图像分类竞赛第一名。在ResNet网络提出之前,传统的卷积神经网络都是将一系列的卷积层和池化层堆叠得到的,但当网络堆叠到一定深度时,就会出现退化问题。下图是在CIFAR-10数据集上使用56层网络与20层网络训练误差和测试误差图,由图中数据可以看出,56层网络比20层网络训练误差和测试误差更大,随着网络的加深,其误差并没有如预想的一样减小。
【药智甄选】PaddlePaddle3.0助力实现ResNet50中药分拣 - 游乐网        

ResNet网络提出了残差网络结构(Residual Network)来减轻退化问题,使用ResNet网络可以实现搭建较深的网络结构(突破1000层)。论文中使用ResNet网络在CIFAR-10数据集上的训练误差与测试误差图如下图所示,图中虚线表示训练误差,实线表示测试误差。由图中数据可以看出,ResNet网络层数越深,其训练误差和测试误差越小。
【药智甄选】PaddlePaddle3.0助力实现ResNet50中药分拣 - 游乐网        

网络特色

残差网络结构

残差结构是ResNet网络中最重要的结构,其结构图如下图所示,残差网络由两个分支构成:一个主分支,一个shortcuts(图中弧线表示)。主分支通过堆叠一系列的卷积操作得到,shortcuts从输入直接到输出,主分支的输出与shortcuts的输出相加后通过Relu激活函数后即为残差网络最后的输出。
【药智甄选】PaddlePaddle3.0助力实现ResNet50中药分拣 - 游乐网        

残差网络结构主要由两种,一种是Building Block,适用于较浅的ResNet网络,如ResNet18和ResNet34;另一种是Bottleneck,适用于层数较深的ResNet网络,如ResNet50、ResNet101和ResNet152。

Building Block

Building Block结构图如下图所示,主分支有两层卷积网络结构:

主分支第一层网络以输入channel为64为例,首先通过一个3×3的卷积层,然后通过Batch Normalization层,最后通过Relu激活函数层,输出channel为64;

主分支第二层网络的输入channel为64,首先通过一个3×3的卷积层,然后通过Batch Normalization层,输出channel为64。

最后将主分支输出的特征矩阵与shortcuts输出的特征矩阵相加,通过Relu激活函数即为Building Block最后的输出。
【药智甄选】PaddlePaddle3.0助力实现ResNet50中药分拣 - 游乐网        

网络定义

定义一个基于ResNet50的自定义神经网络模型,其中利用了预训练的ResNet50作为特征提取器;

由于本任务为12分类,因此添加了一个全连接层以适应12个类别的分类任务;

模型的前向传播方法定义了数据如何通过这些层,实现了从输入到输出的计算过程;

【药智甄选】PaddlePaddle3.0助力实现ResNet50中药分拣 - 游乐网    In [74]
#定义模型class MyNet(paddle.nn.Layer):    def __init__(self):        super(MyNet,self).__init__()        self.layer=paddle.vision.models.resnet50(pretrained=True)        self.fc = paddle.nn.Linear(1000, 12)    #网络的前向计算过程    def forward(self,x):        x=self.layer(x)        x=self.fc(x)        return x
登录后复制    

模型训练

1、定义模型输入规格,实例化自定义的MyNet模型,并使用PaddlePaddle的高级API paddle.Model 进行了封装;

2、配置Adam优化器和交叉熵损失函数,设置准确率作为评估指标,并在GPU上进行了模型的训练和评估;

3、设置日志打印频率和模型保存频率,指定模型保存目录;

通过观察训练过程,准确度高达97.3%!

step 77/77 - loss: 0.7499 - acc: 0.9440 - 759ms/stepEval begin...step 20/20 - loss: 3.6955e-06 - acc: 0.9737 - 712ms/stepEval samples: 1219Epoch 15/15
登录后复制    In [ ]
# 定义输入input_define = paddle.static.InputSpec(shape=[-1,3,224,224], dtype="float32", name="img")label_define = paddle.static.InputSpec(shape=[-1,1], dtype="int64",name="label")# 实例化网络对象并定义优化器等训练逻辑model = MyNet()model = paddle.Model(model,inputs=input_define,labels=label_define) # 用Paddle.Model()对模型进行封装optimizer = paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters())# 上述优化器中的学习率(learning_rate)参数很重要。要是训练过程中得到的准确率呈震荡状态,忽大忽小,可以试试进一步把学习率调低。place = paddle.CUDAPlace(0)  # 使用第一个GPU设备model.prepare(optimizer=optimizer, # 指定优化器              loss=paddle.nn.CrossEntropyLoss(), # 指定损失函数              metrics=paddle.metric.Accuracy()) # 指定评估方法model.fit(train_data=train_dataset,     # 训练数据集          eval_data=eval_dataset,         # 测试数据集          batch_size=64,                  # 一个批次的样本数量          epochs=15,                      # 迭代轮次          save_dir="/home/aistudio/model/", # 把模型参数、优化器参数保存至自定义的文件夹          save_freq=2,                    # 设定每隔多少个epoch保存模型参数及优化器参数          log_freq=100,                    # 打印日志的频率)
登录后复制    

推理测试

数据格式定义

1、定义一个用于推理的数据集类InferDataset,接受单个图像路径并进行预处理;

2、这个类继承自PaddlePaddle的Dataset类,提供了单张图像的读取和预处理功能,方便模型对单个图像进行预测;

In [79]
class InferDataset(Dataset):    def __init__(self, img_path=None):        """        数据读取Reader(推理)        :param img_path: 推理单张图片        """        super().__init__()        if img_path:            self.img_paths = [img_path]        else:            raise Exception("请指定需要预测对应图片路径")    def __getitem__(self, index):        # 获取图像路径        img_path = self.img_paths[index]        # 使用Pillow来读取图像数据并转成Numpy格式        img = Image.open(img_path)        if img.mode != 'RGB':             img = img.convert('RGB')         img = preprocess(img) #数据预处理--这里仅包括简单数据预处理,没有用到数据增强        return img    def __len__(self):        return len(self.img_paths)
登录后复制    

实例化模型推理

1、实例化推理模型并加载了训练好的参数;

2、通过model.predict方法对指定图像进行预测,获取了预测结果,并根据结果索引输出了对应的类别名称;

In [90]
import matplotlib.pyplot as pltfrom PIL import Image#实例化推理模型input_define = paddle.static.InputSpec(shape=[-1,3,224,224], dtype="float32", name="img")model = paddle.Model(MyNet(),inputs=input_define)#读取刚刚训练好的参数model.load('/home/aistudio/model/final')#准备模型model.prepare()#利用训练好的模型进行预测infer_path='/home/aistudio/work/images/wblx_sp/IMG_20240220_103938_15.JPG'infer_data = InferDataset(infer_path)result = model.predict(test_data=infer_data)[0] #关键代码,实现预测功能result = paddle.to_tensor(result)result = np.argmax(result.numpy()) #获得最大值所在的序号class_label_list=['ph_bj','ph_sp','ph_sz','ph_tg','sz_bj','sz_sp','sz_sz','sz_tg','wblx_bj','wblx_sp','wblx_sz','wblx_tg']label_description_dict = {    'ph_sp': '蒲黄-生品',    'ph_bj': '蒲黄-不及',    'ph_sz': '蒲黄-适中',    'ph_tg': '蒲黄-太过',    'sz_sp': '山楂-生品',    'sz_bj': '山楂-不及',    'sz_sz': '山楂-适中',    'sz_tg': '山楂-太过',    'wblx_sp': '王不留行-生品',    'wblx_bj': '王不留行-不及',    'wblx_sz': '王不留行-适中',    'wblx_tg': '王不留行-太过'}print('识别结果为:'+label_description_dict[class_label_list[result]])# 使用Pillow库读取图像img = Image.open(infer_path)# 显示图像plt.figure(figsize=(8, 6))plt.imshow(img)plt.axis('off')  # 不显示坐标轴plt.show()
登录后复制        
Predict begin...step 1/1 [==============================] - 33ms/stepPredict samples: 1识别结果为:王不留行-生品
登录后复制        
登录后复制                
来源:https://www.php.cn/faq/1425640.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

从宿舍到全球!米哈游3位创始人捐赠母校上海交大 设立AI未来基石基金
游戏资讯
从宿舍到全球!米哈游3位创始人捐赠母校上海交大 设立AI未来基石基金

4月5日消息,据“上海交通大学”公众号消息,日前,米哈游联合创始人、总裁、董事长、上海交通大学2005级信息工程专业本科、2009级通信与信息系统专业硕士校友刘伟,代表米哈游创始团队蔡浩宇、罗宇皓,

热心网友
04.07
变压器等5年!美国AI数据中心建设遭遇“电力危机”:一半项目延期
业界动态
变压器等5年!美国AI数据中心建设遭遇“电力危机”:一半项目延期

据彭博社近日报道称,尽管2026年Alphabet、亚马逊、Meta和微软等科技巨头都要投入超过6,500亿美元扩展人工智能(AI),但关键电气元件可用性成为主要障碍,近50%将因电力基础设施短缺和

热心网友
04.07
AI导致失业是假的 大佬拿出证据:软件工程岗位三年来新高
业界动态
AI导致失业是假的 大佬拿出证据:软件工程岗位三年来新高

4月6日消息,最近两年AI发展速度越来越快,AI取代大量工作导致人类失业的说法甚嚣尘上,然而事实可能不是这样。著名风投机构创始人a16z联合创始人Marc Andreessen也是AI圈的大佬,他日

热心网友
04.07
红果短剧一季度下架违规漫剧1718部  四类典型违规案例曝光
业界动态
红果短剧一季度下架违规漫剧1718部 四类典型违规案例曝光

4月6日消息,今日,红果短剧发布《关于持续治理AI短剧素材违规使用行为的公告》(以下简称《公告》)。《公告》显示,今年一季度,平台已累计下架违反平台治理规范的漫剧1718部。其中,针对近期AI短剧素

热心网友
04.07
阿里千问3.6Plus大模型登顶全球模型调用排行榜首
业界动态
阿里千问3.6Plus大模型登顶全球模型调用排行榜首

4月4日消息,发布仅1天的阿里千问新模型Qwen3 6-Plus,冲上全球知名大模型API调用平台OpenRouter的日榜榜首,成为当下最受企业和开发者热捧的大模型。OpenRouter最新数据显

热心网友
04.07

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

美国SEC主席Paul Atkins证实:加密货币安全港提案已送交白宫审查
web3.0
美国SEC主席Paul Atkins证实:加密货币安全港提案已送交白宫审查

加密货币行业翘首以盼的监管里程碑,终于有了实质性进展。美国证券交易委员会(SEC)主席保罗·阿特金斯(Paul Atkins)近日证实,那份允许加密项目在早期获得注册豁免权的“安全港”框架提案,已经正式送抵白宫,进入了最终审查阶段。 在范德堡大学与区块链协会联合举办的数字资产峰会上,阿特金斯透露了这

热心网友
04.08
微策略Strategy报告:第一季录得144.6亿美元浮亏 再斥资约3.3亿美元买进4871枚比特币
web3.0
微策略Strategy报告:第一季录得144.6亿美元浮亏 再斥资约3.3亿美元买进4871枚比特币

微策略Strategy报告:第一季录得144 6亿美元浮亏 再斥资约3 3亿美元买进4871枚比特币 市场震荡的威力有多大?看看Strategy的最新季报就明白了。根据其最新向美国证管会(SEC)提交的8-K报告,受市场剧烈波动影响,这家公司所持的比特币在第一季度录得了一笔惊人的数字——144 6亿

热心网友
04.08
稳定币发行商Tether再扩Web3版图!Paolo Ardoino:正开发去中心化搜索引擎Hypersearch
web3.0
稳定币发行商Tether再扩Web3版图!Paolo Ardoino:正开发去中心化搜索引擎Hypersearch

稳定币巨头Tether的动向,向来是加密世界的风向标。这不,它向Web3基础设施的版图扩张,又迈出了关键一步。公司执行长Paolo Ardoino在社交平台X上透露,其工程团队正在全力“烹制”一个新项目——去中心化搜索引擎 “Hypersearch”。这个消息一出,立刻引发了行业的广泛猜想。 采用D

热心网友
04.08
Base链首个原生DeFi借贷协议Seamless Protocol倒闭 将于2026年6月30日下线
web3.0
Base链首个原生DeFi借贷协议Seamless Protocol倒闭 将于2026年6月30日下线

基地位于Coinbase旗下以太坊Layer2网络Base的Seamless Protocol,日前正式宣告了服务的终结。这个曾经吸引了超过20万用户的原生DeFi借贷协议,在运营不到三年后,终究没能跑赢时间。它主打的核心产品是Integrated Leverage Markets(ILMs)——一

热心网友
04.08
PAAL代币如何参与治理?社区投票能决定哪些事项?
web3.0
PAAL代币如何参与治理?社区投票能决定哪些事项?

PAAL代币揭秘:深度解析Web3社区治理的核心钥匙 在去中心化自治组织的浪潮中,谁真正掌握了项目的话语权?PAAL代币提供了一套系统化的答案。它不仅是生态内流转的价值媒介,更是开启链上治理大门的核心凭证。通过持有并质押PAAL代币,用户能够对协议升级、资金分配乃至战略方向等关键事务投出决定性的一票

热心网友
04.08