blendMask

1、安装Detectron2

按照官方安装步骤进行安装
官方文档
https://github.com/facebookresearch/detectron2/blob/main/INSTALL.md
下载Detectron2相关代码

git clone https://github.com/facebookresearch/detectron2.git   #用git下载代码
python -m pip install -e detectron2                            #安装detectron2

2、安装AdelaiDet

git clone https://github.com/aim-uofa/AdelaiDet.git
cd AdelaiDet
python setup.py build develop
python demo/demo.py \
    --config-file configs/BlendMask/R_101_dcni3_5x.yaml \
    --input datasets/input1.jpg \
    --confidence-threshold 0.35 \
    --opts MODEL.WEIGHTS blendmask_r101_dcni3_5x.pth
python demo/demo.py --config-file configs/BlendMask/R_101_dcni3_5x.yaml --input ./datasets/00000.jpg --confidence-threshold 0.35 --opts MODEL.WEIGHTS ./blendmask_r101_dcni3_5x.pth

3、运行

添加链接描述
添加链接描述

报错

1、 ImportError(“cannot import name ‘string_metric’ from ‘rapidfuzz’

错误原因:rapidfuzz包版本过高
解决办法:降低该包版本为1.1.1版本,直接下载报错,去官网下载相应轮子文件进行安装

pip install rapidfuzz==1.1.1

2、AttributeError: module ‘PIL.Image’ has no attribute ‘LINEAR’

解决办法:卸载Pillow-10.0.0

重新安装Pilow=8.4.0

即降低Pillow版本即可。

3、ImportError: /home/jy/segement/detectron2/detectron2/_C.cpython-38-x86_64-linux-gnu.so: undefined symbol: _ZNK2at6Tensor7reshapeEN3c108ArrayRefIlEE

AdelaiDet训练自己的数据集(COCO格式数据集)

注册数据集

从detectron2/data/datasets中修改builtin.py

# builtin中添加的内容
# 在_PREDEFINED_SPLITS_COCO["coco"]中添加自己数据集的路径
_PREDEFINED_SPLITS_COCO["coco"] = {
    # 自己的数据集:
    # "coco_handwritten_train"为自定义名称,后面会用到;后面的两个路径第一个是图片目录,第二个是对应json文件路径
    # 训练集
    "coco_handwritten_train": ("/mnt/big_disk/big_disk_1/zhuzhibo/download/AdelaiDet/datasets/handwritten_chinese_stroke_2021/train2021",
                      "/mnt/big_disk/big_disk_1/zhuzhibo/download/AdelaiDet/datasets/handwritten_chinese_stroke_2021/annotations/instances_train2021.json"),
    # 验证集
    "coco_handwritten_val": ("/mnt/big_disk/big_disk_1/zhuzhibo/download/AdelaiDet/datasets/handwritten_chinese_stroke_2021/val2021",
                      "/mnt/big_disk/big_disk_1/zhuzhibo/download/AdelaiDet/datasets/handwritten_chinese_stroke_2021/annotations/instances_val2021.json"),
}
...
# 更改if __name__.endswith(".builtin"):下的_root
if __name__.endswith(".builtin"):
    # Assume pre-defined datasets live in `./datasets`.
    # 这里后面更改为你自己的AdelaiDet的根目录
    _root = os.getenv("DETECTRON2_DATASETS", "/mnt/big_disk/big_disk_1/zhuzhibo/download/AdelaiDet")
    #_root = os.getenv("/mnt/big_disk/big_disk_1/zhuzhibo/download/AdelaiDet", "datasets")

从detectron2/data/datasets中修改builtin_meta.py
这里注意类别的定义顺序要与你转coco数据集时的一样(我没试不一样会怎么样),颜色填不重复的就行,isthing为1,id从1开始,name为这个类别的名称

# 将原来的COCO_CATEGORIES注释掉,换为新的
COCO_CATEGORIES = [
    {"color": [220, 20, 60], "isthing": 1, "id": 1, "name": "leaves"},
    {"color": [119, 11, 32], "isthing": 1, "id": 2, "name": "rust"},
]

# 更改_getcoco_instances_mata()如下
# assert len(thing_ids) == 25, len(thing_ids) 我这里是25类,改成你自己的类别数(不算背景类)
def _get_coco_instances_meta():
    thing_ids = [k["id"] for k in COCO_CATEGORIES if k["isthing"] == 1]
    thing_colors = [k["color"] for k in COCO_CATEGORIES if k["isthing"] == 1]
    assert len(thing_ids) == 25, len(thing_ids)
    # Mapping from the incontiguous COCO category id to an id in [0, 24]
    thing_dataset_id_to_contiguous_id = {k: i for i, k in enumerate(thing_ids)}
    thing_classes = [k["name"] for k in COCO_CATEGORIES if k["isthing"] == 1]
    ret = {
        "thing_dataset_id_to_contiguous_id": thing_dataset_id_to_contiguous_id,
        "thing_classes": thing_classes,
        "thing_colors": thing_colors,
    }
    return ret
    
# 更改_get_coco_panoptic_separated_meat()中以下内容
    assert len(stuff_ids) == 0, len(stuff_ids)
    #assert len(stuff_ids) == 53, len(stuff_ids) 原来的语句

更改AdelaiDet下的datasets/prepare_thins_sem_from_instacne.py(这步可能不需要,可以先不改这里)

def get_parser():
    parser = argparse.ArgumentParser(description="Keep only model in ckpt")
    parser.add_argument(
        "--dataset-name",
        default="handwritten_chinese_stroke_2021",
        help="dataset to generate",
    )
    return parser

if __name__ == "__main__":
    args = get_parser().parse_args()
    dataset_dir = os.path.join(os.path.dirname(__file__), args.dataset_name)
    if args.dataset_name == "handwritten_chinese_stroke_2021":
        thing_id_to_contiguous_id = _get_coco_instances_meta()["thing_dataset_id_to_contiguous_id"]
        split_name = 'train2021'
        annotation_name = "annotations/instances_{}.json"
    ...

更改AdelaiDet/configs/BlendMask中的Base-BlendMask.yaml文件

MODEL:
  META_ARCHITECTURE: "BlendMask"
  MASK_ON: True
  BACKBONE:
    NAME: "build_fcos_resnet_fpn_backbone"
  RESNETS:
    OUT_FEATURES: ["res3", "res4", "res5"]
  FPN:
    IN_FEATURES: ["res3", "res4", "res5"]
  PROPOSAL_GENERATOR:
    NAME: "FCOS"
  BASIS_MODULE:
    LOSS_ON: True
  PANOPTIC_FPN:
    COMBINE:
      ENABLED: False
  FCOS:
    THRESH_WITH_CTR: True
    USE_SCALE: False
DATALOADER: 8
DATASETS: # 这里写自己之前第一步注册的名字
  TRAIN: ("coco_handwritten_train",)  # 训练
  TEST: ("coco_handwritten_val",)     # 验证
SOLVER:
  IMS_PER_BATCH: 32
  BASE_LR: 0.001  # Note that RetinaNet uses a different default learning rate
  STEPS: (200, 400)
  MAX_ITER: 600
INPUT:
  MIN_SIZE_TRAIN: (120, 120)  # 训练最小图片尺寸,按照你的需求修改
  MIN_SIZE_TEST: 120          # 验证最小图片尺寸,按照你的需求修改

更改你需要使用配置的yaml,这里以R_101_3x.yaml为例

_BASE_: "Base-BlendMask.yaml"
MODEL:
  WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-101.pkl"
  BACKBONE:
    NAME: "build_fcos_resnet_fpn_backbone"
  RESNETS:
    DEPTH: 101
  FCOS:
    NUM_CLASSES: 25  # 更改为自定义数据集类别
# INPUT的内容根据自己需要修改
INPUT:
  FORMAT: BGR
  MASK_FORMAT: polygon
  MAX_SIZE_TEST: 144
  MAX_SIZE_TRAIN: 144
  MIN_SIZE_TEST: 112
  MIN_SIZE_TRAIN: [ 112, 120 ]
SOLVER:
  STEPS: [2500, 29999]
  MAX_ITER: 30000 # default 270000
  WARMUP_ITERS: 100 # default 1000
  CHECKPOINT_PERIOD: 2500 # default 5000
  IMS_PER_BATCH: 64 # default 16
  BASE_LR: 0.025 # default 0.02
TEST:
  EVAL_PERIOD: 2500 # default 0, means no evaluation will be performed
VIS_PERIOD: 2500 # default 0, means no visualization will be performed
DATASETS:  # 可以覆盖Base-BlendMask.yaml中的配置
  TRAIN: ("coco_handwritten_train",)
  TEST: ("coco_handwritten_val",)
OUTPUT_DIR: "training_dir/blendmask/hw_R_101_3x_fpn"  # 训练输出目录

更改AdelaiDet/adet/data/dataset_mapper.py

if self.basis_loss_on and self.is_train:
    # load basis supervisions
    """
    if self.ann_set == "coco":
        basis_sem_path = (
            dataset_dict["file_name"]
            .replace("train2017", "thing_train2017")
            .replace("image/train", "thing_train")
        )
    """
    # 更改上面内容为下面
    if self.ann_set == "coco":
        basis_sem_path = (
            dataset_dict["file_name"]
            .replace("train2021", "thing_train2021")
        )

运行

OMP_NUM_THREADS=1 python tools/train_net.py --config-file configs/BlendMask/R_50_1x.yaml  --num-gpus 1 OUTPUT_DIR training_dir/blendmask_R_50_1x

验证

OMP_NUM_THREADS=1 python tools/train_net.py \
    --config-file configs/BlendMask/R_50_1x.yaml \
    --eval-only \
    --num-gpus 1 \
    OUTPUT_DIR training_dir/blendmask_R_50_1x \
    MODEL.WEIGHTS training_dir/blendmask_R_50_1x/model_final.pth
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值