【.com原创稿】当一张图片展现在我们眼前时,我们的大脑会立即识别出图片中包含的物体。另一方面,我们需要花费大量的时间和训练数据来让机器识别这些物体。但鉴于硬件和深度学习的最新进展,计算机视觉领域变得更加容易和直观。以下图为例,系统能够以高精度识别图像中的不同对象。图1对象检测技术正在迅速被各行各业所采用。它可以帮助自动驾驶汽车安全行驶,发现拥挤场所的暴力行为,协助团队分析和生成草稿报告,确保制造的零件有适当的质量控制,等等。这些只是物体检测技术强大功能的一些应用!在本文中,我们将了解什么是对象检测,并了解可用于解决该领域问题的几种不同方法。然后我们将深入研究使用Python构建我们自己的对象检测系统。阅读本文后,您将有足够的知识来克服不同的目标检测挑战!注意:本教程假定您了解深度学习的基础知识并且之前已经解决了简单的图像处理问题。如果你还没有或需要弥补,我建议你先阅读以下文章:《深度学习的基础:从人工神经网络开始》https://www.analyticsvidhya.com/blog/2016/03/introduction-deep-learning-fundamentals-neural-网络/h??ttps://www.analyticsvidhya.com/blog/2016/04/deep-learning-computer-vision-introduction-convolution-neural-networks/《教程:使用Keras优化神经网络(附有图像识别案例研究)》https://www.analyticsvidhya.com/blog/2016/10/tutorial-optimizing-neural-networks-using-keras-with-image-recognition-case-study/什么是目标检测?在我们开始构建最先进的模型之前,让我们了解什么是对象检测。让我们想象一下为自动驾驶汽车构建行人检测系统。假设您驾驶的汽车捕捉到如下图所示的图像,您会如何描述该图像?图2这张图片实际上描绘了我们的汽车驶近广场,有几个人在我们的汽车前面过马路。由于很难看到交通标志,因此汽车的行人检测系统应准确识别行人行走的位置,以便避开。那么,汽车的系统如何确保避开行人呢?它所能做的就是用边界框圈出这些人,这样系统就可以准确地识别行人在图像中的位置,然后相应地决定走哪条路以避免任何意外。图3我们有两个对象检测目标:识别图像中的所有对象及其位置过滤掉感兴趣的对象解决对象检测问题的不同方法现在我们知道规定的问题是什么,要解决哪种方法(或哪些方法)问题?在本节中,我们描述了几种可用于检测图像中对象的技术。从最简单的方法开始,逐步提高。方法1:NaiveApproach(分而治之)我们可以采用的最简单的方法是将图像分解为四个部分:图4:左上图5:右上图6:左下图7:右下下一步是将这些部分中的每一个都馈送到图像分类器。输出是图像的某个部分是否有行人。如果有行人,在原图像中标记这个图像块(patch)。输出将如下所示:图8首先尝试这样做是个好主意,但我们正在寻找一个极其准确和精确的系统。它需要识别整个物体(或在本例中为行人),因为仅定位物体的一部分可能会导致灾难性的结果。方法二:增加分解次数之前的系统做的很好,但是我们还能做什么呢?我们可以通过大幅增加输入到系统的图像块的数量来改进系统。输出应如下所示:图9最终,这既有优点也有缺点。当然,我们的解决方案看起来比朴素的方法好一点,但是相似的边界框太多了。这是一个问题,我们需要一种更结构化的方法来解决它。方法三:进行结构化分解为了以更结构化的方式构建目标检测系统,我们可以按照以下步骤进行:步骤一:将图像分解为10x10的网格,如下图所示:图10步骤二:定义每个图像块的质心。Step3:对于每个质心,取三个不同高度和长宽比的图像块,如下图所示:图11Step4:让所有创建的图像块通过图像分类器进行预测。那么最终的输出是什么?当然,它更加结构化和标准化,如下所示:图12但我们可以进一步改进它!这是获得更好结果的另一种方法。方法4:提高效率我们之前看到的方法在很大程度上是可以接受的,但我们可以构建比这更高效的系统。你对此有何建议?我首先想到的是优化。如果我们考虑方法3,可以做两件事来改进模型。增加网格大小我们可以将网格大小增加到20,而不是选择10。图13使用更多具有不同高度和纵横比的图像块,而不是三个图像块这里,我们可以使一个锚点对应9个图像块,即,3个不同高度的正方形图像块和6个不同高度的垂直和水平矩形块。这将为我们提供具有不同纵横比的图像块。图14这同样有利也有弊。当然,这两种方法都可以帮助我们更精细化。但它再次生成大量必须通过图像分类器模型的图像块。我们可以做的是选择图像块而不是所有图像块。例如,我们可以建立一个中间分类器,并尝试预测某个图像块是否真的有背景,即它可能包含一个物体。这将大大减少图像分类器模型看到的图像块。我们可以做的另一个优化是减少指示“相同结果”的预测数量。我们再以方法3的输出为例:图15可以看到,两个boundingbox预测的基本是同一个人。我们可以选择其中任何一个。因此,为了进行预测,我们考虑了所有“建议相同结果”的边界框,并选择最有可能检测到人的边界框。到目前为止,所有这些优化都给了我们很好的预测。我们几乎可以肯定,但猜猜缺少了什么?当然,没有深度学习!方法5:使用深度学习使用深度学习进行特征选择并构建端到端方法,深度学习在目标检测领域具有巨大潜力。我们在哪里可以利用深度学习来解决我们的问题?如何使用它?我在下面列出了几种方法:我们可以将原始图像通过神经网络来降低维度,而不是从原始图像中获取补丁。我们还可以使用神经网络来建议选择性图像块。我们可以增强深度学习算法,使预测尽可能接近原始边界框。这将确保算法给出更严格和更精细的边界框预测。我们现在可以采用单个深度神经网络模型并尝试自行解决所有问题,而不是训练不同的神经网络来解决每个问题。这样做的好处是神经网络的每个较小部分都将有助于优化同一神经网络的其他部分。这将有助于我们共同训练整个深度模型。输出将导致我们迄今为止看到的任何方法的最佳性能,有点类似于下图。我们将在下一节中了解如何使用Python构建此模型。图16如何使用ImageAI库构建对象检测模型?现在我们知道什么是物体检测以及解决它的最佳方法,让我们构建我们自己的物体检测系统吧!我们将使用ImageAI(https://github.com/OlafenwaMoses/ImageAI),这是一个支持用于计算机视觉任务的最先进机器学习算法的Python库。运行对象检测模型以获得预测很简单。我们无需担心复杂的安装脚本即可开始,我们甚至不需要GPU来生成预测!我们将使用这个ImageAI库来获得上面方法5中看到的输出预测。强烈建议您遵循下面的代码(在您自己的机器上),因为这将使您从本节中获得尽可能多的知识。请注意,您需要在构建对象检测模型之前设置系统。在本地系统上安装Anaconda后,您可以从以下步骤开始。第1步:使用Python3.6版创建Anaconda环境。condacreate-nretinanetpython=3.6anaconda第二步:激活环境,安装必要的包。sourceactivateretinanetcondainstalltensorflownumpyscipyopencvpillowmatplotlibh5pykeras第三步:然后安装ImageAI库。pipinstallhttps://github.com/OlafenwaMoses/ImageAI/releases/download/2.0.1/imageai-2.0.1-py3-none-any.whl第4步:现在下载生成预测所需的预训练模型。该模型基于RetinaNet。点击链接下载:RetinaNet预训练模型(https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/resnet50_coco_best_v2.0.1.h5)。第5步:将下载的文件复制到您当前的工作文件夹。第6步:从此链接下载图像(https://s3-ap-south-1.amazonaws.com/av-blog-media/wp-content/uploads/2018/06/I1_2009_09_08_drive_0012_001351-768x223.png),将该图像被命名为image.png。第七步:打开jupyternotebook(在终端输入jupyternotebook),运行如下代码:fromimageai.DetectionimportObjectDetectionimportosexecution_path=os.getcwd()detector=ObjectDetection()detector.setModelTypeAsRetinaNet()detector.setModelPath(os.path.join(execution_path,“resnet50_coco_best_v2.0.1.h5”))检测器.loadModel()custom_objects=detector.CustomObjects(person=True,car=False)detections=detector.detectCustomObjectsFromImage(input_image=os.path.join(execution_path,“image.png”"),output_image_path=os.path.join(execution_path,"image_new.png"),custom_objects=custom_objects,minimum_percentage_probability=65)foreachObjectdetections:print(eachObject["name"]+":"+eachObject["percentage_probability"])print("--------------------------------")这将创建一个名为image_new.png的修改后的图像文件,该文件包含图像的边界框。第8步:要打印图像,请使用以下代码:fromIPython.displayimportImageImage("image_new.png")恭喜!您已经构建了自己的对象检测模型来检测行人。看看它有多棒?结论在本文中,我们了解了对象检测是什么以及构建对象检测模型背后的机制。我们还看到了如何使用ImageAI库构建这个检测行人的对象检测模型。只需更改几处代码,您就可以轻松更改模型并克服您自己的对象检测挑战。【原创稿件,合作网站转载请注明原作者和出处为.com】
