detectron2入门实测

之前的文章有提到使用 detectron2 实现图像分割的功能,接下来就很快熟悉了下pytorch的环境,然后根据网友的文章搭建环境。

o.gif

本篇文章结构


  • 搭建环境重点介绍
  • 测试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 .


清华的pytorch 源链接:

可以使用离线安装
conda install .\pytorch-1.8.1-py3.7_cuda10.1_cudnn7_0.tar.bz2
接着安装 对应的CUDA的torchvision ,torchvison 的格式如下 黄色标记:



pytorch pytorch/win-64::pytorch-1.8.1-py3.7_cuda10.1_cudnn7_0
six pkgs/main/noarch::six-1.16.0-pyhd3eb1b0_0
tk pkgs/main/win-64::tk-8.6.10-he774522_0
torchaudio pytorch/win-64::torchaudio-0.8.1-py37

torchvision pytorch/win-64::torchvision-0.9.1-py37_cu101


最后安装detectron2 .

  • 测试detectron2  demo 实例分割

找张图片放到 demo 下

最后使用最新的指令
python demo.py --config-file ../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml --input 1.jpg --opts MODEL.WEIGHTS detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl
微信截图_20210804152828.png

  • 使用VIA 2 注释图样数据集
ViA的工具链接 https://www.robots.ox.ac.uk/~vgg/software/via/via.html 我们可以直接在网页上进行标注很方便,但是目前没找到撤销键在哪里。

via 可以将之前via 1.6的数据导入进来,在基础上继续修改,然后添加categories 分类。

微信截图_20210804154158.png


参考文章 

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()
微信截图_20210804154913.png

 有显示标注正确。




sitemap