软银机器人实验室(SoftBank Robotics Labs)的公共SBR项目(包括实验代码,示例程序库等)全部托管在GitHub上,供任何为Pepper和NAO开发的开发者们使用。
Pepper机器人新技能,检测人们是否戴了口罩
我们可以定制丰富的个性化Pepper迎宾项目,在疫情期间,只有人们戴着口罩,Pepper才能“高兴地”欢迎您。Pepper平板电脑上运行的这个函数库基于AIZoo的FaceMaskDetection,使用了相同的模型,并使用了OpenCV库。
该项目包含一个示例项目。您可以拷贝存储库,在Android Studio中将其打开,然后直接在Pepper上运行它。这个示例应用程序只跟踪检测人脸信息,并在平板电脑上显示他们是否戴口罩。要注意的是,由于要使用到真机的视觉摄像头等相关传感器部件,此应用程序无法在模拟机器人上运行。
您可以使用Jitpack将库添加为gradle依赖项。
步骤1)
将JitPack储存库添加到您的构建文件中:
将它添加到储存库末尾的root build.gradle中:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
步骤2)
将人脸识别库上的依赖项添加到您的应用程序build.gradle的“依赖项”部分中:
dependencies {
implementation 'com.github.softbankrobotics-labs:pepper-mask-recognition:master-SNAPSHOT'
}
该库依赖于OpenCV。您有两个选择可将OpenCV库添加到项目中:
1.包含OpenCV本机库
2.使用OpenCV外部APK
使用这种方法,您可以将库直接添加到apk中,这种方法的缺点是您的apk会变大。
将jniLibs文件夹app/src/main/jniLibs(在示例应用程序中)复制到您自己的src/main文件夹中。Android Studio会自动查找这些库并将其包含到您的apk中。
注意的是,示例应用程序仅包含针对“ armeabi-v7a”架构编译的库,该架构是Pepper平板电脑使用的库。
您可以在此处获得这些库的更多版本。
使用这种方法,Opencv库不会与您的apk一起安装,您需要在机器人上单独安装它们。
要安装OpenCV Manager APK,请使用adb连接到您的机器人ip(例如10.0.204.180),然后安装OpenCV APK文件夹中的软件包:
$ adb connect 10.0.204.180:5555
$ adb install opencv-apk/OpenCV_3.4.7-dev_Manager_3.47_armeabi-v7a.apk
您可以在示例项目中查看如何使用库的示例
示例项目使用Pepper的tablet camera获取图像(因为帧速率稍好),但您可以通过在MainActivity的顶部将useTopCamera设置为True来进行更改。
在Activity类中,您需要在onCreate方法中加载OpenCV才能使用该库。为此,调用OpenCVUtils.loadOpenCV(this):
class MyActivity : AppCompatActivity(), RobotLifecycleCallbacks() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
OpenCVUtils.loadOpenCV(this)
//...
}
检测需要两个部分:
·摄像头,用于检索图像;该库为顶部或底部摄像机提供了一个
·检测器方法,用于处理图像并返回是否带了口罩;该库提供了一个使用OpenCV和AIZoo模型的检测器方法,但是您可以基于另一种技术来实现自己的检测器方法。
要构建检测器方法并开始检测,请执行以下操作:
val detector = AizooFaceMaskDetector(this)
val capturer = BottomCameraCapturer(this, this)
val detection = FaceMaskDetection(detector, capturer)detection.start { faces ->
// Handle faces here
}
每次处理图像时,都会使用检测到的(可能为空)人脸列表来调用此回调。
回调将是的列表DetectedFace,针对处理的每个图像调用
faces.forEach {
when {
(it.confidence < 0.5) && it.hasMask -> {
// Process "someone has a mask"
}
(it.confidence < 0.5) && !it.hasMask -> {
// Process "someone Doesn't have a mask"
}
}
}
除了hasMask和confidence之外,还可以获得人脸的边界框和相应的图片(它将是一个比实际边界框稍大的正方形,以便更好地显示)。
请注意,此API的工作方式与内置的humansAround检测不完全相同,
因为每次检测都会返回一个新的DetectedFace对象,因此您无法将这些项与以前收到的列表进行比较。
这意味着一旦戴着口罩的人在Pepper面前,就会经常调用此回调-如果您的目标是让Pepper做出一个自定义的欢迎,您可以一个添加计时器以避免频繁给予或等待在不让任何人见面之前(或者更好的是,例如在一秒钟之内不与人见面),然后再让Pepper再次表示欢迎。
Pepper的平板电脑相机具有帧率略高的优点,但并不总是与Pepper所看的角度一致。
在使用它之前,需要确保您具有执行此操作的权限,如链接处所述。获得权限后,您可以创建BottomCameraCapturer并开始检测:
val capturer = BottomCameraCapturer(this, this)
val detection = FaceMaskDetection(detector, capturer)
detection.start { faces ->
// Handle faces here
}
头部相机的优点是可以跟踪人类Pepper看到的东西,并以更好的角度观看它们,但是帧率却不太好。要注意的是,头部跟踪依赖于Pepper内置的人类意识来检测到人类,这对于戴着口罩的人来说不会那么容易。
要使用头部的相机,请在onRobotFocusGained中使用需要qiContext的TopCameraCapturer:
override fun onRobotFocusGained(qiContext: QiContext) {
val detector = AizooFaceMaskDetector(this)
val capturer = TopCameraCapturer(qiContext)
val detection = FaceMaskDetection(detector, capturer)
detection.start { faces ->
// Handle faces here
}
}
可以替换此项目中包含的OpenCV版本。尽管有关如何执行此操作的完整方法完全不在本自述文件中。
这里有两种更改检测方式的方式:
1.通过用另一个模型替换模型
2.通过实现自己的检测器类
遮罩检测(和脸部检测)的质量主要取决于所用模型的质量,并且有可能构建更好的模型(面罩的形状和颜色很多,形状和颜色也很多,可能是AIZoo建立的模型无法涵盖足够的脸部,或者不能很好地处理儿童面部信息等)。
提供的使用OpenCV,但也可以使用Tensorflow Lite或任何其他技术来制作。您只需要子类化FaceMaskDetector,并实现函数即可recognize拍照,并返回面孔列表。
fun recognize(picture: Bitmap): List<DetectedFace>
该应用程序处理用户面部的图像。它不会存储它们或将它们发送到任何外部服务器,确保您的用法符合当地法规。
有关整个库和所有说明,请转到Github上查看该项目