目录
介绍
AI队列长度检测:使用Keras进行对象检测
卷积神经网络
训练CNN以检测物体
测试我们的模型
下一步是什么?
- 下载源1.4 KB
看到人们排队进入您的咖啡店或商店是一件很棒的事,因为更多的客户意味着更多的生意。但是,根据最新研究,排长队会阻止更多人排队。例如,当您的肚子因饥饿而咆哮时,您要做的最后一件事就是排队等候吃饭。因此,对于企业而言,制定有效的排队策略很重要。十年前,让计算机计算队列中排队的人数是一个非常困难的问题。公司通常必须雇用整个学术研究团队来尝试准确地做到这一点。然后出现了深度学习。这曾经是一个难以置信的难题,现在任何人只要有一个像样的GPU或访问负担得起的云GPU实例就可以解决。
在本系列文章中,我们将展示如何制作AI队列长度检测器。我们将从在自定义数据集上受过训练的从头开始实现一个简单的对象检测器开始,并以实时方式检测和跟踪对象(在我们的例子中为人类)。稍后,我们还将看到如何使用像YOLO这样的预训练对象检测网络来提高解决方案的效率。
AI队列长度检测:使用Keras进行对象检测对象检测被认为是一个复杂的计算机视觉问题,因为我们需要找到给定图像或视频中所需对象的位置,并确定检测到的对象类型。基于深度学习的模型的最新进展使开发对象检测应用程序变得更加容易。这些模型不仅可以显著的改善性能,而且还可以利用最新技术和庞大的数据集来有效地获得所需的结果。
在本文中,我们将使事情变得简单,并尝试实现用于对象检测的卷积神经网络(CNN)。在转到编码部分之前,让我们首先快速回顾一下CNN是什么。
卷积神经网络简单地说,CNN是一类深度神经网络,通常用于分析视觉图像。像其他神经网络一样,它由不同的层组成(即输入层,一个或多个隐藏层以及输出层)。它可以将图像作为输入,为图像中的不同方面或对象分配权重,并将它们彼此区分开。每个隐藏层都使用特定的模式和功能来转换其输入,并将其传递到下一层,而最后一层通常将对象分类。
训练CNN以检测物体在继续之前,重要的是要注意,我将假定您对Python有所了解,并且对深度学习也有所了解,因此,我将跳过常见Python库的安装过程。我将使用Windows的Anaconda发行版在Jupyter Notebook上工作,但可以选择任何IDE一起工作。该代码不是特定于平台的,应该可以正常工作。
对于本文,我们将使用cifar10数据集来训练一个简单的对象检测器。
让我们从导入所需的库开始。
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from keras import losses,metrics
from keras.optimizers import Adam
from keras.models import Sequential
from keras.callbacks import EarlyStopping
from keras.utils.np_utils import to_categorical
from keras.layers import MaxPool2D, Dense, Conv2D, Flatten
from sklearn.metrics import classification_report,confusion_matrix,accuracy_score
下一步是加载数据。您可以使用以下几行将其直接下载到笔记本中。
from keras.datasets import cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
让我们验证每个集合的形状。
X_train.shape
X_test.shape
y_train.shape
Y_test.shape
cifar10数据集具有十个不同类别的对象,它们的数量均相等,因此将有助于算法平等地学习所有类别。可以验证如下:
np.unique(y_train,return_counts=True)
我们需要对这些数据进行标准化,然后才能将其提供给神经网络,并将类变量更改为矩阵。
x_train=x_train.astype('float32')
x_test=x_test.astype('float32')
x_train /= 200
x_test /= 200
y_train=to_categorical(y_train)
y_test=to_categorical(y_test)
现在是时候定义我们的模型来对这些对象进行分类了。我们将使用具有两个卷积层的顺序模型。图层将具有32个滤镜(稍后我们将应用最大池化以减小空间尺寸)。我们将使用Adam激活来编译模型。
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(32, 32, 3),activation='relu'))
model.add(Conv2D(32, (3, 3),activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3),activation='relu'))
model.add(Conv2D(64, (3, 3),activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dense(10, activation='softmax'))
model.compile(loss=losses.categorical_crossentropy,
optimizer=Adam(),
metrics=[metrics.categorical_accuracy])
您可以看到模型摘要,如下所示:
model.summary()
现在让我们在训练数据上拟合模型。
early=EarlyStopping(monitor='loss')
hist=model.fit(x_train,y_train,batch_size=100,validation_split=0.2,epochs=5,callbacks=[early])
测试我们的模型
现在我们的模型已经训练完毕,我们可以使用该evaluate函数评估模型的执行情况。
model.evaluate(x_test,y_test,batch_size=100)
您应该看到类似于以下内容的输出:
100/100 [==============================] - 10s 97ms/step - loss: 0.8231 - categorical_accuracy: 0.7128
[0.8231054544448853, 0.7128000259399414]
我们已经获得71%的准确度,这已经足够了,因为我们可以看到它并不太合适。我们还可以为训练和验证绘制这种准确性。
现在,让我们使用新近训练的模型来预测测试数据集的类别。
y_pred = model.predict_classes(x_test)
我们可以再次使用precision_score测试模型的准确性。
print(accuracy_score(y_test_classes,y_pred))
我们实现了非常简单的CNN架构,因此得分为72%,这还不错。只要我们具有所需的计算能力和内存,我们仍然可以改善这些分数。目前,我们的模型在整个数据上都有很好的概括,并概述了如何使用CNN进行对象检测。
在本文中,我们从头开始探讨了对象检测。我们训练的模型可用于以72%的精度检测一般物体。如果我们想进一步提高性能怎么办?传统的CNN并非始终是物体检测的理想选择。我们的模型表现良好,因为每个类在数据集中的计数相同。在现实世界中交易时通常不是这种情况。如果尝试为自定义对象检测训练模型,我们将面临许多问题。在下一篇文章中,我们将探索用于对象检测的其他一些算法,并将学习实现用于自定义对象检测的算法。