TorchVision中使用FasterRCNN+ResNet50+FPN进行目标检测
TorchVision中给出了使用ResNet-50-FPN主干(backbone)构建Faster R-CNN的pretrained模型,模型存放位置为https://download.pytorch.org/models/fasterrcnn_resnet50_fpn_coco-258fb6c6.pth,可通过fasterrcnn_resnet50_fpn函数下载,此函数实现在torchvison/models/detection/faster_rcnn.py中,下载后在Ubuntu上存放在~/.cache/torch/hub/checkpoints目录下,在Windows上存放在C:\Users\spring\.cache\torch\hub\checkpoints目录下,其中spring为用户名。
模型的输入是一个tensor列表;每个shape都是[c,h,w];每个shape指定一副图像,并且图像中值的范围为[0,1],即已做过normalized;不同的图像可以有不同的大小,即此模型支持非固定大小图像的输入。
模型的行为取决于它是处于训练模式(training)还是评估模式(evaluation):
(1).在训练期间,模型需要输入tensors和targets(字典列表),包含boxes和labels。
boxes类型为FloatTensor[N,4],其中N为图像数;4为[x1,y1,x2,y2],即ground-truth box的左上和右下角坐标,它们的值要合理范围内。
labels类型为Int64Tensor[N],每个ground-truth box的class label。
(2).在推理(inference)过程中,模型只需要输入tensors,并返回后处理的预测(post-processed predictions),此预测类型为List[Dict[Tensor]],对应每个输入图像。
Dict字段内容除包含boxes和labels外,还包含scores。
scores类型为Tensor[N],每个预测的分值,按照值从大到小的顺序排列。
模型是通过COCO数据集训练获得的,COCO数据集的介绍参考:https://blog.csdn.net/fengbingchun/article/details/121308708
FPN全称为Feature Pyramid Networks,即特征金字塔网络,是一种多尺度的目标检测算法,FPN的介绍参考:https://blog.csdn.net/fengbingchun/article/details/87359191
ResNet即Residual Networks,也称为残差网络,是为了解决深度神经网络的”退化(degradation)”问题。ResNet-50中的50指此网络有50层。ResNet介绍参考:https://blog.csdn.net/fengbingchun/article/details/114167581
Faster R-CNN为目标检测算法,为RPN(Region Proposal Network)和Fast R-CNN的结合。Faster R-CNN介绍参考:https://blog.csdn.net/fengbingchun/article/details/87195597
以下为测试代码:
import torch
from torchvision import models
from torchvision import transforms
import cv2'''
Note: conda pytorch install opencv
windows: conda install opencv # python=3.8.8, opencv=4.0.1
ubuntu: pip3 install opencv-python # python=3.7.11, opencv=4.5.4
'''images_path = "../../data/image/"
images_name = ["1.jpg", "2.jpg", "4.jpg"]
images_data = [] # opencv
tensor_data = [] # pytorch tensorfor name in images_name:img = cv2.imread(images_path + name)print(f"name: {images_path+name}, opencv image shape: {img.shape}") # (w,h,c)images_data.append(img)transform = transforms.Compose([transforms.ToTensor()])tensor = transform(img) # Normalized Tensor image: [0., 1.]print(f"tensor shape: {tensor.shape}, max: {torch.max(tensor)}, min: {torch.min(tensor)}") # (c,h,w)tensor_data.append(tensor)# reference: torchvison/models/detection/faster_rcnn.py
# 使用ResNet-50-FPN(Feature Pyramid Networks, 特征金字塔网络)构建Faster RCNN模型
model = models.detection.fasterrcnn_resnet50_fpn(pretrained=True)
#print(model) # 可查看模型结构
model.eval() # 推理
predictions = model(tensor_data) # result: list: boxes (FloatTensor[N, 4]), labels (Int64Tensor[N]), scores (Tensor[N])
#print(predictions)coco_labels_name = ["unlabeled", "person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat","traffic light", "fire hydrant", "street sign", "stop sign", "parking meter", "bench", "bird", "cat", "dog", "horse","sheep", "cow", "elephant", "bear", "zebra", "giraffe", "hat", "backpack", "umbrella", "shoe","eye glasses", "handbag", "tie", "suitcase", "frisbee", "skis", "snowboard", "sports_ball", "kite", "baseball bat","baseball glove", "skateboard", "surfboard", "tennis racket", "bottle", "plate", "wine glass", "cup", "fork", "knife","spoon", "bowl", "banana", "apple", "sandwich", "orange", "broccoli", "carrot", "hot_dog", "pizza","donut", "cake", "chair", "couch", "potted plant", "bed", "mirror", "dining table", "window", "desk","toilet", "door", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone", "microwave", "oven","toaster", "sink", "refrigerator", "blender", "book", "clock", "vase", "scissors", "teddy bear", "hair drier","toothbrush", "hair brush"] # len = 92for x in range(len(predictions)):pred = predictions[x]scores = pred["scores"]mask = scores > 0.5 # 只取scores值大于0.5的部分boxes = pred["boxes"][mask].int().detach().numpy() # [x1, y1, x2, y2]labels = pred["labels"][mask]scores = scores[mask]print(f"prediction: boxes:{boxes}, labels:{labels}, scores:{scores}")img = images_data[x]for idx in range(len(boxes)):cv2.rectangle(img, (boxes[idx][0], boxes[idx][1]), (boxes[idx][2], boxes[idx][3]), (255, 0, 0))cv2.putText(img, coco_labels_name[labels[idx]]+" "+str(scores[idx].detach().numpy()), (boxes[idx][0]+10, boxes[idx][1]+10), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0, 255, 0), 1)cv2.imshow("image", img)cv2.waitKey(1000)cv2.imwrite(images_path+"result_"+images_name[x], img)print("test finish")
说明:
(1).输入图像既可以是彩色图也可以是灰度图,即channel为3或1均可。
(2).输入图像的大小不受限制,一组图像可以大小不一致。
(3).输入图像要求normalized到[0., 1.]。
(4).执行结果仅显示scores值大于0.5的情况。
(5).测试代码中类别数为92而不是80,92=1+11+80。其中1为id为0,label name为unlabeled;11为从COCO中移除的label,如street sign;80为真正的label数,如person。详细参考:https://github.com/nightrome/cocostuff/blob/master/labels.md
(6).结果显示中有冗余的检测框,可以通过NMS(Non-Maximum Suppression)非极大值抑制算法移除。
执行结果如下:以下原始测试图像来自网络
GitHub: GitHub - fengbingchun/PyTorch_Test: PyTorch's usage
相关文章:

iOS-UIButton防止重复点击(三种办法)
目录 使用场景方法一 设置enabled或userInteractionEnabled属性方法二 借助cancelPreviousPerformRequestsWithTarget:selector:object实现方法三 通过runtime交换方法实现注意事项一 使用场景 在实际应用场景中,有几个业务场景需要控制UIButton响应事件的时间间隔。…
华为诺亚方舟开源预训练模型“哪吒”,4项任务均达到SOTA
出品 | AI科技大本营(ID:rgznai100)BERT之后,新的预训练语言模型XLnet、RoBERTa、ERNIE不断推出,这次,华为诺亚方舟实验室开源了基于BERT的中文预训练语言模型NEZHA(哪吒),寓意模型能…

音量调节助手(转)
源:音量调节助手 软件名称:音量调节助手 软件功能:通过键盘快捷键快速调节系统主音量 软件版本:V2014 软件作者:易几网络 操作系统:所有WINDOWS版本 开发工具:DELPHI XE …

TorchVision中通过AlexNet网络进行图像分类
TorchVision中给出了AlexNet的pretrained模型,模型存放位置为https://download.pytorch.org/models/alexnet-owt-4df8aa71.pth ,可通过models.alexnet函数下载,此函数实现在torchvision/models/alexnet.py中,下载后在Ubuntu上存放…
西湖龙井也上链?是的,以后你喝什么茶我都知道!
什么?区块链还可以帮忙法律取证?是的!就是这么牛13!区块链存证第一案12月9日,据《新华每日电讯》报道,杭州互联网法院用区块链提升审判效率。报道提到一个案例。2018年4月,杭州一家公司…

Java Enumeration接口
import java.util.Vector; import java.util.Enumeration; /* * Enumeration接口中定义了一些方法,通过这些方法可以枚举(一次获得一个)对象集合中的元素。 * 这种传统接口已被迭代器取代,虽然Enumeration 还未被遗弃࿰…
Windows Azure Pack与SCVMM标签解析分享
我在SCVMM上做了好CentOS6.5的VM模板镜像,自己部署也是成功的,现在配置WAP的VM云虚拟机角色配置,在SCVMM上我打好了CentOS6.5的标签,可是在创建虚拟机角色配置中,选择的CentOS却无法找到硬盘,这是怎么回事呢…

Linux下C++中可使用的3种Hook方法
Hook即钩子,截获API调用的技术,是将执行流程重定向到你自己的代码,类似于hack。如使程序运行时调用你自己实现的malloc函数代替调用系统库中的malloc函数。这里介绍下Linux下C中可使用的3中Hook方法: 1. GNU C库允许你通过指定适当…

Java Properties 类
Properties 继承于 Hashtable.表示一个持久的属性集.属性列表中每个键及其对应值都是一个字符串。 Properties 类被许多Java类使用。例如,在获取环境变量时它就作为System.getProperties()方法的返回值。 Properties 定义如下实例变量.这个变量持有一个Properties对…
国产数据库年终大盘点
作者 | 马超 编辑 | 胡巍巍出品 | CSDN(ID:CSDNnews)去“IOE”这个概念,最早由王坚院士在刚刚加入阿里时提出,其目标是将IBM 的小型机、Oracle数据库、EMC存储设备从阿里的IT体系中去除,代之以自主研发的系…

解密FFmpeg播放track mode控制
上一篇文章(http://www.cnblogs.com/yangdanny/p/4421130.html)我们解决了在FFmpeg下如何处理H264和AAC的扩展数据,根据解出的NALU长度恢复了H264的起始码和AAC的ADTS头,这样一般来说播放是没有问题。本篇文章来谈谈如何实现基于FFmpeg的track mode控制&…

UIButton防止按钮和手势的暴力点击
首先理解下几个概念 1、IMP:它是指向一个方法具体实现的指针,每一个方法都有一个对应的IMP,当你发起一个消息之后,最终它会执行的那段代码,就是由IMP这个函数指针指向了这个方法实现的 2、SEL:方法名称的描…

使用Windows7上的VS Code打开远程机Ubuntu上的文件操作步骤
之前在https://blog.csdn.net/fengbingchun/article/details/118991855 中介绍过在Windows10通过VS Code打开Ubuntu 16.04上的文件或文件夹的操作步骤。Windows7上的操作与Windows10有所不同,这里记录下。 Visual Studio Code Remote - SSH扩展允许你在任何远程机器…
微众银行殷磊:AI+卫星,从上帝视角洞察资产管理|BDTC 2019
出品 | AI科技大本营(ID:rgznai100)12月5日-7日,2019中国大数据技术大会(BDTC)于北京隆重举办,大会已成功举办十二届,是大数据领域极具影响力的行业盛会。本届大会汇聚了学术界、企业界上千位知…

【二分答案】【最短路】bzoj1614 [Usaco2007 Jan]Telephone Lines架设电话线
对于二分出的答案x而言,验证答案等价于将所有边权>x的边赋成1,否则赋成0,然后判断从1到n的最短路是否<K。 #include<cstdio> #include<cstring> #include<queue> using namespace std; #define N 1001 #define M 100…

Python3中装饰器@typing.overload的使用
typing.py的源码在:https://github.com/python/cpython/blob/main/Lib/typing.py 。此模块为类型提示(Type Hints)提供运行时支持。这里介绍下typing.overload的使用,从python 3.5版本开始将Typing作为标准库引入。 python3中增加了Function Annotation(…
19年NAACL纪实:自然语言处理的实用性见解 | CSDN博文精选
作者 | Nikita Zhiltsov翻译 | 王威力校对 | 李海明本文为你概述处理不同NLP问题时的具有卓越性能的方法、技术和框架等。计算语言:人类语言技术学会北美分会2019年年会(North American Chapter of the Association for Computational Linguistics: Huma…

高并发场景下数据库的常见问题及解决方案
一、分库分表 (1)为什么要分库分表 随着系统访问量的增加,QPS越来越高,数据库磁盘容量不断增加,一般数据库服务器的QPS在800-1200的时候性能最佳,当超过2000的时候sql就会变得很慢并且很容易被请求打死&a…

典型用户 persona
persona 典型用户 1、姓名:王涛 2、年龄:22 3、收入:基本无收入 4、代表用户在市场上的比例和重要性:王涛为铁道学生。本软件的用户主要是学生和老师,尤其是广大的铁大学子,所以此典型用户的重要性不言而喻…

PyTorch中nn.Module类简介
torch.nn.Module类是所有神经网络模块(modules)的基类,它的实现在torch/nn/modules/module.py中。你的模型也应该继承这个类,主要重载__init__、forward和extra_repr函数。Modules还可以包含其它Modules,从而可以将它们嵌套在树结构中。 只要…

什么是三层交换机、网关、DNS、子网掩码、MAC地址
一、什么是vlan? 二、单臂路由与三层交换机 三、什么是网关 一、什么是网关 二、如何来理解网关 三、网关的ip地址 四、网关是如何实现通信? 五、什么是默认网关? 四、什么是DNS 五、MAC地址 六、子网掩码 很多朋友多次问到什么是网关、dns、子网掩码&…
20行代码发一篇NeurIPS:梯度共享已经不安全了
整理 | 夕颜,Jane出品 | AI科技大本营(ID:rgznai100)【导读】12 月 8 日-14 日,NeurIPS 2019 在加拿大温哥华举行,和往常一样,今年大会吸引了数万名专家参会,并展示了计算机领域的最新进展。其中…

关于页面打印window.print()的样式问题
当我们打印网页的时候。有时候会发现。打印出来的。跟网页上看到的样式的差别有点大。这其中可能有的问题是。样式问题。 当调用打印(window.print())方法时。打印机会在网页的样式中查找 media print{}的样式,并适应到要打印的网页中。 所以 如果要打印的页面符合看…

Python3中参数*args和**kwargs介绍
在Python中,我们可以使用两种特殊符号将可变数量的参数传递给函数:*args和**kwargs。你可以使用任何单词代替args和kwargs,但通常做法是使用args和kwargs。 *args允许函数接受任意数量的位置参数(positional arguments)。 **kwargs收集所有未…
4大主流CPU处理器技术架构,不知道就out了!
作者 | 王艺威责编 | 阿秃RISC(精简指令集计算机)是一种执行较少类型计算机指令的微处理器,起源于80年代的MIPS主机(即RISC机),RISC机中采用的微处理器统称RISC处理器。这样一来,它能够以更快的…

grunt-connect-proxy解决开发时跨域问题
最近的项目中前后端是完全分离开发的,前端用grunt管理项目。这样就会导致一个问题:开发时前端调用后台的接口时因为不在一个服务器,所以会出现跨域问题。但是也不能用JSONP或CROS方式实现真正的跨域,因为项目发布时其实是在同一个…
混合推荐系统就是多个推荐系统“大杂烩”吗?
作者丨gongyouliu编辑丨zandy【导读】在本篇文章中,我们会介绍混合推荐系统(Hybrid Recommender Systems),就是利用多种推荐算法配合起来做推荐,期望避免单个推荐算法存在的问题,最终获得比单个算法更好的推荐效果。本篇文章我们从…

Python3中collections.OrderedDict介绍
Python3中的collections模块实现了特定目标的容器,以提供Python标准内建容器dict、list、set和tuple的替代选择,包括namedtuple、deque、ChainMap、Counter、OrderedDict、defaultdict、UserDict、UserList、UserString。这里介绍下OrderedDictÿ…

汗!雅虎中国个人空间
今天发现雅虎中国有了个人空间,偷偷试了下,让人失望到极点,几乎没有什么特点,和MSN很相似,空间相册放着好好的Flickr不用,偏偏弄了个很垃圾的相册,还有整合能力也不行。都不知道del.icio.us和Fl…

关于v$process与v$session中process的理解
v$session有个process字段,V$PROCESS有个SPID字段,这两个字段是不是一个意思呢?是不是都代表会话的操作系统进程呢?官方文档上的解释:SPID VARCHAR2(12) Operating system process identifierPROCESS VARCHAR2…