手把手教你部署一个蘑菇识别的小应用


本文介绍使用飞桨EasyEdge平台部署蘑菇分类模型的流程。先定义图像分类任务,解压并标注蘑菇数据集,划分训练集和验证集,定义数据集类并做图像增强。选用mobilenet_v2网络,配置优化器训练模型,最后保存为静态图,通过EasyEdge平台完成部署,操作简洁。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

手把手教你部署一个蘑菇识别的小应用 -

项目背景

飞桨最近新上了EasyEdge端与边缘AI服务平台,这对于新手来说非常友好

在原来我们开发了模型之后,没有办法快速部署到手机上

现在有了EasyEdge这个平台,直接在EasyEdge端与边缘AI服务平台部署就可以了,操作十分简洁流畅!下面以一个示例来给大家展示:

手把手教你部署一个蘑菇识别的小应用 -        

① 问题定义

对于一个任务,当你想使用深度学习来解决时,一般流程如下:

①问题定义->②数据准备->③模型选择与开发->④模型训练和调优->⑤模型评估测试->⑥部署上线

本项目中的蘑菇的分类的本质是图像分类任务,采用轻量级卷积神经网络mobilenet_v2进行相关实践。

② 数据准备

2.1 解压缩数据集

我们将网上获取的数据集以压缩包的方式上传到aistudio数据集中,并加载到我们的项目内。

在使用之前我们进行数据集压缩包的一个解压。

DM建站系统幼儿教育机构网站模板1.62 DM建站系统幼儿教育机构网站模板1.62

DM建站系统幼儿教育机构网站模板,DM企业建站系统。是由php+mysql开发的一套专门用于中小企业网站建设的开源cms。DM系统的理念就是组装,把模板和区块组装起来,产生不同的网站效果。可以用来快速建设一个响应式的企业网站( PC,手机,微信都可以访问)。后台操作简单,维护方便。DM企业建站系统安装步骤:第一步,先用phpmyadmin导入sql文件。 第二步:把文件放到你的本地服务器,或上传到

DM建站系统幼儿教育机构网站模板1.62 0 查看详情 DM建站系统幼儿教育机构网站模板1.62 In [ ]
# !unzip -oq /home/aistudio/data/data81902/mushrooms_train.zip -d work/
    In [ ]
import paddle
paddle.seed(8888)import numpy as npfrom typing import Callable#参数配置config_parameters = {    "class_dim": 9,  #分类数
    "target_path":"/home/aistudio/work/",                     
    'train_image_dir': '/home/aistudio/work/trainImages',    'eval_image_dir': '/home/aistudio/work/evalImages',    'epochs':100,    'batch_size': 128,    'lr': 0.01}
   

2.2 数据标注

我们先看一下解压缩后的数据集长成什么样子。

In [ ]
import osimport randomfrom matplotlib import pyplot as pltfrom PIL import Image

imgs = []
paths = os.listdir('work/mushrooms_train')for path in paths:   
    img_path = os.path.join('work/mushrooms_train', path)    if os.path.isdir(img_path):
        img_paths = os.listdir(img_path)
        img = Image.open(os.path.join(img_path, random.choice(img_paths)))
        imgs.append((img, path))

f, ax = plt.subplots(3, 3, figsize=(12,12))for i, img in enumerate(imgs[:9]):
    ax[i//3, i%3].imshow(img[0])
    ax[i//3, i%3].axis('off')
    ax[i//3, i%3].set_title('label: %s' % img[1])
plt.show()
       
<Figure size 864x864 with 9 Axes>
               

2.3 划分数据集与数据集的定义

接下来我们使用标注好的文件进行数据集类的定义,方便后续模型训练使用。

2.3.1 划分数据集

In [ ]
# import os# import shutil# train_dir = config_parameters['train_image_dir']# eval_dir = config_parameters['eval_image_dir']# paths = os.listdir('work/mushrooms_train')# if not os.path.exists(train_dir):#     os.mkdir(train_dir)# if not os.path.exists(eval_dir):#     os.mkdir(eval_dir)# for path in paths:#     imgs_dir = os.listdir(os.path.join('work/mushrooms_train', path))#     target_train_dir = os.path.join(train_dir,path)#     target_eval_dir = os.path.join(eval_dir,path)#     if not os.path.exists(target_train_dir):#         os.mkdir(target_train_dir)#     if not os.path.exists(target_eval_dir):#         os.mkdir(target_eval_dir)#     for i in range(len(imgs_dir)):#         if ' ' in imgs_dir[i]:#             new_name = imgs_dir[i].replace(' ', '_')#         else:#             new_name = imgs_dir[i]#         target_train_path = os.path.join(target_train_dir, new_name)#         target_eval_path = os.path.join(target_eval_dir, new_name)     #         if i % 5 == 0:#             shutil.copyfile(os.path.join(os.path.join('work/mushrooms_train', path), imgs_dir[i]), target_eval_path)#         else:#             shutil.copyfile(os.path.join(os.path.join('work/mushrooms_train', path), imgs_dir[i]), target_train_path)# # print('finished train val split!')
   

2.3.2 导入数据集的定义实现

In [ ]
#数据集的定义class TowerDataset(paddle.io.Dataset):
    """
    步骤一:继承paddle.io.Dataset类
    """
    def __init__(self, transforms: Callable, mode: str ='train'):
        """
        步骤二:实现构造函数,定义数据读取方式
        """
        super(TowerDataset, self).__init__()
        
        self.mode = mode
        self.transforms = transforms

        train_image_dir = config_parameters['train_image_dir']
        eval_image_dir = config_parameters['eval_image_dir']

        train_data_folder = paddle.vision.DatasetFolder(train_image_dir)
        eval_data_folder = paddle.vision.DatasetFolder(eval_image_dir)        
        if self.mode  == 'train':
            self.data = train_data_folder        elif self.mode  == 'eval':
            self.data = eval_data_folder    def __getitem__(self, index):
        """
        步骤三:实现__getitem__方法,定义指定index时如何获取数据,并返回单条数据(训练数据,对应的标签)
        """
        data = np.array(self.data[index][0]).astype('float32')

        data = self.transforms(data)

        label = np.array([self.data[index][1]]).astype('int64')        
        return data, label        
    def __len__(self):
        """
        步骤四:实现__len__方法,返回数据集总数目
        """
        return len(self.data)
   

2.3.3 实例化数据集类及图像增强

根据所使用的数据集需求实例化数据集类,并查看总样本量。

In [ ]
from paddle.vision import transforms as T#数据增强transform_train =T.Compose([T.Resize((256,256)),
                            T.RandomHorizontalFlip(10),
                            T.RandomRotation(10),
                            T.Transpose(),
                            T.Normalize(mean=[0, 0, 0],                           # 像素值归一化
                                        std =[255, 255, 255]),                    # transforms.ToTensor(), # transpose操作 + (img / 255),并且数据结构变为PaddleTensor
                            T.Normalize(mean=[0.50950350, 0.54632660, 0.57409690],# 减均值 除标准差    
                                        std= [0.26059777, 0.26041326, 0.29220656])# 计算过程:output[channel] = (input[channel] - mean[channel]) / std[channel]
                            ])
transform_eval =T.Compose([ T.Resize((256,256)),
                            T.Transpose(),
                            T.Normalize(mean=[0, 0, 0],                           # 像素值归一化
                                        std =[255, 255, 255]),                    # transforms.ToTensor(), # transpose操作 + (img / 255),并且数据结构变为PaddleTensor
                            T.Normalize(mean=[0.50950350, 0.54632660, 0.57409690],# 减均值 除标准差    
                                        std= [0.26059777, 0.26041326, 0.29220656])# 计算过程:output[channel] = (input[channel] - mean[channel]) / std[channel]
                            ])
    In [ ]
train_dataset = TowerDataset(mode='train',transforms=transform_train)
eval_dataset  = TowerDataset(mode='eval', transforms=transform_eval )#数据异步加载train_loader = paddle.io.DataLoader(train_dataset, 
                                    places=paddle.CUDAPlace(0), 
                                    batch_size=128, 
                                    shuffle=True,                                    #num_workers=2,
                                    #use_shared_memory=True
                                    )
eval_loader = paddle.io.DataLoader (eval_dataset, 
                                    places=paddle.CUDAPlace(0), 
                                    batch_size=128,                                    #num_workers=2,
                                    #use_shared_memory=True
                                    )
    In [ ]
print('训练集样本量: {},验证集样本量: {}'.format(len(train_loader), len(eval_loader)))
       
训练集样本量: 42,验证集样本量: 11
       

③ 模型选择和开发

3.1 网络构建

本次我们使用mobilenet_v2网络来完成我们的案例实践。

In [ ]
network=paddle.vision.models.mobilenet_v2(pretrained=True,num_classes=9)
model=paddle.Model(network)
model.summary((-1, 3, 256, 256))
       
2025-06-03 21:51:44,710 - INFO - unique_endpoints {''}
2025-06-03 21:51:44,711 - INFO - Downloading mobilenet_v2_x1.0.pdparams from https://paddle-hapi.bj.bcebos.com/models/mobilenet_v2_x1.0.pdparams
100%|██████████| 20795/20795 [00:00<00:00, 22406.24it/s]
2025-06-03 21:51:46,068 - INFO - File /home/aistudio/.cache/paddle/hapi/weights/mobilenet_v2_x1.0.pdparams md5 checking...
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dygraph/layers.py:1303: UserWarning: Skip loading for classifier.1.weight. classifier.1.weight receives a shape [1280, 1000], but the expected shape is [1280, 9].
  warnings.warn(("Skip loading for {}. ".format(key) + str(err)))
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dygraph/layers.py:1303: UserWarning: Skip loading for classifier.1.bias. classifier.1.bias receives a shape [1000], but the expected shape is [9].
  warnings.warn(("Skip loading for {}. ".format(key) + str(err)))
       
-------------------------------------------------------------------------------
   Layer (type)         Input Shape          Output Shape         Param #    
===============================================================================
     Conv2D-1        [[1, 3, 256, 256]]   [1, 32, 128, 128]         864      
   BatchNorm2D-1    [[1, 32, 128, 128]]   [1, 32, 128, 128]         128      
      ReLU6-1       [[1, 32, 128, 128]]   [1, 32, 128, 128]          0       
     Conv2D-2       [[1, 32, 128, 128]]   [1, 32, 128, 128]         288      
   BatchNorm2D-2    [[1, 32, 128, 128]]   [1, 32, 128, 128]         128      
      ReLU6-2       [[1, 32, 128, 128]]   [1, 32, 128, 128]          0       
     Conv2D-3       [[1, 32, 128, 128]]   [1, 16, 128, 128]         512      
   BatchNorm2D-3    [[1, 16, 128, 128]]   [1, 16, 128, 128]         64       
InvertedResidual-1  [[1, 32, 128, 128]]   [1, 16, 128, 128]          0       
     Conv2D-4       [[1, 16, 128, 128]]   [1, 96, 128, 128]        1,536     
   BatchNorm2D-4    [[1, 96, 128, 128]]   [1, 96, 128, 128]         384      
      ReLU6-3       [[1, 96, 128, 128]]   [1, 96, 128, 128]          0       
     Conv2D-5       [[1, 96, 128, 128]]    [1, 96, 64, 64]          864      
   BatchNorm2D-5     [[1, 96, 64, 64]]     [1, 96, 64, 64]          384      
      ReLU6-4        [[1, 96, 64, 64]]     [1, 96, 64, 64]           0       
     Conv2D-6        [[1, 96, 64, 64]]     [1, 24, 64, 64]         2,304     
   BatchNorm2D-6     [[1, 24, 64, 64]]     [1, 24, 64, 64]          96       
InvertedResidual-2  [[1, 16, 128, 128]]    [1, 24, 64, 64]           0       
     Conv2D-7        [[1, 24, 64, 64]]     [1, 144, 64, 64]        3,456     
   BatchNorm2D-7     [[1, 144, 64, 64]]    [1, 144, 64, 64]         576      
      ReLU6-5        [[1, 144, 64, 64]]    [1, 144, 64, 64]          0       
     Conv2D-8        [[1, 144, 64, 64]]    [1, 144, 64, 64]        1,296     
   BatchNorm2D-8     [[1, 144, 64, 64]]    [1, 144, 64, 64]         576      
      ReLU6-6        [[1, 144, 64, 64]]    [1, 144, 64, 64]          0       
     Conv2D-9        [[1, 144, 64, 64]]    [1, 24, 64, 64]         3,456     
   BatchNorm2D-9     [[1, 24, 64, 64]]     [1, 24, 64, 64]          96       
InvertedResidual-3   [[1, 24, 64, 64]]     [1, 24, 64, 64]           0       
     Conv2D-10       [[1, 24, 64, 64]]     [1, 144, 64, 64]        3,456     
  BatchNorm2D-10     [[1, 144, 64, 64]]    [1, 144, 64, 64]         576      
      ReLU6-7        [[1, 144, 64, 64]]    [1, 144, 64, 64]          0       
     Conv2D-11       [[1, 144, 64, 64]]    [1, 144, 32, 32]        1,296     
  BatchNorm2D-11     [[1, 144, 32, 32]]    [1, 144, 32, 32]         576      
      ReLU6-8        [[1, 144, 32, 32]]    [1, 144, 32, 32]          0       
     Conv2D-12       [[1, 144, 32, 32]]    [1, 32, 32, 32]         4,608     
  BatchNorm2D-12     [[1, 32, 32, 32]]     [1, 32, 32, 32]          128      
InvertedResidual-4   [[1, 24, 64, 64]]     [1, 32, 32, 32]           0       
     Conv2D-13       [[1, 32, 32, 32]]     [1, 192, 32, 32]        6,144     
  BatchNorm2D-13     [[1, 192, 32, 32]]    [1, 192, 32, 32]         768      
      ReLU6-9        [[1, 192, 32, 32]]    [1, 192, 32, 32]          0       
     Conv2D-14       [[1, 192, 32, 32]]    [1, 192, 32, 32]        1,728     
  BatchNorm2D-14     [[1, 192, 32, 32]]    [1, 192, 32, 32]         768      
     ReLU6-10        [[1, 192, 32, 32]]    [1, 192, 32, 32]          0       
     Conv2D-15       [[1, 192, 32, 32]]    [1, 32, 32, 32]         6,144     
  BatchNorm2D-15     [[1, 32, 32, 32]]     [1, 32, 32, 32]          128      
InvertedResidual-5   [[1, 32, 32, 32]]     [1, 32, 32, 32]           0       
     Conv2D-16       [[1, 32, 32, 32]]     [1, 192, 32, 32]        6,144     
  BatchNorm2D-16     [[1, 192, 32, 32]]    [1, 192, 32, 32]         768      
     ReLU6-11        [[1, 192, 32, 32]]    [1, 192, 32, 32]          0       
     Conv2D-17       [[1, 192, 32, 32]]    [1, 192, 32, 32]        1,728     
  BatchNorm2D-17     [[1, 192, 32, 32]]    [1, 192, 32, 32]         768      
     ReLU6-12        [[1, 192, 32, 32]]    [1, 192, 32, 32]          0       
     Conv2D-18       [[1, 192, 32, 32]]    [1, 32, 32, 32]         6,144     
  BatchNorm2D-18     [[1, 32, 32, 32]]     [1, 32, 32, 32]          128      
InvertedResidual-6   [[1, 32, 32, 32]]     [1, 32, 32, 32]           0       
     Conv2D-19       [[1, 32, 32, 32]]     [1, 192, 32, 32]        6,144     
  BatchNorm2D-19     [[1, 192, 32, 32]]    [1, 192, 32, 32]         768      
     ReLU6-13        [[1, 192, 32, 32]]    [1, 192, 32, 32]          0       
     Conv2D-20       [[1, 192, 32, 32]]    [1, 192, 16, 16]        1,728     
  BatchNorm2D-20     [[1, 192, 16, 16]]    [1, 192, 16, 16]         768      
     ReLU6-14        [[1, 192, 16, 16]]    [1, 192, 16, 16]          0       
     Conv2D-21       [[1, 192, 16, 16]]    [1, 64, 16, 16]        12,288     
  BatchNorm2D-21     [[1, 64, 16, 16]]     [1, 64, 16, 16]          256      
InvertedResidual-7   [[1, 32, 32, 32]]     [1, 64, 16, 16]           0       
     Conv2D-22       [[1, 64, 16, 16]]     [1, 384, 16, 16]       24,576     
  BatchNorm2D-22     [[1, 384, 16, 16]]    [1, 384, 16, 16]        1,536     
     ReLU6-15        [[1, 384, 16, 16]]    [1, 384, 16, 16]          0       
     Conv2D-23       [[1, 384, 16, 16]]    [1, 384, 16, 16]        3,456     
  BatchNorm2D-23     [[1, 384, 16, 16]]    [1, 384, 16, 16]        1,536     
     ReLU6-16        [[1, 384, 16, 16]]    [1, 384, 16, 16]          0       
     Conv2D-24       [[1, 384, 16, 16]]    [1, 64, 16, 16]        24,576     
  BatchNorm2D-24     [[1, 64, 16, 16]]     [1, 64, 16, 16]          256      
InvertedResidual-8   [[1, 64, 16, 16]]     [1, 64, 16, 16]           0       
     Conv2D-25       [[1, 64, 16, 16]]     [1, 384, 16, 16]       24,576     
  BatchNorm2D-25     [[1, 384, 16, 16]]    [1, 384, 16, 16]        1,536     
     ReLU6-17        [[1, 384, 16, 16]]    [1, 384, 16, 16]          0       
     Conv2D-26       [[1, 384, 16, 16]]    [1, 384, 16, 16]        3,456     
  BatchNorm2D-26     [[1, 384, 16, 16]]    [1, 384, 16, 16]        1,536     
     ReLU6-18        [[1, 384, 16, 16]]    [1, 384, 16, 16]          0       
     Conv2D-27       [[1, 384, 16, 16]]    [1, 64, 16, 16]        24,576     
  BatchNorm2D-27     [[1, 64, 16, 16]]     [1, 64, 16, 16]          256      
InvertedResidual-9   [[1, 64, 16, 16]]     [1, 64, 16, 16]           0       
     Conv2D-28       [[1, 64, 16, 16]]     [1, 384, 16, 16]       24,576     
  BatchNorm2D-28     [[1, 384, 16, 16]]    [1, 384, 16, 16]        1,536     
     ReLU6-19        [[1, 384, 16, 16]]    [1, 384, 16, 16]          0       
     Conv2D-29       [[1, 384, 16, 16]]    [1, 384, 16, 16]        3,456     
  BatchNorm2D-29     [[1, 384, 16, 16]]    [1, 384, 16, 16]        1,536     
     ReLU6-20        [[1, 384, 16, 16]]    [1, 384, 16, 16]          0       
     Conv2D-30       [[1, 384, 16, 16]]    [1, 64, 16, 16]        24,576     
  BatchNorm2D-30     [[1, 64, 16, 16]]     [1, 64, 16, 16]          256      
InvertedResidual-10  [[1, 64, 16, 16]]     [1, 64, 16, 16]           0       
     Conv2D-31       [[1, 64, 16, 16]]     [1, 384, 16, 16]       24,576     
  BatchNorm2D-31     [[1, 384, 16, 16]]    [1, 384, 16, 16]        1,536     
     ReLU6-21        [[1, 384, 16, 16]]    [1, 384, 16, 16]          0       
     Conv2D-32       [[1, 384, 16, 16]]    [1, 384, 16, 16]        3,456     
  BatchNorm2D-32     [[1, 384, 16, 16]]    [1, 384, 16, 16]        1,536     
     ReLU6-22        [[1, 384, 16, 16]]    [1, 384, 16, 16]          0       
     Conv2D-33       [[1, 384, 16, 16]]    [1, 96, 16, 16]        36,864     
  BatchNorm2D-33     [[1, 96, 16, 16]]     [1, 96, 16, 16]          384      
InvertedResidual-11  [[1, 64, 16, 16]]     [1, 96, 16, 16]           0       
     Conv2D-34       [[1, 96, 16, 16]]     [1, 576, 16, 16]       55,296     
  BatchNorm2D-34     [[1, 576, 16, 16]]    [1, 576, 16, 16]        2,304     
     ReLU6-23        [[1, 576, 16, 16]]    [1, 576, 16, 16]          0       
     Conv2D-35       [[1, 576, 16, 16]]    [1, 576, 16, 16]        5,184     
  BatchNorm2D-35     [[1, 576, 16, 16]]    [1, 576, 16, 16]        2,304     
     ReLU6-24        [[1, 576, 16, 16]]    [1, 576, 16, 16]          0       
     Conv2D-36       [[1, 576, 16, 16]]    [1, 96, 16, 16]        55,296     
  BatchNorm2D-36     [[1, 96, 16, 16]]     [1, 96, 16, 16]          384      
InvertedResidual-12  [[1, 96, 16, 16]]     [1, 96, 16, 16]           0       
     Conv2D-37       [[1, 96, 16, 16]]     [1, 576, 16, 16]       55,296     
  BatchNorm2D-37     [[1, 576, 16, 16]]    [1, 576, 16, 16]        2,304     
     ReLU6-25        [[1, 576, 16, 16]]    [1, 576, 16, 16]          0       
     Conv2D-38       [[1, 576, 16, 16]]    [1, 576, 16, 16]        5,184     
  BatchNorm2D-38     [[1, 576, 16, 16]]    [1, 576, 16, 16]        2,304     
     ReLU6-26        [[1, 576, 16, 16]]    [1, 576, 16, 16]          0       
     Conv2D-39       [[1, 576, 16, 16]]    [1, 96, 16, 16]        55,296     
  BatchNorm2D-39     [[1, 96, 16, 16]]     [1, 96, 16, 16]          384      
InvertedResidual-13  [[1, 96, 16, 16]]     [1, 96, 16, 16]           0       
     Conv2D-40       [[1, 96, 16, 16]]     [1, 576, 16, 16]       55,296     
  BatchNorm2D-40     [[1, 576, 16, 16]]    [1, 576, 16, 16]        2,304     
     ReLU6-27        [[1, 576, 16, 16]]    [1, 576, 16, 16]          0       
     Conv2D-41       [[1, 576, 16, 16]]     [1, 576, 8, 8]         5,184     
  BatchNorm2D-41      [[1, 576, 8, 8]]      [1, 576, 8, 8]         2,304     
     ReLU6-28         [[1, 576, 8, 8]]      [1, 576, 8, 8]           0       
     Conv2D-42        [[1, 576, 8, 8]]      [1, 160, 8, 8]        92,160     
  BatchNorm2D-42      [[1, 160, 8, 8]]      [1, 160, 8, 8]          640      
InvertedResidual-14  [[1, 96, 16, 16]]      [1, 160, 8, 8]           0       
     Conv2D-43        [[1, 160, 8, 8]]      [1, 960, 8, 8]        153,600    
  BatchNorm2D-43      [[1, 960, 8, 8]]      [1, 960, 8, 8]         3,840     
     ReLU6-29         [[1, 960, 8, 8]]      [1, 960, 8, 8]           0       
     Conv2D-44        [[1, 960, 8, 8]]      [1, 960, 8, 8]         8,640     
  BatchNorm2D-44      [[1, 960, 8, 8]]      [1, 960, 8, 8]         3,840     
     ReLU6-30         [[1, 960, 8, 8]]      [1, 960, 8, 8]           0       
     Conv2D-45        [[1, 960, 8, 8]]      [1, 160, 8, 8]        153,600    
  BatchNorm2D-45      [[1, 160, 8, 8]]      [1, 160, 8, 8]          640      
InvertedResidual-15   [[1, 160, 8, 8]]      [1, 160, 8, 8]           0       
     Conv2D-46        [[1, 160, 8, 8]]      [1, 960, 8, 8]        153,600    
  BatchNorm2D-46      [[1, 960, 8, 8]]      [1, 960, 8, 8]         3,840     
     ReLU6-31         [[1, 960, 8, 8]]      [1, 960, 8, 8]           0       
     Conv2D-47        [[1, 960, 8, 8]]      [1, 960, 8, 8]         8,640     
  BatchNorm2D-47      [[1, 960, 8, 8]]      [1, 960, 8, 8]         3,840     
     ReLU6-32         [[1, 960, 8, 8]]      [1, 960, 8, 8]           0       
     Conv2D-48        [[1, 960, 8, 8]]      [1, 160, 8, 8]        153,600    
  BatchNorm2D-48      [[1, 160, 8, 8]]      [1, 160, 8, 8]          640      
InvertedResidual-16   [[1, 160, 8, 8]]      [1, 160, 8, 8]           0       
     Conv2D-49        [[1, 160, 8, 8]]      [1, 960, 8, 8]        153,600    
  BatchNorm2D-49      [[1, 960, 8, 8]]      [1, 960, 8, 8]         3,840     
     ReLU6-33         [[1, 960, 8, 8]]      [1, 960, 8, 8]           0       
     Conv2D-50        [[1, 960, 8, 8]]      [1, 960, 8, 8]         8,640     
  BatchNorm2D-50      [[1, 960, 8, 8]]      [1, 960, 8, 8]         3,840     
     ReLU6-34         [[1, 960, 8, 8]]      [1, 960, 8, 8]           0       
     Conv2D-51        [[1, 960, 8, 8]]      [1, 320, 8, 8]        307,200    
  BatchNorm2D-51      [[1, 320, 8, 8]]      [1, 320, 8, 8]         1,280     
InvertedResidual-17   [[1, 160, 8, 8]]      [1, 320, 8, 8]           0       
     Conv2D-52        [[1, 320, 8, 8]]     [1, 1280, 8, 8]        409,600    
  BatchNorm2D-52     [[1, 1280, 8, 8]]     [1, 1280, 8, 8]         5,120     
     ReLU6-35        [[1, 1280, 8, 8]]     [1, 1280, 8, 8]           0       
AdaptiveAvgPool2D-1  [[1, 1280, 8, 8]]     [1, 1280, 1, 1]           0       
     Dropout-1          [[1, 1280]]           [1, 1280]              0       
     Linear-1           [[1, 1280]]             [1, 9]            11,529     
===============================================================================
Total params: 2,269,513
Trainable params: 2,201,289
Non-trainable params: 68,224
-------------------------------------------------------------------------------
Input size (MB): 0.75
Forward/backward pass size (MB): 199.66
Params size (MB): 8.66
Estimated Total Size (MB): 209.07
-------------------------------------------------------------------------------
       
{'total_params': 2269513, 'trainable_params': 2201289}
               

④ 模型训练和优化器的选择

In [ ]
#优化器选择class S*eBestModel(paddle.callbacks.Callback):
    def __init__(self, target=0.5, path='work/best_model', verbose=0):
        self.target = target
        self.epoch = None
        self.path = path    def on_epoch_end(self, epoch, logs=None):
        self.epoch = epoch    def on_eval_end(self, logs=None):
        if logs.get('acc') > self.target:
            self.target = logs.get('acc')
            self.model.s*e(self.path)            print('best acc is {} at epoch {}'.format(self.target, self.epoch))

callback_visualdl = paddle.callbacks.VisualDL(log_dir='work/mushroom')
callback_s*ebestmodel = S*eBestModel(target=0.5, path='work/best_model')
callbacks = [callback_visualdl, callback_s*ebestmodel]

base_lr = config_parameters['lr']
epochs = config_parameters['epochs']def make_optimizer(parameters=None):
    momentum = 0.9

    learning_rate= paddle.optimizer.lr.CosineAnnealingDecay(learning_rate=base_lr, T_max=epochs, verbose=False)
    weight_decay=paddle.regularizer.L2Decay(0.0001)
    optimizer = paddle.optimizer.Momentum(
        learning_rate=learning_rate,
        momentum=momentum,
        weight_decay=weight_decay,
        parameters=parameters)    return optimizer

optimizer = make_optimizer(model.parameters())
    In [ ]
model.prepare(optimizer,
              paddle.nn.CrossEntropyLoss(),
              paddle.metric.Accuracy())
    In [14]
model.fit(train_loader,
          eval_loader,
          epochs=100,
          batch_size=128,           # 是否打乱样本集     
          callbacks=callbacks, 
          verbose=1)   # 日志展示格式
   

⑤模型评估测试

手把手教你部署一个蘑菇识别的小应用 -        

⑥部署上线

将我们训练得到的模型进行保存为静态图,得到mushroom.pdmodel和mushroom.pdiparams两个文件,准备一个label_list.txt文件

In [15]
model.s*e('mushroom',training=False)
   

6.1上传原模型

根据图示进行上传文件验证,生成Demo

手把手教你部署一个蘑菇识别的小应用 -        

6.2生成端模型

手把手教你部署一个蘑菇识别的小应用 -        

手把手教你部署一个蘑菇识别的小应用 -        

6.3Demo下载体验

手把手教你部署一个蘑菇识别的小应用 - 手把手教你部署一个蘑菇识别的小应用 -  手把手教你部署一个蘑菇识别的小应用 -        

以上就是手把手教你部署一个蘑菇识别的小应用的详细内容,更多请关注其它相关文章!


# 一言  # 做seo的账号  # 抚顺抖音seo  # 地产营销推广画面  # 桂林小语种网站建设  # 网站代理推广赚钱吗现在  # 吴江软文网络营销推广  # seo流量精灵优化软件  # 霸屏首页seo优化  # 舟山网络营销推广哪家好  # 全员营销如何引流推广  # 解压缩  # 压缩包  # 加载  # 数据结构  # python  # 教育机构  # 建站系统  # 手把手教你  # 中文网  # 网站建设的  # type  # fig  # udio  # igs  # red  # cos  # 异步加载  # ai 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: 世界人工智能大会(WAIC 2025)点燃魔都,博尔捷数字科技携前沿技术产品亮相  IBM和NASA合作发布可追踪碳排放的开源AI基础模型  视觉中国推出AI灵感绘图功能  大模型的“黄金搭档”来了!腾讯云正式发布AI原生向量数据库,提供10亿级向量检索能力  五项人工智能尚未能够实现的任务  人形机器人打开精密齿轮市场全新空间!受益上市公司梳理  周鸿祎:用超级AI实现室温超导和核聚变,实现能源自由  OpenAI大神Karpathy最新分享:为什么OpenAI内部对AI Agents最感兴趣  加强高质量数据供应能力,促进通用人工智能大模型领域的创新  微软在德国举办MR研讨会,向女性分享元宇宙潜力  云深处与昇腾CANN携手合作:开设ROS四足机器狗开发训练营  深剖Apple Vision Pro中暗藏的“AI”  有 ARM 和 X86 两个版本,香橙派游戏掌机细节曝光  月薪6万,哪些AI岗位在抢人?  微软为 AI 初学者推出免费网课:为期 12 周,共 24 节课  中国联通推出“极光一号”5G机载终端,适配大疆等品牌无人机设备  一句话搞定数据分析,浙大全新大模型数据助手,连搜集都省了  梦想实现!硬核科幻大片VR智能头盔即将问世  DeepMind用AI重写排序算法;将33B大模型塞进单个消费级GPU  映宇宙集团执行总编辑:元宇宙还是要以人为媒介  国宝级文物“铜兽驮跪坐人顶尊铜像”完成模拟拼接,腾讯AI立功  用AI技术点亮老照片:Deep Nostalgia带给照片新生动感  Win11 AI 助手 Windows Copilot 被吐槽:套皮的 Edge 浏览器  世界人工智能大会上,科大讯飞宣布与华为联手  Meta 发布 Voicebox AI 模型:可生成音频信息,用于 NPC 对话等  奥比中光子公司和斯坦德机器人深度合作,共同推进新一代激光雷达的研发  OpenAI宣布在伦敦设立海外分部,要招揽“世界级人才”  利亚德加码AI战略,与光年无限图灵机器人全面开展AI研发业务合作  人工智能赋能无人驾驶:商业化进程再提速  ChatGPT只讲这25个笑话!实验上千次有90%重复,网友:幽默是人类最后的尊严  OpenAI 为开发者推出 GPT 聊天机器人 API 大更新,同时降低价格  如何提高集群协作效率?中外团队合作研发基于均值偏移的机器人队形控制策略  13万个注释神经元,5300万个突触,普林斯顿大学等发布首个完整「成年果蝇」大脑连接组  360发布AI数字人广场,可同孙悟空、爱因斯坦等古今中外角色对话  遵义市首次引入手术机器人,成功实施全膝关节置换术  Zoom远程会议应用:AI培训需经用户授权  AI和ML推动联网设备的增长  世界周刊丨AI“棱镜”?  第四范式「式说」大模型入选《2025年通用人工智能创新应用案例集》  腾讯机器狗进化:通过深度学习掌握自主决策能力  7/8上海 | 2025世界人工智能大会分论坛:科技与人文-共筑无障碍智能社会  物联网“僵尸网络DDos攻击”增长惊人,威胁全球电信网络  MiracleVision视觉大模型功能介绍  杭州举办第19届亚运会,主题为「亚运元宇宙」的发布仪式举行  无人机协助盐城交通执法的协同训练  特斯拉首发人形机器人“擎天柱”亮相世界人工智能大会  OpenAI CEO 山姆・阿尔特曼呼吁 AI 领域中美应当合作  鉴智机器人发布基于地平线征程5的标准视觉感知产品  泗洪:畅通城市“血管” ,管下机器人来帮忙  华为AI大模型将融入HarmonyOS 4 

 2025-07-24

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.