OpenVINO中提供了八个人脸检测的相关模型,其中有两个与剩余的六个是基于不同的对象检测头实现。今天这里就重点介绍一下这两个与众不同的人脸检测预训练模型的使用。 模型说明
这两个预训练模型名称分别是:
代码语言:javascript复制face-detection-0205
face-detection-0206
这两个模型的检测头分别是基于FCOS与ATSS实现的,其中FOCS的检测头输出如下:
两个模型输入图象格式分别是:
代码语言:javascript复制face-detection-0205 NCHW=1x3x416x416
face-detection-0206 NCHW=1x3x640x640
输出格式:
代码语言:javascript复制BGR顺序
两个输出层分别是Boxes表示检测框label表示对象
Boxes的数据格式为Nx5,其中N表示数目,5表示数据如下:
代码语言:javascript复制[`x_min`, `y_min`, `x_max`, `y_max`, `conf`]
- (`x_min`, `y_min`) – 检测框左上角坐标
- (`x_max`, `y_max`) – 检测框右下角坐标
- `conf` - 置信度
预测出来的坐标值是基于输入图象大小的实际坐标值,conf值在0~1之间。
用法演示
演示如何使用OpenVINO中的FCOS与ATSS人脸检测模型!
代码语言:javascript复制import cv2 as cv
import time
from openvino.inference_engine import IECore
ie = IECore()
for device in ie.available_devices:
print(device)
# Read IR
net = ie.read_network(model=face_xml, weights=face_bin)
input_blob = next(iter(net.input_info))
out_blob = next(iter(net.outputs))
# 输入设置
n, c, h, w = net.input_info[input_blob].input_data.shape
# 设备关联推理创建
exec_net = ie.load_network(network=net, device_name="CPU")
cap = cv.VideoCapture("D:/images/video/Boogie_Up.mp4")
while True:
inf_start = time.time()
ret, src = cap.read()
if ret is not True:
break
# 处理输入图象
image = cv.resize(src, (w, h))
image = image.transpose(2, 0, 1)
# 推理
prob = exec_net.infer(inputs={input_blob: [image]})
# 后处理
ih, iw, ic = src.shape
res = prob["boxes"]
for obj in res:
if obj[4] > 0.5:
xmin = int(obj[0] * iw / w)
ymin = int(obj[1] * ih / h)
xmax = int(obj[2] * iw / w)
ymax = int(obj[3] * ih / h)
cv.rectangle(src, (xmin, ymin), (xmax, ymax), (0, 255, 255), 2, 8)
cv.putText(src, str("%.3f" % obj[4]), (xmin, ymin), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1, 8)
inf_end = time.time() - inf_start
cv.putText(src, "infer time(ms): %.3f, FPS: %.2f" % (inf_end * 1000, 1 / (inf_end 0.0001)), (10, 50),
cv.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 255), 2, 8)
cv.imshow("face_detect", src)
c = cv.waitKey(1)
if c == 27: # ESC
break
cv.destroyAllWindows()
运行结果如下:
i7CPU跑出这个速度还不错!