使用Qualcomm NeturalNetwork SDK。 我可以运行SNPE SDK示例并更改为inception_v3模型,工作正常。
但是 SNPE 会在 execute() 中阻塞 UI 线程;
我没有办法阻止这一点。 安卓用户会得到糟糕的用户体验。
我试过:低优先级线程、作业调度程序等
当我使用 GPU 执行 SNPE 时,它总是阻止 UI。
如何配置SNPE,Android UI是高优先级,SNPE是低优先级,因此我们可以快速获得结果并且不会阻塞UI
谢谢。
GPU 上的批量操作会阻止新帧的渲染。这个问题很难解决,它实际上与SNPE无关,因为我们可以使用非SNPE实现(内部基于OpenCL的框架)重现这个问题。您可以简单地更改张量运算的位置来缓解此问题。例如,您可以在CPU上进行计算(例如:tensorflow mobile),并且UI可以正确呈现,同时速度要慢得多且占用大量CPU。
可以通过设备上的开发人员选项可视化我的解释。有关更多信息,请点击此链接:https://developer.android.com/studio/profile/inspect-gpu-rendering#profile_rendering。您将能够看到,几个"交换缓冲区"1 操作可能需要异常长的时间间隔。
最好的解决方案是使用量化网络在DSP上进行计算,但对可用的运算符和内存存在许多限制。
Android 8.1 可以通过 NN-API 抽象和 GPU 资源的操作系统级调度来解决这些问题,但我不会对 Google 抱有太多期望。
顺便说一句:我有一个假设的方案,可以通过对批量操作进行碎片化来缓解这个问题。理论上,如果工作线程在低于 50 毫秒的操作之间休眠 20 毫秒,以便 UI 线程可以正确呈现,则用户体验应该是可以容忍的,因为 FPS 可以保持在 15 以上。我们将尝试此方案,因为此残障方案仍应比基于 CPU 的方案快得多。
您应该能够使用 AsyncTask 在后台线程上运行推理。有关此示例,请参阅 SNPE SDK 中的"ClassifyImageTask"。
对于 SNPE GPU 运行时,可以使用低执行提示,这会将 SNPE 设置为最低 GPU 优先级。
通过设置ExecutionPriorityHint_t::Low 到 SNPEBuilder::setExecutionPriorityHint()