一、坐姿是否端正、离座的判断依据
1.1、正坐(前)

相机放在人的正前方。高于桌面,像25cm。有笔记本电脑的话,就夹在屏幕上边沿。至少拍到鼻、两耳、两肩。两肩差不多要到图像底了,不能拍到腰。

“两肩中点得在相机中部”,具体是[0.4, 0.6]。只要相机尽可能放在正前方,就会满足这要求。
“鼻子处在双肩区域”,这是针对垂直方向说的。正坐时,鼻子一般就会两肩之上。
1.2、正坐(右)

相机底下不要垫东西,挨着桌面放。镜头方向和桌沿平行,镜头“射”出的线和桌沿在一条线上。距坐的地方大概60cm。

“嘴不在双肩右侧”。相机是从右侧拍,等同一旦嘴不在双肩前面,认为离坐。
人直站时,要没意外,会满足脊柱角度、肩到鼻角度。这时通过缩短镜头和人之间距离、以及让相机距桌面更近,避免拍出这种图像。
二、事件关联的处理操作

和坐姿相关事件有三种:不端正,离座和久坐。
- 不端正。语音提示。字符串变量$aplt.launcher.fake__env_basesubtask_str_存储不端正的原因。
- 离座。关灯。
- 久坐。重复式语音提示。直到用户按下“场景”按钮(此时这按钮会led灯闪烁着)关掉这语音。
三、如何提高离座状态检测正确率
此部分面向读者是开发者。
须先分清离座和离座状态。
- 离座。新来一帧图像,判断出或端正,或不端正,或离座。
- 离座状态。kpose处于的一种状态。代码用“noperson_start_ticks_ != 0”,表示处于离座状态。判断出不端正,并不意味着就离开离座状态,进入不端正状态。
这里目标是提高离座状态检测正确率,而不是离坐正确率。方法是分两步。
- 用离坐判断,过滤掉明显离座。正如上面正坐(前)、正坐(右)写的。
- 当判断出是不端正时,如果之前是离座状态,依旧保持离座状态。
第一步不能太严格。原因是不满足第一步条件,是不会有语音提示的。举个例子,如果让存在“双肩中点落在相机中部”这条件。真发生中点不在相机中部了,那不会有语音提示。但真实情况可能是,用户没放对相机位置。由于没语音提示,用户还以为坐姿端正,当时间达到离坐阈值时长后,用户会看到灯怎么莫名其妙灭了。
一来离座判断不能太严苛,二来Mediapipe检测人体33个关键点会发生错检,在第一步后,会漏下不少真的离坐。怎么筛出更多“真的离座”呢?——当判断出是不端正时,如果之前是离座状态,依旧保持离座状态。由于会用较严格条件判断是否端正,此时很多“真的离座”,会被判为不端正。采用不端正不改变离座状态,间接让它们归到离座,从而提高了离座状态正确率。举个例子,用户设置了离座两分钟关灯,用户只是路过,被拍到,这时不是进入“不端正”,而是继续“离座”,离座正确率就提升了。
总之,如果此刻kpose处于离座状态,新来一帧图像,判断出不端正,并不等同kpose就会离开离座状态。要等到新来一帧,判断出端正了,才会离开离座状态,进入端正状态。也就是说,只能判断出端正了,才能让离开离座状态。