拿来就用,OpenCV用于检测分类等AI推理的DNN模块

机智客 2022-05-17 06:13:24

在我们的一般印象中,OpenCV是最常见的跨平台的计算机视觉库。虽然在定义上它也是机器学习库,不过更多情况下我们用它来做一些机器视觉之类的项目,一般情况并不会和DNN之类深度学习联系起来,不过事实当然不是这样,在后期的版本中,比如OpenCV3.3以上,也加入了对深度学习的支持。比如现在学习的DNN模块。

具体地说,dnn模块在OpenCV中,当我们导入OpenCV模块后,可以通过cv.dnn来引用。有了dnn模块的加持,OpenCV可以说如虎添翼,更加强大了。托管社区有很多项目都是用了cv.dnn模块。

这里用图像风格迁移举例,引用和使用dnn模块一般的步骤是,import cv2 as cv,然后用cv.dnn读取外部模型net = cv.dnn.readNetFromTorch(args.model),之后通过blobFromImage来对图像预处理,代码是inp = cv.dnn.blobFromImage(frame, 1.0, (inWidth, inHeight),(103.939, 116.779, 123.68), swapRB=False, crop=False),之后模型推理net.setInput(inp),再就是out = net.forward()来前向传播,然后则是处理out,比如out = out.reshape(3, out.shape[2], out.shape[3]),out..transpose(1, 2, 0)啦,最后是net.getPerfProfile()输出完成一次深度学习模型推理的时间。这个由t, _ = net.getPerfProfile()和freq = cv.getTickFrequency() / 1000两段代码完成,而输出的结果则是t / freq,单位ms。

当然这只是一个小例子,而且没有完全覆盖cv.dnn用法。比如载入模型,上面用了cv.dnn.readNetFromTorch,其实还有类似readNetFromCaffe、readNetFromTensorflow、readNetFromONNX、readNetFromModelOptimizer多种。当然除了读取其他后端AI框架的模型外,OpenCV的dnn还有readNet。

有dnn,看起来似乎可以用于深度学习的训练和推理。其实不然,OpenCV只支持推理而不支持训练。而且它支持推理涉及到的模型,很是广泛,涵盖我们常见的pytorch,TensorFlow,Caffe等多种。所以机智客觉得在其他AI框架中训练好的模型,连转换都不用,到了OpenCV中就可以拿来就用,十分方便。

不仅是图像风格迁移,在常见的类似目标分类、目标检测、图像分割或者风格迁移之类的AI应用中,OpenCV的dnn模块应用广泛。正因为OpenCV可以用于推理,支持广泛的AI框架模型,所以很多其他深度学习框架训练好的模型,可以移植到OpenCV中,配合它做推理,从而实现很多惊艳和创意的应用功能。

0 阅读:20
机智客

机智客

始于计算机;陷于AI机器人等现代科技;终于,学傻了吧