开源一个安全帽佩戴检测数据集及预训练模型

本文开源了一个安全帽佩戴检测数据集及预训练模型,该项目已上传至github,点此链接,感觉有帮助的话请点star 。同时简要介绍下实践上如何完成一个端到端的目标检测任务。可以看下效果图:

同时该模型也可以做人头检测,效果如下:

一、背景介绍

最近几年深度学习的发展让很多计算机视觉任务落地成为可能,这些任务渗透到了各行各业,比如工业安全,包含的任务如安全帽佩戴检测、高空坠物检测、异常事故检测(行人跌倒不起等)等等,这里以安全帽检测为例,简单介绍下如何完成一个端到端的任务,包括:

1. 业务场景分析

2. 数据收集、预处理及标注

3.算法设计及训练

4.模型转换及部署

二、业务场景分析

怎样定义“安全帽佩戴检测”这个问题呢?正常来看是需要判断行人头部区域有没有安全帽,比如有些做法是先用目标检测模型如SSD、Yolo系列及改进系列(各种加速版及适用移动端的网络)检测行人区域,然后再设计一个小的分类网络判断区域内是否存在安全帽。这种做法的好处是比较简单:

一来,行人检测算是做的比较多的应用,数据集、算法都比较多;

二来,很多数据都是以监控视频的形式存在,标注的时候标注较粗粒度的区域即可,然后做分类。

不过这种做法的劣势也比较明显:

第一,这种做法并不是一个端到端的预测过程,显然要做到先检测出行人,再用分类网络判断是否存在安全帽;

第二,目标检测和分类的区别,如果用这种粗粒度的标注方法,也就是标注出包含安全帽的较大的区域,而不是紧紧包含安全帽的那块区域,分类效果并不会太好;

第三,严谨来说,对于用户更希望得到的是,定位出佩戴安全帽的目标位置,很多情况安全帽虽然在行人区域内,但这时候并不是出于“佩戴”状态。

基于以上分析,这里用的方法是注重安全帽“佩戴”状态,所以业务层面来看,需要的数据是有“佩戴”安全帽和未“佩戴”安全帽的图片。如下图所示:

                     

其中蓝色的bounding box是未佩戴安全帽的目标,红色的bounding box是佩戴安全帽的目标,这样可以更精准、更直接的确定是否佩戴的状态,不过需要覆盖更多场景的正负类目标数据。

三、数据收集、预处理及标注

确定了业务场景之后,需要手机大量的数据,一般来说包含两大来源,一部分是网络数据,可以通过百度、Google图片爬虫拿到,另一部分是用户场景的视频录像,后一部分相对来说数据量更大,但出于商业因素几乎不会开放。本文开源的安全帽检测数据集(SafetyHelmetWearing-Dataset, SHWD)主要通过爬虫拿到,总共有7581张图像,包含9044个佩戴安全帽的bounding box(正类),以及111514个未佩戴安全帽的bounding box(负类),所有的图像用labelimg标注出目标区域及类别:

其中每个bounding box的标签如下:

“hat”表示佩戴安全帽,“person”表示普通未佩戴的行人头部区域的bounding box。另外本数据集中person标签的数据大多数来源于SCUT-HEAD数据集,用于判断是未佩戴安全帽的人。大致说一下数据集构造的过程:

1.数据爬取

用的爬百度图片和Google图片的方法,百度图片用自己写的访问web页面的方式,通过不同的关键词多线程爬取数据,如果是Google图的话推荐用google-images-download,使用方法不多描述,也是爬取多个不同的关键词。关键词是个很有意思的选项,直接用“安全帽”这样的并不是一个好的选择,更多的时候可以用“建筑工人”等之类的词语;英文注意安全帽既可以是“safety Helmet”也可以是“safety hat”,“hard hat”等等。

2.数据清洗

显然用以上爬取得到的图片包含大量重复的,或者是并不包含ROI的图片,需要过滤掉大量的这些图片,这里介绍自己用到的几个方法:

(1)用已有的行人检测方法过滤掉大部分非ROI图像;

(2)可以使用深度学习模型zoo,比如ImageNet分类预训练好的模型提取特征,判断图像相似度,去除极为相似的图像;

(3)剩余的部分存在重名或者文件大小一致的图像,通常情况下这些都是不同链接下的相同图片,在数量少的情况下可以手动清洗。

3.bounding box标注

用的开源标注工具labelImg,这个没什么多说的,是个体力活,不过一个更为省力的方法是数据回灌,也就是先用标注好的一部分数据训练出一个粗糙的检测模型,精度虽然不高,不过可以拿来定位出大致的目标区域位置,然后进行手动调整bounding box位置,这样省时省力,反复这样可以减少工期。另外标注的过程中会出不少问题比如由于手抖出现图中小圈的情形:

这种情况会导致标注的xml出现bounding box的四个坐标宽或高相等,显然不符合常理,所以需要手动写脚本检查和处理有这种或者其他问题的xml的annotation,比如还有的检测算法不需要什么都没标注的背景图像,可以检测有没有这种“空”类别的数据;甚至是笔误敲错了类别的标签;等等这些都需要手动写自动化或半自动化的脚本来做纠错处理,这样的工具在标注时应该经常用到。也可以看出,一旦标注项目形成规模,规范的自动化流程会节省很多资源。

四.算法设计及训练

基于之前的分析,这里的任务可以看成一个常规的目标检测的情形,目标检测算法发展很快,单阶段的多阶段的,各种anchor及anchor-free的,GIoU,soft-NMS,各种金字塔多尺度预测的等等,不过很多sota的方法很难应用在实际项目中,毕竟速度、功耗、成本等因素均要考虑在内,本文仅用gluoncv自带的model-zoo中的yolo系列做检测,用了原始的darknet53、mobilenet1.0级mobilenet0.25做示例,使用的时候注意调整输入图像的尺寸参数。更多的效果图如下:

             

以及较为密集情况下的人头检测(测试的时候注意短边尺寸的大小):

       

模型的使用清参考github上的项目:点此链接

五.模型转换及部署

如果说前几年深度学习主题追求的是越来越深的模型及越来越准的方法,那么最近两年关注的点是模型的轻量化及部署,这是一个比较大而且比较复杂的话题。即训练好的模型怎样部署在实际的项目中,也就是我们常说的train和inference(或者forward,test,deploy)主要关注以下几点:

(1) 场景和平台选择,是移动端还是服务器端的,CPU还是GPU的,速度和准确率要求等等。有的时候像TensorFlow、PyTorch、MXNet等框架不太适合直接拿来部署,即使用这些框架部署也要结合硬件平台手动做一些配置上的加速,比如Intel CPU可以用MKL或者SSE、AVX等SIMD指令集加速等等。

(2) 移动端有很多大厂的forward框架比如主流的NCNN,上半年阿里开源的MNN,以及比较低调的armNN等等,目前看NCNN用的最多,MNN很有潜力,移动端的GPU支持貌似不是很好,NVIDIA GPU的话主流还是他们自家的TensorRT加速。训练好的模型部署到移动端需要做模型转换,要注意有些框架只支持几个大厂的格式,比如TensorFlow,PyTorch、Caffe、onnx等,话说这里的onnx貌似发展的并不怎么样,感觉caffe本身反而是最时候做中间转换的桥梁,哈哈。。比如MXNet->Caffe->MNN;另外诸多框架的op也尚未完全统一,很多需要自己自定义op实现,还有的方法是做截断,也就是拿支持的那部分网络的op做转换,先计算得到这部分的结果,后接自己实现的剩余部分。

(3) TVM做编译优化,这个看起来比较有意思,很可能是深度学习部署优化的方向之一,针对不同框架、不同语言的前端(目前使用relay)生成中间层IR,然后针对不同的硬件平台做针对性的优化工作。优化的内容包括内存分配、算子融合、GEMM优化等等。之前试过mobilefacenet的TVM版本,差不多能加速30%左右,14ms->9.5ms还是非常给力的,但是目前看默认的优化选项并不是最优的,比如我也试过mxnet gluoncv中的模型还不如不用TVM来得快,更多的时候需要用tvm中auto-tuning方法搜索一个最优的配置,这个过程比较耗时,一个模型可能需要几个小时来实验。

(4) 手动写forward方法,如果做到完全脱离第三方库,需要自己手写forward方法,基本思路还是im2col+GEMM等等,做好内存分配,数据对齐重排,使用指定架构的寄存器提高访存效率、提高cache命中率等等,模型压缩和优化的坑太深,这里不多说了。。。。

六. 总结

本文开源了一个安全帽佩戴检测数据集和预训练模型点此链接,目前来看该数据集还有几个不足之处:

(1)数据量还是少,总共接近一万个bounding box,真实场景覆盖的越多越好,比如至少十万以上;

(2)业务规则设计是否真的好呢?这里有个问题,其实安全帽佩戴的bounding box也包含人脸,因此会存在数据标签重叠的情况,标注普通人头的时候bounding box稍微大一些覆盖到整个头部边缘而非人头的一部分效果会更好;

(3)由于数据量的问题,佩戴其他种类的帽子可能会被误认为是安全帽,需要更多这些“困难”样本会达到更好的效果。

深度学习工程化是一个很复杂的任务,每一环展开都有很多的内容展开,本文只是浅尝辄止~关于目标检测算法的部分以后再补~

原文地址:https://www.cnblogs.com/supersayajin/p/11445401.html

时间: 2024-08-27 22:22:36

开源一个安全帽佩戴检测数据集及预训练模型的相关文章

图像分类任务不用冷启动,PaddlePaddle一口气发布十大预训练模型

PaddlePaddle在不断增加官方支持的模型的同时,也在关注预训练模型的丰富度. 在过去的版本中,我们已经发布了目标检测Faster-RCNN.MobileNet-SSD.PyramidBox和场景文字识别CRNN-CTC.OCR Attention共计5个预训练模型. 近期,在图像分类领域我们一口气发布了四个系列共十个预训练模型,丰富扩充了预训练模型库,助力用户提高构建模型的效率,大大减轻"炼丹"的烦恼. 主要包括: MobileNet v1 针对亟需在移动端应用深度学习技术的需

预训练模型:XLNet 和他的先辈们

预训练模型 在CV中,预训练模型如ImagNet取得很大的成功,而在NLP中之前一直没有一个可以承担此角色的模型,目前,预训练模型如雨后春笋,是当今NLP领域最热的研究领域之一. 预训练模型属于迁移学习,即在某一任务上训练的模型,经过微调(finetune)可以应用到其它任务上. 在NLP领域,最早的预训练模型可以说是word2vec, Mikolov应用语言模型进行训练,产生的词向量(word embeddings)可以用于其他任务上,这样的词向量在目标任务上,可以固定不变,也可以随着模型训练

Caffe学习3-使用预训练模型finetuning

该篇陈述了在采用imagenet大数据集合上使用caffenet预训练得到caffemodel,然后应用该caffemodel进一步fintuning图像风格数据库style.下面为主要步骤: #采用别人的预训练模型,在自己的数据库上进行微调(fine-tunning) #fine-tune是应用别人在大数据集合上训练到一定程度的caffemodel,在这进行微调.这比随机化参数要好,因为该模型可能已经接近最优! #可以省时间,省资源.也可以克服没有大数据的困扰 #这里采用imagenet数据集

[CV]人脸识别检测数据集

[CV]人脸识别检测数据集 做了一段时间的人脸识别和检测,在这里列一下用过的数据集.基本上,大家近期也都是在这几个数据集上检测自己的算法.网上这方面的总结虽然不少,但是一则有些是多年前的数据,或是规模太小或是链接已经失效,再则是数据集的测试协议定义不明,不尽适合用来和其它方法做比较. 1. Labeled Faces in the Wild:做人脸识别,准确的说是人脸验证(Face Verification),UMass的LFW估计是最近被用的最多的了,LFW采用的测试协议也已经被几个新的数据集

开源一个常用的小软件的源码——系统数据库服务管理软件

郝喜路  2014年7月27日22:28:34 GitHub地址:https://github.com/haoxilu/ServiceManager    希望编程爱好者 更改添加...   开发环境:Visual Studio 2012   .Net Framework 4.0 大家在软件开发过程中,是离不开 数据库的,不管你用什么数据库,都会在系统服务上注册一个,当你安装了太多的数据库,是否有感到极大的拖掉了开机时间,影响了计算机的性能.(仅限windows系统).这时有的朋友可能会想到手动

构建了一个简单的时间序列数据集来说明索引功能

数据索引和选取 pandas对象中的轴标签信息有很多作用: 使用已知指示来确定数据(即提供元数据),这对于分析.可视化以及交互式控制台的显示都十分重要 使能够实现自动和显式的数据对齐 允许直观地获取和设置数据集的子集 在这一部分,我们将致力于最终的目的:即如何切片,切丁以及一般地获取和设置pandas对象的子集.文章将主要集中在Series和DataFrame上,因为它们潜力很大.希望未来在高维数据结构(包括panel)上投入更多的精力,尤其是在基于标签的高级索引方面. 提示:Python和bu

肤色检测&人脸检测数据集链接大集合(持续更新中...)

在国内计算机视觉领域,人体器官的识别和跟踪,如人脸识别跟踪.人手识别跟踪等还是一个热门领域.然而,国内的研究者大多不如国外的研究者那么勤快,不喜欢把自己的测试的数据集(dataset)公开给开发者用,导致大多数开发者只能到国外网站去找.这里为方便大家找数据集,我把一些我自己用的数据集连接放到网上,并附上一些简介,如果链接失效,可以私信我要. 1.   来自牛津大学Visual Geometry Group的Hand Dataset:http://www.robots.ox.ac.uk/~vgg/

tensorflow利用预训练模型进行目标检测(一):预训练模型的使用

一.运行样例 官网链接:https://github.com/tensorflow/models/blob/master/research/object_detection/object_detection_tutorial.ipynb  但是一直有问题,没有运行起来,所以先使用一个别人写好的代码 上一个在ubuntu下可用的代码链接:https://gitee.com/bubbleit/JianDanWuTiShiBie  使用python2运行,python3可能会有问题 该代码由https

开源一个golang小程序商城后台(moshopserver)

开源一个golang小程序商城后台(moshopserver) golang和c/c++比起来是一门新的语言,一直想学,网上搜集了一些资料,有些人说很容易上手,确实是这样,和C/C++比起来,少了很多乱七八糟的语法.学一门新的语言,最好的方法就是动手写一些东西,最近小程序也比较火,也想学一下,网络上搜索的一些开源项目,基本上没有golang实现的,大部分都是nodejs和java写的,那么我就来实现一个golang版的吧,一石二鸟. 开发小程序前后端都需要开发,自己的前端经验很少,搜索了一些开源