【深度相机系列五】脑补了和库克的对话后,我发现了iPhone X深度相机选择的秘诀和方法

本文首发于微信公众号:计算机视觉life
前面的文章分别介绍了三种深度相机的原理:TOF、RGB双目、结构光。看起来它们都各有利弊,那么在实际产品研发中如何选择深度相机呢?
为了读者能够有个清晰的思路,我 脑补 了苹果公司CEO蒂姆·库克(Tim Cook)和我的一段对话,我们就iPhone X如何选择深度相机深入交换了意见。

以下对话内容纯属虚构,如有雷同,肯定是抄我的。
--------------------------------------------------------------------------------------------------
Cook:Hi,sixgod,how are you?
Sixgod:I am fine. Thank you! And you?
Cook:I am fine, too.
我:我英语库存已经耗尽了。。。接不下去了。。。我们还是用中文吧!
库克:木问题!我最近在考虑一款新手机iPhone X,想要增加深度相机,我看了你公众号介绍的三种深度相机,写的不错,然而看完了我还是不知道该怎么选,你有什么建议吗?
我:谢谢!我最近正好想写一下,如何根据自身产品的需求选择合适的深度相机技术方案。简单来说,这三种深度相机没有最好,只有最合适。首先,这款用在手机上的深度相机,你打算放前置还是后置?
库克:前置。因为我们的深度相机主要是对人脸进行三维建模,然后在此基础上增加三维人脸识别来解锁手机,后面还有更多基于三维人脸的有趣应用。
我:要进行三维人脸识别,那看来使用距离很近了。另外,对深度相机的测量精度要求也很高啊!
库克:是啊,这次我们就是主打三维人脸解锁,要做就要做到最牛X,不然不好意思拿出手啊!
我:明白!那这么说,是不是也要随时随地人脸解锁了?不论室内室外,白天夜晚,效果都要杠杠的?
库克:那是必须,如果人脸解锁还要看环境条件,那消费者肯定不会买账的!三维人脸解锁本来就是要方便的啊,我们的目标是比指纹解锁还要方便快捷!
我:Got it!那我们现在可以先排除掉RGB的双目相机了。
库克:啊!这么快就排除一个了?那你得告诉我为啥要排除掉RGB双目方案。
我:RGB双目相机因为非常依赖纯图像特征匹配,所以在光照较暗或者过度曝光的情况下效果都非常差,另外如果被测场景本身缺乏纹理,也很难进行特征提取和匹配。你看看下面的图就懂了。

库克:嗯,这个点明白了。我们继续讨论吧。
我:我:别急,看下面的表格,我列出了对比结果。

库克:嗯,知道了。我们手机必须全天候实现三维人脸识别,RGB双目方案做不到,不考虑了。那还有两种呢,怎么选?
我:下面可以从分辨率、帧率、软件复杂度、功耗等方面来考虑吧。毕竟我们要用在移动设备上。
库克:OK。我们计划推出基于人脸的很多实用有趣的应用,比如人脸表情,人像光照,背景虚化等。攻城狮们正在努力加班中。后期可能还会推出AR相关的应用。所以对深度图分辨率还是有较高的要求的。
我:啊?你们也加班啊。。。关于分辨率,TOF方案深度图分辨率很难提高,一般都达不到VGA(640x480)分辨率。比如Kinect2的TOF方案深度图分辨率只有512x424。而Google和联想合作的PHAB2手机的后置TOF深度相机分辨率只有224x171。TOF方案受物理器件的限制,分辨率很难做到接近VGA的,即使做到,也会和功耗呈指数倍增长。
库克:那结构光的分辨率呢?
我:在较近使用范围内,结构光方案的分辨率会大大高于TOF方案。比如目前结构光方案的深度图最高可以做到1080p左右的分辨率了。
库克:嗯,这个分辨率够用了。那帧率和软件复杂度呢?我们要实现实时的应用,这点也很重要!
我:帧率的话,TOF方案可以达到非常高的帧率,差不多上百fps吧。结构光方案帧率会低点,典型的是30fps,不过这也基本够用了。软件复杂度方面,结构光因为需要对编码的结构光进行解码,所以复杂度要比直接测距的TOF高一些。
库克:嗯,看起来,帧率和软件复杂度方面TOF更有优势,不过差别对我们的需求影响不太明显,我们无所不能的算法工程师应该可以搞定。那功率呢?三维人脸解锁使用频率很高,功率是一个非常重要的考虑因素。
我:确实是啊,我之前用的iphone5s每天都得充电,出远门都得自带充电宝,心累啊。
库克:额。。。
我:扯远了啊。功耗的话TOF是激光全面照射,而结构光是只照射其中局部区域,比如PrimeSense的伪随机散斑图案,只覆盖了不到十分之一的空间。另外,TOF发射的是高频调制脉冲,而结构光投射图案并不需要高频调制,所以结构光的功耗要比TOF低很多。还是以伪随机散斑结构光为例,结构光方案功耗只有TOF的十分之一不到吧。
库克:Amazing! 有没有具体的对比表格?
我:有有有。下面是三种方案在分辨率,帧率,软件复杂度和功耗方面的对比结果。

库克:嗯,看来我只能选择结构光方案了。其实,结构光方案还有一个优势在于技术成熟,我们收购的PrimeSense很早就把结构光技术用在kinect一代产品中了。既然技术这么成熟,想必结构光技术也有很多变种吧。
我:没错!目前结构光技术有如下几种:一种是单目IR+投影红外点阵,另外一种是双目IR+投影红外点阵,这样相当于结构光+双目立体融合了,深度测量效果会比前者好一些,比如Intel RealSense R200采用的就是双目IR+投影红外点阵,不足之处就是体积较大。而单目IR+投影红外点阵的方案虽然体积较小,但是效果会差一点。
库克:等下,体积是重点考虑因素啊!手机上空间本身就非常有限,消费者现在对全面屏也非常着迷。看来只能选择单目IR+投影红外点阵的方案了。我们前置深度相机的空间非常狭小,即使这样设计出来,看起来很可能像是女生的齐刘海。
我:那挺萌的啊!
库克:额。。。你继续说说计算复杂度。
我:嗯,计算方式也分几种:一是直接用ASIC(专用集成电路)进行计算,成本稍微高一点,但是处理速度快,支持高帧率和高分辨率深度相机,关键是比通用芯片功耗低。二是DSP+软件算法,成本跟用ASIC差不多,但支持不了高帧率高分辨率,功耗比ASIC稍高。三是直接用手机的AP(Application Processor)进行纯软件计算,这个不需要额外增加硬件成本,但是比较消耗AP的计算资源。同样也不支持高帧率高分辨率,功耗比较大。

库克:低功耗,计算速度快,高帧率高分辨率,嗯,ASIC方案比较适合iPhone X。
我:那您总结一下最后iPhone X的深度相机技术方案?
库克:嗯。我们最终选择方案是:结构光原理的深度相机。具体来说是:单目IR+投影红外点阵+ASIC方案。该方案在深度分辨率、深度测量精度上有较大优势,实时性处理和全天候工作也都有保障,功耗也相对较低,就是成本稍高了一些。
我:额,这么说,iPhone X的定价会比较高了?
库克:还好吧,不过是几杯咖啡的钱。
--------------------------------------------------------------------------------------------------------
我猛地从梦中惊醒,出了一身冷汗。手里攥着还没来得及泡的泡面,已被我捏的咔咔作响,那分明是心脏被震碎一地声音。我掐指算了算,嗯,只要再坚持吃半年泡面,我就能攒够买iPhone X的钱了。
  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
基于深度典型相关分析的脑网络特征和眼动特征的融合,可以使用Python中的多个库来实现。以下是一个简单的实现示例: 1. 导入所需的库 ``` python import numpy as np from sklearn.cross_decomposition import CCA from keras.layers import Input, Dense, concatenate from keras.models import Model ``` 2. 准备数据 假设我们有两个数据集,一个是脑网络特征,另一个是眼动特征。每个数据集都有N个样本和D1或D2个特征。我们可以将这两个数据集分别存储在numpy数组X1和X2中。 ``` python X1 = np.random.rand(N, D1) X2 = np.random.rand(N, D2) ``` 3. 进行深度典型相关分析 使用sklearn库中的CCA函数进行深度典型相关分析。我们可以设置n_components参数为1,以获得一个典型变量。然后,我们可以使用transform函数将数据集转换为新的典型变量表示形式。 ``` python cca = CCA(n_components=1) cca.fit(X1, X2) X1_c, X2_c = cca.transform(X1, X2) ``` 4. 构建深度神经网络 使用Keras库中的函数构建深度神经网络模型。我们可以使用Input函数定义输入层,Dense函数定义隐藏层和输出层,并使用concatenate函数将两个输入层连接起来。 ``` python input1 = Input(shape=(1,)) hidden1 = Dense(10, activation='relu')(input1) output1 = Dense(1)(hidden1) input2 = Input(shape=(1,)) hidden2 = Dense(10, activation='relu')(input2) output2 = Dense(1)(hidden2) merge = concatenate([output1, output2]) model = Model(inputs=[input1, input2], outputs=merge) ``` 5. 训练模型 使用Keras库中的函数编译和训练模型。我们可以使用mean_squared_error作为损失函数,使用adam作为优化器,并设置epoch和batch_size参数。 ``` python model.compile(loss='mean_squared_error', optimizer='adam') model.fit([X1_c, X2_c], y, epochs=100, batch_size=32) ``` 在这个示例中,y是我们的目标变量,可以是任何我们想要预测的变量。 6. 预测结果 使用训练好的模型进行预测。我们可以使用predict函数将X1和X2转换为典型变量表示形式,并将它们输入到我们的模型中进行预测。 ``` python X1_pred, X2_pred = cca.transform(X1, X2) y_pred = model.predict([X1_pred, X2_pred]) ``` 这是一个简单的实现示例,可以根据实际情况进行修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值