Duration: 1 mins
Duration: 10 mins
进行口罩检测模型的开发,需要完成以下准备工作
参考此文档完成ModelArts准备工作。
点此链接 下载口罩检测数据集,将得到mask_detect_datasets.zip,解压得到mask_detect_datasets,其中的train目录是训练集,里面是图片和已经标注好的物体检测xml标签文件,test是测试集,里面有测试图片和视频。
(1)按照下图操作创建一个OBS桶,点击 添加桶 -》输入桶名(确保桶名符合命名规则)-》确定
(2)按照下图上传数据集文件夹,点击 上传-》选择文件夹,选定前面解压的mask_detect_datasets目录 -》确定
至此,准备工作完成。
准备好数据集之后,我们就可以到ModelArts上使用一键模型上线功能开始训练口罩检测模型,训练过程总共分两大步骤:数据集导入和作业参数配置。
点此链接前往ModelArts北京四区域的控制台页面,依次按照下面的步骤进行模型的训练。
点击创建后,ModelArts会自动从OBS中导入已经标注好的数据集,导入时间根据数据集大小而定,可以手动刷新页面查看最新的导入进度,如下图所示,等待进度达到100%。
本步骤为可选步骤,跳过本步不影响整个案例的完成。
本案例提供了已经标注好的数据集用于训练,那么如何上传新的未标注图片加入训练呢?只需要两个步骤:上传图片到OBS、手工标注图片。
上面第(2)步,我们选定了OBS上的"obs://mask-detect-0211/mask_detect_datasets/train/"路径作为数据输入位置,那么未标注图片也要上传到该位置,按照下图中步骤进行图片的上传,注意一次最多上传500张图
等待图片上传完成后,再回到ModelArts,点击上面第(5)步创建的数据集名称,进入到数据集详情页面,如下图所示,点击开始标注
再依次点击 未标注-》同步数据源,等待数据同步完成,将会看到显示的图片
点击图片,将进入数据标注页面,如下图所示,标注工具的详细用法请点此链接查看
所有图片标注完成后,依次点击 返回数据标注预览-》返回数据集预览-》返回数据集列表,此时已完成了新图片的标注工作,您可以再次点击 一键模型上线-》任务创建 开始新的训练任务。
按照下图点击 一键模型上线 -》任务创建
按照下图修改作业名称,选择预置算法,设置算法参数。本案例直接使用默认的预置算法、默认的算法参数即可,
直接使用默认的配置也可以得到较好的模型训练效果。
按照下图选择训练输出位置
按照下图步骤新建一个train_output目录
按照下图选择作业日志路径
按照下图步骤新建一个train_log目录
如果在等待过程中退出了该网页,可以按照下图 数据集-》一键模型上线-》任务历史,重新进入任务页面查看任务详情:
至此,模型训练任务完成。
回顾一下整个训练过程,我们只需要准备标注好的训练数据集,然后使用ModelArts的一键模型上线功能,进行一些参数配置,后台就会自动开始模型训练,在训练完之后,会将模型保存到OBS,并将模型部署成在线服务,整个过程是零代码开发,非常方便。
一键模型上线任务完成之后,将会创建一个在线服务,这个在线服务是将模型进行了部署,并可以通过在线API的形式获取到模型的预测能力。
按照下图找到以"mask_detect_demo"前缀为名的服务名称,这个前缀就是我们创建一键部署任务时取的名字
点击服务名称进入到在线服务详情页面,如下图所示,依次点击预测-》上传-》预测,即可以实现一张图片的预测,由于该在线服务默认是用CPU部署,所以预测较慢一些,使用GPU部署可以加快预测。
为了进一步地测试模型的能力,我们可以使用ModelArts的高级功能——Notebook交互式开发调试工具,来做图片的预测和视频的预测。Notebook简介请点此链接进行查看。
我们需要先创建一个Notebook,按照下图创建
再按照下图进行配置,选择GPU -》P100,下一步,提交,大约两分钟后创建好。
等待Notebook的状态变为“运行中”,然后点击Notebook名称进入到Notebook,进去将看到一个空的工作空间,如下图所示:
我们需要创建一个交互式开发脚本——ipynb脚本,按照下图中步骤,点击右上角的"New",然后选择TensorFlow 1.8。之所以选择TensorFlow1.8是因为前面的一键模型上线步骤中选择的预置算法是使用TensorFlow1.8的AI引擎,如果您选择了其他预置算法,则需要更改为相应的AI引擎,每个预置算法使用的引擎类型,可以点此查看。
这时就已经成功创建了一个空的ipynb脚本,按照下图中步骤,点击左上方的文件名"Untitled",并输入一个与本案例相关的名称,如"mask_detect"。
ipynb的基本用法,请参考下图,您可以手动输入 print('Hello, ModelArts'),然后点击快捷功能键的“Run”按钮或按下Ctrl+Enter键运行。
快捷功能键的作用从左往右,依次是“保存当前脚本”、“新建一个Cell”、“剪切一个Cell”(也可用于删除一个Cell)、“拷贝一个Cell”、“粘贴一个Cell”、“把当前Cell往上移动一步”、“把当前Cell往下移动一步”、“停止当前Cell的执行”、“重启当前脚本的内核”(内核就是运行环境,即右上角的AI引擎)、“切换当前Cell的类型”(支持Code、Markdown等类型)、“打开命令调色板”(基本极少用到)、“将ipynb脚本转换成python脚本”。
好,到目前为止,您已经掌握了ipynb的基本用法,下面我们开始使用代码来测试口罩检测模型。
print('Hello, ModelArts!')
Hello, ModelArts!
本案例的ipynb脚本分6个功能模块:
(1)获取模型id
(2)下载测试数据
(3)部署环境初始化
(4)模型初始化
(5)图片测试
(6)视频测试
下面我们开始进入到脚本执行环节。
进行模型部署之前,我们需要指定部署哪一个模型,按照下图步骤,找到以"mask_detect_demo"前缀为名的服务名称,这个前缀就是我们创建一键模型上线任务时取的名字
点击模型名字,进入到模型详情页面,按照下图找到 id,这就是模型id,复制,填写到下面的test_model_id参数中。
test_model_id = "92b7dfab-ce58-4aba-995c-778eac825d80"
本案例提供了部分测试数据,直接运行下面的Cell即可下载到Notebook
import os
import shutil
import moxing as mox
if not os.path.exists('mask_detect_datasets'):
mox.file.copy('s3://modelarts-labs-bj4/case_zoo/mask_detect/datasets/mask_detect_datasets.zip', './mask_detect_datasets.zip')
os.system("unzip mask_detect_datasets.zip")
os.system("rm mask_detect_datasets.zip")
INFO:root:Using MoXing-v1.14.1-ddfd6c9a INFO:root:Using OBS-Python-SDK-3.1.2
a) 注意,本步骤在打开ipynb后只需要运行一次即可,不需要运行多次
b) 本步骤的运行时长依赖于您的网络状况,请留意当前Cell的运行结果输出,如果看到“Successfully configure tensorflow local inference environment”,则表示环境初始化成功
from modelarts.session import Session
from modelarts.model import Model
from modelarts.config.model_config import ServiceConfig
session = Session()
Model.configure_tf_infer_environ(device_type='GPU') # 如果不是使用 TF 训练的模型,则屏蔽这一行
Configuring tensorflow local inference environment ... Successfully configure tensorflow local inference environment
a) 注意本步骤在打开ipynb后只需要运行一次即可,不需要运行多次
b) 本步骤的运行时长依赖于您的网络状况,请留意当前Cell的运行结果输出,如果看到“Successfully deployed the local service.”,则表示模型初始化成功
model_instance = Model(session, model_id=test_model_id)
configs = [ServiceConfig(model_id=model_instance.model_id, weight="100", specification="local", instance_count=1)]
predictor_instance = model_instance.deploy_predictor(configs=configs)
Service name is service-0224-181528
INFO:obs:Successfully download file mask-detect-0211/train_output/model/checkpoint from OBS to local /home/ma-user/modelarts/model_location/model_id_92b7dfab-ce58-4aba-995c-778eac825d80/1/checkpoint INFO:obs:Successfully download file mask-detect-0211/train_output/model/config.json from OBS to local /home/ma-user/modelarts/model_location/model_id_92b7dfab-ce58-4aba-995c-778eac825d80/1/config.json
model_local_path is /home/ma-user/modelarts/model_location/model_id_92b7dfab-ce58-4aba-995c-778eac825d80/
INFO:obs:Successfully download file mask-detect-0211/train_output/model/customize_service.py from OBS to local /home/ma-user/modelarts/model_location/model_id_92b7dfab-ce58-4aba-995c-778eac825d80/1/customize_service.py INFO:obs:Successfully download file mask-detect-0211/train_output/model/faster_rcnn_resnet50_voc07.config from OBS to local /home/ma-user/modelarts/model_location/model_id_92b7dfab-ce58-4aba-995c-778eac825d80/1/faster_rcnn_resnet50_voc07.config INFO:obs:Successfully download file mask-detect-0211/train_output/model/index from OBS to local /home/ma-user/modelarts/model_location/model_id_92b7dfab-ce58-4aba-995c-778eac825d80/1/index INFO:obs:Successfully download file mask-detect-0211/train_output/model/model.ckpt-6524.data-00000-of-00001 from OBS to local /home/ma-user/modelarts/model_location/model_id_92b7dfab-ce58-4aba-995c-778eac825d80/1/model.ckpt-6524.data-00000-of-00001 INFO:obs:Successfully download file mask-detect-0211/train_output/model/model.ckpt-6524.index from OBS to local /home/ma-user/modelarts/model_location/model_id_92b7dfab-ce58-4aba-995c-778eac825d80/1/model.ckpt-6524.index INFO:obs:Successfully download file mask-detect-0211/train_output/model/model.ckpt-6524.meta from OBS to local /home/ma-user/modelarts/model_location/model_id_92b7dfab-ce58-4aba-995c-778eac825d80/1/model.ckpt-6524.meta INFO:obs:Successfully download file mask-detect-0211/train_output/model/saved_model.pb from OBS to local /home/ma-user/modelarts/model_location/model_id_92b7dfab-ce58-4aba-995c-778eac825d80/1/saved_model.pb INFO:obs:Successfully download file mask-detect-0211/train_output/model/variables/variables.data-00000-of-00001 from OBS to local /home/ma-user/modelarts/model_location/model_id_92b7dfab-ce58-4aba-995c-778eac825d80/1/variables/variables.data-00000-of-00001 INFO:obs:Successfully download file mask-detect-0211/train_output/model/variables/variables.index from OBS to local /home/ma-user/modelarts/model_location/model_id_92b7dfab-ce58-4aba-995c-778eac825d80/1/variables/variables.index
Successfully download file mask-detect-0211/train_output/model from OBS to local /home/ma-user/modelarts/model_location/model_id_92b7dfab-ce58-4aba-995c-778eac825d80/1/ local_service_port is 127.0.0.1:6060 Deploying the local service ... Successfully deployed the local service.
import cv2
import json
import numpy as np
import PIL.Image as pil_Image
def detect_img_and_show(img):
predict_result = predictor_instance.predict(data=img, data_type='images')
predict_result = json.loads(predict_result, encoding='utf8')
classes = predict_result.get('detection_classes', None)
boxes = predict_result.get('detection_boxes', None)
scores = predict_result.get('detection_scores', None)
if classes is not None:
img_copy = np.array(img.convert('RGB')).copy()
for i in range(len(classes)): # 绘制水平框
box = boxes[i]
y1, x1, y2, x2 = [int(float(v)) for v in box]
cv2.rectangle(img_copy, (x1, y1), (x2, y2), (0, 255, 0), thickness=2)
text = classes[i] + '-%s' % str(float(scores[i]) * 100)[:4] + '%'
cv2.putText(img_copy, text, (x1, y1 - 3), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0, 255, 0), 1) # 绘制标签名
return classes, img_copy
开始图片测试
file_path = 'mask_detect_datasets/test/no_1.jpg'
classes, img_show = detect_img_and_show(pil_Image.open(file_path))
print(classes)
pil_Image.fromarray(img_show) # 显示图片
['no_mask']
修改图片路径,换一张图片进行测试
file_path = 'mask_detect_datasets/test/yes_no_5.jpg'
classes, img_show = detect_img_and_show(pil_Image.open(file_path))
print(classes)
pil_Image.fromarray(img_show) # 显示图片
['yes_mask', 'no_mask']
至此,您已经完成了图片的测试,您还可以上传自己的图片进行测试。
下一步,我们将进行视频的测试。
import ipywidgets
from IPython.display import clear_output, Image, display
# 定义视频读取函数
def read_video(input_video_path, video_start_time, video_end_time):
cap = cv2.VideoCapture(input_video_path) # 打开视频
total_frame_num = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) # 获取视频总帧数
fps = cap.get(cv2.CAP_PROP_FPS) # 视频帧率
s_time_split = video_start_time.split(':')
start_time = int(s_time_split[0]) * 3600 + int(s_time_split[1]) * 60 + int(s_time_split[2])
e_time_split = video_end_time.split(':')
end_time = int(e_time_split[0]) * 3600 + int(e_time_split[1]) * 60 + int(e_time_split[2])
start_frame_id = int(start_time * fps) # 设置需要处理的开始帧
end_frame_id = int(end_time * fps) # 设置需要处理的结束帧
if end_frame_id > total_frame_num:
end_frame_id = total_frame_num - 1
cap.set(cv2.CAP_PROP_POS_FRAMES, start_frame_id) # 设置开始帧
return cap, start_frame_id, end_frame_id
input_video_path = 'mask_detect_datasets/test/yes_mask.mp4' # 输入视频所在的路径
video_start_time = '00:00:00' # 设置需要处理的视频开始时间,按照2位数字'时:分:秒'的格式进行填写
video_end_time = '00:00:06' # 设置需要处理的视频结束时间,按照2位数字'时:分:秒'的格式进行填写
cap, start_frame_id, end_frame_id = read_video(input_video_path, video_start_time, video_end_time)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) # 获取视频画面宽度
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 获取视频画面高度
for frame_id in range(start_frame_id + 1, end_frame_id + 1):
clear_output(wait=True)
ret, frame = cap.read()
pil_frame = pil_Image.fromarray(frame[:, :, ::-1])
classes, img_show = detect_img_and_show(pil_frame)
cv2.putText(img_show, 'id: ' + str(frame_id), (30, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) # 画frame_id
img_show = img_show[:, :, ::-1]
display(Image(data=cv2.imencode('.jpg', img_show)[1]))
print('end')
end
按照下图,点击“停止”按钮即可,在线服务停止后可以重新启动。
清除方法:登录OBS管理控制台,找到您在前面步骤新建的桶,比如“mask-detect-0211”,点击桶名进入概览页面,点击左侧导航栏的“对象”,先选中您需要删除的文件夹,点击删除,然后再删除桶。
恭喜您,您已经使用ModelArts完成了口罩检测模型的开发测试任务!