【华为云技术分享】从软件开发到 AI 领域工程师:模型训练篇 (4)

训练过程中会有一个 tensor 对不上的错误,需要修改 model_data/model.py 这个代码中的 140-141 行,如下所示:

box_xy = (K.sigmoid(feats[..., :2]) + grid) / K.cast(grid_shape[..., ::-1], K.dtype(feats)) box_wh = K.exp(feats[..., 2:4]) * anchors_tensor / K.cast(input_shape[..., ::-1], K.dtype(feats))

•可视化类:

为了直观判断模型效果,增加了一个在图片上直接标注的可视化代码,也就是在图片上打印输出结果(yes_mask 或 no_mask),代码如下所示:

#!/usr/bin/env python # coding: utf- img_path = "D:/Code/mask_detection/data/test" save_path = "D:/Code/mask_detection/data/test_result/" import matplotlib matplotlib.use(\'Agg\') import matplotlib.pyplot as plt import matplotlib.patches as patches import matplotlib.image as mpimg import random import json # 推理输出路径 with open(\'D:/Code/mask_detection/keras-YOLOv3-mobilenet-master/annotation_YOLOv3.json\') as json_file: data = json.load(json_file) imgs = list(data.keys()) def parse_json(json): bbox = [] for item in json[\'annotations\']: name = item[\'label\'] xmin = item[\'x\'] ymin = item[\'y\'] xmax = item[\'x\']+item[\'width\'] ymax = item[\'y\']+item[\'height\'] bbox_i = [name, xmin, ymin, xmax, ymax] bbox.append(bbox_i) return bbox def visualize_bbox(image, bbox, name): fig, ax = plt.subplots() plt.imshow(image) colors = dict()#指定标注某个对象的边框的颜色 for bbox_i in bbox: cls_name = bbox_i[0] #得到 object 的 name if cls_name not in colors: colors[cls_name] = (random.random(), random.random(), random.random()) #随机生成标注 name 为 cls_name 的 object 的边框颜色 xmin = bbox_i[1] ymin = bbox_i[2] xmax = bbox_i[3] ymax = bbox_i[4] #指明对应位置和大小的边框 rect = patches.Rectangle(xy=(xmin, ymin), width=xmax-xmin, height=ymax-ymin, edgecolor=colors[cls_name],facecolor=\'None\',linewidth=3.5) plt.text(xmin, ymin-2, \'{:s}\'.format(cls_name), bbox=dict(facecolor=colors[cls_name], alpha=0.5)) ax.add_patch(rect) plt.axis(\'off\') plt.savefig(save_path+\'{}_gt.png\'.format(name)) #将该图片保存下来 plt.close() for item in imgs: img = mpimg.imread(img_path+item) bbox = parse_json(data[item]) visualize_bbox(img, bbox, item.split(\'.\')[0])

•上云准备类:

开源代码写的比较随意,直接就是在训练代码 trian_Mobilenet.py 代码中一开头指定所有的参数。华为云中训练作业是需要指定 OBS 的输入路径和输出路径的,最好使用 argparse 的形式将路径参数传进去。其他参数可以按照自己需求做增加,修改样例如下:

import argparse parser = argparse.ArgumentParser(description="training a maskmodel in modelarts") # 训练输出路径 parser.add_argument("--train_url", default=\'logs/maskMobilenet/003_Mobilenet_finetune/\', type=str) # 数据输入路径 parser.add_argument("--data_url", default="D:/code/mask_detection/data/MASK_MERGE/", type=str) # GPU 数量 parser.add_argument("--num_gpus", default=0, type=int) args = parser.parse_args()

开源代码中,数据处理的部分是将 xml 转换成 yolo 读的 txt 文档,这样导致数据输入需要有一个写入到 txt 文件,然后训练工程读取这个 txt 文件和图片的过程。上云后,这种流程不太方便,需要将数据处理,数据转换和训练代码打通。这里我使用缓存将数据直接传到训练代码中,这样改起来比较方便,但是当数据量较大的时候并不科学,有兴趣的人可以自己修改。

迁移公有云

我使用某厂商公有云的 AI 训练平台,用的是 OBS 桶上传已经调试好的代码(建议大家体验 Notebook 方式,在线编程、编译),如下图所示:

【华为云技术分享】从软件开发到 AI 领域工程师:模型训练篇

【华为云技术分享】从软件开发到 AI 领域工程师:模型训练篇

接着启动 Notebook,不过我没有用 jupyter 方式写代码,而是采用同步 OBS 桶的资源,通过 Notebook 启动一个 GPU 镜像:

【华为云技术分享】从软件开发到 AI 领域工程师:模型训练篇

创建一个 Notebook 环境:

【华为云技术分享】从软件开发到 AI 领域工程师:模型训练篇

确认计算资源规格:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgwffz.html