最近做这个篮球视频解构项目,发现手机端跑AI模型这件事,和我之前的所有开发经验特别不一样

图像处理特有领域知识

  1. 图片区分RGB、YUV这些图像格式,YUV更友好,而且RGB和YUV都有很多种标准,YUV对硬件更友好,RGB对模型更友好。
  2. 在芯片上除了我们常常所熟知的GPU、CPU,还有我们不太了解的NPU、VPU,都是做某一方面工作的专门芯片,NPU能加速神经网络计算,要在开发效率、执行效率、兼容性方面取舍。当前这个阶段够用就好。

调试困难,1秒30fps,几万行日志

做web开发的时候,一个接口调用就是一个接口调用,你可以打断点,可以打日志,可以慢慢分析。
但手机端识别不一样。30fps意味着每秒钟有30次识别,根本来不及观察单次的执行过程。想测试5秒的视频?那就是150次处理循环,每次处理大概1秒钟。
我之前的调试思路完全不适用了。你不能像调试普通程序那样一步步跟踪,因为太快了。你需要从统计的角度去看问题,需要从大量的数据中提取规律。

硬件工况对程序运行影响超级大

以前做web开发,服务器配置基本是固定的,性能问题大多数时候能够预测。但手机不一样。
同样的代码,在不同的环境下跑出来的结果可能完全不同:

  • 手机温度高了,性能就下降
  • JVM刚好执行了GC,处理就卡顿
  • 用户同时开了其他应用,资源就不够了
    这些因素还会相互影响。温度高导致CPU降频,CPU降频导致任务积压,任务积压导致内存占用增加,内存占用增加又可能触发GC…

厂商差异比想象中大

最让我崩溃的是华为手机的录制问题。
你以为录制30fps的视频,存下来的就是标准的30fps文件?不是的。华为给你录出27.5fps,而且这个帧率还不是固定的,会波动。
我们整个后处理逻辑都是基于帧号计算时间的。实际的进球发生在1分03秒,我们算出来是1分10秒,差了7秒钟!
这种问题你在开发阶段根本预料不到,只有真正上了不同的设备才会发现。