计算机视觉:在20行代码中实现实时分类器

计算机视觉:在20行代码中实现实时分类器

依赖

  • 开源的计算机视觉库openCV

  • 如果您不想从头开始训练模型,可以从Keras / Caffe下载预先训练好的模型重量

准备工作

首先,加载所需的库和分类器。

import cv2

import numpy as np

from keras.applications import imagenet_utils

from keras.applications.inception_v3 import InceptionV3

model = VGG19(weights='imagenet') # load the model weights

在这个练习中,我将使用VGG19,这是通过ImageNet训练的模型之一。VGG19可以使用Keras库加载。

我们需要imagenet_utils来预处理图像并解码VGG19给出的分类。

让我们开始吧

cam = cv2.VideoCapture(0)#打开网络摄像头

这个实时分类器的想法是将网络摄像机捕获成帧,并将每个帧视为要分类的图像。为此,我们需要创建一个无限循环来连续捕获帧。

while True:

ret, frame = cam.read()

k = cv2.waitKey(1)

if k%256 == 27: # if esp key is pressed

break

该循环捕获后续帧(帧)以及前一帧是否存在(ret)。我们还包括一个退出条件,特别是当按下退出键时。您可以参考Ascii Table获取其他的等号键映射。

接下来,我们要抓住帧并将其分类为任何常规图像。这全部在我们的循环中。

frame_pred = cv2.resize(frame, (224, 224))

frame_pred = cv2.cvtColor(frame_pred, cv2.COLOR_BGR2RGB).astype(np.float32)

frame_pred = frame_pred.reshape((1, ) + frame_pred.shape)

frame_pred = imagenet_utils.preprocess_input(frame_pred)

predictions = model.predict(frame_pred)

(imageID, label, score) = imagenet_utils.decode_predictions(predictions)[0][0]

我们一行一行看下:

  • 所述图像的尺寸调整为(224,224),用于VGG19默认输入大小

  • 图像被转换为RGB格式。OpenCV使用BGR格式,而Keras(以及几乎所有其他)使用RGB

  • 图像被重新塑造以适应模型输入要求

  • 输入被预处理为模型需要的格式

  • 我们检索预测

  • 我们对预测进行解码以获得类,标签和分数(在该类中的可能性)

在网络摄像头的上方叠加预测:

cv2.putText(frame, "%s with Probability %.2f" % (label, score), (25, 25), cv2.FONT_HERSHEY_DUPLEX, 0.9, (0, 0, 250), 2)

cv2.imshow('Computer Vision on a Budget', frame)

这是在循环内运行。最后一行返回原始摄像头捕捉(不是模型增加的),并带有所需的标签文本。

最后,你想关闭你的网络摄像头。此步骤位于循环之外,只有在按下escape键时才执行。

cam.release()

cv2.destroyAllWindows()

相关推荐