colab中训练复现OW-DETR

源码链接:akshitac8/OW-DETR: [CVPR 2022] Official Pytorch code for OW-DETR: Open-world Detection Transformer (github.com)

论文链接:[2112.01513] OW-DETR: Open-world Detection Transformer (arxiv.org)


写于2024.7.2

突然发现好多人看过这个博客,写了之后就一直扔在那,好几个月不看有点记不清了,写一些更有助于理解这个代码的建议。

建议

下面这些建议基本上都是我个人的对这个代码的理解,为了搞懂这个代码我前前后后Debug加一遍遍看代码不少于五次,建议先把DETR和Deformable DETR过一遍,直接看这篇论文的代码会很云里雾里,OW-DETR的代码有百分之九十都是和DDETR一样的,他自己的部分其实很少。并且很多地方和论文里写的完全不一样,比如像论文里提到的三个分支,其实在源码里完全不像论文里写的那样分明,如果看完论文直接去看代码会非常的懵,完全找不到作者所写的那几个分支在哪里。

这是我的理解,Novelty Classification这个分支就是加了一个用来判断未知类的;至于论文中提到的Foreground Objectness分支,就是用了原来的DDETR的检测分支,还有伪标签的计算也不像论文中所写到的样子,我感觉这篇论文是为了水而水,而且原作者用了八张v100来练还练了一周好像是,感觉就不是来给我们复现的,不如去复现和改进yolo-world,但是yolo-world又没有完全用纯视觉的方法,而是用GLIP和CLIP结合语义的词的方法。

这篇论文我觉得能借鉴的没太多东西,他的想法在论文中写出来的是好的,但是我感觉在代码中没有论文里写的那么神乎其神。

1.首先把google drive挂载过来,这样就可以在colab中使用google drive中的资源了

import os
from google.colab import drive
drive.mount('/content/drive')

path = "/content/drive/My Drive"

os.chdir(path)
os.listdir(path)

2.把代码复制到drive中

!git clone https://github.com/akshitac8/OW-DETR.git

3.安装需要的库

!pip install -r /content/drive/MyDrive/OW-DETR/requirements.txt

但其实大部分的库已经装好了,这一步是以防万一,我跑yolov5的时候是有没有安装的库的。

4.运行set.py

!python /content/drive/MyDrive/OW-DETR/models/ops/setup.py build install

这一步可以解决ModuleNotFoundError: No module named 'MultiScaleDeformableAttention'这个报错。

5.运行test.py进行测试

!python /content/drive/MyDrive/OW-DETR/models/ops/test.py

如果GPU不够的话就把channels调小一点。

这样test.py就跑通了。

6.数据集准备

作者github中的readme写的很模糊,完全跟着他写的做做不出来,数据集很大,如果想在colab上跑,要开一个colabpro还有云端硬盘也需要扩容

下载coco数据集

要分别下载coco数据集的训练集和验证集,然后将他们移动到JEPGImages文件夹下。

#下载coco数据集
!wget http://images.cocodataset.org/zips/train2017.zip
!wget http://images.cocodataset.org/zips/val2017.zip

解压移动

由于train2017中的文件很多,所以我直接把train解压到目标目录下并改名成JEPGImages,然后把val2017解压后移动过去。

#解压到指定文件夹,然后改名
!unzip /content/drive/MyDrive/train2017.zip -d /content/drive/MyDrive/OW-DETR/data/OWDETR/VOC2007
!unzip /content/drive/MyDrive/val2017.zip -d /content/drive/MyDrive/OW-DETR/data/coco
!mv /content/drive/MyDrive/OW-DETR/data/coco/val2017/*.jpg /content/drive/MyDrive/OW-DETR/data/OWDETR/VOC2007/JPEGImages/.

但是解压到云盘有一个很大的问题,由于文件很大,解压到云盘会很慢,因为云盘主要用途是用来存东西的,而不是用来跑代码的,所以我建议直接解压到/content目录下

#解压到指定文件夹,然后改名
!unzip /content/drive/MyDrive/train2017.zip -d /content//OW-DETR/data/OWDETR/VOC2007
!unzip /content/drive/MyDrive/val2017.zip -d /content//OW-DETR/data/coco
!mv /content//OW-DETR/data/coco/val2017/*.jpg /content/OW-DETR/data/OWDETR/VOC2007/JPEGImages/.

Annotations

使用代码 coco2voc.py 将 json 注释转换为 xml 文件。

先下载coco的annotation文件,然后解压

!wget http://images.cocodataset.org/annotations/annotations_trainval2017.zip
!unzip /content/drive/MyDrive/annotations_trainval2017.zip -d /content/OW-DETR/data/coco/

还有一个问题,源码中使用了train.txt,但是作者没有给所有的train.txt,而是给了t1_train,t2_train,t3_train,t4_train,我是把这段代码复制了四遍,然后把train.txt换成t1_train到t4_train,这样子最简单,并且要在ImageSets文件夹下新建一个Main文件夹,把本来ImageSets下的txt文件都移动到Main文件夹下,要不然下面训练也会报错。

同时,要更改下面的文件夹路径

我是这样改的,我建议都放在/content目录下,不要放在云盘里,我是开始放在云盘里,后面发现云盘太慢,但是这些文件放在云盘里基本不会影响,只要数据集不在云盘中就可以。

coco_annotation_file = '/content/drive/MyDrive/OW-DETR/data/coco/annotations/instances_train2017.json'
    target_folder = '/content/drive/MyDrive/OW-DETR/data/OWDETR/VOC2007'

运行完成后是这样的。

7.开始训练

训练量很大,在colab上即使开了会员也是练不下来的,所以我准备就跑两轮能跑通就可以,后面用办公室的电脑跑。

忘记了还有一个backbone.py文件也会报错,运行时--backbone 'dino_resnet50'有一个指定backbone的指令,然后在代码中是这样的

作者是没有提供这个预训练模型的, 所以我去找了dino_resnet50_pretrain.pth,这段代码可以下载,作者的github链接:GitHub - facebookresearch/dino: PyTorch code for Vision Transformers training with the Self-Supervised learning method DINO,其中有多个dino已经训练好的预训练模型。

#dino_resnet50
import os
os.chdir('/content/drive/MyDrive/OW-DETR/')
!wget https://dl.fbaipublicfiles.com/dino/dino_resnet50_pretrain/dino_resnet50_pretrain.pth

然后改一下backbone.py这行,改成自己的路径就行

跑之前还是要运行一遍,防止报错

#运行setup.py解决ModuleNotFoundError: No module named 'MultiScaleDeformableAttention'
!python /content/drive/MyDrive/OW-DETR/models/ops/setup.py build install
#ModuleNotFoundError: No module named 'einops'
!pip install einops

然后运行sh文件的话,也会报错Permission denied,其中路径错误也会报错Permission denied,所以我就看了run.sh,他其实就是运行了/content/drive/MyDrive/OW-DETR/tools/run_dist_launch.sh和/content/drive/MyDrive/OW-DETR/configs/OWOD_our_proposed_split.sh这两个文件,这两个其实都是DETR模型运行时的文件,OWOD_our_proposed_split.sh里面就是训练的各个参数

所以我就想直接运行main_open_world.py,只用第一个参数,先把模型跑起来看一下。


!python -u /content/drive/MyDrive/OW-DETR/main_open_world.py \
    --output_dir '/content/drive/MyDrive/OW-DETR/exps/OWDETR_t1' --dataset owod --num_queries 100 --eval_every 5 \
    --PREV_INTRODUCED_CLS 0 --CUR_INTRODUCED_CLS 19 --data_root '/content/OW-DETR/data/OWDETR' --train_set 't1_train' --test_set 'test' --num_classes 81 \
    --unmatched_boxes --epochs 2 --top_unk 5 --featdim 1024 --NC_branch --nc_loss_coef 0.1 --nc_epoch 9 \
    --backbone 'dino_resnet50' \
    ${@:1}

一定要把数据集放在/content目录下

然后就可以跑起来了。

但是跑的相当慢,跑一轮的话得五六个小时,源代码是45轮,我改成了只跑两轮看一下,在colab上复现还是不太现实。

8.如果不想下载coco并解压然后运行

因为在colab文件夹大移动起来很麻烦,colab也会很容易卡住不动,以及同步的各种关系,老是出错,而且也会遇到命名云盘中有这张图片,但是跑的时候会报错说没有这张图片的原因,所以还是要直接放在/content目录下,不要放在云盘下。

如果只是想看一下跑通的效果,可以直接下载作者给的OWOD的图片和标注,放在OWDETR中,也是可以跑通的。链接:https://drive.google.com/drive/folders/1S5L-YmIiFMAKTs6nHMorB0Osz5iWI31k?usp=sharing

直接把Annotations和JEPGImages两个共享给自己,然后在自己的云盘中看到与我共享,找到这个文件夹,添加快捷方式

然后在自己的云盘中找到这个快捷方式进去后找到需要的压缩包,复制一份

就能在云盘首页找到这个压缩包,就保存到自己的云盘中了

之后去colab中就能看到,再解压到/content目录下

!unzip /content/drive/MyDrive/Annotations -d /content/OW-DETR/data/OWDETR/VOC2007
unzip /content/drive/MyDrive/JEPGImages -d /content/OW-DETR/data/OWDETR/VOC2007

然后在ImageSets文件夹下新建一个Main文件夹,把本来ImageSets下的txt文件都移动到Main文件夹下,准备工作就完成了,之后就可以开始训练了。

有一点要注意,作者readme中有一个很大的问题,就是他给出的文件夹示例,顺序是错的,OWDETR和OWOD这两个文件夹是在VOC2007文件夹上级的,代码也是这样写的。

还有一点,在/content目录下的文件,断开连接之后是会消失的,所以要一直跑,而就算是colabpro最长也就十二个小时,所以也就能跑一轮或者两轮知道怎么跑这个模型。

在colab上还有一个问题就是文件的路径会很容易错,如果报错,记得看一下报错的内容,改一下路径,有一些可能我改了,但是写博客的时候我忘记了,我也就没写到。

以后应该不会在colab上复现这些大模型了,太麻烦了,而且总是出现各种离谱bug,掉线之类的事情都属于小的。

  • 33
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值