技巧 | OpenCV程序执行时间计算
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
01
引言
大家用OpenCV做开发,经常需要调试算法,打印出算法的执行时间,OpenCV中没有直接获取时间戳的函数,但是有两个根据CPU时钟可以精准计算算法每个步骤执行时间的函数,通过它们可以计算一行或者多行代码的执行时间,视频处理的FPS等性能指标。
计算执行时间
cv.getTickCount,
返回CPU执行的时间周期数,
cv.getTickFrequency
每秒CPU时间周期总数
计算一段算法处理执行的时间秒数,代码结构如下:
e1 = cv.getTickCount()
# your code execution
e2 = cv.getTickCount()
time = (e2 - e1)/ cv.getTickFrequency()
time是以秒位单位。
计算秒/毫秒/FPS
在算法执行阶段,有三个经常使用的速度性能计量指标分别是秒、毫秒、FPS(每秒多少帧),根据上面的cv.getTickCount与cv.getTickFrequency两个函数,这三个指标的计算代码如下:
e1 = cv.getTickCount()
# your code execution
e2 = cv.getTickCount()
## 计算秒
time = (e2 - e1)/ cv.getTickFrequency()
## 计算毫秒
mt =((e2 - e1)/ cv.getTickFrequency())*1000
## 计算FPS
fps = cv.getTickFrequency() / (e2 - e1)
网络模型推理执行时间计算
OpenCV中还提供了网络模型推理执行时间得计算函数,完成一次深度学习模型推理的时间,可以从模型的getPerfProfile函数中获取,转换为毫秒数,相关的计算代码如下:
# Put efficiency information.
t, _ = net.getPerfProfile()
label = 'Inference time: %.2f ms' % (t * 1000.0 / cv.getTickFrequency())
人脸检测模型与代码执行时间计算
下面的代码演示了实时视频人脸检测模型推理时间毫秒数与计算执行时间FPS
# 人脸检测
while True:
e1 = cv.getTickCount()
ret, frame = capture.read()
if ret is not True:
break
h, w, c = frame.shape
blobImage = cv.dnn.blobFromImage(frame, 1.0, (300, 300), (104.0, 177.0, 123.0), False, False);
net.setInput(blobImage)
cvOut = net.forward()
# Put efficiency information.
t, _ = net.getPerfProfile()
label = 'Inference time: %.2f ms' % (t * 1000.0 / cv.getTickFrequency())
# 绘制检测矩形
for detection in cvOut[0,0,:,:]:
score = float(detection[2])
objIndex = int(detection[1])
if score > 0.5:
left = detection[3]*w
top = detection[4]*h
right = detection[5]*w
bottom = detection[6]*h
# 绘制
cv.rectangle(frame, (int(left), int(top)), (int(right), int(bottom)), (255, 0, 0), thickness=2)
cv.putText(frame, "score:%.2f"%score, (int(left), int(top)), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)
e2 = cv.getTickCount()
fps = cv.getTickFrequency() / (e2 - e1)
cv.putText(frame, label + (" FPS: %.2f"%fps), (10, 50), cv.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255), 2)
cv.imshow('face-detection-demo', frame)
cv.waitKey(1)
此外,OpenCV还有两个函数可以决定程序执行时间,默认情况下OpenCV会自动编译优化代码,检测是否启用自动化,它们分别是:
cv.useOptimized() ## 检查是否使用优化
cv.setUseOptimized() ### 设置优化
默认情况下,OpenCV都是自动启动优化,根据CPU支持不同,可以启动SSE/AVX等底层指令集优化!
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~