重庆工商大学CO团队-CHNhawk(小熊)转载请注明出处
今天在做项目的系统优化时,突然顺手就写了一行代码可以优化到提升50%以上的性能,Emmm。
一行代码提升50%以上性能哦,了解一下!
先说背景,最近在参加比赛,做一个人脸识别的门禁系统项目。当然作为本科生,识别引擎使用的是第三方的。我们主要工作是做一套完整的客户端-门禁端-管理端应用解决方案。项目设计时,考虑到如果人脸识别失败,还可以通过扫描二维码的方式进入。二维码使用的当然是Zxing包。门禁端使用的是Android系统,用的rk3399开发板。
门禁端实现功能后发现,如果需要同时扫描二维码和人脸的话,性能比较吃紧,表现出来的是人脸的追踪框会有卡顿(PS.我这边使用了两层SurfaceView,一层直接预览相机,另外一层画各种HUD框框,相机预览层是不会卡的)。识别其实还好,1s内识别还能接受。经过排查,发现是二维码扫描时做的一系列图像处理有点费时,先转YUV格式再转jpeg,再转二值图进行识别。
yuvimage.compressToJpeg(new Rect(0, 0, previewSize.width, previewSize.height), 30, baos); // JPG图片的质量[0-100],100最高
其中这行代码中第二个参数是jpeg质量,做PS经常接触到。我一开始是对这里进行优化,想到降低图片质量是否会提高性能。经过测试,发现如果调到10以下,对性能的影响会较小,但是识别率惨不忍睹.......
正当我纠结之际,突然想到这个二维码扫描是对每一帧的图像进行的处理,但是实际应用中,完全用不着每一帧都去扫描一下。因为在你拿着二维码到摄像头前面去的时候,有很多帧基本上都是相同的,因此我在识别二维码的地方加了这么一句。
if(!detected && Math.random() > 0.5f) {
// 进行二维码识别操作
}
PS.detected是指是否已识别,识别到了就向服务器发送数据,这个等待过程中就没必要做扫描操作了。
只是使用一个随机数进行判断,也就是说如果每秒帧数为30,仅对其中15帧进行较为耗时的扫描处理 ,性能就这么提升了,并且对二维码的识别也没有什么太大的影响。当然后面我调整了参数,取得了最优的值。感觉基本上所有的实时性图像识别都可以这样优化吧,如果硬件平台性能确实吃紧的话。
个人觉得这种方法可能并不是特别优雅,毕竟我只是每天搬砖的穷大学生,但是确实简单粗暴地满足了需求。
至于为什么叫猴子优化法,当然是借鉴大名鼎鼎的猴子排序了23333
以上,记录一下。