Detectron2是由Facebook AI Research (FAIR)推出的基于PyTorch的模块化物体检测库,发布于2019年10月10日。该平台原是2018年推出的Detectron的第二代版本,它完全重写于maskrcnn-benchmark,并采用了PyTorch语言实现。与原版相比,Detectron2具有更灵活和可扩展的设计,可以在单个或多个GPU服务器上快速训练。
主要特点:
-
实现新颖:
- Detectron2是从头重新设计的,它采用了PyTorch而不是原来的Caffe2。这种转变使得编程模型更加直观,提高了模型设计和实验的迭代速度。
- PyTorch的大型社区和不断改进也为Detectron2用户提供了巨大利益。
-
模块化和可扩展性:
- Detectron2采用模块化设计,允许用户在几乎任何部分插入自定义模块,使新研究项目可以在数百行代码内实现,并且清晰地与核心库分离。
- 这种设计实现了模型和功能的快速集成与扩展,例如高级姿态检测模型的快速设计和训练。
-
新功能和模型:
- Detectron2整合了DensePose、Panoptic FPN等最新算法,并支持新的数据集如LVIS。
- 它支持各种任务,包括对象检测、实例分割、语义分割和全景分割。
-
实现质量:
- 通过重新设计,解决了原版Detectron中的一些实现问题,大大提高了整体性能。
- 整个训练管道已迁移至GPU,提升了训练速度且易于拓展至多GPU服务器,便于处理大规模数据集。
-
Detectron2go:
- Detectron2go是一个附加的软件层,旨在简化模型的生产部署,包括标准训练工作流程、网络量化和模型转换等。
预训练模型
下面的表格列出了detectron2/configs
源码目录下的模型及其简要的中文描述。
分类 | Model Config File Path(–model-name 参数) | 简要描述 |
---|---|---|
Base Models | Base-RCNN-C4.yaml | 基于C4的基础RCNN模型 |
Base-RCNN-DilatedC5.yaml | 基于扩张卷积C5的基础RCNN模型 | |
Base-RCNN-FPN.yaml | 基于FPN的基础RCNN模型 | |
Base-RetinaNet.yaml | 基础的RetinaNet模型 | |
COCO目标检测 | COCO-Detection/fast_rcnn_R_50_FPN_1x.yaml | 采用FPN的ResNet-50的Fast R-CNN模型,1倍学习速率 |
COCO-Detection/faster_rcnn_R_101_C4_3x.yaml | 采用C4的ResNet-101的Faster R-CNN模型,3倍学习速率 | |
COCO-Detection/faster_rcnn_R_101_DC5_3x.yaml | 采用DC5的ResNet-101的Faster R-CNN模型,3倍学习速率 | |
COCO-Detection/faster_rcnn_R_101_FPN_3x.yaml | 采用FPN的ResNet-101的Faster R-CNN模型,3倍学习速率 | |
COCO-Detection/faster_rcnn_R_50_C4_1x.yaml | 采用C4的ResNet-50的Faster R-CNN模型,1倍学习速率 | |
COCO-Detection/faster_rcnn_R_50_C4_3x.yaml | 采用C4的ResNet-50的Faster R-CNN模型,3倍学习速率 | |
COCO-Detection/faster_rcnn_R_50_DC5_1x.yaml | 采用DC5的ResNet-50的Faster R-CNN模型,1倍学习速率 | |
COCO-Detection/faster_rcnn_R_50_DC5_3x.yaml | 采用DC5的ResNet-50的Faster R-CNN模型,3倍学习速率 | |
COCO-Detection/faster_rcnn_R_50_FPN_1x.yaml | 采用FPN的ResNet-50的Faster R-CNN模型,1倍学习速率 | |
COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml | 采用FPN的ResNet-50的Faster R-CNN模型,3倍学习速率 | |
COCO-Detection/faster_rcnn_X_101_32x8d_FPN_3x.yaml | 采用FPN的ResNeXt-101的Faster R-CNN模型,3倍学习速率 | |
COCO-Detection/fcos_R_50_FPN_1x.py | 采用FPN的ResNet-50的FCOS模型,1倍学习速率 | |
COCO-Detection/retinanet_R_101_FPN_3x.yaml | 采用FPN的ResNet-101的RetinaNet模型,3倍学习速率 | |
COCO-Detection/retinanet_R_50_FPN_1x.py | 采用FPN的ResNet-50的RetinaNet模型,1倍学习速率 | |
COCO-Detection/retinanet_R_50_FPN_1x.yaml | 采用FPN的ResNet-50的RetinaNet模型,1倍学习速率 | |
COCO-Detection/retinanet_R_50_FPN_3x.yaml | 采用FPN的ResNet-50的RetinaNet模型,3倍学习速率 | |
COCO-Detection/rpn_R_50_C4_1x.yaml | 采用C4的ResNet-50的RPN模型,1倍学习速率 | |
COCO-Detection/rpn_R_50_FPN_1x.yaml | 采用FPN的ResNet-50的RPN模型,1倍学习速率 | |
COCO实例分割 | COCO-InstanceSegmentation/mask_rcnn_R_101_C4_3x.yaml | 采用C4的ResNet-101的Mask R-CNN模型,3倍学习速率 |
COCO-InstanceSegmentation/mask_rcnn_R_101_DC5_3x.yaml | 采用DC5的ResNet-101的Mask R-CNN模型,3倍学习速率 | |
COCO-InstanceSegmentation/mask_rcnn_R_101_FPN_3x.yaml | 采用FPN的ResNet-101的Mask R-CNN模型,3倍学习速率 | |
COCO-InstanceSegmentation/mask_rcnn_R_50_C4_1x.py | 采用C4的ResNet-50的Mask R-CNN模型,1倍学习速率 | |
COCO-InstanceSegmentation/mask_rcnn_R_50_C4_1x.yaml | 采用C4的ResNet-50的Mask R-CNN模型,1倍学习速率 | |
COCO-InstanceSegmentation/mask_rcnn_R_50_C4_3x.yaml | 采用C4的ResNet-50的Mask R-CNN模型,3倍学习速率 | |
COCO-InstanceSegmentation/mask_rcnn_R_50_DC5_1x.yaml | 采用DC5的ResNet-50的Mask R-CNN模型,1倍学习速率 | |
COCO-InstanceSegmentation/mask_rcnn_R_50_DC5_3x.yaml | 采用DC5的ResNet-50的Mask R-CNN模型,3倍学习速率 | |
COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.py | 采用FPN的ResNet-50的Mask R-CNN模型,1倍学习速率 | |
COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml | 采用FPN的ResNet-50的Mask R-CNN模型,1倍学习速率 | |
COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x_giou.yaml | 采用FPN的ResNet-50的Mask R-CNN模型,1倍学习速率,使用GIoU | |
COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml | 采用FPN的ResNet-50的Mask R-CNN模型,3倍学习速率 | |
COCO-InstanceSegmentation/mask_rcnn_X_101_32x8d_FPN_3x.yaml | 采用FPN的ResNeXt-101的Mask R-CNN模型,3倍学习速率 | |
COCO-InstanceSegmentation/mask_rcnn_regnetx_4gf_dds_fpn_1x.py | 采用RegNetX-4GF的Mask R-CNN模型,1倍学习速率 | |
COCO-InstanceSegmentation/mask_rcnn_regnety_4gf_dds_fpn_1x.py | 采用RegNetY-4GF的Mask R-CNN模型,1倍学习速率 | |
COCO关键点检测 | COCO-Keypoints/keypoint_rcnn_R_101_FPN_3x.yaml | 采用FPN的ResNet-101的关键点检测RCNN模型,3倍学习速率 |
COCO-Keypoints/keypoint_rcnn_R_50_FPN_1x.py | 采用FPN的ResNet-50的关键点检测RCNN模型,1倍学习速率 | |
COCO-Keypoints/keypoint_rcnn_R_50_FPN_1x.yaml | 采用FPN的ResNet-50的关键点检测RCNN模型,1倍学习速率 | |
COCO-Keypoints/keypoint_rcnn_R_50_FPN_3x.yaml | 采用FPN的ResNet-50的关键点检测RCNN模型,3倍学习速率 | |
COCO-Keypoints/keypoint_rcnn_X_101_32x8d_FPN_3x.yaml | 采用FPN的ResNeXt-101的关键点检测RCNN模型,3倍学习速率 | |
COCO全景分割 | COCO-PanopticSegmentation/panoptic_fpn_R_101_3x.yaml | 采用FPN的ResNet-101的全景分割模型,3倍学习速率 |
COCO-PanopticSegmentation/panoptic_fpn_R_50_1x.py | 采用FPN的ResNet-50的全景分割模型,1倍学习速率 | |
COCO-PanopticSegmentation/panoptic_fpn_R_50_1x.yaml | 采用FPN的ResNet-50的全景分割模型,1倍学习速率 | |
COCO-PanopticSegmentation/panoptic_fpn_R_50_3x.yaml | 采用FPN的ResNet-50的全景分割模型,3倍学习速率 | |
Cityscapes | Cityscapes/mask_rcnn_R_50_FPN.yaml | 采用FPN的ResNet-50的Cityscapes实例分割模型 |
Detectron1比较 | Detectron1-Comparisons/faster_rcnn_R_50_FPN_noaug_1x.yaml | 采用FPN的ResNet-50的Faster R-CNN模型,无数据增强,1倍学习速率 |
Detectron1-Comparisons/keypoint_rcnn_R_50_FPN_1x.yaml | 采用FPN的ResNet-50的关键点检测RCNN模型,1倍学习速率 | |
Detectron1-Comparisons/mask_rcnn_R_50_FPN_noaug_1x.yaml | 采用FPN的ResNet-50的Mask R-CNN模型,无数据增强,1倍学习速率 | |
LVIS v0.5实例分割 | LVISv0.5-InstanceSegmentation/mask_rcnn_R_101_FPN_1x.yaml | 采用FPN的ResNet-101的Mask R-CNN模型,1倍学习速率,适用于LVIS v0.5 |
LVISv0.5-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml | 采用FPN的ResNet-50的Mask R-CNN模型,1倍学习速率,适用于LVIS v0.5 | |
LVISv0.5-InstanceSegmentation/mask_rcnn_X_101_32x8d_FPN_1x.yaml | 采用FPN的ResNeXt-101的Mask R-CNN模型,1倍学习速率,适用于LVIS v0.5 | |
LVIS v1实例分割 | LVISv1-InstanceSegmentation/mask_rcnn_R_101_FPN_1x.yaml | 采用FPN的ResNet-101的Mask R-CNN模型,1倍学习速率,适用于LVIS v1 |
LVISv1-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml | 采用FPN的ResNet-50的Mask R-CNN模型,1倍学习速率,适用于LVIS v1 | |
LVISv1-InstanceSegmentation/mask_rcnn_X_101_32x8d_FPN_1x.yaml | 采用FPN的ResNeXt-101的Mask R-CNN模型,1倍学习速率,适用于LVIS v1 | |
杂项 | Misc/cascade_mask_rcnn_R_50_FPN_1x.yaml | 基于FPN的ResNet-50的级联Mask R-CNN模型,1倍学习速率 |
Misc/cascade_mask_rcnn_R_50_FPN_3x.yaml | 基于FPN的ResNet-50的级联Mask R-CNN模型,3倍学习速率 | |
Misc/cascade_mask_rcnn_X_152_32x8d_FPN_IN5k_gn_dconv.yaml | 基于FPN的ResNeXt-152的级联Mask R-CNN模型,使用组归一化和扩张卷积 | |
Misc/mask_rcnn_R_50_FPN_1x_cls_agnostic.yaml | 基于FPN的ResNet-50的类别无关的Mask R-CNN模型,1倍学习速率 | |
Misc/mask_rcnn_R_50_FPN_1x_dconv_c3-c5.yaml | 基于FPN的ResNet-50的带有扩张卷积的Mask R-CNN模型,1倍学习速率 | |
Misc/mask_rcnn_R_50_FPN_3x_dconv_c3-c5.yaml | 基于FPN的带有扩张卷积的Mask R-CNN模型,3倍学习速率 | |
Misc/mask_rcnn_R_50_FPN_3x_gn.yaml | 基于FPN的ResNet-50的带有组归一化的Mask R-CNN模型,3倍学习速率 | |
Misc/mask_rcnn_R_50_FPN_3x_syncbn.yaml | 基于FPN的ResNet-50的带有同步批归一化的Mask R-CNN模型,3倍学习速率 | |
Misc/panoptic_fpn_R_101_dconv_cascade_gn_3x.yaml | 基于FPN的ResNet-101的带有扩张卷积和级联组归一化的全景分割模型,3倍学习速率 | |
Misc/scratch_mask_rcnn_R_50_FPN_3x_gn.yaml | 基于FPN的ResNet-50的从头训练的带组归一化的Mask R-CNN模型,3倍学习速率 | |
Misc/scratch_mask_rcnn_R_50_FPN_9x_gn.yaml | 基于FPN的ResNet-50的从头训练的带组归一化的Mask R-CNN模型,9倍学习速率 | |
Misc/scratch_mask_rcnn_R_50_FPN_9x_syncbn.yaml | 基于FPN的ResNet-50的从头训练的带同步批归一化的Mask R-CNN模型,9倍学习速率 | |
Misc/semantic_R_50_FPN_1x.yaml | 采用FPN的ResNet-50的语义分割模型,1倍学习速率 | |
Pascal VOC检测 | PascalVOC-Detection/faster_rcnn_R_50_C4.yaml | 采用C4的ResNet-50的Faster R-CNN模型,PascalVOC检测任务 |
PascalVOC-Detection/faster_rcnn_R_50_FPN.yaml | 采用FPN的ResNet-50的Faster R-CNN模型,PascalVOC检测任务 |
模型体验
上面的表格列出了不同类别的模型和相应的配置文件路径。执行下面的命令下载所有的预训练模型并推理。例如:
python3 infer_allmode.py --input input.jpg --output ./outimgs --cache-dir /liveguard/Detectron2/models/
该命令将 infer_allmode.py
脚本与指定的输入、输出和缓存目录一起执行。具体而言:
- 输入图像:
input.jpg
是将被加载并用于模型推理的图像文件。 - 输出目录:
./outimgs
是模型推理的结果图像保存的目录。 - 缓存目录:
/liveguard/Detectron2/models/
是模型文件的缓存位置,以避免每次运行脚本时重新下载模型。
执行 infer_allmode.py
脚本后,在不同模型配置文件上的推理结果保存在outimgs目录,目录下的目录结构的层次树,每个子目录对应一种模型类型,文件名的格式为 input_<模型名称>.jpg
,已命名的结果图像证明了每个模型的推理任务已经成功执行并保存到了相应的目录中
输出目录结构
顶层目录
/liveguard/Detectron2/outimgs
该目录包含多个子目录,每个子目录对应不同的模型分类。
子目录及其内容
-
COCO-Detection:
- 包含对 COCO 数据集进行目标检测的模型推理结果图像。
- 文件名格式:
input_<模型名称>.jpg
。
├── input_faster_rcnn_R_101_C4_3x.jpg ├── input_faster_rcnn_R_101_DC5_3x.jpg ├── input_faster_rcnn_R_101_FPN_3x.jpg ├── input_faster_rcnn_R_50_C4_1x.jpg ├── input_faster_rcnn_R_50_C4_3x.jpg ├── input_faster_rcnn_R_50_DC5_1x.jpg ├── input_faster_rcnn_R_50_DC5_3x.jpg ├── input_faster_rcnn_R_50_FPN_1x.jpg ├── input_faster_rcnn_R_50_FPN_3x.jpg ├── input_faster_rcnn_X_101_32x8d_FPN_3x.jpg ├── input_retinanet_R_101_FPN_3x.jpg ├── input_retinanet_R_50_FPN_1x.jpg └── input_retinanet_R_50_FPN_3x.jpg
-
COCO-InstanceSegmentation:
- 包含对 COCO 数据集进行实例分割的模型推理结果图像。
- 文件名格式与 COCO-Detection 类似。
├── input_mask_rcnn_R_101_C4_3x.jpg ├── input_mask_rcnn_R_101_DC5_3x.jpg ├── input_mask_rcnn_R_101_FPN_3x.jpg ├── input_mask_rcnn_R_50_C4_1x.jpg ├── input_mask_rcnn_R_50_C4_3x.jpg ├── input_mask_rcnn_R_50_DC5_1x.jpg ├── input_mask_rcnn_R_50_DC5_3x.jpg ├── input_mask_rcnn_R_50_FPN_1x.jpg ├── input_mask_rcnn_R_50_FPN_3x.jpg └── input_mask_rcnn_X_101_32x8d_FPN_3x.jpg
-
COCO-Keypoints:
- 包含对 COCO 数据集进行关键点检测的模型推理结果图像。
├── input_keypoint_rcnn_R_101_FPN_3x.jpg ├── input_keypoint_rcnn_R_50_FPN_1x.jpg ├── input_keypoint_rcnn_R_50_FPN_3x.jpg └── input_keypoint_rcnn_X_101_32x8d_FPN_3x.jpg
-
COCO-PanopticSegmentation:
- 包含对 COCO 数据集进行全景分割的模型推理结果图像。
├── input_panoptic_fpn_R_101_3x.jpg ├── input_panoptic_fpn_R_50_1x.jpg └── input_panoptic_fpn_R_50_3x.jpg
-
Cityscapes:
- 包含对 Cityscapes 数据集进行实例分割的模型推理结果图像。
└── input_mask_rcnn_R_50_FPN.jpg
-
Detectron1-Comparisons:
- 包含用于与 Detectron1 进行比较的模型推理结果图像。
├── input_faster_rcnn_R_50_FPN_noaug_1x.jpg ├── input_keypoint_rcnn_R_50_FPN_1x.jpg └── input_mask_rcnn_R_50_FPN_noaug_1x.jpg
-
LVISv0.5-InstanceSegmentation:
- 包含对 LVIS v0.5 数据集进行实例分割的模型推理结果图像。
├── input_mask_rcnn_R_101_FPN_1x.jpg ├── input_mask_rcnn_R_50_FPN_1x.jpg └── input_mask_rcnn_X_101_32x8d_FPN_1x.jpg
-
Misc:
- 包含各种类型的模型推理结果图像。
├── input_cascade_mask_rcnn_R_50_FPN_1x.jpg ├── input_cascade_mask_rcnn_R_50_FPN_3x.jpg ├── input_cascade_mask_rcnn_X_152_32x8d_FPN_IN5k_gn_dconv.jpg ├── input_mask_rcnn_R_50_FPN_1x_dconv_c3-c5.jpg ├── input_mask_rcnn_R_50_FPN_3x_dconv_c3-c5.jpg ├── input_mask_rcnn_R_50_FPN_3x_gn.jpg ├── input_mask_rcnn_R_50_FPN_3x_syncbn.jpg ├── input_panoptic_fpn_R_101_dconv_cascade_gn_3x.jpg ├── input_scratch_mask_rcnn_R_50_FPN_3x_gn.jpg ├── input_scratch_mask_rcnn_R_50_FPN_9x_gn.jpg └── input_scratch_mask_rcnn_R_50_FPN_9x_syncbn.jpg
-
PascalVOC-Detection:
- 包含对 Pascal VOC 数据集进行目标检测的模型推理结果图像。
└── input_faster_rcnn_R_50_C4.jpg
总结
该结果展示了执行 infer_allmode.py
脚本后,在不同模型配置文件上的推理结果。每个子目录对应一种模型类型,文件名的格式为 input_<模型名称>.jpg
,已命名的结果图像证明了每个模型的推理任务已经成功执行并保存到了相应的目录中。通过这种方式,可以方便地比较不同模型在相同输入图像上的推理结果。
代码及概述
下面是带有详细注释的代码:
import argparse # 用于处理命令行参数
import os # 提供与操作系统相关的功能
import cv2 # OpenCV库,用于图像处理
import torch # PyTorch库,深度学习的基础库
import time # 提供时间相关的功能
from detectron2 import model_zoo # Detectron2的模型库
from detectron2.engine import DefaultPredictor # Detectron2的默认预测器
from detectron2.config import get_cfg # 获取Detectron2的配置对象
from detectron2.utils.logger import setup_logger # 设置日志工具
from detectron2.utils.visualizer import Visualizer # 可视化工具
from detectron2.data import MetadataCatalog # 用于管理数据集元数据
# 所有模型配置文件的字典
MODEL_CONFIGS = {
"COCO-Detection": [
"fast_rcnn_R_50_FPN_1x.yaml",
"faster_rcnn_R_101_C4_3x.yaml",
"faster_rcnn_R_101_DC5_3x.yaml",
"faster_rcnn_R_101_FPN_3x.yaml",
"faster_rcnn_R_50_C4_1x.yaml",
"faster_rcnn_R_50_C4_3x.yaml",
"faster_rcnn_R_50_DC5_1x.yaml",
"faster_rcnn_R_50_DC5_3x.yaml",
"faster_rcnn_R_50_FPN_1x.yaml",
"faster_rcnn_R_50_FPN_3x.yaml",
"faster_rcnn_X_101_32x8d_FPN_3x.yaml",
"retinanet_R_101_FPN_3x.yaml",
"retinanet_R_50_FPN_1x.yaml",
"retinanet_R_50_FPN_3x.yaml",
"rpn_R_50_C4_1x.yaml",
"rpn_R_50_FPN_1x.yaml",
],
"COCO-InstanceSegmentation": [
"mask_rcnn_R_101_C4_3x.yaml",
"mask_rcnn_R_101_DC5_3x.yaml",
"mask_rcnn_R_101_FPN_3x.yaml",
"mask_rcnn_R_50_C4_1x.yaml",
"mask_rcnn_R_50_C4_3x.yaml",
"mask_rcnn_R_50_DC5_1x.yaml",
"mask_rcnn_R_50_DC5_3x.yaml",
"mask_rcnn_R_50_FPN_1x.yaml",
"mask_rcnn_R_50_FPN_3x.yaml",
"mask_rcnn_X_101_32x8d_FPN_3x.yaml",
],
"COCO-Keypoints": [
"keypoint_rcnn_R_101_FPN_3x.yaml",
"keypoint_rcnn_R_50_FPN_1x.yaml",
"keypoint_rcnn_R_50_FPN_3x.yaml",
"keypoint_rcnn_X_101_32x8d_FPN_3x.yaml",
],
"COCO-PanopticSegmentation": [
"panoptic_fpn_R_101_3x.yaml",
"panoptic_fpn_R_50_1x.yaml",
"panoptic_fpn_R_50_3x.yaml",
],
"Cityscapes": [
"mask_rcnn_R_50_FPN.yaml",
],
"Detectron1-Comparisons": [
"faster_rcnn_R_50_FPN_noaug_1x.yaml",
"keypoint_rcnn_R_50_FPN_1x.yaml",
"mask_rcnn_R_50_FPN_noaug_1x.yaml",
],
"LVISv0.5-InstanceSegmentation": [
"mask_rcnn_R_50_FPN_1x.yaml",
"mask_rcnn_X_101_32x8d_FPN_1x.yaml",
],
"Misc": [
"cascade_mask_rcnn_R_50_FPN_1x.yaml",
"cascade_mask_rcnn_R_50_FPN_3x.yaml",
"cascade_mask_rcnn_X_152_32x8d_FPN_IN5k_gn_dconv.yaml",
"mask_rcnn_R_50_FPN_1x_dconv_c3-c5.yaml",
"mask_rcnn_R_50_FPN_3x_dconv_c3-c5.yaml",
"mask_rcnn_R_50_FPN_3x_gn.yaml",
"mask_rcnn_R_50_FPN_3x_syncbn.yaml",
"panoptic_fpn_R_101_dconv_cascade_gn_3x.yaml",
"scratch_mask_rcnn_R_50_FPN_3x_gn.yaml",
"scratch_mask_rcnn_R_50_FPN_9x_gn.yaml",
"scratch_mask_rcnn_R_50_FPN_9x_syncbn.yaml",
"semantic_R_50_FPN_1x.yaml",
],
"PascalVOC-Detection": [
"faster_rcnn_R_50_C4.yaml",
"faster_rcnn_R_50_FPN.yaml",
]
}
def draw_model_name(image, text):
"""
在图像上绘制模型名称的矩形框和文本。
:param image: 输入图像
:param text: 要绘制的文本
:return: 带有绘制文本的图像
"""
font = cv2.FONT_HERSHEY_SIMPLEX
font_scale = 0.6
color = (255, 0, 0)
thickness = 2
(text_width, text_height), _ = cv2.getTextSize(text, font, font_scale, thickness)
overlay = image.copy()
cv2.rectangle(overlay, (5, 5), (10 + text_width, 10 + text_height + 20), (255, 255, 255), -1)
cv2.putText(overlay, text, (10, 30), font, font_scale, color, thickness)
return cv2.addWeighted(overlay, 0.7, image, 0.3, 0)
def run_inference(args):
"""
运行推理,处理各个模型并保存输出图像。
:param args: 命令行参数
"""
# 设置日志
setup_logger()
# 检查设备(CPU或GPU)
device = 'cuda' if torch.cuda.is_available() else 'cpu'
print(f"Using device: {device}")
# 加载输入图像
im = cv2.imread(args.input)
input_filename = os.path.splitext(os.path.basename(args.input))[0]
# 遍历所有模型配置
for category, models in MODEL_CONFIGS.items():
for model in models:
if model.endswith('.py'):
continue # 跳过 .py 配置文件
model_path = f"{category}/{model}"
print(f"Running inference with model: {model_path}")
# 创建配置
cfg = get_cfg()
cfg.merge_from_file(model_zoo.get_config_file(model_path))
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5
# 设置权重和设备
try:
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url(model_path)
except RuntimeError as e:
print(f"Skipping {model_path} due to missing model weights.")
continue
cfg.MODEL.DEVICE = device
# 创建预测器
predictor = DefaultPredictor(cfg)
try:
start_time = time.time() # 开始计时
# 进行推理
outputs = predictor(im)
# 结束计时
end_time = time.time()
elapsed_time = end_time - start_time
print(f"Inference with model {model_path} took {elapsed_time:.2f} seconds")
# 可视化预测结果
v = Visualizer(im[:, :, ::-1], MetadataCatalog.get(cfg.DATASETS.TRAIN[0]), scale=1.2)
out = v.draw_instance_predictions(outputs["instances"].to("cpu"))
# 生成输出路径
model_filename = os.path.splitext(os.path.basename(model))[0]
output_filename = f"{input_filename}_{model_filename}.jpg"
output_dir = os.path.join(args.output, category)
os.makedirs(output_dir, exist_ok=True)
output_path = os.path.join(output_dir, output_filename)
# 在输出图像上绘制模型名称
output_image = out.get_image()[:, :, ::-1]
output_image = draw_model_name(output_image, model_filename)
# 保存输出文件
cv2.imwrite(output_path, output_image)
print(f"Output saved to {output_path}")
except Exception as e:
print(f"Error inferencing with {model_path}: {e}")
continue
if __name__ == "__main__":
# 解析命令行参数
parser = argparse.ArgumentParser(description="Detectron2 Inference Script")
parser.add_argument("--input", required=True, help="Path to the input image")
parser.add_argument("--output", required=True, help="Path to the output directory")
parser.add_argument("--cache-dir", required=True, help="Path to the cache directory")
args = parser.parse_args()
# 确保缓存目录存在
os.makedirs(args.cache_dir, exist_ok=True)
os.environ["FVCORE_CACHE"] = args.cache_dir
run_inference(args)
代码概述
-
包导入:
- 处理命令行参数、操作系统功能、图像处理、PyTorch、时间管理、Detectron2相关库的导入。
-
模型配置:
MODEL_CONFIGS
字典存储了各种模型配置文件路径。
-
函数
draw_model_name
:- 在图像上绘制模型名称,用于标识每个生成图像对应的模型。
-
函数
run_inference
:- 设置日志、检测设备、加载输入图像、遍历所有模型配置、创建配置和预测器、进行推理、可视化预测结果、生成输出路径、绘制模型名称并保存输出文件。
-
脚本入口:
- 解析命令行参数,并调用
run_inference
函数开始处理。
- 解析命令行参数,并调用
使用方法
在命令行输入以下命令,运行脚本进行推理:
python3 infer_allmode.py --input input.jpg --output ./outimgs --cache-dir /liveguard/Detectron2/models/
运行环境
使用Dockerfile构建一个包含NVIDIA的PyTorch和Detectron2的镜像
nvcr.io/nvidia/pytorch:23.01-py3