目录

YOLO简介

创建和加载模型

预处理输入

获取边界框

下一步是什么?


  • 下载源219 MB

在本系列的前几篇文章中,我们从头开始实现了对象检测。我们观察到从头训练模型需要大量的计算资源和时间。这些算法训练和测试都很慢,几乎不可能实时有效地实现它们。将我们的注意力转移到面向速度的解决方案上,“一次只看一次(YOLO)”是当今最流行的对象检测方法。

YOLO简介

顾名思义,YOLO只需要向前传播即可检测给定图像中的物体。相同的属性使YOLO能够以最小的延迟处理实时视频,同时保持合理的准确性。

我们在本系列前面讨论的所有对象检测算法都使用区域来在图像中定位对象。它们拍摄的图像很有可能包含感兴趣的对象,并且看不到完整的图像。另一方面,YOLO拍摄图像并将其拆分为网格。然后,我们在每个网格单元上运行本地化算法,从而得出m个边界框。网络将为每个边界框输出类别概率,并为边界框输出偏移值。最后,算法选择类别概率高于阈值的边界框,然后在图像中定位对象。让我们看一下YOLO3的简单实现,以了解检测是如何发生的。

创建和加载模型

让我们从导入必要的库开始。我们将使用Keras进行实现。

import cv2
import numpy as np

由于我们正在使用预先训练的模型,因此我们需要下载某些权重和配置文件。在这里获取权重文件,并在这里配置文件。在MS COCO数据集上训练了指定的模型,该数据集可以识别80类对象。您可以从此处下载或复制coco.names。

一旦下载了所需的文件,我们就可以继续创建和加载模型。OpenCV提供了一个readNet函数,用于将深度学习网络加载到系统中。深度学习网络必须以受支持的格式之一表示,例如xml和prototxt。加载模型后,我们将为模型提供类以从coco.names文件中进行识别。然后,我们使用getLayerNames函数检索输出图层,并使用getUnConnectedOutLayers将它们存储为输出图层列表。

# Use readNet to load Yolo
net=cv2.dnn.readNet("./yolov3.weights", "./yolov3.cfg")# Classes
Classes = []
with open("coco.names","r") as f:classes = [line.strip() for line in f.readlines()]# Define Output Layers
layer_names  =net.getLayerNames()
output_layers = [layer_names[i[0]-1] for i in net.getUnconnectedOutLayers()]

预处理输入

现在我们可以通过模型传递图像,但是模型希望图像具有特定的形状。为了使图像的形状与模型输入的形状兼容,我们将使用blobFromImage。该函数将重塑图像并以适当的顺序重新排列图像的颜色通道。然后,我们将图像提供给模型以执行前向传递。前向通过输出检测列表。

#reshape, normalize and re-order colors of image using blob
blob = cv2.dnn.blobFromImage(img,1/255,(416,416),(0,0,0),True,crop=False)# blob as input
net.setInput(blob)#Object Detection
results = net.forward(outputlayers)

获取边界框

我们可以使用此输出结果来获取每个检测到的对象的边界框的坐标。如前所述,然后我们使用阈值来获取准确的边界框。

# Evaluate class ids, confidence score and bounding boxes for detected objects
class_ids=[]
confidences=[]
boxes=[]
confidence_threshold = 0.5for result in results:for detection in result:scores = detection[5:]class_id = np.argmax(scores)confidence = scores[class_id]if confidence> confidence_threshold:# Object Detectedcenter_x=int(detection[0]*width)center_y=int(detection[1]*height)w=int(detection[2]*width)h=int(detection[3]*height)# Boundry box Co-ordinatesx=int(center_x-w/2)y=int(center_y-h/2)boxes.append([x,y,w,h])confidences.append(float(confidence))class_ids.append(class_id)

现在我们有了边界框的坐标,我们可以继续将框绘制在检测到的对象上并标记它。但是我们事先不知道任何给定对象的出现次数。为了克服这个问题,我们将使用采用非最大抑制的NMSBoxes函数。之后,我们最终显示图像。

# Non-max Suppression
indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.4, 0.6)# Draw final bounding boxes
font = cv2.FONT_HERSHEY_PLAIN
count = 0
for i in range(len(boxes)):if i in indexes:x,y,w,h = boxes[i]label = str(classes[class_ids[i]])color = COLORS[i]cv2.rectangle(img, (x,y), (x+w, y+h), color, 2)cv2.putText(img, label, (x, y-5), font, 1, color, 1)

最后一步是将所有片段放在一起,并显示带有检测到的物体的最终图像。

cv2.imshow("Detected_Images",img)

那很容易,对吧?但是,等等——我们可以修改相同的代码来计算图像中的人数吗?让我们来看看。

MS COCO数据集可以识别80种不同的类别,包括人员。通过计算“人物”类别的出现次数,我们可以轻松地计算图像中出现的人数。

if int(class_ids[i] == 0):count +=1

上面的小修改返回了图像中存在的人数。前一张图片返回的人数是2,下一张图片的计数是18:

下一步是什么?

在本文中,我们学习了用于对象检测的YOLO的基本实现。我们看到,使用预先训练的模型可以节省时间和计算资源,这相当容易。在接下来的文章中,我们将看看我们是否能对队列长度检测视频供稿实显著YOLO。作为结尾文章,我们还将讨论要使用自定义训练模型而不是预先训练模型的场景。

AI队列长度检测:使用YOLO进行图像中的对象检测相关推荐

  1. AI队列长度检测:使用YOLO进行视频中的对象检测

    下载源219 MB 到目前为止,在本系列中,我们一直在处理静止图像数据.在本文中,我们将使用YOLO的基本实现来检测和计数视频序列中的人物. 让我们再次从导入所需的库开始. import cv2 im ...

  2. X射线图像中的目标检测

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 1 动机和背景 每天有数百万人乘坐地铁.民航飞机等公共交通工具,因 ...

  3. python图像计数_检测并计数图像中的对象

    我试图用python编写一个脚本来检测和计算图像中的对象,但我失败得很惨.在 这是我第一次对计算机视觉感兴趣并尝试一些东西.我已经尝试过使用cv2模块(opencv),遵循关于特征匹配和模板匹配的教程 ...

  4. 《OpenCv视觉之眼》Python图像处理十六:Opencv图像处理实战一之图像中的硬币检测

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

  5. 【论文学习】行人检测——CVPR:通过MIMS在低分辨率图像中做行人检测

    论文:Pedestrian Detection in Low-resolution Imagery by Learning Multi-scale Intrinsic Motion Structure ...

  6. 使用YOLO Core ML模型构建对象检测iOS应用(七)

    目录 在我们的应用程序中添加模型 在捕获的视频帧上运行目标检测 绘制边界框 实际应用 下一步? 总目录 将ONNX对象检测模型转换为iOS Core ML(一) 解码Core ML YOLO对象检测器 ...

  7. Python OpenCV分水岭算法分割和提取重叠或有衔接的图像中的对象

    本文将介绍如何使用分水岭算法对触摸和重叠的图像中的对象进行分割和提取. 参考:https://www.pyimagesearch.com/2015/11/02/watershed-opencv/ 分水 ...

  8. ITK:从二进制图像中的对象计算距离图

    ITK:从二进制图像中的对象计算距离图 内容提要 C++实现代码 内容提要 从二进制图像中的对象计算距离图 C++实现代码 #include "itkImage.h" #inclu ...

  9. 检测和语义分割_分割和对象检测-第2部分

    检测和语义分割 有关深层学习的FAU讲义 (FAU LECTURE NOTES ON DEEP LEARNING) These are the lecture notes for FAU's YouT ...

最新文章

  1. 八、LaTex中的表格
  2. Chem. Commun. | 利用基于迁移学习策略的transformer 模型进行Heck反应预测
  3. 不停应用重启oracle数据库,此类情况下解决Oracle数据库重启的四种方案
  4. java获取服务器上的图片进行拼接
  5. 让那些为Webkit优化的网站也能适配IE10(转载)
  6. 第一个linux桌面,Ubuntu 4.10 “Warty Warthog”:回顾第一个Ubuntu Linux桌面
  7. OpenStack Keystone架构
  8. python怎么读取csv文件-Python读取csv文件(详解版,看了无师自通)
  9. 图像处理VintaSoftImaging.NET SDK控件发布v7.0版本
  10. 为什么Go比Java快这么多?看完这个例子就懂!
  11. 电脑使用技巧(禁用微软 Windows 10 易升)
  12. 用众城计算机弹学猫叫,19年真男神当众被逼学猫叫?谁能把我的童年还给我!...
  13. ios设置tabbar背景颜色_IOS UITabBarViewController 修改背景颜色
  14. 目前流行的装修风格_目前什么装修风格最流行?
  15. 成龙寿宴筹善款7000万 嘉宾:比春晚还热闹
  16. 部分经济学术语英文简写
  17. Microsoft Visio 文本框上标或下标
  18. es java api 查询_es聚合查询javaapi
  19. Python 中的 astype() 和 .dtype
  20. 优维CMDB又征服了一家国际零售巨头

热门文章

  1. 交换机和路由器的区别_秒懂交换机和路由器的功用区别 拷贝
  2. 全球最顶级的电脑配置_全球最顶级外汇交易员,非这10位莫属
  3. PHP可不可以调用opengl库,opengl,_苹果能不能用 OpenGL 3 或以上写代码?,opengl - phpStudy...
  4. mac r 导出csv文件_R在Max OS进行导入和导出xlsx文件
  5. kafka 丢弃数据_Kafka快速入门
  6. java 线程 主进程_java 多线程通用方法
  7. java link 使用_Java数据结构之简单的连接点(link)实现方法示例
  8. 外星人电脑为什么那么贵_为什么隐形矫正那么贵
  9. 设计师效率帮手|提高设计效率的Sketch插件!
  10. qwt需要添加到qcreator的东西