PaddleClas训练自己的图像分类模型(代码与实践)--ZHY
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
整理完成后,还需要划分训练集和测试集
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('完成')
如果出现以上图片问题,可以运行以下代码,找出坏图:
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)
待评估完成,输出log如下
训练时只训练一会儿,只用来做演示,还可以通过调学习率,epoch等来增加准确值
四、模型推理
4.1 分类预测框架简介:
Paddle 的模型保存有多种不同的形式,大体可分为两类:
-
persistable 模型(fluid.save_persistabels保存的模型)一般做为模型的 checkpoint,也就是我们训练保存的模型,可以加载后重新训练。persistable 模型保存的是零散的权重文件,每个文件代表模型中的一个 Variable,这些零散的文件不包含结构信息,需要结合模型的结构一起使用。**
-
inference 模型(fluid.io.save_inference_model保存的模型) 一般是模型训练完成后保存的固化模型,用于预测部署。与 persistable 模型相比,inference 模型会额外保存模型的结构信息,用于配合权重文件构成完整的模型。
PaddlePaddle提供三种方式进行预测推理,接下来介绍如何用预测引擎进行推理:
以上我们将训练好的模型转换完毕,保存在/output/ResNet50_vd/best_model/mp文件及里
部署
完成以上任务后,接下来会展示如何部署:
部署三(生成exe文件部署)
部署四(Python/C#调用DLL部署,可传参)
如果在操作过程中有任何问题欢迎在评论区提出,或者在PaddleClas-Github提issue