首页 飞桨领航团 帖子详情
AI达人创造营第二课 教你从制作数据集到模型训练搭建 附带全流程详细代码
收藏
快速回复
飞桨领航团 文章AI达人创造营 2613 10
AI达人创造营第二课 教你从制作数据集到模型训练搭建 附带全流程详细代码
收藏
快速回复
飞桨领航团 文章AI达人创造营 2613 10

次课程 主要为后期进行项目部署做了基础,这里整理了本次课程的整体操作流程 ,方便大家做参考,手笔不好,还望各位朋友多多见谅哦

一. 数据集的准备与制作

对于模型的训练我们需要一套标准格式的数据集,最常见的数据集格式为 VOC 和 COCO 

- 数据集来源: 

  • -百度 ---- EasyDada 
  • adancoda 的标准数据
  • COCO数据
  • 阿里云
  • IEEE
  • 推荐 ---- Aistudio官方搜索所需要的数据集 

2. 数据集的制作

- 数据清洗

 如果我们希望自己制作数据集 ,那就要对数据进行清洗

发现并纠正数据文件中可识别的错误,NAN值 ,检查数据一致性,处理无效值和缺失值等

利用有关技术如数理统计、数据挖掘或预定义的清理规则将不合理的数据转化为满足数据质量要求的数据。

你可以根据自己的数据集类型,选择不同的数据清理方案

这里我的建议是

表格预测问题 ,使用函数判定来对数据进行清洗,

图像类数据 提交专业的代码清洗 ,或网上在线清理工具 列入 EasyData的数据清理功能

 

- 标注数据集 ----- 图像类

图像标注是制作图像类图像类数据集重要的一步骤,标注的质量也一定程度上决定着最后模型训练出来精度的高低

常见的图像标注类型有

- 图像分割

- 物体检测

- 图像分类

本次课程我们案例为物体监测 ,这里我以人物标注为例,进行演示操作

 

 

每张被标注的图片都包含一个及一个以上的label标签 --- 也就是我上边标注的person

每个标签代表一类,如果你是多目标的检测,那你进行标注是就会有多种类型的标签,列入 猫狗识别 就有两个标签 cat  dog

  

- 输出指定格式的标准数据集 ------ voc or coco

当我们对原始数据中每个图片进行标注完成 ,我们就阔以开始对数据集进行指定格式的导出

voc 格式 如下 

压缩包内需要包括Images、Annotations两个文件夹,分别包括不重名图片源文件(jpg/png/bmp/jpeg)及与图片具有相同名称的对应标注文件(xml后缀)

coco格式如下

压缩包内需要包括Images、Annotations两个文件夹,分别包括图片源文件(jpg/png/bmp/jpeg)及唯一一个命名为coco_info.json的标注文件

 

如果没有接触过数据标注的同学,建议先使用Easydata里边的自动化在线制作工具

具体会用教程我之后回出贴,或者 fork 

 

二 . 数据集的导入和数据预处理

将我们制作好的数据集 ,导入项目中,并对数据集进行解压和数据预处理

首先进入项目页面,点击修改 , 点击下一步,可根据需求选择,或者导入数据集

 

这里我以我已经导入了行人跟踪·的MOT20官方数据集为例 对数据集进行解释---内容和昨晚课堂中讲的大致一样

 

解压数据集到指定文件夹

!unzip -oq /home/aistudio/data/data43922/dataset.zip -d /home/aistudio/work2/mot20-guan

 

解压后的数据集包括JPEGImages、Annotations两个文件夹,分别包括不重名图片源文件及与图片具有相同名称的对应标注文件(xml后缀)

- 划分数据集 利用shuffle(模块对数据集进行打乱,并将数据集划分为 训练集和测试集 ,并生成具体划分文件

from random import shuffle, seed


imgs = os.listdir(os.path.join(base, 'JPEGImages'))

print('total:', len(imgs))

seed(666)
shuffle(imgs)


CLASSES = ['person'] 


with open('labels.txt', 'w') as f:
    for v in CLASSES:
        f.write(v+'\n')

- 数据预处理

这里使用了图像混合、随机像素变换、随机膨胀、随即裁剪、随机水平翻转等数据增强方法。

from paddlex.det import transforms
train_transforms = transforms.Compose([
    transforms.RandomHorizontalFlip(),
    transforms.Normalize(),
    transforms.ResizeByShort(short_size=800, max_size=1333),
    transforms.Padding(coarsest_stride=32)
])
 
eval_transforms = transforms.Compose([
    transforms.Normalize(),
    transforms.ResizeByShort(short_size=800, max_size=1333),
    transforms.Padding(coarsest_stride=32),
])

 

三 .定义训练集和测试集变量

这一步主要还是将前边划分好的是数据集用变量来定义,方便后边训练使用

base = '/home/aistudio/work2/mot02'

train_dataset = pdx.datasets.VOCDetection(
    data_dir=base,
    file_list=os.path.join(base, 'train_list.txt'),
    label_list='labels.txt',
    transforms=train_transforms,
    shuffle=True)
eval_dataset = pdx.datasets.VOCDetection(
    data_dir=base,
    file_list=os.path.join(base, 'val_list.txt'),
    label_list='labels.txt',
    transforms=eval_transforms)

四.模型训练

我这里使用的是Paddle的yoloV3,训练轮数为60轮 ,时间大概在四个小时,使用的至尊版跑的

可以通过更改轮数来调节时间,具体参数昨晚也没细讲,所以我们都留在下节课,这节课的笔记重点在写模型训练流程

num_classes = len(train_dataset.labels) + 1
print('class num:', num_classes)
model = pdx.det.YOLOv3(
    num_classes=num_classes, 
    backbone='ResNet34'
)
model.train(
    num_epochs=60,
    train_dataset=train_dataset,
    train_batch_size=20,
    eval_dataset=eval_dataset,
    learning_rate=0.001,
    
    #burn_in=1000 ,               ### 学习率控制的参数  
    #max_batches = 10000 ,        ### 迭代次数   ##注意## 这里训练次数一般填10000到50000次
    ### 根据batch_num调整学习率
    #policy = [100,25000,35000],               #调整学习率的policy,有如下policy:CONSTANT, STEP, EXP, POLY, STEPS, SIG, RANDOM 
   #scales=[10,.1,.1] ,      ###学习率变化的比例,累计相乘

    resume_checkpoint=None,
    lr_decay_epochs=[91, 100],
    save_interval_epochs=2,
    log_interval_steps=5,
    save_dir='./YOLOv31',
    use_vdl=True)

 

五.模型评估

训练好玩的模型我们就可以对其进行预测评估

通过 多次调参,

加载不同的模型。

可视化界面观测

来对模型进行评估

 

- 加载model 文件

model = pdx.load_model('../mot03/mot03/mot03-76/best_model')
image_name = '../img/3/210.jpg'
start = time.time()
result = model.predict(image_name, eval_transforms)
print('infer time:{:.6f}s'.format(time.time()-start))
print('detected num:', len(result))
im = cv2.imread(image_name)
font = cv2.FONT_HERSHEY_SIMPLEX
threshold = 0.9
for value in result:
    xmin, ymin, w, h = np.array(value['bbox']).astype(np.int)
    cls = value['category']
    score = value['score']
    if score < threshold:
        continue
    cv2.rectangle(im, (xmin, ymin), (xmin+w, ymin+h), (0, 255, 0), 2)
    cv2.putText(im, '{:s} {:.3f}'.format(cls, score),
                    (xmin, ymin), font, 0.6, (255, 0, 0), thickness=2)
cv2.imwrite('result.jpg', im)
plt.figure(figsize=(15,14))
plt.imshow(im[:, :, [2,1,0]])
plt.show()

 

六 .可视化工具的使用

在 model训练时 ,添加参数 use_vdl=True, 即可在左侧可视化工具中添加相关配置文件, 显示模型训练的可视化效果,达到实时监控的效果。

 

0
收藏
回复
全部评论(10)
时间顺序
小布丁窝窝头
#2 回复于2021-07

求大佬Carry啊

求大佬Carry啊

求大佬Carry啊

0
回复
百花缭乱
#3 回复于2021-07

请问有coco格式的代码吗?

0
回复
认知科学-小龙
#4 回复于2021-07

hi :)

第七行是anaconda

1
回复
魔术师
#5 回复于2021-08
请问有coco格式的代码吗?

有的官方这边有的,不过你想改的哈去我主页看,有转换的代码 ,先把自己的数据集放进去

0
回复
Alchemist_W
#6 回复于2021-08

很不错哦~

0
回复
Alchemist_W
#7 回复于2021-08

大佬

0
回复
魔术师
#8 回复于2021-08
很不错哦~

不不不 ,不才是大佬 ,阔以请教下windows的部署不

0
回复
Alchemist_W
#9 回复于2021-08
不不不 ,不才是大佬 ,阔以请教下windows的部署不

目前我只知道,https://ai.baidu.com/easyedge/app/models  这个Windows下部署  你可以试试  但是可用的模型比较少  然后再就是安卓部署了  在Windows下载Android studio

0
回复
小小小疯叔叔
#10 回复于2021-08

写的太好了

1
回复
SuperAI*
#11 回复于2021-08

写的真不错!

1
回复
在@后输入用户全名并按空格结束,可艾特全站任一用户