2020-12-12

PyTorch 目标检测教程 目标检测任务不仅要识别图像中的物体类别,还要精确定位物体的边界框。在此任务中,每个模型输出一个物体类别标签和一个边界框。 阅读详情

引言

在昨天的文章中,我们介绍了如何在PyTorch中使用您自己的图像来训练图像分类器,然后使用它来进行图像识别。本文将展示如何使用预训练的分类器检测图像中的多个对象,并在视频中跟踪它们。

图像中的目标检测

目标检测的算法有很多,YOLO跟SSD是现下最流行的算法。在本文中,我们将使用YOLOv3。在这里我们不会详细讨论YOLO,如果想对它有更多了解,可以参考下面的链接哦~(https://pjreddie.com/darknet/yolo/)

下面让我们开始吧,依然从导入模块开始:

 
 

 

  1. from models import *

  2. from utils import *

  3. import os, sys, time, datetime, random

  4. import torch

  5. from torch.utils.data import DataLoader

  6. from torchvision import datasets, transforms

  7. from torch.autograd import Variable

  8. import matplotlib.pyplot as plt

  9. import matplotlib.patches as patches

  10. from PIL import Image

 

然后加载预训练的配置和权重,以及一些预定义的值,包括:图像的尺寸、置信度阈值和非最大抑制阈值。

 
 

 

  1. config_path='config/yolov3.cfg'

  2. weights_path='config/yolov3.weights'

  3. class_path='config/coco.names'

  4. img_size=416

  5. conf_thres=0.8

  6. nms_thres=0.4

  7. # Load model and weights

  8. model = Darknet(config_path, img_size=img_size)

  9. model.load_weights(weights_path)

  10. model.cuda()

  11. model.eval()

  12. classes = utils.load_classes(class_path)

  13. Tensor = torch.cuda.FloatTensor

 

下面的函数将返回对指定图像的检测结果。

 
 

 

  1. def detect_image(img):

  2. # scale and pad image

  3. ratio = min(img_size/img.size[0], img_size/img.size[1])

  4. imw = round(img.size[0] * ratio)

  5. imh = round(img.size[1] * ratio)

  6. img_transforms=transforms.Compose([transforms.Resize((imh,imw)),

  7. transforms.Pad((max(int((imh-imw)/2),0),

  8. max(int((imw-imh)/2),0), max(int((imh-imw)/2),0),

  9. max(int((imw-imh)/2),0)), (128,128,128)),

  10. transforms.ToTensor(),

  11. ])

  12. # convert image to Tensor

  13. image_tensor = img_transforms(img).float()

  14. image_tensor = image_tensor.unsqueeze_(0)

  15. input_img = Variable(image_tensor.type(Tensor))

  16. # run inference on the model and get detections

  17. with torch.no_grad():

  18. detections = model(input_img)

  19. detections = utils.non_max_suppression(detections, 80,

  20. conf_thres, nms_thres)

  21. return detections[0]

 

最后,让我们通过加载一个图像,获取检测结果,然后用检测到的对象周围的包围框来显示它。并为不同的类使用不同的颜色来区分。

 
 

 

  1. # load image and get detections

  2. img_path = "images/blueangels.jpg"

  3. prev_time = time.time()

  4. img = Image.open(img_path)

  5. detections = detect_image(img)

  6. inference_time = datetime.timedelta(seconds=time.time() - prev_time)

  7. print ('Inference Time: %s' % (inference_time))

  8. # Get bounding-box colors

  9. cmap = plt.get_cmap('tab20b')

  10. colors = [cmap(i) for i in np.linspace(0, 1, 20)]

  11. img = np.array(img)

  12. plt.figure()

  13. fig, ax = plt.subplots(1, figsize=(12,9))

  14. ax.imshow(img)

  15. pad_x = max(img.shape[0] - img.shape[1], 0) * (img_size / max(img.shape))

  16. pad_y = max(img.shape[1] - img.shape[0], 0) * (img_size / max(img.shape))

  17. unpad_h = img_size - pad_y

  18. unpad_w = img_size - pad_x

  19. if detections is not None:

  20. unique_labels = detections[:, -1].cpu().unique()

  21. n_cls_preds = len(unique_labels)

  22. bbox_colors = random.sample(colors, n_cls_preds)

  23. # browse detections and draw bounding boxes

  24. for x1, y1, x2, y2, conf, cls_conf, cls_pred in detections:

  25. box_h = ((y2 - y1) / unpad_h) * img.shape[0]

  26. box_w = ((x2 - x1) / unpad_w) * img.shape[1]

  27. y1 = ((y1 - pad_y // 2) / unpad_h) * img.shape[0]

  28. x1 = ((x1 - pad_x // 2) / unpad_w) * img.shape[1]

  29. color = bbox_colors[int(np.where(

  30. unique_labels == int(cls_pred))[0])]

  31. bbox = patches.Rectangle((x1, y1), box_w, box_h,

  32. linewidth=2, edgecolor=color, facecolor='none')

  33. ax.add_patch(bbox)

  34. plt.text(x1, y1, s=classes[int(cls_pred)],

  35. color='white', verticalalignment='top',

  36. bbox={'color': color, 'pad': 0})

  37. plt.axis('off')

  38. # save image

  39. plt.savefig(img_path.replace(".jpg", "-det.jpg"),

  40. bbox_inches='tight', pad_inches=0.0)

  41. plt.show()

 

下面是我们的一些检测结果:

 

 

 

 

 

 

视频中的目标跟踪

现在你知道了如何在图像中检测不同的物体。当你在一个视频中一帧一帧地看时,你会看到那些跟踪框在移动。但是如果这些视频帧中有多个对象,你如何知道一个帧中的对象是否与前一个帧中的对象相同?这被称为目标跟踪,它使用多次检测来识别一个特定的对象。

有多种算法可以做到这一点,在本文中决定使用SORT(Simple Online and Realtime Tracking),它使用Kalman滤波器预测先前识别的目标的轨迹,并将其与新的检测结果进行匹配,非常方便且速度很快。

现在开始编写代码,前3个代码段将与单幅图像检测中的代码段相同,因为它们处理的是在单帧上获得 YOLO 检测。差异在最后一部分出现,对于每个检测,我们调用 Sort 对象的 Update 函数,以获得对图像中对象的引用。因此,与前面示例中的常规检测(包括边界框的坐标和类预测)不同,我们将获得跟踪的对象,除了上面的参数,还包括一个对象 ID。并且需要使用OpenCV来读取视频并显示视频帧。

 
 

 

  1. videopath = 'video/interp.mp4'

  2. %pylab inline

  3. import cv2

  4. from IPython.display import clear_output

  5. cmap = plt.get_cmap('tab20b')

  6. colors = [cmap(i)[:3] for i in np.linspace(0, 1, 20)]

  7. # initialize Sort object and video capture

  8. from sort import *

  9. vid = cv2.VideoCapture(videopath)

  10. mot_tracker = Sort()

  11. #while(True):

  12. for ii in range(40):

  13. ret, frame = vid.read()

  14. frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

  15. pilimg = Image.fromarray(frame)

  16. detections = detect_image(pilimg)

  17. img = np.array(pilimg)

  18. pad_x = max(img.shape[0] - img.shape[1], 0) *

  19. (img_size / max(img.shape))

  20. pad_y = max(img.shape[1] - img.shape[0], 0) *

  21. (img_size / max(img.shape))

  22. unpad_h = img_size - pad_y

  23. unpad_w = img_size - pad_x

  24. if detections is not None:

  25. tracked_objects = mot_tracker.update(detections.cpu())

  26. unique_labels = detections[:, -1].cpu().unique()

  27. n_cls_preds = len(unique_labels)

  28. for x1, y1, x2, y2, obj_id, cls_pred in tracked_objects:

  29. box_h = int(((y2 - y1) / unpad_h) * img.shape[0])

  30. box_w = int(((x2 - x1) / unpad_w) * img.shape[1])

  31. y1 = int(((y1 - pad_y // 2) / unpad_h) * img.shape[0])

  32. x1 = int(((x1 - pad_x // 2) / unpad_w) * img.shape[1])

  33. color = colors[int(obj_id) % len(colors)]

  34. color = [i * 255 for i in color]

  35. cls = classes[int(cls_pred)]

  36. cv2.rectangle(frame, (x1, y1), (x1+box_w, y1+box_h),

  37. color, 4)

  38. cv2.rectangle(frame, (x1, y1-35), (x1+len(cls)*19+60,

  39. y1), color, -1)

  40. cv2.putText(frame, cls + "-" + str(int(obj_id)),

  41. (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX,

  42. 1, (255,255,255), 3)

  43. fig=figure(figsize=(12, 8))

  44. title("Video Stream")

  45. imshow(frame)

  46. show()

  47. clear_output(wait=True)

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

python免费学习资料以及群交流解答点击即可加入

下面让我们来看一下处理的结果:

pytorch深度学习入门(9)之-使用TORCHVISION进行目标检测 用于训练对象检测、实例分割和人物关键点检测的参考脚本可以轻松支持添加新的自定义数据集。数据集应继承自标准 torch.utils.data.Dataset类,并实现__len__和getitem。我们需要的唯一特殊性是数据集__getitem__ 应返回一个元组:image:torchvision.tv_tensors.Imageshape 、纯张量或 size 的 PIL 图像[3, H, W](H, W)target:包含以下字段的字典。 阅读详情

相关推荐

Pytorch实现目标检测与跟踪

近年来,计算机视觉一直处于一个高速发展阶段。随着深度学习技术的普及,目标检测与跟踪也得到了越来越多的关注。目前主流的目标检测与跟踪算法主要分为两类:基于深度学习的目标检测算法、基于传统特征点的方法。本文主要介绍使用Pytorch实现基于深度学习的目标检测与跟 Tracking 算法——YOLO(You Only Look Once)。YOLO是一种轻量级的目标检测网络,在速度、精度和实时性等方面都有不俗的表现。

AI天才研究院 752

使用PyTorch实现目标检测与跟踪

欢迎关注“小白玩转Python”,发现更多 “有趣”引言在昨天的文章中,我们介绍了如何在PyTorch中使用您自己的图像来训练图像分类器,然后使用它来进行图像识别。本文将展示如何使用预...

Warmer_Sweeter 9030

PLSQL Developer新手必看:如何避免安装过程中的常见坑

本文为PL/SQL Developer新手提供了详尽的安装与配置避坑指南。从版本选择、注册码使用、汉化包安装到Oracle客户端连接配置,逐一解析常见问题并提供解决方案,帮助开发者快速搭建稳定的PL/SQL开发环境,顺利开启Oracle数据库编程工作。

g9h0i1的博客 650

PyTorch: 目标检测(object detection)介绍

在图像分类任务中,我们假设图像中只有一个主要物体对象,我们只关注如何识别其类别。 然而,很多时候图像里有多个我们感兴趣的目标,我们不仅想知道它们的类别,还想得到它们在图像中的具体位置。 在计算机视觉里,我们将这类任务称为目标检测(object detection)或目标识别(object recognition)。

weixin_43276033的博客 5134

从ROS2到ROS1:Lightning-LM激光SLAM模块的移植实践与核心代码解析

本文详细解析了将高性能激光SLAM算法Lightning-LM从ROS2移植到ROS1的完整实践过程。针对ROS1与ROS2在节点初始化、话题通信、参数服务器及TF发布等核心API的差异,文章提供了loc_system和slam模块的核心代码改造示例,并给出了适配catkin的CMakeLists.txt与package.xml配置方案,帮助开发者在现有ROS1生态中高效集成先进的SLAM模块。

weixin_29224529的博客 172

AUTOSAR R20-11标准下载!

这是公众号的第2篇推文,粉丝数49 Document Search Classic Platform Adaptive Platform Foundation 文档截图 以为会在明天的发布会之后才上线,没想到官网现在就悄悄放出来了。 中国由于网络问题,下载速度比较慢或者会中断。 “阅读原文”提供多种下载方式,可以在线浏览,可以集中下载也可单个文档下载。 如有增减我也会及时在公众号里通知大家,不过我觉得不会变动了。 整理不宜,好东西要分...

Adaptive_AUTOSAR的博客 1890

JSON Schema 2020-12 介绍

是一种用于描述和验证 JSON 数据结构的规范,它提供了一种声明性的方法来定义 JSON 数据的格式、内容和约束条件。通过 JSON Schema,可以确保 JSON 数据符合预期的结构,满足特定的要求,从而提高数据交换的可靠性和一致性。熟练掌握 JSON Schema 的使用,能够提高系统的可靠性,减少因数据格式不符而导致的错误。它是继 2019-09 版本之后的一个更新,包含了一些新的特性和改进,以增强模式定义的能力和灵活性。指定嵌入内容的模式定义,多用于字符串中包含嵌套的 JSON 数据时。

fydw_715的博客 1785

STM32F4驱动ADS1220高精度ADC:从SPI配置到数据校准的完整实战指南

本文详细介绍了如何使用STM32F4微控制器驱动ADS1220高精度ADC,涵盖从SPI接口配置、寄存器设置到数据采集与校准的全过程。通过实战代码示例和硬件设计要点,帮助开发者快速构建高精度数据采集系统,适用于工业测量和精密仪器等应用场景。

weixin_26918763的博客 224

eclipse中文汉化操作 2020-12

本次所用 eclipse 版本为 2020-12 的 Eclipse IDE for Enterprise Java Developers 官方下载地址: https://www.eclipse.org/downloads/packages/ 官方原版(英文): ——如何汉化? 1.打开官方下载站: https://www.eclipse.org/babel/downloads.php 2.推荐选择最新版本,例 2020-09 点击 Chinese (Simplified) 前往中文翻译包所在

Soulref1212的博客 1万+

IP2315高效同步降压充电IC在快充应用中的硬件与软件控制策略

本文深入解析IP2315高效同步降压充电IC在快充应用中的硬件与软件控制策略,涵盖其核心特性、硬件电阻调节技巧、I2C动态控制方案、散热设计优化及典型问题排查。IP2315支持多种快充协议,如Type-C PD、华为FCP等,适用于便携设备快速充电需求,并通过I2C实现灵活的充电参数设置,提升充电效率与安全性。

weixin_29248313的博客 539

excel 如何自动调整行间距 vba

EXCEL是一个非常使用的软件,虽然我们平时仅使用他做一些报表,仅此而已;我在工作中,由于很懒,不愿意做考试重复的工作,就想着使用vba的宏来完成重复的工作,这样就能省出一部分的时间来了。本人不喜欢在博客里面写以下教程类的东西,我的理念是将工作中的痛点的解决办法分享出来,以解决问题为主。

sixtome 1316

mashlab2020.12版本

mashlab2020.12版本 下载直接安装即可windows64位 链接:https://pan.baidu.com/s/1HJ4JND-L4Qd8Wx4dnJJmwg 提取码:jfxy 复制这段内容后打开百度网盘手机App,操作更方便哦

徐某人的博客 249

【数据同化第二期】数据同化中三大理论基础之一(最小方差估计)

【数据同化第二期】深入理解数据同化及经典案例(最小方差估计)

WW、forever的博客 1596

2020.11.12

2020.11.12 test

hhhhhhhhhhhyu的博客 85

LeRobot 入门教程(九)使用 Android、iOS 手机控制机械臂

本指南详细介绍了如何使用iOS/Android手机远程控制机器人。内容包括:1)安装依赖(pip install leroobot[phone]);2)平台支持说明(iOS需HEBI Mobile I/O应用/Android用WebXR);3)手机方向校准方法;4)控制模式设定(按钮/手势);5)示例脚本使用(遥操作/数据记录/回放/策略评估);6)关键参数配置(运动学/安全限制/夹爪控制);7)故障排查方法。支持ROS2集成,提供URDF文件处理、逆向运动学计算和实时可视化功能,适用于物理机器人和仿真环境

2506_90492529的博客 1657

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【免费下载】 Eclipse 2020-12 下载与安装指南

Eclipse 2020-12 下载与安装指南 【下载地址】Eclipse2020-12下载与安装指南 Eclipse 2020-12 下载与安装指南本资源文件提供了Eclipse 2020-12版本的下载与安装指南 项目地址: ...

gitblog_06550的博客 1470

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Eclipse IDE 2020‑12 下载

清华大学开源软件镜像站 从这里下载更快 https://mirrors.tuna.tsinghua.edu.cn/eclipse/technology/epp/downloads/release/2020-12/R/eclipse-java-2020-12-R-win32-x86_64.zip

hello world 3721

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Eclipse 2020-12:Java开发者的最佳选择

Eclipse 2020-12:Java开发者的最佳选择 【下载地址】Eclipse2020-12下载与安装指南 Eclipse 2020-12 下载与安装指南本资源文件提供了Eclipse 2020-12版本的下载与安装指南 项...

gitblog_06519的博客 700

2020:我有12个关键词

2020年过去了,关于这不平凡的一年,我有12个关键词和大家分享_

inspur_cloud的博客 183

2020-03-12

import os import tensorflow as tf from tensorflow.keras import datasets, layers, models ''' python 3.7 tensorflow 2.0.0b0 ''' class CNN(object): def __init__(self): model = models.Seque...

weixin_45250924的博客 226

2020-12-25 C语言打印时间

#include<sys/time.h> #include<stdio.h> #include<time.h> #include<stdint.h> int main() { struct timeval tv; gettimeofday(&tv,NULL);//获取1970-1-1到现在的时间结果保存到tv中 uint64_t sec=tv.tv_sec; uint64_t min.

oceanstudy123的博客 1506

从零吃透 JSON Schema 2020-12:C++ 开发者专属实战指南

本文介绍了C++开发者如何利用JSONSchema 2020-12规范进行高效JSON数据校验。文章首先阐述了JSONSchema的核心价值,即通过标准化定义JSON数据结构和约束条件,避免手写冗余校验代码。随后详细解析了2020-12版本的核心语法,包括数据类型约束、对象/数组校验、数值/字符串限制等关键特性,并提供了C++实战示例,展示如何使用nlohmann/json-schema-validator库实现数据校验。文章还涵盖了高级特性如条件校验、Schema复用,以及从旧版本迁移的注意事项,为C++

Small_entreprene的博客 1429

2020年1月12日MARK帖

2020年1月12日是武汉新型冠状病毒感染的肺炎疫情关键点,记录下来希望病毒赶快消灭,永远成为历史!

一个处女座技术的专栏 213

JSON Schema 示例详解(基于 Draft 2020-12)

通过上述示例和解释,我们深入了解了如何使用Draft 2020-12规范来创建复杂且详细的JSON Schema。这不仅有助于确保数据的一致性和正确性,还能提高API和服务间交互的安全性和可靠性。希望这份指南能帮助您更好地理解和应用JSON Schema。JSON Schema是一种用于描述和验证JSON数据结构的强大工具。规范,提供一个详尽的JSON Schema示例,并深入讲解其中涉及的各种属性和特性。值得注意的是,除了字符串类型外,数值类型并不直接支持正则表达式或类似的模式匹配方式。

小单的博客专栏 1770

2020,改变世界的12大领域

原文链接 2020,不仅仅是一个数字,更是世界即将发生变革的一个分水岭,不仅仅是我们常常挂载嘴边的AI、机器人、区块链、量子计算、无人机等等,还有更多的领域也在相互推动中产生变革。 CB Insights日前评选出了2020年将改变世界“游戏规则”的36家科技创业公司,涉及12大领域:光芯片、量子加密、AI透明度、CRISPR 2.0、基于AI的蛋白质预测、电子脉冲治疗、微生物医疗、改变精神的药物...

覃杨森的博客 462
上一篇: 我爬取了爬虫岗位薪资,分析后发现爬虫真香!
下一篇: Python爬虫:短视频平台无水印下载!强不强?
pythonlaodi
博客等级 码龄6年 286粉丝 244原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值