[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~

上一篇文章是图像处理的最后一篇文章,写到这里,第一阶段的44篇Python图像处理就介绍完毕。接下来我们进入Python图像识别第二阶段,该部分主要以目标检测、图像识别以及深度学习相关图像分类为主,将会分享近50篇文章,感谢您一如至往的支持。作者也会继续加油的!

本文主要介绍目标检测原理,通过七个问题来普及什么是目标检测。然后利用ImageAI实现最简单的目标检测案例,加深读者的印象。希望您喜欢,且看且珍惜。

文章目录

  • 一.目标检测入门普及
    • 1.什么是目标检测?
    • 2.目标检测的核心问题是什么?
    • 3.目标检测算法常用分类
    • 4.目标检测常见算法
    • 5.目标检测应用
    • 6.目标检测未来挑战
    • 7.目标检测原理简述
  • 二.ImageAI简介
  • 三.安装流程
  • 四.TinyYOLOv3模型对象检测案例
    • 1.案例实现
    • 2.学习建议
  • 五.总结

万字长文整理,希望对您有所帮助。同时,该部分知识均为作者查阅资料撰写总结,并且开设成了收费专栏,为小宝赚点奶粉钱,感谢您的抬爱。如果有问题随时私聊我,只望您能从这个系列中学到知识,一起加油。代码下载地址(如果喜欢记得star,一定喔):

  • https://github.com/eastmountyxz/ImageProcessing-Python

图像识别:

  • [Python图像识别] 四十五.对象检测案例入门及ImageAI基础用法 (1)

图像处理:

  • [Python图像处理] 一.图像处理基础知识及OpenCV入门函数
  • [Python图像处理] 二.OpenCV+Numpy库读取与修改像素
  • [Python图像处理] 三.获取图像属性、兴趣ROI区域及通道处理
  • [Python图像处理] 四.图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波
  • [Python图像处理] 五.图像融合、加法运算及图像类型转换
  • [Python图像处理] 六.图像缩放、图像旋转、图像翻转与图像平移
  • [Python图像处理] 七.图像阈值化处理及算法对比
  • [Python图像处理] 八.图像腐蚀与图像膨胀
  • [Python图像处理] 九.形态学之图像开运算、闭运算、梯度运算
  • [Python图像处理] 十.形态学之图像顶帽运算和黑帽运算
  • [Python图像处理] 十一.灰度直方图概念及OpenCV绘制直方图
  • [Python图像处理] 十二.图像几何变换之图像仿射变换、图像透视变换和图像校正
  • [Python图像处理] 十三.基于灰度三维图的图像顶帽运算和黑帽运算
  • [Python图像处理] 十四.基于OpenCV和像素处理的图像灰度化处理
  • [Python图像处理] 十五.图像的灰度线性变换
  • [Python图像处理] 十六.图像的灰度非线性变换之对数变换、伽马变换
  • [Python图像处理] 十七.图像锐化与边缘检测之Roberts算子、Prewitt算子、Sobel算子和Laplacian算子
  • [Python图像处理] 十八.图像锐化与边缘检测之Scharr算子、Canny算子和LOG算子
  • [Python图像处理] 十九.图像分割之基于K-Means聚类的区域分割
  • [Python图像处理] 二十.图像量化处理和采样处理及局部马赛克特效
  • [Python图像处理] 二十一.图像金字塔之图像向下取样和向上取样
  • [Python图像处理] 二十二.Python图像傅里叶变换原理及实现
  • [Python图像处理] 二十三.傅里叶变换之高通滤波和低通滤波
  • [Python图像处理] 二十四.图像特效处理之毛玻璃、浮雕和油漆特效
  • [Python图像处理] 二十五.图像特效处理之素描、怀旧、光照、流年以及滤镜特效
  • [Python图像处理] 二十六.图像分类原理及基于KNN、朴素贝叶斯算法的图像分类案例
  • [Python图像处理] 二十七.OpenGL入门及绘制基本图形(一)
  • [Python图像处理] 二十八.OpenCV快速实现人脸检测及视频中的人脸
  • [Python图像处理] 二十九.MoviePy视频编辑库实现抖音短视频剪切合并操作
  • [Python图像处理] 三十.图像量化及采样处理万字详细总结(推荐)
  • [Python图像处理] 三十一.图像点运算处理两万字详细总结(灰度化处理、阈值化处理)
  • [Python图像处理] 三十二.傅里叶变换(图像去噪)与霍夫变换(特征识别)万字详细总结
  • [Python图像处理] 三十三.图像各种特效处理及原理万字详解(毛玻璃、浮雕、素描、怀旧、流年、滤镜等)
  • [Python图像处理] 三十四.数字图像处理基础与几何图形绘制万字详解(推荐)
  • [Python图像处理] 三十五.OpenCV图像处理入门、算数逻辑运算与图像融合(推荐)
  • [Python图像处理] 三十六.OpenCV图像几何变换万字详解(平移缩放旋转、镜像仿射透视)
  • [Python图像处理] 三十七.OpenCV和Matplotlib绘制直方图万字详解(掩膜直方图、H-S直方图、黑夜白天判断)
  • [Python图像处理] 三十八.OpenCV图像增强万字详解(直方图均衡化、局部直方图均衡化、自动色彩均衡化)
  • [Python图像处理] 三十九.Python图像分类万字详解(贝叶斯图像分类、KNN图像分类、DNN图像分类)
  • [Python图像处理] 四十.全网首发Python图像分割万字详解(阈值分割、边缘分割、纹理分割、分水岭算法、K-Means分割、漫水填充分割、区域定位)
  • [Python图像处理] 四十一.Python图像平滑万字详解(均值滤波、方框滤波、高斯滤波、中值滤波、双边滤波)
  • [Python图像处理] 四十二.Python图像锐化及边缘检测万字详解(Roberts、Prewitt、Sobel、Laplacian、Canny、LOG)
  • [Python图像处理] 四十三.Python图像形态学处理万字详解(腐蚀膨胀、开闭运算、梯度顶帽黑帽运算)
  • 万字长文告诉新手如何学习Python图像处理(上篇完结 四十四)

一.目标检测入门普及

该部分结合自己多年图像识别的经验,并参考图像算法AI(yegeli)、Zhengxia Zou、牛戈和SIGAI老师们的文章进行总结。主要通过七个核心问题带领初学者了解什么是目标检测。

1.什么是目标检测?

目标检测(Object Detection)旨在寻找出图像中所有感兴趣的目标物体或对象,包含物体定位和物体分类两个子任务,同时确定它们的类别和位置。如下图所示,通过卷积神经网络有效定位猫的轮廓及类别。

目标检测是计算机视觉领域中最基本、最具挑战性的问题之一,近年来受到了广泛的关注。它在过去二十年的发展可以说是计算机视觉历史的缩影。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡、天气、分辨率、景深等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题,并且目标检测的结果将直接影响后续的跟踪、动作识别和行为描述的效果。因此,目标检测发展到今天仍然是非常具有挑战且存在很大提升空间的问题。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第1张图片


2.目标检测的核心问题是什么?

在计算机视觉领域,图像识别主要包括四大类任务:

  • 分类(Classification)
    解决“是什么?”问题,即给定一张图片或一段视频判断里面包含什么类别的目标。
  • 定位(Location)
    解决“在哪里?”问题,即定位出这个目标的的位置。
  • 检测(Detection)
    解决“在哪里?是什么?”问题,即定位出这个目标的位置并且知道目标物是什么。
  • 分割(Segmentation)
    包括实例分割(Instance-level)和场景分割(Scene-level),解决“每一个像素属于哪个目标物或场景”的问题。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第2张图片

如上图所示(引用yegeli老师,推荐大家关注),目标检测主要是实现分类问题和定位问题的叠加。其核心问题即:

  • 分类问题:确定图片(或某个区域)中的图像属于哪个类别。
  • 定位问题:目标可能出现在图像的任何位置。

同时,需要解决大小问题(目标存在各种不同的大小)和形状问题(目标可能有各种不同的形状)。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第3张图片


3.目标检测算法常用分类

每个领域的分类方法通常各式各样,这里主要介绍两种分类方法。

(1) 基于应用程序的角度分类
目标检测作为计算机视觉的基本问题之一,是许多其他计算机视觉任务的基础,如实例分割、图像字幕、对象跟踪等。从应用程序的角度来看,目标检测可以被分为两个研究主题:

  • general object detection
    旨在探索统一框架下检测不同类型物体的方法,以模拟人类的视觉和认知。

  • detection applications
    指特定应用场景下的检测,如行人检测、人脸检测、文本检测等。

近年来,随着深度学习技术的快速发展,为目标检测注入了新的血液,取得了显著的突破,将其推向了一个前所未有的研究热点。目前,目标检测已广泛应用于自主驾驶、机器人视觉、视频监控等领域。下图显示了过去二十年中与“目标检测”相关的出版物数量的增长。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第4张图片

(2) 基于深度学习的目标检测分类
基于深度学习的目标检测算法主要分为两类:Two stage和One stage。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第5张图片

  • Two stage
    Two-stage Detection将检测框定为一个“从粗到细”的过程。先进行区域生成,该区域称之为Region Proposal(简称RP,一个有可能包含待检物体的预选框),再通过卷积神经网络进行样本分类。
    任务流程:特征提取 => 生成RP => 分类/定位回归,常见tow stage目标检测算法有:
    – R-CNN
    – SPP-Net
    – Fast R-CNN
    – Faster R-CNN
    – R-FCN
    – …

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第6张图片

  • One stage
    One-stage Detection定义为 “ 一步完成 ”过程。不用RP,直接在网络中提取特征来预测物体分类和位置。
    任务流程:特征提取 => 分类/定位回归,常见one stage目标检测算法有:
    – OverFeat
    – YOLOv1
    – YOLOv2
    – YOLOv3
    – SSD
    – RetinaNet
    – …

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第7张图片


4.目标检测常见算法

在过去的二十年中,人们普遍认为,目标检测的发展大致经历了两个历史时期:“ 传统的目标检测时期 ” ( 2014年以前 ) 和 “ 基于深度学习的检测时期 ” ( 2014年以后 ),其发展历程如下图所示。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第8张图片

下面分别列举了各里程碑式的目标检测算法,后续博客会分别进行详细介绍及编程案例实现。

(1) 传统检测器(Traditional Detectors)
早期的目标检测算法大多是基于手工特征构建的。由于当时缺乏有效的图像表示,人们只能设计复杂的特征表示,以及各种加速技术来用尽有限的计算资源。

  • Viola Jones Detectors
    2001年,P. Viola和M. Jones在没有任何约束条件(如肤色分割)的情况下首次实现了人脸的实时检测。VJ检测器采用滑动窗口最直接的检测方法,查看图像中所有可能的位置和比例,看看是否有窗口包含人脸。其检测器结合了 “积分图像”、“特征选择” 和 “检测级联” 三种重要技术,大大提高了检测速度。

  • HOG Detector
    方向梯度直方图(HOG)特征描述符最初是由N. Dalal和B.Triggs在2005年提出的。HOG可以被认为是对当时的尺度不变特征变换和形状上下文的重要改进。多年来,HOG检测器一直是许多目标检测器和各种计算机视觉应用的重要基础。

  • Deformable Part-based Model (基于可变形部件的模型,DPM)
    DPM最初是由P. Felzenszwalb提出的,于2008年作为HOG检测器的扩展。DPM遵循“分而治之”的检测思想,训练可以简单地看作是学习一种正确的分解对象的方法,推理可以看作是对不同对象部件的检测的集合。例如,检测“汽车”的问题可以看作是检测它的窗口、车身和车轮。

(2) CNN based Two-stage Detectors
随着手工特征的性能趋于饱和,目标检测在2010年之后达到了一个稳定的水平。2012年卷积神经网络在世界范围内重生。由于深度卷积网络能够学习图像的鲁棒性和高层次特征表示,一个自然的问题是我们能否将其应用到目标检测中?

在2014年,R. Girshick等人率先打破僵局,提出了具有CNN特征的区域(RCNN)用于目标检测。从那时起,目标检测开始以前所未有的速度发展。在深度学习时代,目标检测可以分为两类,即 two-stage detection 和 one-stage detection,分别对应“从粗到细”的检测过程和“一步完成”的检测过程。

  • RCNN
    RCNN首先通过选择性搜索提取一组对象候选框。然后,每个提案都被重新调整成一个固定大小的图像,并输入到一个在 ImageNet 上训练得到的CNN模型 ( 如AlexNet) 来提取特征。最后,利用线性SVM分类器对每个区域内的目标进行预测,识别目标类别。

  • SPPNet
    2014年,K. He等人提出了空间金字塔池化网络 ( Spatial Pyramid Pooling Networks,SPPNet ) 。以前的CNN模型需要固定大小的输入,例如,AlexNet需要224x224图像。SPPNet主要贡献是引入了空间金字塔池化(SPP)层,它使CNN能够生成固定长度的表示,而不需要重新缩放图像/感兴趣区域的大小。利用SPPNet进行目标检测时,只对整个图像进行一次特征映射计算,然后生成任意区域的定长表示,训练检测器,避免了卷积特征的重复计算。

  • Fast RCNN
    2015年,R. Girshick提出了 Fast RCNN 检测器,这是对 R-CNN和SPPNet的进一步改进。Fast-RCNN融合了R-CNN和SPPNet的优点,使我们能够在相同的网络配置下同时训练检测器和边界框回归器。

  • Faster RCNN
    2015年,S. Ren等人提出了 Faster RCNN 检测器,在 Fast RCNN 之后不久。Faster RCNN是第一个端到端的,也是第一个接近实时的深度学习检测器。Faster RCNN 主要贡献是引入了区域建议网络 ( RPN ),使几乎cost-free的区域建议成为可能。从RCNN到Faster RCNN,一个目标检测系统中的大部分独立块,如提案检测、特征提取、边界框回归等,都已经逐渐集成到一个统一的端到端学习框架中。

  • Feature Pyramid Networks(FPN)
    2017年,T.-Y.Lin等人基于 Faster RCNN 提出了特征金字塔网络 ( FPN )。在FPN之前,大多数基于深度学习的检测器只在网络的顶层进行检测。虽然CNN较深层的特征有利于分类识别,但不利于对象的定位。为此,开发了具有横向连接的自顶向下体系结构,用于在所有级别构建高级语义。由于CNN通过它的正向传播,自然形成了一个特征金字塔,FPN在检测各种尺度的目标方面显示出了巨大的进步。FPN现在已经成为许多最新探测器的基本组成部分。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第9张图片

(3) CNN based One-stage Detectors

  • You Only Look Once (YOLO)
    YOLO由R. Joseph等人于2015年提出,它是深度学习时代的第一个单级检测器。YOLO是“You Only Look Once”的缩写,其速度较快。从它的名字可以看出,作者完全抛弃了之前的“提案检测+验证”的检测范式。相反,它遵循一个完全不同的哲学:将单个神经网络应用于整个图像。该网络将图像分割成多个区域,同时预测每个区域的边界框和概率。后来R. Joseph在 YOLO 的基础上进行了一系列改进,提出了其 v2 和 v3 版本,在保持很高检测速度的同时进一步提高了检测精度。尽管与两级探测器相比,它的探测速度有了很大的提高,但是YOLO的定位精度有所下降,特别是对于一些小目标。

  • Single Shot MultiBox Detector (SSD)
    SSD由W. Liu等人于2015年提出,这是深度学习时代的第二款单级探测器。SSD的主要贡献是引入了多参考和多分辨率检测技术,这大大提高了单级检测器的检测精度,特别是对于一些小目标。SSD与以往任何检测器的主要区别在于,前者在网络的不同层检测不同尺度的对象,而后者仅在其顶层运行检测。

  • RetinaNet
    单级检测器速度快、结构简单,但多年来一直落后于两级检测器的精度。T.-Y.Lin等人发现了背后的原因,并在2017年提出了RetinaNet。他们声称,在密集探测器训练过程中所遇到的极端的前景-背景阶层不平衡(the extreme foreground-background class imbalance)是主要原因。为此,在 RetinaNet 中引入了一个新的损失函数“焦损失(focal loss)”,通过对标准交叉熵损失的重构,使检测器在训练过程中更加关注难分类的样本。焦损耗使得单级检测器在保持很高的检测速度的同时,可以达到与两级检测器相当的精度。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第10张图片

建立具有更少偏置的大数据集,是开发先进的计算机视觉算法的关键。在目标检测方面,在过去10年中,已经发布了许多著名的数据集和基准测试,包括 PASCAL VOC 挑战的数据集(如VOC2007、VOC2012)、ImageNet大尺度视觉识别挑战(如ILSVRC2014)、MS-COCO检测挑战等。表1给出了这些数据集的统计数据。下图显示了这些数据集的一些图像示例。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第11张图片

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第12张图片


5.目标检测应用

  • 车辆检测
    自动驾驶、违章查询、关键通道检测、广告检测(检测广告中的车辆类型,弹出链接)等。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第13张图片

  • 人脸检测
    人脸支付、智能门控、考勤签到、智慧超市、车站机场实名认证、公共安全(逃犯抓捕、走失人员检测)等。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第14张图片

  • 行人检测
    步态识别、智能辅助驾驶、智能监控、暴恐检测(根据面相识别暴恐倾向)、移动侦测、区域入侵检测、安全帽/安全带检测等。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第15张图片

  • 遥感检测
    大地遥感(如土地使用、公路、水渠、河流监控)、农作物监控、工业检测、JS检测等。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第16张图片


6.目标检测未来挑战

近20年来,目标检测取得了显著的成就。包括里程碑检测器、关键技术、加速方法、检测应用、数据集和指标,,如VJ、HOG、DPM、Faster-RCNN、YOLO、SSD等。未来的目标检测研究可能会集中在以下几个方面:

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第17张图片

  • 加快检测算法的速度(Lightweight object detection)
    使其能够在移动设备上平稳运行。一些重要的应用包括移动增强现实、智能摄像头、人脸验证等。虽然近年来已经做了很大的努力,但机器和人眼之间的速度差距仍然很大,特别是在检测一些小物体时。

  • 自动机器学习目标检测(Detection meets AutoML)
    近年来,基于深度学习的检测器变得越来越复杂,严重依赖于经验。未来的方向是在使用神经结构搜索设计检测模型时减少人为干预 ,譬如如何设计引擎和如何设置锚框 ) 。AutoML可能是未来的目标检测。

  • 领域自适应检测(Detection meets domain adaptation)
    任何目标检测器的训练过程本质上都可以看作是一个假设数据独立且同分布(i.i.d)时的似然估计过程。使用非 i.i.d 数据的目标检测,特别是对一些实际应用程序来说,仍然是一个挑战。GAN在领域自适应方面显示出良好的应用前景,对未来的目标检测具有重要的指导意义。

  • 弱监督检测(Weakly supervised detection)
    基于深度学习的检测器的训练通常依赖于大量注释良好的图像。注释过程耗时、开销大且效率低。开发弱监督检测技术,只使用图像级标注或部分使用边界框标注对检测器进行训练,对于降低人工成本和提高检测灵活性具有重要意义。

  • 小目标检测(Small object detection)
    在大场景中检测小物体一直是一个挑战。该研究方向的一些潜在应用包括利用遥感图像计算野生动物的数量和检测一些重要JS目标的状态。进一步的方向可能包括视觉注意机制的集成和高分辨率轻量级网络的设计。

  • 视频目标检测(Detection in videos)
    高清视频中的实时目标检测/跟踪对于视频监控和自主驾驶具有重要意义。传统的目标检测器通常设计为基于图像的检测,而忽略了视频帧之间的相关性。通过探索时空相关性来改进检测是一个重要的研究方向。

  • 含信息融合的目标检测(Detection with information fusion)
    RGB-D图像、三维点云、激光雷达等多数据源/多模式的目标检测对自主驾驶和无人机应用具有重要意义。目前存在的问题包括:如何将训练有素的检测器移植到不同的数据模式,如何进行信息融合以提高检测能力等。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第18张图片


7.目标检测原理简述

目标检测分为两大系列——RCNN系列和YOLO系列,RCNN系列是基于区域检测的代表性算法,YOLO是基于区域提取的代表性算法,另外还有著名的SSD是基于前两个系列的改进。基本原理包括:

(1) 候选区域产生
目标检测技术大都会涉及候选框(bounding boxes)的生成,物体候选框获取当前主要使用图像分割与区域生长技术。区域生长(合并)主要由于检测图像中存在的物体具有局部区域相似性(颜色、纹理等)。目标识别与图像分割技术的发展进一步推动有效提取图像中信息。

  • 滑动窗口
    ① 首先对输入图像进行不同窗口大小的滑窗进行从左往右、从上到下的滑动。每次滑动时候对当前窗口执行分类器(分类器是事先训练好的)。如果当前窗口得到较高的分类概率,则认为检测到了物体。② 对每个不同窗口大小的滑窗都进行检测后,会得到不同窗口检测到的物体标记,这些窗口大小会存在重复较高的部分,接着采用非极大值抑制(Non-Maximum Suppression, NMS)的方法进行筛选。③ 最终经过NMS筛选后获得检测到的物体。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第19张图片

  • 选择性搜索
    图像中物体可能存在的区域应该是有某些相似性或者连续性区域的。因此,选择搜索基于上面这一想法采用子区域合并的方法进行提取bounding boxes。① 首先对输入图像进行分割算法产生许多小的子区域。② 根据这些子区域之间相似性(相似性标准主要有颜色、纹理、大小等)进行区域合并,不断的进行区域迭代合并。每次迭代过程中对这些合并的子区域做bounding boxes(外切矩形),这些子区域外切矩形就是通常所说的候选框。最终提高检测物体的概率。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第20张图片

(2) 数据表示
经过标记后的样本数据如下所示:

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第21张图片

预测输出可以表示如下,其中pc为预测结果的置信概率,(bx,by,bw,bh)是边框坐标,Ci为属于某个类别的概率。通过预测结果、实际结果,构建损失函数。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第22张图片

(3) 效果评估
使用IoU(Intersection over Union,交并比)来判断模型的好坏。交并比是指预测边框、实际边框交集和并集的比率,一般约定0.5为一个可以接收的值。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第23张图片

(4) 非极大值抑制
预测结果中,可能多个预测结果间存在重叠部分,需要保留交并比最大的、去掉非最大的预测结果,这就是非极大值抑制(Non-Maximum Suppression,简写作NMS)。如下图所示,对同一个物体预测结果包含三个概率0.8、0.9、0.95,经过非极大值抑制后,仅保留概率最大的预测结果。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第24张图片

写到这里,一个简单的目标检测过程介绍完毕。接下来我们重点使用ImageAI库实现最简单的目标检测或对象检测案例。这部分原理应用了yegeli老师的博客。

参加及推荐文章,大家可以关注并前往学习。

  • 目标检测(Object Detection) - 图像算法AI yegeli老师
  • https://arxiv.org/abs/1905.05055v2
  • Object Detection in 20 Years: A Survey 综述:目标检测的二十年 - 牛戈老师
  • 目标检测最新进展总结与展望 - SIGAI老师
  • 论文笔记-2019-Object Detection in 20 Years: A Survey

二.ImageAI简介

ImageAI是一个开源Python库,旨在使开发人员能够使用简单的几行代码构建具有包含深度学习和计算机视觉功能的应用程序和系统。 这个AI Commons项目由Moses Olafenwa和John Olafenwa开发和维护。官方源码及文档如下:

  • https://github.com/OlafenwaMoses/ImageAI
  • https://imageai-cn.readthedocs.io/zh_CN/latest/

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第25张图片

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第26张图片

ImageAI本着简洁的原则,支持最先进的机器学习算法,用于 图像预测自定义图像预测物体检测视频检测视频对象跟踪图像预测训练。ImageAI目前支持使用在ImageNet-1000数据集上训练的4种不同机器学习算法进行图像预测和训练。ImageAI还支持使用在COCO数据集上训练的RetinaNetYOLOv3TinyYOLOv3 进行对象检测、视频检测和对象跟踪。 最终,ImageAI将为计算机视觉提供更广泛和更专业化的支持,包括但不限于特殊环境和特殊领域的图像识别。

  • 新版本:ImageAI 2.1.6

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第27张图片

新添加功能:

  • 添加了SqueezeNet、ResNet50、InceptionV3 和 DenseNet121 模型进行自定义图像预测训练
  • 添加了自定义训练模型和json文件进行导入和导出自定义图像
  • 预览版:添加视频对象检测和视频自定义对象检测(对象跟踪)
  • 为所有图像预测和对象检测任务添加文件,numpy数组和流输入类型
  • 添加文件和numpy数组输出类型,用于图像中的对象检测和自定义对象检测
  • 引入4种速度模式(normal, fast, faster 和 fastest)进行图像预测,在fastest速度模式下预测时间将缩短50%,同时保持预测精准度
  • 为图像所有物体检测和视频物体检测任务引入5种速度模式(normal, fast, faster, fastest 和 flash)
  • 引入帧检测率,允许开发人员调整视频中的检测间隔frame_detection_interval,有利于达到特定效果

ImageAI核心功能如下:

1.图像检测
ImageAI提供 4 种不同的算法和模型类型来执行图像预测,并在ImageNet-1000数据集上进行训练。为图像预测提供的4 种算法包括:

  • MobileNetV2
  • ResNet50
  • InceptionV3
  • DenseNet121

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第28张图片


2.对象检测
ImageAI提供了非常方便和强大的方法来对图像进行对象检测并从图像中提取每个对象。对象检测类提供对三种模型的支持,并提供针对最先进性能或实时处理进行调整的选项。

  • RetinaNet
  • YOLOv3
  • TinyYOLOv3

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第29张图片

person : 91.946941614151
--------------------------------
person : 73.61021637916565
--------------------------------
laptop : 90.24320840835571
--------------------------------
laptop : 73.6881673336029
--------------------------------
laptop : 95.16398310661316
--------------------------------
person : 87.10319399833679
--------------------------------

3.视频对象检测和跟踪
ImageAI提供了非常方便和强大的方法来执行视频中的对象检测和跟踪特定对象。提供的视频对象检测类仅支持当前最先进的RetinaNet,但可以选择调整最先进的性能或实时处理。下图展示了对人、自行车和摩托车的视频快照检测效果。

下面是ImageAI返回到“per_second”函数中的视频分析的可视化。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第30张图片


4.自定义模型训练
ImageAI为您提供了用于训练新模型的类和方法,该模型可用于对您自己的自定义对象进行预测。您可以在5行代码中使用算法训练您的自定义模型 。

  • SqueezeNet
  • ResNet50
  • InceptionV3
  • DenseNet

下图展示了来自IdenProf数据集的样本,用于训练预测专业人士的模型。

自定义图像预测:来自在 IdenProf 上训练的样本模型的预测,用于预测专业人士。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第31张图片

mechanic : 76.82620286941528
chef : 10.106072574853897
waiter : 4.036874696612358
police : 2.6663416996598244
pilot : 2.239348366856575

ImageAI提供了一些类和方法,供您使用通过ImageAI模型训练类训练的自己的模型来运行图像预测您自己的自定义对象。您可以使用SqueezeNet、ResNet50、InceptionV3和DenseNet训练的自定义模型以及包含自定义对象名称映射的JSON文件。


5.自定义检测模型训练
ImageAI提供类和方法供您在自定义数据集上训练新的YOLOv3对象检测模型。这意味着您可以通过提供图像、注释和使用 ImageAI 进行训练来训练模型以检测任何感兴趣的对象。

下图展示了自定义YOLOv3模型的检测结果,该模型经过训练以检测 Hololens 耳机。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第32张图片

hololens  :  39.69653248786926  :  [611, 74, 751, 154]
hololens  :  87.6643180847168  :  [23, 46, 90, 79]
hololens  :  89.25175070762634  :  [191, 66, 243, 95]
hololens  :  64.49641585350037  :  [437, 81, 514, 133]
hololens  :  91.78624749183655  :  [380, 113, 423, 138]

ImageAI现在提供类和方法,供您使用通过DetectionModelTraining类训练的自己的模型检测和识别图像中的自定义对象。您可以使用自定义训练的YOLOv3模式和训练期间生成的detection_config.json文件。


6.自定义视频对象检测和分析
来自自定义 YOLOv3 模型的视频检测结果,训练用于检测视频中的 Hololens 耳机。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第33张图片


三.安装流程

安装过程比较简单,直接调用pip工具即可。

  • pip install imageai --upgrade
  • pip install imageai-2.0.2-py3-none-any.whl
    Processing c:\users\xxx\downloads\imageai-2.0.2-py3-none-any.whl
(base) C:\Users\xiuzhang>activate tensorflow
(tensorflow) C:\Users\xiuzhang>cd Downloads

(tensorflow) C:\Users\xiuzhang\Downloads>pip install imageai-2.0.2-py3-none-any.whl
Processing c:\users\xiuzhang\downloads\imageai-2.0.2-py3-none-any.whl
Installing collected packages: imageai
Successfully installed imageai-2.0.2

本地安装下载链接如下:

  • https://github.com/OlafenwaMoses/ImageAI/releases/download/2.0.2/imageai-2.0.2-py3-none-any.whl

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第34张图片

依赖扩展包:

  • Python 3.5.1
  • Tensorflow 1.4.0
  • Numpy 1.13.1
  • SciPy 0.19.1
  • OpenCV
  • pillow
  • Matplotlib
  • h5py
  • Keras 2.x

四.TinyYOLOv3模型对象检测案例

1.案例实现

对象检测是计算机视觉领域中的一种技术,它处理识别和跟踪图像和视频中存在的对象。目标检测有多种应用,如人脸检测、车辆检测、行人计数、自动驾驶汽车、安全系统等。ImageAI提供了非常方便和强大的方法来对图像进行对象检测并从图像中提取每个对象。ImageAI 包含几乎所有最先进的深度学习算法的Python 实现,如RetinaNet、YOLOv3和 TinyYOLOv3。

ImageAI使用对象检测、视频检测和对象跟踪 API,无需访问网络即可调用。ImageAI使用预先训练的模型并且可以轻松定制。ImageAI中的 ObjectDetectionImageAI 库的类包含使用预训练模型对任何图像或图像集执行对象检测的函数。借助 ImageAI,可以检测和识别 80 种不同的常见日常物品。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第35张图片

下面开始实现一个简单的对象检测案例。

第一步,成功安装ImageAI后,下载包含将用于对象检测的分类模型的TinyYOLOv3模型文件。

  • https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/yolo-tiny.h5

第二步,创建如下图所示的文件夹。

  • Object-detection:根文件夹
  • models:存储预先训练的模型
  • input : 存储要执行对象检测的图像文件
  • output:存储检测到对象的图像文件

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第36张图片

│  test_detector.py
│
├─input
│      test_car.png
│
├─models
│      yolo-tiny.h5
│
└─output

第三步,创建test_detector.py文件,从ImageAI库导入ObjectDetection类。

from imageai.Detection import ObjectDetection

第四步,实例化ObjectDetection并指定相关的路径文件。

model_path = "./models/yolo-tiny.h5"
input_path = "./input/test_car-02.png"
output_path = "./output/pre_car-02.png"

detector = ObjectDetection()

第五步,利用实例化ObjectDetection类,调用其中的函数实现不同的功能。该类包含以下功能调用预先训练模式:

  • setModelTypeAsRetinaNet()
  • setModelTypeAsYOLOv3()
  • setModelTypeAsTinyYOLOv3()

第六步,使用预训练TinyYOLOv3模型,利用setModelTypeAsTinyYOLOv3()函数加载模型。

detector.setModelTypeAsTinyYOLOv3()

第七步,设置模型路径并实现图像对象检测。这里需要detectObjectsFromImage使用detector创建的对象,并输出结果。

detector.setModelPath(model_path)
detector.loadModel()
detection = detector.detectObjectsFromImage(input_image=input_path, 
                                            output_image_path=output_path)

完整代码如下图所示:

# -*- coding: utf-8 -*-
"""
Created on Mon Jul 26 14:26:27 2021
@author: xiuzhang
"""

from imageai.Detection import ObjectDetection

#实例化
detector = ObjectDetection()

#路径定义
model_path = "./models/yolo-tiny.h5"
input_path = "./input/test_car.png"
output_path = "./output/pre_car.png"

#预训练模式
detector.setModelTypeAsTinyYOLOv3()

#设置预训练模型路径
detector.setModelPath(model_path)

#加载模型
detector.loadModel()

#创建对象
detection = detector.detectObjectsFromImage(input_image=input_path, output_image_path=output_path)

#检测结果
for eachItem in detection:
    print(eachItem["name"] , " : ", eachItem["percentage_probability"])

输入图像如下图所示,位于input文件夹中。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第37张图片

输出结果如下图所示,可以看到不同列类别的预测概率及对应轮廓。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第38张图片

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第39张图片

同时,还可以预测其他的车辆及行人等。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第40张图片


2.学习建议

个人认为Python提供了良好的扩展包供大家学习,如果您对CV感兴趣,可以先阅读作者前面的图像处理系列文章。后面再进行目标检测的实验,而目标检测可以尝试先了解最简单调包的实现,后面再一步步告诉大家如果构建YOLO或SSD模型。

此外,Python开源库提供了强大的源代码,大家可以去学习及修改对应的功能。比如:

  • setModelTypeAsTinyYOLOv3函数原型

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第41张图片

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第42张图片

同时,该扩展包可以检测多种类型的对象,从上图源代码中可以看到,也可以看到绘制方块及Text的过程。

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第43张图片

后续作者会想办法尝试自定义数据集进行目标识别,比如农产品、飞行器、自然灾害等。

  • https://github.com/OlafenwaMoses/ImageAI/blob/master/imageai/Classification/CUSTOMCLASSIFICATION.md
from imageai.Classification.Custom import CustomImageClassification
import os

execution_path = os.getcwd()

prediction = CustomImageClassification()
prediction.setModelTypeAsResNet50()
prediction.setModelPath(os.path.join(execution_path, "idenprof_resnet_ex-056_acc-0.993062.h5"))
prediction.setJsonPath(os.path.join(execution_path, "idenprof.json"))
prediction.loadModel(num_objects=10)

predictions, probabilities = prediction.classifyImage(os.path.join(execution_path, "4.jpg"), result_count=5)

for eachPrediction, eachProbability in zip(predictions, probabilities):
    print(eachPrediction + " : " + eachProbability)

最后推荐刘兄的系列文章,也真心不错。

  • 深度学习和目标检测系列教程 2-300:小试牛刀,使用 ImageAI 进行对象检测

五.总结

写到这里,第一篇目标检测入门文章就介绍完毕,希望您喜欢。

  • 一.目标检测入门普及
    1.什么是目标检测?
    2.目标检测的核心问题是什么?
    3.目标检测算法常用分类
    4.目标检测常见算法
    5.目标检测应用
    6.目标检测未来挑战
    7.目标检测原理简述
  • 二.ImageAI简介
  • 三.安装流程
  • 四.TinyYOLOv3模型对象检测案例
    1.案例实现
    2.学习建议

[Python图像识别] 四十五.目标检测入门普及和ImageAI“傻瓜式”对象检测案例详解 (1)_第44张图片

源代码下载地址,记得帮忙点star和关注喔。

  • https://github.com/eastmountyxz/ImageProcessing-Python

大学之道在明明德,
在亲民,在止于至善。
这周又回答了很多博友的问题,有大一学生的困惑,有论文的咨询,也有老乡和考博的疑问,还有无数博友奋斗路上的相互勉励。虽然自己早已忙成狗,但总忍不住去解答别人的问题。最后那一句感谢和祝福,永远是我最大的满足。虽然会花费我一些时间,但也挺好的,无所谓了,跟着心走。不负遇见,感恩同行。莫愁前路无知己,继续加油。晚安娜和珞。

在这里插入图片描述

(By:Eastmount 2021-08-03 晚上10点 http://blog.csdn.net/eastmount/ )

你可能感兴趣的:(Python图像处理及图像识别,图像识别,Python,目标检测,ImageAI,YOLO)