BoxInst配置及训练
BoxInst安装
使用BoxInst需要先安装AdelaiDet,AdelaiDet是一个运行在Detectron2基础上的工具箱,可以实现以下多个算法:
FCOS,BlendMask,MEInst,ABCNet,ABCNetv2,CondInst,SOLO,SOLOv2,BoxInst,DenseCL,FCPose,DirectPose
github地址:https://github.com/aim-uofa/AdelaiDet
requirement
-
linux or macOS with Python >= 3.7
-
pytorch >= 1.8 (最好是1.8.1,1.10以上的会出一点bug,很怪,最后也没解决掉)
-
Opencv
-
gcc&g++ >= 5.4
sudo apt-get install gcc
-
ninja
Build detectron2 from source
git clone https://github.com/facebookresearch/detectron2.git
python -m pip install -e detectron2
如果安装出了bug,需要重新安装,使用指令 rm -rf build/ **/*.so
清除掉旧的build文件,然后重新安装
如果重新安装的pytorch,也需要对detectron2进行重新安装。
Install AdelaiDet
git clone https://github.com/aim-uofa/AdelaiDet.git
cd AdelaiDet
python setup.py build develop
可能会出的bug:
这一步基本上没啥bug出现,很常见的一个bug,就是
AdelaiDet/adet/layers/csrc/ml_nms/ml_nms.cu:4:10: fatal error: THC/THC.h: No such file or directory
4 | #include <THC/THC.h>
| ^~~~~~~~~~~
compilation terminated.
类似于这个样子的。
这个,主要原因是因为Pytorch的后期版本,把这个模块移除了
解决方案有两个
- 降级pytorch,降级到1.8.1(已验证,可以解决)
- 使用issue#516的解决方案,我用这个方法最后没解决掉
Start BoxInst
ok,如果安装好的AdelaiDet,就可以开始进入BoxInst的使用了。
首先,因为AdelaiDet是在Detectron2上运行的,所以他的所有数据集都需要在detectron2上注册后才能使用。
Register Dataset
首先,把以下的代码引入AdelaiDet/tools/train_net.py里
#写你自己的类别
CLASS_NAMES =["tower"]
# 数据集路径
DATASET_ROOT = 'path'
ANN_ROOT = os.path.join(DATASET_ROOT, '你json文件的目录')
TRAIN_PATH = os.path.join(DATASET_ROOT, '训练集图片文件夹')
VAL_PATH = os.path.join(DATASET_ROOT, '验证集图片文件夹')
TRAIN_JSON = os.path.join(ANN_ROOT, 'train.json')
VAL_JSON = os.path.join(ANN_ROOT, 'val.json')
#VAL_JSON = os.path.join(ANN_ROOT, 'test.json')
# 声明数据集的子集
PREDEFINED_SPLITS_DATASET = {
"my_dataset_train": (TRAIN_PATH, TRAIN_JSON),
"my_dataset_val": (VAL_PATH, VAL_JSON),
}
def plain_register_dataset():
DatasetCatalog.register("coco_my_train", lambda: load_coco_json(TRAIN_JSON, TRAIN_PATH))
MetadataCatalog.get("coco_my_train").set(thing_classes=CLASS_NAMES,
evaluator_type='coco',
json_file=TRAIN_JSON,
image_root=TRAIN_PATH)
DatasetCatalog.register("coco_my_val", lambda: load_coco_json(VAL_JSON, VAL_PATH))
MetadataCatalog.get("coco_my_val").set(thing_classes=CLASS_NAMES,
evaluator_type='coco',
json_file=VAL_JSON,
image_root=VAL_PATH)
然后在train_net.py的main类里,加入plain_register_dataset(),这样就算注册完了
修改配置文件
进到configs/boxinst文件夹,改掉base-Boxinst.yaml文件里的DATASETS,改成你的数据集名称
进行训练
运行以下代码去执行训练
OMP_NUM_THREADS=1 python tools/train_net.py --config-file configs/BoxInst/MS_R_50_1x.yaml --num-gpus 1 OUTPUT_DIR training_dir/BoxInst_MS_R_50_1x
config-file:调整为你需要的模型
num-gpus:你用几个gpu就写几个
按回车,跑就行了
常见bug
ModuleNotFoundError: No module named 'adet'
在train_net.py开头加入如下代码:
import sys
sys.path.append("/home/detectron2/")
sys.path.append("/home/AdelaiDet") #你的adelaiDet和detectron2路径
训练结果验证
python demo/demo.py \
--config-file configs/BoxInst/MS_R_50_3x.yaml \
--input input1.jpg input2.jpg \ #改成你的需要验证的图片路径
--opts MODEL.WEIGHTS BoxInst_MS_R_50_3x.pth #改成你的模型文件