【OpenMMLab AI实战营二期笔记】第七天 MMDetection代码课

0. 环境检测和安装

# 安装 mmengine 和 mmcv 依赖
# 为了防止后续版本变更导致的代码无法运行,暂时锁死版本
pip install -U "openmim==0.3.7"
mim install "mmengine==0.7.1"
mim install "mmcv==2.0.0"# Install mmdetection
rm -rf mmdetection
# 为了防止后续更新导致的可能无法运行,特意新建了 tutorials 分支
git clone -b tutorials https://github.com/open-mmlab/mmdetection.git
cd mmdetectionpip install -e .

以下提供一个环境检查的小代码:

from mmengine.utils import get_git_hash
from mmengine.utils.dl_utils import collect_env as collect_base_envimport mmdet# 环境信息收集和打印
def collect_env():"""Collect the information of the running environments."""env_info = collect_base_env()env_info['MMDetection'] = f'{mmdet.__version__}+{get_git_hash()[:7]}'return env_infoif __name__ == '__main__':for name, val in collect_env().items():print(f'{name}: {val}')

1.数据集准备和可视化

已经提供了一个猫的数据集,且已经划分了训练集和测试集

# 数据集下载
rm -rf cat_dataset*
wget https://download.openmmlab.com/mmyolo/data/cat_dataset.zip
unzip cat_dataset.zip -d cat_dataset && rm cat_dataset.zip 

数据的可视化如下

# 数据集可视化import os
import matplotlib.pyplot as plt
from PIL import Image%matplotlib inline
%config InlineBackend.figure_format = 'retina'original_images = []
images = []
texts = []
plt.figure(figsize=(16, 5))image_paths= [filename for filename in os.listdir('cat_dataset/images')][:8]for i,filename in enumerate(image_paths):name = os.path.splitext(filename)[0]image = Image.open('cat_dataset/images/'+filename).convert("RGB")plt.subplot(2, 4, i+1)plt.imshow(image)plt.title(f"{filename}")plt.xticks([])plt.yticks([])plt.tight_layout()

该数据集的COCO json可视化如下所示

from pycocotools.coco import COCO
import numpy as np
import os.path as osp
from matplotlib.collections import PatchCollection
from matplotlib.patches import Polygondef apply_exif_orientation(image):_EXIF_ORIENT = 274if not hasattr(image, 'getexif'):return imagetry:exif = image.getexif()except Exception:exif = Noneif exif is None:return imageorientation = exif.get(_EXIF_ORIENT)method = {2: Image.FLIP_LEFT_RIGHT,3: Image.ROTATE_180,4: Image.FLIP_TOP_BOTTOM,5: Image.TRANSPOSE,6: Image.ROTATE_270,7: Image.TRANSVERSE,8: Image.ROTATE_90,}.get(orientation)if method is not None:return image.transpose(method)return imagedef show_bbox_only(coco, anns, show_label_bbox=True, is_filling=True):"""Show bounding box of annotations Only."""if len(anns) == 0:returnax = plt.gca()ax.set_autoscale_on(False)image2color = dict()for cat in coco.getCatIds():image2color[cat] = (np.random.random((1, 3)) * 0.7 + 0.3).tolist()[0]polygons = []colors = []for ann in anns:color = image2color[ann['category_id']]bbox_x, bbox_y, bbox_w, bbox_h = ann['bbox']poly = [[bbox_x, bbox_y], [bbox_x, bbox_y + bbox_h],[bbox_x + bbox_w, bbox_y + bbox_h], [bbox_x + bbox_w, bbox_y]]polygons.append(Polygon(np.array(poly).reshape((4, 2))))colors.append(color)if show_label_bbox:label_bbox = dict(facecolor=color)else:label_bbox = Noneax.text(bbox_x,bbox_y,'%s' % (coco.loadCats(ann['category_id'])[0]['name']),color='white',bbox=label_bbox)if is_filling:p = PatchCollection(polygons, facecolor=colors, linewidths=0, alpha=0.4)ax.add_collection(p)p = PatchCollection(polygons, facecolor='none', edgecolors=colors, linewidths=2)ax.add_collection(p)coco = COCO('cat_dataset/annotations/test.json')
image_ids = coco.getImgIds()
np.random.shuffle(image_ids)plt.figure(figsize=(16, 5))# 只可视化 8 张图片
for i in range(8):image_data = coco.loadImgs(image_ids[i])[0]image_path = osp.join('cat_dataset/images/',image_data['file_name'])annotation_ids = coco.getAnnIds(imgIds=image_data['id'], catIds=[], iscrowd=0)annotations = coco.loadAnns(annotation_ids)ax = plt.subplot(2, 4, i+1)image = Image.open(image_path).convert("RGB")# 这行代码很关键,否则可能图片和标签对不上image=apply_exif_orientation(image)ax.imshow(image)show_bbox_only(coco, annotations)plt.title(f"{filename}")plt.xticks([])plt.yticks([])plt.tight_layout()  

2.自定义配置文件

RTMDet

本教程采用 RTMDet 进行演示,在开始自定义配置文件前,先来了解下 RTMDet 算法。
RTMDet

其模型架构图如上所示。RTMDet 是一个高性能低延时的检测算法,目前已经实现了目标检测、实例分割和旋转框检测任务。其简要描述为:为了获得更高效的模型架构,MMDetection 探索了一种具有骨干和 Neck 兼容容量的架构,由一个基本的构建块构成,其中包含大核深度卷积。MMDetection 进一步在动态标签分配中计算匹配成本时引入软标签,以提高准确性。结合更好的训练技巧,得到的目标检测器名为 RTMDet,在 NVIDIA 3090 GPU 上以超过 300 FPS 的速度实现了 52.8% 的 COCO AP,优于当前主流的工业检测器。RTMDet 在小/中/大/特大型模型尺寸中实现了最佳的参数-准确度权衡,适用于各种应用场景,并在实时实例分割和旋转对象检测方面取得了新的最先进性能。

自定义配置文件

目前使用的cat的数据集,是一个单类的数据集,相比MMdetection提供的coco的80类的配置需要进行一定的改动。
MMDetection3.0相比2.0的重要改动,添加了metainfo字段

metainfo = {# 类别名,注意 classes 需要是一个 tuple,因此即使是单类,# 你应该写成 `cat,` 很多初学者经常会在这犯错'classes': ('cat',),#因为这里是个元组'palette': [(220, 20, 60),]
}

具体的修改内容如下:

# 当前路径位于 mmdetection/tutorials, 配置将写到 mmdetection/tutorials 路径下config_cat = """
_base_ = 'configs/rtmdet/rtmdet_tiny_8xb32-300e_coco.py'data_root = 'cat_dataset/'# 非常重要
metainfo = {# 类别名,注意 classes 需要是一个 tuple,因此即使是单类,# 你应该写成 `cat,` 很多初学者经常会在这犯错'classes': ('cat',),'palette': [(220, 20, 60),]
}
num_classes = 1# 训练 40 epoch
max_epochs = 40
# 训练单卡 bs= 12
train_batch_size_per_gpu = 12
# 可以根据自己的电脑修改
train_num_workers = 4# 验证集 batch size 为 1
val_batch_size_per_gpu = 1
val_num_workers = 2# RTMDet 训练过程分成 2 个 stage,第二个 stage 会切换数据增强 pipeline
num_epochs_stage2 = 5# batch 改变了,学习率也要跟着改变, 0.004 是 8卡x32 的学习率
base_lr = 12 * 0.004 / (32*8)# 采用 COCO 预训练权重
load_from = 'https://download.openmmlab.com/mmdetection/v3.0/rtmdet/rtmdet_tiny_8xb32-300e_coco/rtmdet_tiny_8xb32-300e_coco_20220902_112414-78e30dcc.pth'  # noqamodel = dict(# 考虑到数据集太小,且训练时间很短,我们把 backbone 完全固定# 用户自己的数据集可能需要解冻 backbonebackbone=dict(frozen_stages=4),# 不要忘记修改 num_classesbbox_head=dict(dict(num_classes=num_classes)))# 数据集不同,dataset 输入参数也不一样
train_dataloader = dict(batch_size=train_batch_size_per_gpu,num_workers=train_num_workers,pin_memory=False,dataset=dict(data_root=data_root,metainfo=metainfo,ann_file='annotations/trainval.json',data_prefix=dict(img='images/')))val_dataloader = dict(batch_size=val_batch_size_per_gpu,num_workers=val_num_workers,dataset=dict(metainfo=metainfo,data_root=data_root,ann_file='annotations/test.json',data_prefix=dict(img='images/')))test_dataloader = val_dataloader# 默认的学习率调度器是 warmup 1000,但是 cat 数据集太小了,需要修改 为 30 iter
param_scheduler = [dict(type='LinearLR',start_factor=1.0e-5,by_epoch=False,begin=0,end=30),dict(type='CosineAnnealingLR',eta_min=base_lr * 0.05,begin=max_epochs // 2,  # max_epoch 也改变了end=max_epochs,T_max=max_epochs // 2,by_epoch=True,convert_to_iter_based=True),
]
optim_wrapper = dict(optimizer=dict(lr=base_lr))# 第二 stage 切换 pipeline 的 epoch 时刻也改变了
_base_.custom_hooks[1].switch_epoch = max_epochs - num_epochs_stage2val_evaluator = dict(ann_file=data_root + 'annotations/test.json')
test_evaluator = val_evaluator# 一些打印设置修改
default_hooks = dict(checkpoint=dict(interval=10, max_keep_ckpts=2, save_best='auto'),  # 同时保存最好性能权重logger=dict(type='LoggerHook', interval=5))
train_cfg = dict(max_epochs=max_epochs, val_interval=10)
"""with open('rtmdet_tiny_1xb12-40e_cat.py', 'w') as f:f.write(config_cat)

需要注意几个问题:

  1. 自定义数据集中最重要的是 metainfo 字段,用户在配置完成后要记得将其传给 dataset,否则不生效(有些用户在自定义数据集时候喜欢去 直接修改 coco.py 源码,这个是强烈不推荐的做法,正确做法是配置 metainfo 并传给 dataset)

  2. 如果用户 metainfo 配置不正确,通常会出现几种情况:(1) 出现 num_classes 不匹配错误 (2) loss_bbox 始终为 0 (3) 出现训练后评估结果为空等典型情况

  3. MMDetection 提供的学习率大部分都是基于 8 卡,如果你的总 bs 不同,一定要记得缩放学习率,否则有些算法很容易出现 NAN,具体参考 https://mmdetection.readthedocs.io/zh_CN/latest/user_guides/train.html#id3

3.训练前可视化验证

开始训练前推荐先验证一下你的整个数据流是否是对的。我们可以采用 mmdet 提供的 tools/analysis_tools/browse_dataset.py 脚本来对训练前的 dataloader 输出进行可视化,确保数据部分没有问题。
考虑到我们仅仅想可视化前几张图片,因此下面基于 browse_dataset.py 实现一个简单版本即可

from mmdet.registry import DATASETS, VISUALIZERS
from mmengine.config import Config
from mmengine.registry import init_default_scopecfg = Config.fromfile('rtmdet_tiny_1xb12-40e_cat.py')init_default_scope(cfg.get('default_scope', 'mmdet'))dataset = DATASETS.build(cfg.train_dataloader.dataset)
visualizer = VISUALIZERS.build(cfg.visualizer)
visualizer.dataset_meta = dataset.metainfoplt.figure(figsize=(16, 5))# 只可视化前 8 张图片
for i in range(8):item=dataset[i]img = item['inputs'].permute(1, 2, 0).numpy()data_sample = item['data_samples'].numpy()gt_instances = data_sample.gt_instancesimg_path = osp.basename(item['data_samples'].img_path)gt_bboxes = gt_instances.get('bboxes', None)gt_instances.bboxes = gt_bboxes.tensordata_sample.gt_instances = gt_instancesvisualizer.add_datasample(osp.basename(img_path),img,data_sample,draw_pred=False,show=False)drawed_image=visualizer.get_image()plt.subplot(2, 4, i+1)plt.imshow(drawed_image[..., [2, 1, 0]])plt.title(f"{osp.basename(img_path)}")plt.xticks([])plt.yticks([])plt.tight_layout()

4.模型训练

在验证数据流没有问题之后,开始训练

python tools/train.py rtmdet_tiny_1xb12-40e_cat.py

5.模型测试和推理

选择训练得到的最佳权重来测试

python tools/test.py rtmdet_tiny_1xb12-40e_cat.py work_dirs/rtmdet_tiny_1xb12-40e_cat/best_coco/bbox_mAP_epoch_30.pth
python tools/test.py rtmdet_tiny_1xb12-40e_cat.py work_dirs/rtmdet_tiny_1xb12-40e_cat/best_coco/bbox_mAP_epoch_30.pth --show-dir results# 保存真实值和预测值

可视化

# 数据集可视化import os
import matplotlib.pyplot as plt
from PIL import Image%matplotlib inlineplt.figure(figsize=(20, 20))# 你如果重新跑,这个时间戳是不一样的,需要自己修改
root_path='work_dirs/rtmdet_tiny_1xb12-40e_cat/20230608_120933/results/'
image_paths= [filename for filename in os.listdir(root_path)][:4]for i,filename in enumerate(image_paths):name = os.path.splitext(filename)[0]image = Image.open(root_path+filename).convert("RGB")plt.subplot(4, 1, i+1)plt.imshow(image)plt.title(f"{filename}")plt.xticks([])plt.yticks([])plt.tight_layout()

6.可视化分析

可视化分析包括特征图可视化以及类似 Grad CAM 等可视化分析手段。由于 MMDetection 中还没有实现,可以直接采用 MMYOLO 中提供的功能和脚本。
MMYOLO环境和依赖安装

cd ../
rm -rf mmyolo
# 为了防止后续更新导致的可能无法运行,特意新建了 tutorials 分支
git clone -b tutorials https://github.com/open-mmlab/mmyolo.git #下载
cd mmyolo
pip install -e .# 安装

特征图可视化

### 放缩图片的过程
import cv2
img = cv2.imread('../mmdetection/cat_dataset/images/IMG_20211024_223313.jpg')
h,w=img.shape[:2]
resized_img = cv2.resize(img, (640, 640))
cv2.imwrite('resized_image.jpg', resized_img)

可视化backbone输出的三个通道

python demo/featmap_vis_demo.py \resized_image.jpg \../mmdetection/rtmdet_tiny_1xb12-40e_cat.py \../mmdetection/work_dirs/rtmdet_tiny_1xb12-40e_cat/best_coco/bbox_mAP_epoch_30.pth  \--target-layers backbone  \--channel-reduction squeeze_mean
Image.open('output/resized_image.jpg') 

可视化neck输出的三个通道

python demo/featmap_vis_demo.py \resized_image.jpg \../mmdetection/rtmdet_tiny_1xb12-40e_cat.py \../mmdetection/work_dirs/rtmdet_tiny_1xb12-40e_cat/best_coco/bbox_mAP_epoch_30.pth  \--target-layers neck  \--channel-reduction squeeze_mean
Image.open('output/resized_image.jpg') 

Grad-Based CAM可视化
区分类别的可视化。由于目标检测的特殊性,这里实际上可视化的并不是 CAM 而是 Grad Box AM。使用前需要先安装 grad-cam 库

pip install "grad-cam"

可视化neck 输出的最小输出特征图的 Grad CAM

python demo/boxam_vis_demo.py \resized_image.jpg \../mmdetection/rtmdet_tiny_1xb12-40e_cat.py \../mmdetection/work_dirs/rtmdet_tiny_1xb12-40e_cat/best_coco/bbox_mAP_epoch_30.pth  \--target-layer neck.out_convs[2]
Image.open('output/resized_image.jpg') 

可视化neck 输出的最大输出特征图的 Grad CAM

python demo/boxam_vis_demo.py \resized_image.jpg \../mmdetection/rtmdet_tiny_1xb12-40e_cat.py \../mmdetection/work_dirs/rtmdet_tiny_1xb12-40e_cat/best_coco/bbox_mAP_epoch_30.pth  \--target-layer neck.out_convs[0]
Image.open('output/resized_image.jpg')   

由于大物体不会在该层预测,因此梯度可视化是 0,符合预期。

7.检测新趋势

典型的方向如:

  1. Open-Vocabulary Object Detection,即开放词汇目标检测,给定图片和类别词汇表,检测所有物体
  2. Grounding Object Detection,即给定图片和文本描述,预测文本中所提到的在图片中的物体位置
  3. 随着 ChatGPT 的强大功能,一个模型可以完成非常多不可思议的事情,在视觉领域大家也开始倾向于研究大一统模型,例如通用图像分割模型,一个模型可以实现封闭集和开放集语义分割、实例分割、全景分割、图像描述等等任务,典型的如 X-Decoder。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/31795.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI实战营第二期 第六节 《MMDetection代码课》——笔记7

文章目录 什么是MMDetection?环境检测和安装1 数据集准备和可视化2 自定义配置文件3 训练前可视化验证4 模型训练5 模型测试和推理6 可视化分析MMYOLO 环境和依赖安装特征图可视化1. 可视化 backbone 输出的 3 个通道2. 可视化 neck 输出的 3 个通道 Grad-Based CAM…

最新!2023软科中国大学排名发布!

Datawhale高校 方向:软科中国大学排名,来源:软科 2023年3月30日,高等教育专业评价机构软科今日正式发布2023“软科中国大学专业排名”。 上榜高校共有590所,清华大学、北京大学、浙江大学连续9年蝉联全国三甲&#xf…

ChatGPT 和对话式 AI 的未来:2023 年的进展和应用

人工智能(Artificial Intelligence)在过去一段时间以来以前所未有的速度快速发展。从自动化日常任务到重要提醒的设定,AI以各种方式渗透到我们的生活中。然而,在这个领域中迈出的最重要一步是ChatGPT。 ChatGPT被瑞银(UBS)评为“有史以来增长最快的消费者应用程序”,于…

月薪13K!从零开始,小白转行程序员,三个月实现人生逆转~

思绪运转之间,上班也已经有一周了,我有想过给的所有老师都写一封感谢信的,但发现工作量太大了,只能用这一封信来表达对所有老师们的感谢。 软件测试,一个陌生的领域,对于一个毫无经验的小白来说&#xff0…

ChatGPT生成一篇文章:关于Docker

如今AI智能如火如荼,如果不会点ChatGPT总感觉有点落后了。最近刚好重新复习了一遍Docker,这里尝试通过ChatGPT来生成一篇关于Docker文章。来看效果。 1、什么是Docker Docker是一种容器化技术,可以将应用程序和它们的依赖项封装在一个虚拟的…

自主安装IPA文件到iPhone上

1.电脑下载iTunes,手机使用数据线连接在电脑上,一定要选择信任电脑 2.打开iTunes,点击手机图标 3.拖拽已下载的IPA文件到我的设备,蓝色高亮处,可以看到顶部的进度条,进度条完了可以查看手机,已…

iPhone 直接安装 .ipa包

有些App因为各种原因,不能直接通过App Store下载到,以前是可以在网上找到.ipa文件通过iTunes直接安装的。但是现在的版本已经不支持了。 官方的工具不好用,只好用民间的了。我们在电脑上下载一个爱思助手,然后将手机连接到电脑上…

实现 ipad 上看来自 v4l2 上的摄像头视频

配合 http://blog.csdn.net/sunkwei/archive/2011/06/07/6530343.aspx 实现在 ipad 上观看来自 v4l2 的摄像头视频. 先上ipad 抓屏图 这个做的很粗糙, 而且有些 opengl es 的概念也没有搞明白, 慢慢再补充吧.

【iOS开发】ipa安装到手机上的三种方式

转载地址:ipa安装到手机上的三种方式 ipa包 安装三种方式,优先推荐第一种方法(通过iTunes安装)。 1、通过iTunes安装 数据线连接手机之后,会自动连接iTunes,(第一次连接的时候会提示是否信任…

iphone或者ipad上安装自己打包的ipa文件

对于非ios开发者来说,这确实是一个问题,但我懂的也不多,也是抱着试试的态度安装了下,之前我以为安装ipa和在安卓手机上安装apk一样,qq或者微信传文件下载点击就可以安装了,但这个ipa如果在iphone上这样做&a…

苹果如何安装ipa(亲测有用,无需越狱)

方法一 懒省事使用爱思助手即可(需要签名) 方法二 1.下载cydiaimpactor(无需签名) 官方地址 百度云下载:https://pan.baidu.com/s/1rYIG4go-fOEHarSjziA1eg 提取码:3b48 2.连上苹果手机,启动cy…

ios 程序发布成ipa 文件 通过 web 下载和安装。install App via OTA

转自: http://blog.csdn.net/totogogo/article/details/7391531 iOS 7.1正式版发布了,之前使用itms-services://URL方式在线安装ipa文件的方法却失效了,点击的时候报错为:“无法安装应用程序,因xxx.com的证书无效”&a…

IPA 包不经过APP Store直接发布到网站供用户下载安装

最近公司有需求,要把IOS客户端(IPA包)放到自己服务器上供用户下载,这样就能跳过APP Store 的审核。 准备条件 1.IOS 开发包 即IPA文件。 2.Plist文件。 3.https服务器(IOS7.01之后必须https) 准备条件…

iOS打包IPA教程

转载:xcode打包导出ipa 众所周知,在开发苹果应用时需要使用签名(证书)才能进行打包安装苹果 IPA,作为刚接触ios开发的同学,只是学习ios app开发内测,并没有上架appstore需求,对于苹…

如何用苹果app完成ipa安装

当打包完ipa文件后,ipa文件无法直接安装,只能添加udid安装到手机,或者上架才能安装,这里,我分享下使用本站工具上传ipa到app store,无需mac电脑完成ipa文件上架的详细步骤: 1、首先&#xff0c…

Mac 电脑下载 AppStore 中的 ipa 软件包详细流程

附:iPhone 移除描述文件详细步骤(Apple Configurator 2) 1、Mac 电脑中安装 Apple Configurator 2 软件。 2、电脑连接手机,并信任,在所有设备中,选中设备,然后点击顶部的加号,选…

IPA安装的几种方法

ipa文件的安装主要有两种方法,一种是使用Apple提供的iTunes安装;另外一种是使用第三方软件安装,比如PP助手之类的。 iTunes安装 打开iTunes 将iPhone与PC同步,并打开iTunes 在下拉列表框里选择"应用" 然后点击 “资料库” ->…

在iPad利用UTM安装Ubuntu20.04的完整过程+远程操控

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、安装Altstore二、UTM是什么?如何安装?1.UTM简介2.UTM.ipa下载3.安装UTM 三、Jitterbug的安装1.Jitterbug安装2.用Jitterbug调试UTM3…

如何通过电脑向ipad传电影视频(不用越狱)

前言 为了能在ipad上看电脑上已下载的电影,我可是试了各种方法,心好累,还好终于解决了。不得不说,网上没一个靠谱的答案! 方法一 如果电影本身的格式是 mp4,mov,m4a格式,通过官方的i…

全网最详细中英文ChatGPT-GPT-4示例文档-从0到1快速入门自然语言指令创建调用OpenAI代码——官网推荐的48种最佳应用(附python/node.js/curl命令源代码,小白也能学)

从0到1快速入门自然语言指令创建调用OpenAI API应用场景 Introduce 简介setting 设置Prompt 提示Sample response 回复样本API request 接口请求python接口请求示例node.js接口请求示例curl命令示例json格式示例 其它资料下载 ChatGPT是目前最先进的AI聊天机器人,它…