计算机视觉:在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()