PaddleClas训练自己的图像分类模型(代码与实践)--ZHY

alt alt alt GitHub链接

alt alt

alt

import shutil
a =0
for i in os.walk("E:/cat_12/1"):   #读取目录内子文件夹名称,以及文件  [0] 文件夹  [1] 子文件夹 [2] 文件夹和子文件夹内文件名
    if a>0:
        f = open("E:/cat_12/train_list_1.txt",'a')    # 追加模式打开标注文件
        isExists=os.path.exists("E:/cat_12/cat_12_train")    # 判断路径是否存在
        if not isExists:    # 如果路径不存在则创建
            os.makedirs("E:/cat_12/cat_12_train")
        for j in range(0,len(i[2])):    # 统一文件到一个目录,并做标注
            line = i[0]
            line = './cat_12_train/'+i[2][j]    if i[0][-2]=='1' else './cat_12_train/'+i[2][j]            
            f.write(line+' '+i[0][-2:]+'\n')  if i[0][-2]=='1'  else  f.write(line+' '+i[0][-1]+'\n')    #写入标注文件
            try:
                line = i[0]
                line = line[:11]+'/'+line[-2:]+'/'+i[2][j]    if i[0][-2]=='1' else line[:11]+'/'+line[-1]+'/'+i[2][j]
                shutil.move(line, "E:/cat_12/cat_12_train")    # 移动文件
            except:
                print(line+'图片已移动或不存在,请检查')
        f.close()
    a += 1 

alt

alt

alt

整理完成后,还需要划分训练集和测试集

import os
import random
import numpy as np

val_percent = 0.1
picfilepath = 'E:/cat_12/cat_12_train'

f = open("E:/cat_12/train_list_1.txt","r")
line = f.readlines()

# 打乱文件顺序
np.random.shuffle(line)
# 划分训练集、测试集
train = line[:int(len(line)*(1-val_percent))]
test = line[int(len(line)*(1-val_percent)):]

# 分别写入train.txt, test.txt	
with open('train_list.txt', 'w') as f1, open('test_list.txt', 'w') as f2:
    for i in train:
        f1.write(i)
    for j in test:
        f2.write(j)

print('完成')

alt alt

alt

如果出现以上图片问题,可以运行以下代码,找出坏图:

import cv2
import shutil
 
dirName = 'E:\PaddleClas-release-2.0\dataset\cat_12\cat_12_train'
# 将dirName路径下的所有文件路径全部存入all_path列表
all_path = []
for root, dirs, files in os.walk(dirName):
        for file in files:
            if "jpg" in file:
                    all_path.append(os.path.join(root, file))
all_path.sort()
 
bad = []
# 坏图片存放路径
badpath = 'E:\PaddleClas-release-2.0\dataset\\bad'
 
for i in range(len(all_path)):
    org = all_path[i]
    # print(all_path[i].split('/')[-1])
    try:
        img = cv2.imread(org)
        ss = img.shape
    except:
        bad.append(all_path[i])
        shutil.move(all_path[i],badpath)
        continue
 
print('共有%s张坏图'%(len(bad)))
print(bad)

alt alt

alt

alt

alt

alt

alt

alt

alt

alt

alt

alt

alt

alt

alt

alt alt

alt

alt

alt

alt

alt

待评估完成,输出log如下 alt

训练时只训练一会儿,只用来做演示,还可以通过调学习率,epoch等来增加准确值

四、模型推理

4.1 分类预测框架简介

Paddle 的模型保存有多种不同的形式,大体可分为两类:

  1. persistable 模型(fluid.save_persistabels保存的模型)一般做为模型的 checkpoint,也就是我们训练保存的模型,可以加载后重新训练。persistable 模型保存的是零散的权重文件,每个文件代表模型中的一个 Variable,这些零散的文件不包含结构信息,需要结合模型的结构一起使用。**

  2. inference 模型(fluid.io.save_inference_model保存的模型) 一般是模型训练完成后保存的固化模型,用于预测部署。与 persistable 模型相比,inference 模型会额外保存模型的结构信息,用于配合权重文件构成完整的模型。

PaddlePaddle提供三种方式进行预测推理,接下来介绍如何用预测引擎进行推理:

alt

alt

以上我们将训练好的模型转换完毕,保存在/output/ResNet50_vd/best_model/mp文件及里

alt

alt

alt

alt

alt

alt

部署

完成以上任务后,接下来会展示如何部署:

部署二(基于Hub的serving服务部署)

部署三(生成exe文件部署)

部署四(Python/C#调用DLL部署,可传参)

如果在操作过程中有任何问题欢迎在评论区提出,或者在PaddleClas-Github提issue

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务