实战演示
1. ModelScope图像检测模型介绍
上图为ModelScope主页截图,可以从最上方的检测专题进入,也可以从左边的计算机视觉、视觉检测跟踪tag进入。比如点击垂类目标检测,将会显示人体口罩、香烟等垂偏垂直行业的检测模型。
ModelScope上的泛检测类的模型可以归类为图片、视频及其他。
图像检测包括通用的目标检测、人脸相关检测。通用检测提供了实时的目标检测,也有DINO高精度目标检测以及自研的DAMOYOLO模型。垂类目标检测包括口罩、安全帽、无人机等垂直行业的模型。
视频检测提供了视频目标检测、视频目标跟踪、单目标/多目标以及视频动作检测等模型,也有更细化的方向比如3D目标检测、Open World目标检测、长尾/少样本目标检测、显著性、伪装目标检测等。本文实战主要基于实时目标检测、实时安全帽检测两个模型。
2. 创空间实战(安全帽检测)
本示例将演示如何基于ModelScope的安全帽检测模型,搭建创空间的应用。主要包括4个步骤,分别是创建创空间、准备需要的文件(启动脚本、说明文档)、上传文件,发布创空间。关于创空间的搭建,文档中心提供了非常详细的介绍。
在ModelScope页面右上角点击创建创空间。
填写相关信息,英文名创建后不可更改,license可以根据需要进行修改。填入空间描述,接入SDK目前支持3种,选择默认的Gradio即可。
需要用到的文件包括app.py的启动脚本、一张示例图片以及readme文件。
app.py会进行模块的导入,导入Gradio模块,Gradio是Python包,可以用于搭建机器学习模型的web应用。声明安全帽的检测器,该检测器基于ModelScope上已有的安全帽检测模型构建。
下面是可视化的函数,输入图片和检测结果,最后返回可视化之后的图片。safaty_helmet_detect函数是主要的函数,串起了整个流程,图片作为输入,用检测器检测得到结果,对图片以及检测结果做可视化,得到输出图片并返回。
最后,用Gradio构建interface。title、description与examples都可以进行设置。构建好interface之后,通过launch()函数启动。
readme文档的前半部分是YAML,后半部分是Markdown,内容可以根据自己的需要填写。YAML主要进行格式的控制,可以设置domain、models、license以及入参、启动脚本等。
创空间创建完毕后,页面会显示基础介绍。
为了方便展示,本次实战直接使用网页端进行操作。此处默认已经有readme的文件,复制提前编写好的readme的内容粘贴至默认readme文件中,添加app.py文件,上传示例图片。
回到ModelScope,添加app.py文件。
此时创空间位未发布状态,需要在设置里点击上线创空间。
发布后的页面如上图所示。
上传图片后即可进行安全帽检测,输出结果如右图。
3. 检测模型实战(安全帽检测)
模型的实战或者实操,经常会提到推理、评估以及训练三个词。
推理是指:有了模型后,对一张图片做前向的推理,得到输出结果,再通过结果判断模型的效果如何,主要为定性分析。
评估是指:模型在已有数据集上的精度水平如何,主要为定量分析。
训练是指:如果已有模型的精度无法达到要求或检测的类别不符合要求,需要做精度提升或类别扩充,对模型进行训练和微调。
模型的实操一般可以分为下面三类:
第一类:无代码。比如OpenVI自学习平台,在网页上完成图片的标注到模型训练再到最终的部署,用鼠标即可完成,全程无代码。
第二类:低代码。比如ModelScope,对底层代码做了封装,向上以模块的形式透出,只需少量的代码便可以进行模型的训练等。
第三类:高代码。比如mmdetection等,代码的开发量较大。
上图中从左到右代码能力要求逐渐递增,而模型的丰富程度也会逐渐递增,灵活性更大。
本示例主要演示如何将COCO上的通用检测模型(不包含安全帽检测模型)通过训练得到安全帽检测模型。
本示例主要基于实时目标检测通用领域的检测模型,大家可以通过名字或modelID进行搜索得到模型的model卡,下方展示了模型的详细介绍、适用范围以、推理示例代码、训练微调的示例代码。
点击右上角Notebook快速开发,选择GPU环境。
先进行目录上的准备,操作与本地基本相似。创建新的目录tutorial(名字可以根据需要任意取),在该目录下创建Notebook的脚本,命名为tutorial(名字可以根据需要任意取,建议用英文命名)。
主要代码如上图所示。首先要做模块的引入,除了内置的模块,基本都为ModelScope的模块。Notebook已经预置了ModelScope等包,如果在本地,则需要安装ModelScope。
复制模块引入的代码,运行代码,完成模块的导入。复制数据集下载相关代码,运行代码,完成数据集加载。
在ModelScope页面的数据集tab,搜索数据集的名称即可找到对应的数据集。
关于如何创建新的数据集,可以在文档中心找到详细的参考。
接下来还需要进行训练的超参设置以及开启模型训练。
modelID是modelcard上的模型ID,work_dir是本次训练的工作目录。batchsize为8代表一次可以训练8张图片,该参数会影响训练的速度,数值大小需要根据GPU的显存决定。total_epochs是总的迭代轮次,本次示例为基于通用检测到安全帽检测的微调,因此total_epoch设为15足够。
参数设置完成之后,构建cfg_options字典,键值为xx.xx的嵌套方式,比如tarin.max_epochs。
模型文件里,每一个模型都有一个configuration.json的文件,是默认的配置文件。构建字典主要作用为对默认的JSON文件进行修改。
开启训练的代码包含构建字典的入参,包括modelID、构建好的train与eval的数据集、工作目录等。然后用build_trainer创建trainer,下载预训练模型,最后调用trainer.train开启训练。
训练完成后,work_dir工作目录下会生成上图文件,包括日志文件、pth模型以及模型的输出。output文件可以用于模型的推理,内容如上图中下方图片所示。
复制训练相关代码并执行。
首先会进行模型的下载,显示默认的配置文件。
训练结束后显示mAP为0.61,IoU为0.5的时候mAP为0.91,基本符合预期。
如果训练完后需要对模型做进一步评估,可以使用trainer的eval接口。
复制相关代码,运行,即可对验证集单独做一次评估,结果显示mAP的数值与上面一致。
如果要利用已经训好的模型再对图片进行推理,需要使用推理以及可视化部分代码。
复制推理相关代码,注意,此处需要进行修改。model处需要使用output的目录做路径的拼接。input图片可以是URL,也可以使用本地图片的路径。上传一张准备好的安全帽图片,设置其路径。运行,即可输出检测结果。
如果想要实现可视化,则复制可视化相关代码,对代码中的图片名称进行修改,运行代码,即可显示上图结果。
至此,我们完成了利用安全帽的数据,从通用检测模型训练得到安全帽检测模型,并用模型进行评估和推理。