基于华为modelarts快速实现安全帽检测任务
一、什么是MODELARTS
ModelArts是华为推出的面向开发者的一站式AI开发平台,为机器学习与深度学习提供海量数据预处理及半自动化标注、大规模分布式Training、自动化模型生成,及端-边-云模型按需部署能力,帮助用户快速创建和部署模型,管理全周期AI工作流。
二、任务分析
安全帽检测是目标检测(Object detection)任务,简单来说,目标检测是识别图片中有哪些物体以及物体的位置(坐标位置),目标检测的位置表示形式有两种:
1.极坐标表示:(xmin, ymin, xmax, ymax)
- xmin:x最小坐标
- ymin:y最小坐标
- xmax:x最大坐标
- ymax:y最大坐标
2.中心点坐标:(x_center, y_center, w, h)
- x_center:中心点x坐标
- y_center:中心点y坐标
- w:检测框宽度
- h:检测框高度
三、数据准备
本项目使用开源的安全帽检测数据集SafetyHelmetWearing-Dataset,SHWD主要通过爬虫拿到,总共有7581张图像,包含9044个佩戴安全帽的bounding box(正类),以及111514个未佩戴安全帽的bounding box(负类),所有的图像用labelimg标注出目标区域及类别。其中每个bounding box的标签:“hat”表示佩戴安全帽,“person”表示普通未佩戴的行人头部区域的bounding box。标注使用xml形式。
四、上传数据至OBS
OBS服务是对象存储服务,我们要在modelarts上使用我们的数据集,需要先把数据集上传到OBS上,就跟我们要训练网络先要把自己的数据下载到自己的硬盘上一样,OBS可以简单的理解成为类似于网盘。网⻚上使用OBS有一定的限制,每次只能上传一百个对象,要像批量上传大量文件要使用工具,这里介绍下我的环境是MacOS。使用的工具是obsutil,windows和linux使用的工具都很简单,所以这里就以MacOS举例。
获取密钥,在华为云点击账号,选择我的凭证:
点击“新增访问秘钥”:
获取邮箱验证码,输入验证码,点击确定即可获得一套秘钥(CSV文件):
打开下载的credentials.csv文件,可看到如下内容:
其中Access Key Id和Secret Access Key的两串要记住。打开一个终端,cd到刚才解压文件夹的目录(cd 之后把那个解压出来的文件夹拖进来即可):
输入:./obsutil config -i=ak -k=sk -e=endpoint
就会创建出一个配置文件(是个隐藏文件),这个文件会在自己的名字下面。cd到自己名字的目录下,使用ls –a查看所有文件:
会看到一个.obsutilconfig文件,使用vim打开它:vim .obsutilconfig:
按i进入编辑模型,在前三行分别输入之前文档中标红的三个串‘北京-1的节点’、‘Access KeyId’、‘Secret Access Key’。
之后按esc,再按wq,即可退出编辑。
退出编辑之后,回到刚才那个解压之后的目录:
输入:./obsutil ls -s
如果返回结果中包含“Bucket number is:”,表明配置正确。
如果返回结果中包含“Http status [403]”,表明访问密钥配置有误。
如果返回结果中包含“A connection attempt failed”,表明无法连接OBS服务,请检查网络环境是否正常。
在已登录的状态下,打开‘服务列表’(不一定从左边打开,从上面也可以),选择‘对象存储服务OBS’:
进入下面的界面:
找到自己要操作的桶,如果没有则自己创建。下图是我进入到我自己设置的桶中:
回到刚才打开的终端,也就是在obsutil解压目录的终端,输入:./obsutil cp /#{本地数据文件目录}obs://#{桶目录} -f –r
看到如下效果则是在上传了:
等待上传完成则可以看到obs目录中有刚刚上传的文件了。
五、创建数据集
这里需要介绍一下,当我们在使用平台的时候,使用的流程和我们自己做的流程并不会差别太大,区别比较大的是平台上的流程是真正的流程,我们做的每一步都对应这个工作流中的一个步骤,所以我们刚才虽然上传数据到OBS当中,但是要在流程中使用需要创建数据集。
进入modelarts的控制台(搜索框搜索modelarts,进入控制台),并在左侧目录中选择数据管理>>数据集。
点击“创建数据集“进入到新建数据集⻚面:
- 名称:创建的数据集名称数据集输入位置:OBS中上传的数据位置,这里上传数据的label文件就可以实现自动匹配成标记后的数据文件;
- 数据集输出位置:这是标记输出的位置,也是OBS路径;
- modelarts支持在线标记标注场景及标注类型:选择要解决问题的场景这里我们实现安全帽检测,是个物体检测问题,填写效果如下:
创建之后可以看到创建的数据集记录,如果上传了label文件,新建之后等一点时间之后可以看到数据已经进行了标注。
这里可以继续补充或者标记我们的数据集,如果数据集已经准备好了,点击”发布“即可在后面的流程中使用该数据集:
六、创建训练任务
准备好了训练数据,可以进行训练了,选择“训练管理”>>“训练作业”:
点击”创建“进入新建训练任务⻚面,计费模式:目前只有一种,按需计费,也是平台常⻅的计费方式。
名称:训练任务名称
算法来源:训练任务选择的算法来源,算法来源有三种:
- 预制算法:预制算法是modelarts上开箱即用的算法,只需要调整超参数即可
- 常用框架:选择AI引擎(框架),上传相应AI引擎及版本的代码进行训练
- 自定义:上传自定义环境docker容器,再上传符合自己环境的代码进行训练
数据来源:选择已经发布的数据集或者从存储位置选择数据集训练输出位置:训练好的模型权重文件输出位置
超参数:参照文档
- lr 学习率
- split_spec 训练集和验证集切分比例
- num_gpus 使用gpu数量
- batch_size 每次迭代训练的图片数量(单卡)
- learning_rate_strategy 训练的学习率策略,取值范围0~1,例如可设置为0.001evaluate_every_n_epochs 每训练N个epoch做一次验证
- save_interval_secs 保存模型的频率(单位:s)
- max_epoches 最大训练的epoch数
- log_every_n_steps 每训练N步打印一次日志,默认为10步打印一次
- save_summaries_steps 每5步保存一次summary信息,包括模型梯度更新值,以及训练参数weight_decay 模型权重衰减的L2系数
- optimizer优化器dymomentumw、sgd、adam、momentum
- momentum 优化器参数momentum
点击“下一步”>>“提交”,可以看到新建的任务已经在初始化了,初始化之后进行训练,经过一段时间之后训练结束OBS的路径中就有模型的权重文件了。这个等待的时间跟我们选择的模型已经设置的epoch有关。
七、导入模型
等训练任务结束之后,就可以进行导入模型了,导入模型是在平台上产出一个模型对象。
点击“模型管理”>>“模型”
点击“导入”,进入导入模型界面:
- 名称:模型名称
- 版本:模型版本号
- 元模型来源:选择预制算法的可以选择从训练中导入,选择对应的训练。或者是从OBS中选择,选择模 型的输出权重文件目录进行导入。从模板中选择是在训练过程中选择AI引擎上传自己代码的导入模型方 式,训练中选择自定义的情况,要选择“从容器镜像中选择”,选择自己定义的容器再选择模型进行导入。
- 运行时依赖:这部分是加入运行时需要的依赖环境,在使用模型的时候会用到。
点击立即创建,模型经过导入及构建之后可以使用:
八、测试
在菜单中选择“开发环境”>>“NoteBook”,这里面是创建执行环境的,也是使用容器技术构建需要的环境,使用方法类似于jupyter notebook。
点击“创建”进入创建执行环境⻚面:
- 计算方式:目前只有一种,按需计费
- 名称:创建的执行环境名称
- 自动停止:自动停止时间,由于是按需计费,防止用户出现忘记停止的情况,设置自动停止环境。
选择好配置资源后,点击下一步,创建的环境就在启动中了,启动时间大概1-2mins。
当启动结束后,点击“打开”进入到执行环境中:
进入开发环境,可以看到跟我们使用的jupyter notebook非常相似,这里面有几个地方不太一样:
- Sync OBS:把选择的内容同步到OBS当中,创建的时候选择的可能是云盘,这时候使用OBS的内容的时候需要把代码同步到OBS当中。
- New:新建不再是新建Python环境,而是选择AI引擎,比如我刚才训练的是Faster-RCNN-resnet50- V1是TensorFlow1.8环境的,所以测试的时候选择TF1.8的环境即可。
- upload:上传代码或文件 下图是我上传了我的代码及文件的图片,代码我上传上来,需要的直接放上去运行吧。
检测结果如下,选用的Faster-RCNN-resnet50-v1,默认参数4块卡训练了8.5小时,效果还不错:
- 点赞
- 收藏
- 关注作者
评论(0)