在本文中,我们将了解物体检测技术是什么以及可以用来解决此领域问题的几种不同方法,接着深入研究在Python中如何构建我们自己的对象检测系统。在本文结束时,您将拥有足够的知识来独自迎接不同的物体检测挑战!

注意:本教程预设您了解深度学习的基础知识,并且在此之前已经解决了简单的图像处理问题。如果您还没有,或需要复习,我建议您先阅读以下文章:

深度学习的基础 - 从人工神经网络开始 https://www.analyticsvidhya.com/blog/2016/03/introduction-deep-learning-fundamentals-neural-networks/

计算机视觉的深度学习 - 卷积神经网络简介 https://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/

深度学习的基础 - 从人工神经网络开始 https://www.analyticsvidhya.com/blog/2016/03/introduction-deep-learning-fundamentals-neural-networks/

计算机视觉的深度学习 - 卷积神经网络简介 https://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/

目录

什么是物体检测?

我们可以使用不同的方法来解决物体检测问题

方法1:原始的方式(分而治之)

方法2:增加分割数量

方法3:执行结构化划分

方法4:提高效率

方法5:使用深度学习进行特征选择以构建端到端方法

方法1:原始的方式(分而治之)

方法2:增加分割数量

方法3:执行结构化划分

方法4:提高效率

方法5:使用深度学习进行特征选择以构建端到端方法

获取技术:如何使用ImageAI库构建物体检测模型

什么是物体检测?

在构建最先进的模型之前,让我们先尝试了解物体检测是什么。假使我们需要建立一个自动驾驶汽车的行人检测系统,汽车捕获的图像如下图所示。你会如何描述这张图片?

图像显示汽车在一个广场附近,有几个人正在我们的车前过马路。由于无法准确识别交通标志,汽车的行人检测系统应准确识别出人们行走的位置,以避开他们。

那么汽车系统如何确保完美避开呢?它可以做的是围绕这些人创建一个边界框,以便系统根据人们在图像中的位置,决定采取哪条路径,避免任何意外。

物体检测的目标有两个方面:

识别图像中存在的所有对象及其位置

过滤掉关注对象

解决物体检测问题的不同方法

现在我们知道问题是什么了,那么可以采用哪种方法(或多种方法)来解决它呢?在本节中,我们将介绍一些可用于检测图像物体的技术。先从最简单的方法开始,从那里找到我们的方式。如果您对下面提及的方法有任何建议或者有相应的替代方法,请在评论部分告诉我们!

方法1:原始的方式(分而治之)

最简单方法是将图像分为四个部分:

左上角

右上角

左下角

右下角

现在,下一步就是把每一部分图像都交给图像分类器进行识别。这样,我们会得到每一部分图像中是否有行人的输出结果。如果有,便在原图像中标记该区域。输出结果类似这样:

这是开始尝试的一个很好的方法,但我们在寻求更加精确和准确的系统。它需要识别整个物体(或者是在本例中的人),因为仅仅识别物体的某些部分可能会导致灾难性的后果。

方法2:增加分割数量

先前的系统效果不错,但是我们还能如何改进呢?我们可以通过指数地增加我们输入系统的选框的数量来提高精确度。输出结果应该是这样:

这个方法有利有弊。尽管我们的解决方案看起来比原始的方法好一点点,但是它粗筛出很多的选框,实际结果基本一样。这是一个问题,我们需要一个更有条理的方法来解决这个问题问题。

方法3:展示结构严密的分区

为了用一种更有条理的方法构建我们的物体检测系统,我们可以按以下步骤操作:

步骤1:把图像划分成10x10的格子,如图所示:

步骤2:定义每个区域的质心。

步骤3:对于每一个质心,选取3个高度和纵横比不同的区域如下:

步骤4:将所有这些创建的区域传入图像分类器来获得预测结果。

所以最终输出结果是什么样呢?一个更加确定且严密有序的结果——见下图:

但我们还可以进一步改进!继续阅读以了解另一种能产生更好结果的方法。

方法4:提高效率

先前我们看到的方法在很大程度上是可以接受的,但我们还可以构建一个比之前更加高效的系统。你能建议怎么做吗?在我脑海中,我能提出一个优化方案。如果我们思考一下方法3,可以做两件事来让模型更好:

增加网格的大小:将网格大小增加到20,替代原有的10:

以多种高度和纵横比选取更多区域而不仅是3个区域:在这里,我们可以围绕每一个锚定质心选取9种形状的区域,即3个不同高度的正方形区域和6个不同高度的垂直和水平的矩形区域,这会给我们提供不同纵横比的区域。

再次说明,这也是有利也有弊。尽管这些方法都能帮助我们达到一个更细致的水平,但是由于我们不得不把所有区域传入到图像分类模型中,这会再次造成计算爆炸。

我们能够做的是,有选择性地选取区域而不是全都选取。举个例子,我们能够构建一个中间分类模型,它尝试预测选区是否真的只有背景,还是潜在地包含一个物体,这会指数式地减少图像分类模型所需要判断的区域。

还有另一种优化方案,就是减少“同一物体”的预测。让我们再次回顾方法3:

就像你看到的一样,基本上所有的选框预测的都是同一个人,我们可以选择其中任意一个。因此,我们可以考虑从标记“同一物体”的所有选框中,任选一个最有可能检测出一个人的选框输入图像分类模型中,进行预测。

目前,所有这些优化方案都给了我们相当合适的预测结果。我们几乎稳操胜券,但你猜出缺了什么吗?深度学习!

方法5:使用深度学习进行特征选择以构建端到端方法

深度学习在物体检测领域有很大的潜力。你能否建议我们从哪里以及如何使用深度学习解决我们的问题吗?我已经列出一些方法,如下:

可以通过神经网络输入原始图像来减少维度,而不是输入原始图像的所有区域。

还可以使用神经网络来限定图像区域的选择。

可以强化深度学习算法,使预测尽可能地接近图像中物体的原始边界框,这将确保算法能够更严格地、更精细地预测边界框。

现在我们可以采用单个深度神经网络模型,来尝试独自解决所有问题,而不是训练不同的神经网络来解决每一个问题。这样做的好处是,神经网络中每个较小的组件都将有助于优化该神经网络的其他部分,从而便于我们合作,共同训练整个深层模型。

目前为止,在我们看过的所有方法中,我们的输出结果能够提供最佳性能,有点类似于下图。我们将在下一节中看到如何使用Python创建它。

获取技术:如何使用ImageAI库

构建物体检测模型

现在我们知道了什么是物体检测以及解决此问题的最佳方法,让我们构建自己的对象检测系统!我们即将使用的是ImageAI库,这是一个python库,支持计算机视觉任务中所有最先进的机器学习算法。

运行物体检测模型获得预测是非常简单的。我们不必从复杂的安装脚本来开始,甚至也不需要GPU来生成预测!我们将使用这个ImageAI库来获得在方法5中所看到的输出结果。强烈建议您在自己的机器上输入下面的代码,因为这可以帮助您能够从本节中获得最大的知识。

请注意,您需要在创建物体检测模型之前设置系统。在本地系统中安装Anaconda后,即可开始执行以下步骤。

步骤1:使用python 3.6版搭建Anaconda环境。

conda create -nretinanet python=3.6 anaconda

conda create -nretinanet python=3.6 anaconda

步骤2:激活环境并安装必要的软件包。

source activateretinanet

conda installtensorflow numpy scipy opencv pillow matplotlib h5py keras

source activateretinanet

conda installtensorflow numpy scipy opencv pillow matplotlib h5py keras

步骤3:安装ImageAI库

pip install https://github.com/OlafenwaMoses /ImageAI/releases/download/2.0.1/imageai-2.0.1-py3-none-any.whl

pip install https://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

https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/resnet50_coco_best_v2.0.1.h5

步骤5:将下载的文件复制到当前工作文件夹。

步骤6:从以下链接下载图像,将图像命名为image.png:

https://s3-ap-south-1.amazonaws.com/av-blog-media/wp-content/uploads/2018/06/I1_2009_09_08_drive_0012_001351-768x223.png

https://s3-ap-south-1.amazonaws.com/av-blog-media/wp-content/uploads/2018/06/I1_2009_09_08_drive_0012_001351-768x223.png

步骤7:打开jupyter笔记本(在终端中键入jupyter notebook)并运行以下代码:

from imageai.Detection import ObjectDetection

import os

execution_path = os.getcwd()

detector = ObjectDetection()

detector.setModelTypeAsRetinaNet()

detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5"))

detector.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)

for eachObject in detections:

print(eachObject["name"] + " : " + eachObject["percentage_probability"] )

print("--------------------------------")

from imageai.Detection import ObjectDetection

import os

execution_path = os.getcwd()

detector = ObjectDetection()

detector.setModelTypeAsRetinaNet()

detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5"))

detector.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)

for eachObject in detections:

print(eachObject["name"] + " : " + eachObject["percentage_probability"] )

print("--------------------------------")

这将创建一个名为image_new.png的修改后的图像文件,其中包含物体的边界框。

步骤8:如需要打印图像,请使用以下代码:

from IPython.display import Image

Image("image_new.png")

from IPython.display import Image

Image("image_new.png")

恭喜!您已为行人检测创建了自己的物体检测模型。这太棒啦!

结语

在本文中,我们了解了什么是物体检测以及创建物体检测模型的思路,还学习了如何使用ImageAI库构建行行人检测模型。

通过微调代码,您可以轻松地转换模型以解决自己的物体检测挑战。如果您已经使用过上述方法解决了这样的问题,特别是社会方面的,请在下面的评论中告诉我们!

原文标题:

Understandingand Building an Object Detection Model from Scratch in Python

原文链接:

https://www.analyticsvidhya.com/blog/2018/06/understanding-building-object-detection-model-python/

觉得本文对你有帮助?请分享给更多人

关注「Python开发者」加星标,提升Python技能

用python做视觉检测系统_教你用 Python 做一个物体检测系统相关推荐

  1. python利用自动识别写模块_教你用Python 实现自动导入缺失的库

    在写 Python 项目的时候,我们可能经常会遇到导入模块失败的错误:ImportError: No module named 'xxx' 或者 ModuleNotFoundError: No mod ...

  2. 使用python 处理表格生成图表_教你用Python自动读取数据生成图表,产生的效益很可观...

    厌烦了每次都要在Excel里拖动数据来生成图形吧,这篇文章里,教你用Python自动读取Excel数据生成图表,然后Python 使用XlsxWriter模块在Excel工作表中绘制带有数据表的柱形图 ...

  3. python画动态爱心代码_教你用python画动态爱心表白

    原标题:教你用python画动态爱心表白 初级画心 学Python,感觉你们的都好复杂,那我来个简单的,我是直接把心形看作是一个正方形+两个半圆: 于是这就很简单了,十行代码解决: import tu ...

  4. python写邮箱系统_教大家用Python写一个简单电子邮件发信器

    嘛~炎热的暑假大家都在家干些啥呢?up主本人每天就是摸鱼哒!为了让这个懒懒的up每天从床上早点爬起来,我可是立了不少flag呢~那就先不多说了,直接开始正文吧. 声明一下,本文内容为原创,如果引用其他 ...

  5. python作品简单手工做法_教你用塑料瓶做一款简易的小汽车

    小孩子喜欢的玩的电动车玩具,其实家长不用花钱买也可以自己动手做,今天的变废为宝DIY教你怎样利用废弃的饮料瓶子手工DIY简易小汽车.只需要装好电池就能启动,好玩简单,而且可以发挥特长将它做成各种外形. ...

  6. python成绩查询系统_教你用python爬虫监控教务系统,查成绩快人一步!

    importdatetimeimporttimefrom email.header importHeaderimportrequestsimportreimportsmtplibfrom email. ...

  7. python自动回复机器人手机版_教你用python做一个哄女友的微信自动回复机器人

    虽然题目是这样的,但是为了两人的幸福,还是尽量不要这么敷衍你的女朋友,毕竟这个世上还是有很多单身狗存在的 . 这是一个github最近刚刚上传的一个开源项目,短短几天就已经有了3000+star,原本 ...

  8. python的界面文字翻译_教你用Python实现微信翻译机器人

    相信大家在日常学习或者是阅读英文文章的过程中,难免会出现几个不认识的单词,或者想快速翻译某段英文的意思. 今天,利用Python爬虫等知识,教大家打造一个微信下的翻译小助手.好吧,开始干活. 先来看看 ...

  9. python怎么变成动图_教你用 Python 生成 GIF 动图 !

    最近啊 ,微信订阅号改变频繁 ,很多读者后台说 :小詹啊 ,我总是容易错过你公号的消息 ,现在没有置顶功能很难过啊 ! 不止你们难过 ,订阅号的作者恐怕更难过 !现在人人公众号时代 ,大家关注的公众号 ...

最新文章

  1. 12,缓冲运动。匀速运动停止条件
  2. [学习]GridView 学习集合 -- GridView中使用超链接的技巧
  3. 【转】HTML全解(1)
  4. Programe_Of_Beauty :3.9 重建二叉树
  5. html5 video修改默认样式,HTML5中将video设置为背景的方法
  6. Replace Array with Object(以对象取代数组)
  7. python教材答案第四章_python核心编程课后习题解答第四章
  8. 鸟哥Linux私房菜_基础篇(第二版)_第十章学习笔记
  9. Games 图形学 L2线性代数
  10. 定时清理elasticsearch索引和数据
  11. elementui 做删除,分页页码不正确
  12. Common IO 使用小结
  13. three.js 08-03 之 加载和保存对象
  14. linux下(centos7)fisheye与crucible破解教程--亲测有用
  15. 英语好不好,不影响做外贸
  16. 解决MacBook浏览器打开北京工作居住证系统问题
  17. 【023】Springboot+vue+mysql员工考勤管理系统(多角色登录、请假、打卡)(含源码、数据库、运行教程)
  18. Cg学习记录002 之Uniform参数
  19. [LeetCode]122. Best Time to Buy and Sell Stock II
  20. mac压缩zip android,【已解决】Mac中如何解压cpgz的压缩文件

热门文章

  1. 小学语文三年级阅读理解专项练习附答案~花坛
  2. Android滑动头部控件
  3. 软件定制开发与软件外包有什么区别 ?
  4. bootstrap-fileinput上传文件插件按钮展示隐藏
  5. 大数据算法_大数据算法解析,如何创建用户画像实现千人千面?
  6. 随机森林预测财务报表是否舞弊
  7. 垃圾的LinkedIn(领英)网站
  8. #SORA#celery原生配置文件研究
  9. 如何设计动态股权分配方案
  10. 人生路漫漫,如何走下去