基于PaddlePaddle平台训练物体分类——猫狗分类

news2024/11/17 7:22:38

学习目标:

在百度的PaddlePaddle平台训练自己需要的模型,以训练一个猫狗分类模型为例

PaddlePaddle平台:

  • 飞桨(PaddlePaddle)是百度开发的深度学习平台,具有动静统一框架、端到端开发套件等特性,支持大规模分布式训练和高性能推理
  • 作为中国首个自主研发的产业级平台,飞桨在市场份额和应用规模上均居中国第一,服务了800万开发者和22万家企事业单位,广泛应用于金融、能源、制造、交通等领域

学习概述:

  • 基于百度的PaddlePaddle平台训练猫狗分类模型

  • 学习使用PaddlePaddle平台的使用方法,其中包括寻找数据集、运行环境配置、数据预处理、训练、计算预估准确率、使用ncc工具将模型转换为kmodel模型文件等


训练方法:

1、寻找数据集:我们可以在搜索框搜索猫和狗,选择一个合适大小的猫与狗的数据集,便于后面训练模型,数据集样本的数量直接影响训练模型的正确率、迭代次数、训练时间等(点击跳转)

在这里插入图片描述
在这里插入图片描述


2、运行环境配置:首先创建一个Notebook项目,然后填写项目名称、数据集配置,此处使用AI Studio经典版、PaddlePaddle 2.4.0框架,接下来选择运行环境,我们选择免费的两核CPU就可以,然后运行创建配置好的项目

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


3、数据预处理:可以看到项目中有两个文件夹work和data,work目录下的变更会持久保存,但data目录下的变更重启环境后会自动还原。在右侧Notebook编译区可以新建代码脚本等

  1. 将data目录下的猫狗.zip重命名为catanddog.zip,新建Code并运行解压数据集
# 解压猫狗数据集
!cd data/data17036 && unzip -q catanddog.zip
  1. 上传预训练参数文件下载链接,新建Code并运行解预训练参数
# 解压预训练参数 
!cd data && unzip -q Pts.zip
# 解压预训练参数 pretrained
!cd data/Pts && unzip -q pretrained.zip
  1. 预处理数据,同时将数据拆分成两份以便训练和计算预估准确率,将其转化为标准格式。
# 预处理数据,将其转化为标准格式。同时将数据拆分成两份,以便训练和计算预估准确率
import codecs
import os
import random
import shutil
from PIL import Image

train_ratio = 4 / 5

all_file_dir = 'data/data17036/catanddog'
class_list = [c for c in os.listdir(all_file_dir) if os.path.isdir(os.path.join(all_file_dir, c)) and not c.endswith('Set') and not c.startswith('.')]
class_list.sort()
print(class_list)
train_image_dir = os.path.join(all_file_dir, "trainImageSet")
if not os.path.exists(train_image_dir):
    os.makedirs(train_image_dir)
    
eval_image_dir = os.path.join(all_file_dir, "evalImageSet")
if not os.path.exists(eval_image_dir):
    os.makedirs(eval_image_dir)

train_file = codecs.open(os.path.join(all_file_dir, "train.txt"), 'w')
eval_file = codecs.open(os.path.join(all_file_dir, "eval.txt"), 'w')

with codecs.open(os.path.join(all_file_dir, "label_list.txt"), "w") as label_list:
    label_id = 0
    for class_dir in class_list:
        label_list.write("{0}\t{1}\n".format(label_id, class_dir))
        image_path_pre = os.path.join(all_file_dir, class_dir)
        for file in os.listdir(image_path_pre):
            try:
                img = Image.open(os.path.join(image_path_pre, file))
                if random.uniform(0, 1) <= train_ratio:
                    shutil.copyfile(os.path.join(image_path_pre, file), os.path.join(train_image_dir, file))
                    train_file.write("{0}\t{1}\n".format(os.path.join(train_image_dir, file), label_id))
                else:
                    shutil.copyfile(os.path.join(image_path_pre, file), os.path.join(eval_image_dir, file))
                    eval_file.write("{0}\t{1}\n".format(os.path.join(eval_image_dir, file), label_id))
            except Exception as e:
                pass
                # 存在一些文件打不开,此处需要稍作清洗
        label_id += 1
            
train_file.close()
eval_file.close()

4、训练模型:训练常用视觉基础网络进行猫狗分类

# -*- coding: UTF-8 -*-
"""
训练常用视觉基础网络,用于分类任务
需要将训练图片,类别文件 label_list.txt 放置在同一个文件夹下
程序会先读取 train.txt 文件获取类别数和图片数量
"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import os
import numpy as np
import time
import math
import paddle
import paddle.fluid as fluid
import codecs
import logging

from paddle.fluid.initializer import MSRA
from paddle.fluid.initializer import Uniform
from paddle.fluid.param_attr import ParamAttr
from PIL import Image
from PIL import ImageEnhance

......#代码较长其余可fork项目,参考本文结尾

5、计算预估准确率:测试集模型评估,测试模型的正确率

from __future__ import absolute_import    
from __future__ import division    
from __future__ import print_function    
    
import os    
import numpy as np    
import random    
import time    
import codecs    
import sys    
import functools    
import math    
import paddle    
import paddle.fluid as fluid    
from paddle.fluid import core    
from paddle.fluid.param_attr import ParamAttr    
from PIL import Image, ImageEnhance    
    
target_size = [3, 224, 224]    
mean_rgb = [127.5, 127.5, 127.5]    
data_dir = "data/data17036/catanddog"    
eval_file = "eval.txt"    
use_gpu = train_parameters["use_gpu"]    
place = fluid.CUDAPlace(0) if use_gpu else fluid.CPUPlace()    
exe = fluid.Executor(place)    
save_freeze_dir = "./freeze-model"    
[inference_program, feed_target_names, fetch_targets] = fluid.io.load_inference_model(dirname=save_freeze_dir, executor=exe)    
# print(fetch_targets)    
    
    
def crop_image(img, target_size):    
    width, height = img.size    
    w_start = (width - target_size[2]) / 2    
    h_start = (height - target_size[1]) / 2    
    w_end = w_start + target_size[2]    
    h_end = h_start + target_size[1]    
    img = img.crop((w_start, h_start, w_end, h_end))    
    return img    
    
    
def resize_img(img, target_size):    
    ret = img.resize((target_size[1], target_size[2]), Image.BILINEAR)    
    return ret    
    
    
def read_image(img_path):    
    img = Image.open(img_path)    
    if img.mode != 'RGB':    
        img = img.convert('RGB')    
    img = crop_image(img, target_size)    
    img = np.array(img).astype('float32')    
    img -= mean_rgb    
    img = img.transpose((2, 0, 1))  # HWC to CHW    
    img *= 0.007843    
    img = img[np.newaxis,:]    
    return img    
    
    
def infer(image_path):    
    tensor_img = read_image(image_path)    
    label = exe.run(inference_program, feed={feed_target_names[0]: tensor_img}, fetch_list=fetch_targets)    
    return np.argmax(label)    
    
    
def eval_all():    
    eval_file_path = os.path.join(data_dir, eval_file)    
    total_count = 0    
    right_count = 0    
    with codecs.open(eval_file_path, encoding='utf-8') as flist:     
        lines = [line.strip() for line in flist]    
        t1 = time.time()    
        for line in lines:    
            total_count += 1    
            parts = line.strip().split()    
            result = infer(parts[0])    
            # print("infer result:{0} answer:{1}".format(result, parts[1]))    
            if str(result) == parts[1]:    
                right_count += 1    
        period = time.time() - t1    
        print("total eval count:{0} cost time:{1} predict accuracy:{2}".format(total_count, "%2.2f sec" % period, right_count / total_count))    
    
    
if __name__ == '__main__':    
    eval_all()  
#print:total eval count:17 cost time:1.00 sec predict accuracy:0.8235294117647058

6、模型转换:

  1. 下载ncc工具,准备转换模型。关于ncc工具可参考K210学习记录(3)——kmodel生成与使用
!mkdir /home/aistudio/work/ncc
!wget "https://platform.bj.bcebos.com/sdk%2Fncc-linux-x86_64.tar.gz" -O ncc-linux-x86_64.tar.gz 
!tar -zxvf ncc-linux-x86_64.tar.gz -C /home/aistudio/work/ncc 
  1. 在模型转换前,需要进行模型压缩,进行量化。为了保证量化后的精度, 需要使用训练图片调整模型。拷贝评估图片到/home/aistudio/work/images
import os
import shutil
!mkdir /home/aistudio/work/images
filenames = os.listdir("/home/aistudio/data/data17036/catanddog/evalImageSet/")

#下面方法是图片太多的时候随机选择图片  
# index = 0
# for i in range(1, len(filenames), 7):
#     srcFile = os.path.join("/home/aistudio/data/data17036/catanddog/evalImageSet/", filenames[index])
#     targetFile = os.path.join("/home/aistudio/work/images",filenames[index])
#     shutil.copyfile(srcFile,targetFile)
#     index += 7

index = 0
for i in range(0, len(filenames), 1):
    srcFile = os.path.join("/home/aistudio/data/data17036/catanddog/evalImageSet/", filenames[index])
    targetFile = os.path.join("/home/aistudio/work/images",filenames[index])
    shutil.copyfile(srcFile,targetFile)
    index += 1
  1. 转换为.kmodel模型
!chmod 777 /home/aistudio/work/ncc
!/home/aistudio/work/ncc/ncc -i paddle -o k210model --postprocess n1to1 --dataset work/images/ freeze-model catanddog.kmodel

小结:

  • PaddlePaddle平台的学习有六个关键步骤:配置运行环境以安装PaddlePaddle、选择并获取适合的数据集、对数据进行预处理,如清洗和标准化、利用PaddlePaddle框架进行深度学习模型的训练、训练完成后,使用验证集对模型性能进行评估、最后通过ncc工具将模型转换成kmodel文件,为模型部署做准备。这一系列步骤构成了机器学习从数据准备到模型部署的完整流程
  • 为提升PaddlePaddle实验效率和模型性能,可自动化实验流程,进行超参数调优,使用可视化监控训练,并通过交叉验证等方法增强模型泛化能力。
  • 本实验的项目地址,为大家学习使用带来方便,大家可以fork学习,点击进入项目地址

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mac装虚拟机好不好 Mac装虚拟机和装Windows系统一样吗 PD虚拟机

随着跨系统操作的不断发展&#xff0c;虚拟机技术在生产力领域扮演着越来越重要的角色。Mac作为一款主流的操作系统&#xff0c;也有着运行虚拟机的能力。接下来给大家介绍Mac装虚拟机好不好&#xff0c;Mac装虚拟机和装Windows系统一样吗的具体内容。 一、Mac装虚拟机好不好 …

直接用表征还是润色改写?LLM用于文生图prompt语义增强的两种范式

直接用表征还是润色改写&#xff1f;LLM用于文生图prompt语义增强的两种范式 导语 目前的文生图模型大多数都是使用 CLIP text encoder 作为 prompt 文本编码器。众所周知&#xff0c;由于训练数据是从网络上爬取的简单图文对&#xff0c;CLIP 只能理解简单语义&#xff0c;而…

linux文件句柄数满,linux文件句柄数超出系统限制怎么办?

1、问题阐述&#xff1a; too many open files&#xff1a;顾名思义即打开过多文件数。 不过这里的files不单是文件的意思&#xff0c;也包括打开的通讯链接(比如socket)&#xff0c;正在监听的端口等等&#xff0c;所以有时候也可以叫做句柄(handle)&#xff0c;这个错误通常…

自动化立体库安全使用管理制度

导语 大家好&#xff0c;我是智能仓储物流技术研习社的社长&#xff0c;老K。专注分享智能仓储物流技术、智能制造等内容。 新书《智能物流系统构成与技术实践》 完整版文件和更多学习资料&#xff0c;请球友到知识星球 【智能仓储物流技术研习社】自行下载 关于自动化立体库安…

Linux--系统烧写

前面几篇文章&#xff0c;已经搞定了Linux移植三巨头&#xff1a;uboot、kernel(包含dtb)和rootfs&#xff0c;除了uboot是烧写在SD中的&#xff0c;其它的都是在ubuntu虚拟机的nfs服务器中&#xff0c;运行时必须通过网络将这些文件加载到开发板的内存中运行。 本篇就来研究&a…

JAVAEE—HTTP

文章目录 HTTP导读HTTP解析HTTP的格式分析环境准备 HTTP请求格式首行headerHostContent-LengthContent-TypeUser-Agent (简称 UA)RefererCookie 空行body HTTP响应格式认识HTTP的方法POST方法POST和GET的区别第一&#xff1a;用处第二&#xff1a;传递数据第三&#xff1a;GET不…

QWidget | Qt::WindowType 枚举的取值及意义QFlags 模板类详解

01 与 QWidget 类有关的部分类的继承图 3、QObject 是所有 Qt 对象的基类,QPaintDevie 是所有可绘制对象的基类。 4、QWidget 类是所有用户界面对象的基类,QWidget 及其子类是开发桌面应用的核心,这些类都位于 QtWidgets 模块内,注意:QtWidgets 是模块,QWidget 是类(少一…

装饰模式【结构型模式C++】

1.概述 装饰模式是一种结构型设计模式&#xff0c; 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。 2.结构 抽象构件&#xff08;Component&#xff09;角色&#xff1a;定义一个抽象接口以规范准备接收附加责任的对象。具体构件&#xff08;Concrete…

区块链安全应用------压力测试

测试要求&#xff1a; 1. 对以下AccountManager智能合约进行压测(基础要求set函数测试&#xff0c;balanceOf涵为20分加分项)2. 在本地链进行测试&#xff0c;需要监控本地进程的资源使用情况。每个进程的multiOutput属性为Avg3. 需要将每一个更改的配置文件截图&#xff0c;和…

指针(5)

前言 本节是有关指针内容的最后一节&#xff0c;本节的内容以讲解指针习题为主&#xff0c;那么就让我们一起来开启本节的学习吧&#xff01; sizeof和strlen的对比 1.sizeof 我们在学习操作符的时候&#xff0c;学习了sizeof。sizeof存在的意义是用来计算变量所占用的内存空…

智慧火电厂合集 | 数字孪生助推能源革命

火电厂在发电领域中扮演着举足轻重的角色。主要通过燃烧如煤、石油或天然气等化石燃料来产生电力。尽管随着可再生能源技术的进步导致其比重有所减少&#xff0c;但直至 2023 年&#xff0c;火电依然是全球主要的电力来源之一。 通过图扑软件自主研发 HT for Web 产品&#xf…

百度智能云千帆 ModelBuilder 技术实践系列:通过 SDK 快速构建并发布垂域模型

​百度智能云千帆大模型平台&#xff08;百度智能云千帆大模型平台 ModelBuilder&#xff09;作为面向企业开发者的一站式大模型开发平台&#xff0c;自上线以来受到了广大开发者、企业的关注。至今已经上线收纳了超过 70 种预置模型服务&#xff0c;用户可以快速的调用&#x…

企业微信hook接口协议,开放平台id转企业用户id

开放平台id转企业用户id 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信 请求示例 {"uuid":"3240fde0-45e2-48c0-90e8-cb098d0ebe43","openid":["woO9o4EAAAUg47yCUh1mDYVh71AJ8R3w"] } …

陪诊小程序的市场潜力与发展趋势研究

随着社会的快速发展和人口老龄化的加剧&#xff0c;医疗服务需求日益增长&#xff0c;而陪诊服务作为医疗服务的重要补充&#xff0c;正逐渐受到人们的关注和青睐。陪诊小程序作为一种便捷、高效的陪诊服务平台&#xff0c;其市场潜力和发展趋势值得关注。 一、市场潜力分析 人…

【现代交换原理与通信网技术】期末突击

文章目录 自己老师画的重点1. 程控交换机结构2. 测试模拟电路的七项功能3.中继电路的六项功能4.数字用户电路和模拟用户电路比较5.路由规划的基本原则6.七路信令的结构7.随路信令和公共信道信令8.软交换9.无极网和分级网10.路由选择.流量控制的原则/方法11.电路交换&&分…

微软Phi-3,3.8亿参数能与Mixtral 8x7B和GPT-3.5相媲美,量化后还可直接在IPhone中运行

Phi-3系列 Phi-3是一系列先进的语言模型&#xff0c;专注于在保持足够紧凑以便在移动设备上部署的同时&#xff0c;实现高性能。Phi-3系列包括不同大小的模型&#xff1a; Phi-3-mini&#xff08;38亿参数&#xff09; - 该模型在3.3万亿个令牌上进行训练&#xff0c;设计得足…

解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务(Spring MVC Springboot)同时允许跨域

解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务&#xff08;Spring MVC Springboot&#xff09;同时允许跨域 Tomcat 配置允许跨域Web 项目配置允许跨域Tomcat 同时允许静态文件和 Web 服务跨域 偶尔遇到一个 Tomcat 部署项目跨域问题&#xff0c;因为已经处理过…

如何调节电脑屏幕亮度?让你的眼睛更舒适!

电脑屏幕亮度的调节对于我们的视力保护和使用舒适度至关重要。不同的环境和使用习惯可能需要不同的亮度设置。可是如何调节电脑屏幕亮度呢&#xff1f;本文将介绍三种不同的电脑屏幕亮度调节方法&#xff0c;帮助您轻松调节电脑屏幕亮度&#xff0c;以满足您的需求。 方法1&…

超级好看动态视频官网源码

源码介绍 超级好看动态视频引导页源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 效果截图 源码下载 超级好看动态…

4.26日学习记录

[湖湘杯 2021 final]Penetratable SUID提权 SUID是一种对二进制程序进行设置的特殊权限&#xff0c;可以让二进制程序的执行者临时拥有属主的权限 SUID具有一定的限制&#xff1a; 1.仅对于二进制有效&#xff1b; 2.执行者在程序中有可以执行的权限&#xff1b; 3.权限仅在程序…