**私人的** **功能** bytesToPixelBuffer(宽度:Int,高度:Int,baseAddress:UnsafeMutableRawPointer,bytesPerRow:Int)-> CVBuffer? { **曾是** dstPixelBuffer:CVBuffer? CVPixelBufferCreateWithBytes(kCFAllocatorDefault,宽度,高度,kCVPixelFormatType_32BGRA,baseAddress,bytesPerRow, **零** , **零** , **零** , &dst像素缓冲区) **返回** dstPixelBuffer ?? **零** } **私人的** **功能** createImage(来自pixelBuffer:CVPixelBuffer)-> CGImage? { **曾是** CGImage:CGImage? VTCreateCGImageFromCVPixelBuffer(pixelBuffer, 选项: **零** , 图像输出: &cgImage) **返回** CG图像 } **私人的** **功能** createUIImageFromRawData(data: Data, imageWidth: Int, imageHeight: Int, bytes: Int) -> UIImage? { data.withUnsafeBytes { rawBufferPointer **在** **让** rawPtr = rawBufferPointer.baseAddress! **让** 地址 = UnsafeMutableRawPointer(mutating:rawPtr) **警卫** **让** pxBuffer = bytesToPixelBuffer(宽度:imageWidth,高度:imageHeight,baseAddress:地址,bytesPerRow:字节), **让** cgiImage = createImage(来自:pxBuffer) **别的** { **返回** **零** } **返回** UIImage(cgImage:cgiImage) }
最后一个我无法修复的部分来了,那就是 Flutter Image Stream。
在性能方面,即使我创建一个什么都没有的简单项目,不做任何工作,做出 Flutter Camera 和 Stream Image,Low Tier 仍然落后。于是在Preview页面尝试不开启Image Stream功能,发现相机和其他机器一样流畅。没问题它表明我们不能在旧机器上打开 Image Stream。但是如果打不开,Liveness怎么办?
当我想到它时,我们实际上打开了 Image Stream,但我们每 500 毫秒只需要一张图像。如果我们打开相机并立即将其关闭怎么办?我尝试只打开 50 毫秒,结果发现在 50 毫秒内我们得到了大约 1-2 张照片,这对于 Liveness 来说已经足够了。然后我们立即关闭它。iPhone 7 看起来很流畅。iPhone 6s 和iPhone. 6s Plus 好多了,生涩几乎察觉不到。我做了下面的实验来看看 Flutter Camera 的性能,在这个例子中是一个只有 Camera 的 Flutter App。没有任何工作
iPhone 11 Pro Max — 53% CPU、190MB 内存每 20-40 毫秒获取一张图像
iPhone 6s — 118% CPU,160MB 内存每 20-30 毫秒获取一张图像
iPhone 6s Plus — 138% CPU、187 MB 内存每 20-50 毫秒获取一张图像。
关闭相机流的 iPhone 6s Plus,只是相机预览,使用 46% 的 CPU
开启和关闭 Image Stream 的 iPhone 6s Plus 的 CPU 似乎在 50%-70% 左右。
虽然 Android Oppo A3s Low-Tier (2018) Andriod 8.1.0, 2GB Ram 的性能仍然比 iPhone 6s 好很多,即使我一直打开 Image Stream,它也只使用 14% 的 CPU 和大约 320 MB Ram。
所以让我们试试如果我在 Native Camera 中轻松打开 iPhone 6s Plus 的相机,它会看到它使用了 57% 的 CPU,39.1 MB 等于 CPU。我们使用相同,但 RAM 会非常不同。
来到最后一步我们还有一个问题,就是上面分享的 UIImage 图片。我们在使用镜像的时候,遇到了线程1的问题:EXC_BAD_ACCESS。
我使用 CGDataProvider_BufferIsNotBigEnough 搜索了相关关键字。找到解决办法似乎他们中的大多数人根本没有与我的问题相匹配的答案。有人告诉我,我用的是大图。或者头发太旧但即使是我的 iPhone 11 Pro Max 也有问题。好吧,可能不是。很多事情我都想办法解决,放一些小图,喂图放慢一些,但都没有消失,这让我头晕目眩。我不知道该怎么继续,我已经迷茫了1-2天,并且尝试过错误和错误。直到最后我才明白 SDK 会返回我们反馈给我们的图像。表明我们输入的图像不可用。所以我试着从那个部分搜索。并且发现插入的图片发送的UIImage是一个Reference,而不是Value Type,所以我们只好把它拷贝出来作为Value Type来使用,于是我们得到了关于Deep Copy PixelBuffer的Keywords继续google。反复试验,直到结束。它完成了。解决所有问题。真的。
我正在猜测
ไม่มีข้อโต้แย้งใดๆ
TL;博士 妈妈求你不要在 Flutter 中做 Real-time ML,去本地做,然后把结果发回 Flutter。我觉得这个方法要容易得多。而不是像我一样在 Flutter 中找出不同的方法。
哦,所以我不提倡在 Flutter 中这样做?是的,我不支持如果使用 Flutter 的目的是为了让我们的工作变得简单。工作更快如果你不能做到这一点,那我们为什么要使用它?别担心,Flutter 并不是世界上终极的全能语言。能做到的,我们都能做到。做不到的,不用勉强。
下面是我实现的一个示例代码,用于将所有Camera Image图像转换为JPG以供SDK使用。如果有人坚持我想在Flutter中做,因为各种原因,我可以采取示例方面。下面可以用来学习。
GitHub — theamorn/flutter-stream-image
一个新的 Flutter 项目。该项目是 Flutter 应用程序的起点。一些资源可以帮助您入门……
github.com
](https://github.com/theamorn/flutter-stream-image)
下面是一个示例视频,展示了 Flutter Stream Performance 在每台机器上的表现。
下面是一个在 Flutter 中使用的例子,它看起来像这样。
Flutter Camera 不适合旧设备,因为 Flutter 会一直发送图片。让它工作起来很费劲,但是如果 Flutter Camera 可以得到一个参数,表示你要发回的图像是多少帧率,那就很好了,因为在某些用例中我们确实需要高细节的图像,但有些用例不需要。您需要实时速度。就像我的这个案例我宁愿每 200 毫秒获取一张图片,也不愿获取 20-30 毫秒的格式,如果解决这个问题,可以将功耗降低多达 90%!
我认为已经被请求了 2 年的人想到了。
在 Camera 插件中设置自定义帧率和比特率 · Issue #54339 ·flutter/flutter
新功能没有损坏;请求新的能力。相机插件p:由...开发的第一方插件
github.com
](https://github.com/flutter/flutter/issues/54339)
从反馈来看,短期内不太可能上线。我想如果你真的想要实时,就去Native吧。其实,如果有机会,我想打开PR修复它。
看过这篇文章,有兴趣在工作中使用 Liveness 的朋友,无论是 Flutter 还是 Native,请联系 KBTG 或我。我会将此事发送给相关团队。KBTG Face Liveness 已通过 ISO 30107-3 标准,由 iBeta 测试,是 SDK Liveness 的世界标准。
ISO 30107–3 演示攻击检测测试方法和确认信
访问帖子了解更多信息。
www.ibeta.com
](https://www.ibeta.com/iso-30107-3-presentation-attack-detection-confirmation-letters/)
对于任何对这样的好故事感兴趣的技术人员。或者想了解KBTG的新产品,可以关注官网的详细介绍。 www.kbtg.tech
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明
本文链接:https://www.qanswer.top/22874/54230909