paddlehub调用PyramidBox小经验
gbsrept 发布于2020-04 浏览:3057 回复:4
1
收藏
最后编辑于2022-04

因为要做人数识别实验,关注了一下PyramidBox。PyramidBox模型是百度自研的人脸检测模型,2018年3月份在WIDER Face数据集上取得第一名。是一种语境辅助的单次人脸检测新方法,能够解决在不受控制的环境中检测小的、模糊的及部分遮挡的人脸时的问题。它基于SSD的单阶段人脸检测器,利用上下文信息解决困难人脸的检测问题。如下图所示,PyramidBox在六个尺度的特征图上进行不同层级的预测。该工作主要包括以下模块:LFPN、Pyramid Anchors、CPM、Data-anchor-sampling。具体可以参考该方法对应的论文 https://arxiv.org/pdf/1803.07737.pdf  。

使用pyramidBox,不需要从头做起,paddleHub提供了很多预训练的模型,如果需求近似,甚至是开箱即用。在我准备进行的数人头的这个情况下,完全可以利用pyramidBox对不完整人脸的优异识别能力,估算人数下限。由于运行环境比较宽松,我使用了 pyramidbox_lite_server( https://www.paddlepaddle.org.cn/hubdetail?name=pyramidbox_lite_server&en_cate )和pyramidbox_face_detection( https://www.paddlepaddle.org.cn/hubdetail?name=pyramidbox_face_detection&en_category=ObjectDetection )这两个预训练模型。

使用的方法很简单,首先要安装paddleHub:

pip install paddlehub

然后根据选用的预训练模型安装:

hub install pyramidbox_lite_server==1.1.1
hub install pyramidbox_face_detection==1.0.0

之后就可以加载hub

import paddlehub as hub

加载模型和使用的方法略有不同,先看pyramidbox_lite_server:

import cv2
module = hub.Module(name="pyramidbox_lite_server")
test_img_path = "/PATH/image.jpg"
input_dict = {"data": [cv2.imread(test_img_path)]}
results = module.face_detection(data=input_dict)
print(len(results[0]['data']))

注意,input_dict的data是一个list,每一项都是读入的图片二进制数据。实测list包含500张图片毫无压力,ai studio的cpu环境不到20分钟出结果。

但是pyramidbox_face_detection的使用就要复杂一些了:

module = hub.Module(name="pyramidbox_face_detection")
test_img_path = "PATH/TO/IMAGE"
input_dict = {"image": [test_img_path]}
results = module.face_detection(data=input_dict)
print(len(result['data']))

这里要用image这个list,传进一组图片的路径。实验发现,在ai studio的cpu环境100张是会报内存不足的,最后每批50通过。不仅内存消耗大得多,pyramidbox_face_detection的速度也明显变慢,但是带来的好处是准确识别的数量大幅度提高。为了提高pyramidbox_face_detection的速度,我做了一个小改动——在运行时发现,会自动生成一个文件夹,并将识别的结果标注好之后生成图片存放进去。这就带来了一定的多余运算和io消耗,但是没有在文档中找到关闭这一过程的方法。因此只好用点非常规手段了。

由于hub会自己管理下载的模型和代码,因此要想关掉标注图输出,就得先找到代码存放位置。我把data参数设为空字典,引发了异常,这样就找到了py文件,然后在终端用vi打开,将153行的“self.visualization = True”改为“self.visualization = False”,:wq保存后再运行,就不会浪费资源在标注图上了。

最后上传验证,results.pyramidbox_lite_server的得分(错误率)是0.69937分,results.pyramidbox_face_detection的得分(错误率)是0.45743分。因为这两个模型是以人脸为标准计数的,所以比数进去只露后脑勺和腿的要低,但是,考虑到去年的飞桨常规赛第一的分数是0.59206,就知道这两个预训练模型有多厉害了。

 

收藏
点赞
1
个赞
共4条回复 最后由用户已被禁言回复于2022-04
#5189******30回复于2020-04

学习地图里的任务完成也能给100小时。

0
#4189******30回复于2020-04

参加一些课程,尤其是比赛,老师会发算力卡。

0
#3189******30回复于2020-04

预训练模型真是强啊。没想到还能在cpu上跑。

0
#2skywalk163回复于2020-04

感谢分享!

0
TOP
切换版块