detectron2入门实测
之前的文章有提到使用 detectron2 实现图像分割的功能,接下来就很快熟悉了下pytorch的环境,然后根据网友的文章搭建环境。
本篇文章结构
- 搭建环境重点介绍
- 测试detetron2 demo
- 使用VIA 2 注释图样数据集
- 测试 自定义数据集
- 搭建环境重点介绍
笔者的环境是WIN10 下使用anaconda 3实现的。
GPU1050TI , 使用nvidia-smi 显示:
NVIDIA-SMI 471.41 Driver Version: 471.41 CUDA Version: 11.4 |
|-------------------------------+----------------------+----------------------+
| GPU Name TCC/WDDM | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA GeForce ... WDDM | 00000000:1D:00.0 On | N/A |
| 20% 30C P5 N/A / 90W | 446MiB / 4096MiB | 0% Default |
| | | N/A |
在开始里边找到 anaconda 打开 anaconda powershell prompt .
conda create -n PYTORCH python==3.7
conda activate PYTORCH
在PYTORCH的环境下安装 pytorch 和torchvision 等dependencies .
首先安装好CUDA 10.1的驱动 。驱动名称如下
cuda_10.1.243_426.00_win10.exe
安装好后会在目录下
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA
出现,之前安装过 CUDA 9,也会并存。
安装cudnn
cudnn-10.1-windows10-x64-v7.6.5.32.zip 解压并拷贝到cuda v10.1下。
安装pytorch
window cuda 10.1版本
# CUDA 10.1
conda install pytorch==1.8.1 torchvision==0.9.1 torchaudio==0.8.1 cudatoolkit=10.1 -c pytorch
网络好的环境下很快。
这里需要注意的是
pytorch 和 torchvison 需要对应,
如果使用 conda --offline install 离线安装pytorch .
torchvision pytorch/win-64::torchvision-0.9.1-py37_cu101
最后安装detectron2 .
找张图片放到 demo 下
- 使用VIA 2 注释图样数据集
via 可以将之前via 1.6的数据导入进来,在基础上继续修改,然后添加categories 分类。
参考文章
https://wendeehsu.medium.com/instance-segmentation-with-detectron2-127fbe01b20b
按照上述的步骤 将 训练集train 和 验证集 val 准备好。 都是 图片+一个JSON文件的样式。
- 测试 自定义数据集
这里我们需要将我们的图集转换成detectron2可以作为输入的形式。由于我只有 1 个类,因此category_id设置为 0。如果您有更多类,则对象的 category_id 应与其类别相对应。此外,iscrowd为 0,因为我们的目标检测是单个对象分割。
vis_test.python
import torch, torchvision import detectron2 from detectron2.utils.logger import setup_logger import os import numpy as np import json import cv2 import matplotlib.pyplot as plt from detectron2.structures import BoxMode from detectron2.data import DatasetCatalog, MetadataCatalog import random from detectron2.utils.visualizer import Visualizer print(torch.__version__, torch.cuda.is_available()) # 1.5.0+cu101 True setup_logger() def get_dicts(img_dir): json_file = os.path.join(img_dir, "via_export_json.json") with open(json_file) as f: imgs_anns = json.load(f) dataset_dicts = [] for idx, v in enumerate(imgs_anns.values()): record = {} filename = os.path.join(img_dir, v["filename"]) height, width = cv2.imread(filename).shape[:2] record["file_name"] = filename record["image_id"] = idx record["height"] = height record["width"] = width annos = v["regions"] objs = [] for anno in annos: anno = anno["shape_attributes"] px = anno["all_points_x"] py = anno["all_points_y"] poly = [(x + 0.5, y + 0.5) for x, y in zip(px, py)] poly = [p for x in poly for p in x] obj = { "bbox": [np.min(px), np.min(py), np.max(px), np.max(py)], "bbox_mode": BoxMode.XYXY_ABS, "segmentation": [poly], "category_id": 0, "iscrowd": 0 } objs.append(obj) print(objs) record["annotations"] = objs dataset_dicts.append(record) return dataset_dicts path = "plane_dataset_via2" # path to your image folder for d in ["train", "val"]: DatasetCatalog.register("BLOCK_" + d, lambda d=d: get_dicts(path + "/" + d)) MetadataCatalog.get("BLOCK_" + d).set(thing_classes=["BLOCK"]) dataset_dicts = get_dicts(path + "/" + "train") for d in random.sample(dataset_dicts, 3): img = cv2.imread(d["file_name"]) visualizer = Visualizer(img[:, :, ::-1], metadata=MetadataCatalog.get("BLOCK_train"), scale=0.5) vis = visualizer.draw_dataset_dict(d) plt.imshow(vis.get_image()[:, :, ::-1]) plt.show()
有显示标注正确。