OpenMMLab——BDD100K数据集(MMSegmentation的第一个PR)

1. BDD100K数据集

1.1 下载

推荐下载

去这个网址注册账号,https://bdd-data.berkeley.edu/,就可以看到以下内容了。
在这里插入图片描述
注意,不是所有数据都要下载,去下载数据说明看自己需要下载什么
(❓表示需要权限下载,即链接后面需要加一些校验内容,要去网站里点)

标题下载链接
Videoshttp://dl.yf.io/bdd100k/bdd100k_videos.zip
Video Partshttp://dl.yf.io/bdd100k/video_parts/
Infohttps://bdd-data-storage-release.s3.us-west-2.amazonaws.com/bdd100k/bdd100k_info.zip
100K Imageshttps://bdd-data-storage-release.s3.us-west-2.amazonaws.com/bdd100k/2021/bdd100k_images_100k.zip
10K Imageshttps://bdd-data-storage-release.s3.us-west-2.amazonaws.com/bdd100k/2021/bdd100k_images_10k.zip
Labelshttps://bdd-data-storage-release.s3.us-west-2.amazonaws.com/bdd100k/bdd100k_labels_release.zip
Segmentationhttps://bdd-data-storage-release.s3.us-west-2.amazonaws.com/bdd100k/2021/bdd100k_sem_seg_labels_trainval.zip
Instance Segmentationhttps://bdd-data-storage-release.s3.us-west-2.amazonaws.com/bdd100k/2021/bdd100k_ins_seg_labels_trainval.zip
Panoptic Segmentationhttps://bdd-data-storage-release.s3.us-west-2.amazonaws.com/bdd100k/2021/bdd100k_pan_seg_labels_trainval.zip
Lane Markinghttps://bdd-data-storage-release.s3.us-west-2.amazonaws.com/bdd100k/2021/bdd100k_lane_labels_trainval.zip
Drivable Areahttps://bdd-data-storage-release.s3.us-west-2.amazonaws.com/bdd100k/2021/bdd100k_drivable_labels_trainval.zip
MOT 2020 Labelshttps://bdd-data-storage-release.s3.us-west-2.amazonaws.com/bdd100k/2021/bdd100k_box_track_20_labels_trainval.zip
MOT 2020 Imageshttps://go.yf.io/bdd100k-mot-2020
Detection 2020 Labelshttps://bdd-data-storage-release.s3.us-west-2.amazonaws.com/bdd100k/2021/bdd100k_det_20_labels_trainval.zip
MOTS 2020 Labelshttps://bdd-data-storage-release.s3.us-west-2.amazonaws.com/bdd100k/2021/bdd100k_seg_track_20_labels_trainval.zip
MOTS 2020 Imageshttp://dl.yf.io/bdd100k/mots20
Pose Estimationhttps://bdd-data-storage-release.s3.us-west-2.amazonaws.com/bdd100k/2022/bdd100k_pose_labels_trainval.zip

其他下载


参考:

1.2 介绍

1.2.1 有效网址


1.2.2 必备了解

  • 100K Image10K Image有一部分图像重合,但是后者并不完全是前者的子集
  • 100K Image是用来进行道路目标检测(object detection), 可驾驶区域分割(drivable area), 车道线检测(lane marking)
  • 10K Images是用来进行语义分割(semantic segmentation),实例分割( instance segmentation) 以及全景分割(panoptic segmentation)
  • 以语义分割的标记为例进行说明,下载10K Images(bdd100k_images_10k.zip)Segmentation(bdd100k_sem_seg_labels_trainval.zip),解压得到以下结构
    	bdd100k/
    ├── images
    │   └── 10k
    │       ├── test [2000 entries exceeds filelimit, not opening dir]
    │       ├── train [7000 entries exceeds filelimit, not opening dir]
    │       └── val [1000 entries exceeds filelimit, not opening dir]
    └── labels
        └── sem_seg
            ├── colormaps # 标记对应的彩色图
            │   ├── train
            │   └── val
            ├── masks # 标记对应的mask(标记序号是0~18,与citespaces的label一致,255是ignore类别)
            │   ├── train
            │   └── val
            ├── polygons
            │   ├── sem_seg_train.json
            │   └── sem_seg_val.json
            └── rles
                ├── sem_seg_train.json
                └── sem_seg_val.json
    
  • 详细的类别信息查看:Label-Format_Semantic Segmentation
  • 关于这些类别的颜色,可以看看:bdd100k/bdd100k/label/label.py

2. PR

2.1 领取的任务信息

发布类型任务名称任务简介任务 Repo任务难度任务积分预期耗时(天)
Enhancement添加 BDD100K 语义分割数据集https://github.com/open-mmlab/mmsegmentation/issues/2808,将代码加入到 project 中,提供一个简单的配置文件,能够用这个数据集启动训练。MMSegmentationEasy207

2.2 明确任务提交产物

根据mmsegmentation中关于数据集的文档:

可以知道,这个任务应该要提交三个内容

  1. 一个BDD100k数据的配置文件,可以启动训练
  2. 一个对BDD100k数据进行处理,保证其符合MMSegmentation格式的脚本
  3. 在上面两个数据集文档添加关于BDD100K的描述

2.3 拉取提交PR

根据贡献代码文档

2.3.1 拉取

  • 先搞清楚官方接受PR,是接受在哪个分支,
  • 对于MMSegmentation来说,那些PR全都是提交到dev-1.x上去的(一开始自己走了默认的main。。。全部重来,哈哈哈)
  • How to fork a branch and not the repository?
# 1. 把对应的官方repo先fork到自己的repo中
注意,fork的时候是没法选择开发分支的,只能fork整个项目

# 2. 从自己fork的repo里clone
git clone git@github.com:CastleDream/mmsegmentation.git

# 3. 切换到有.git的文件夹里
cd mmsegmentation

# 4. 添加原代码库为上游代码库
git remote add upstream git@github.com:open-mmlab/mmsegmentation

# 5.检查 remote 是否添加成功
git remote -v
>origin	git@github.com:CastleDream/mmsegmentation.git (fetch)
origin	git@github.com:CastleDream/mmsegmentation.git (push)
upstream	git@github.com:open-mmlab/mmsegmentation (fetch)
upstream	git@github.com:open-mmlab/mmsegmentation (push)
# origin 的 remote,指向我们克隆的代码库地址,
# upstream 是后续手动添加的,用来指向原始代码库地址
# 通常向 origin 提交代码(即 fork 下来的远程仓库),然后向 upstream 提交一个 pull request

# 6. 安装pre-commit工具,commit的时候会自动帮助检查代码的格式等
# 需要在 mmsegmentation.git 目录下执行
pip install -U pre-commit
pre-commit install

# 7.检查 pre-commit 是否配置成功,并安装 .pre-commit-config.yaml 中的钩子
pre-commit run --all-files

# 8.创建具体的针对某个任务的开发分支
git checkout -b CastleDream/support_BDD100K

### ----根据你领取的任务改代码-----

git add *
git commit -m "support bdd100k datasets" # 清晰且有意义 commit 信息
# commit这步就会自动调用pre-commit,会检查代码里的空格、换行是否规范,并帮你自动修改,会显示类似下面的信息然后你需要重新再add

# 第一次推送,可以在 git push 后加上 -u 参数以关联远程分支
git push -u origin CastleDream/support_BDD100K
# 之后就直接push就可以
git push

(注意,这里有个很奇怪的事情,我在base环境里安装了pytest,也在py37里安装了,但是先调用的base环境的,即便是我切换到了py37环境。。后来把base环境里的pytest卸载了才得以正常运行)

(py37)  ~/mmsegmentation CastleDream/support_BDD100K > pytest tests/test_datasets
================================================================ test session starts =================================================================
platform darwin -- Python 3.7.11, pytest-7.4.0, pluggy-1.2.0
rootdir: /Users/huangshan/Documents/DailyStudy/mmsegmentation
plugins: anyio-3.3.1
collected 55 items                                                                                                                                   

tests/test_datasets/test_dataset.py .....................                                                                                      [ 38%]
tests/test_datasets/test_dataset_builder.py .                                                                                                  [ 40%]
tests/test_datasets/test_formatting.py ..                                                                                                      [ 43%]
tests/test_datasets/test_loading.py .......                                                                                                    [ 56%]
tests/test_datasets/test_transform.py .......................                                                                                  [ 98%]
tests/test_datasets/test_tta.py .                                                                                                              [100%]

================================================================== warnings summary ==================================================================
tests/test_datasets/test_loading.py::TestLoading::test_load_seg
  /Users/huangshan/Documents/DailyStudy/openMMLabCampusLearn/selfExercise/mmsegmentation/mmseg/datasets/transforms/loading.py:78: UserWarning: `reduce_zero_label` will be deprecated, if you would like to ignore the zero label, please set `reduce_zero_label=True` when dataset initialized
    warnings.warn('`reduce_zero_label` will be deprecated, '

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
=========================================================== 55 passed, 1 warning in 5.75s ============================================================

确认没问题就可以推送到自己的repo了

然后就可以去创建PR了(那个 Type Hints 不是强制性的,可以先不关注)

2.3.2 PR

关于PR的描述,看 Linking a pull request to an issue,类似下面这样
在这里插入图片描述

我的issue对应的描述是:
在这里插入图片描述

所以我在pr里写的内容是:[Backlog] add bdd100K datasets #3155

每次push之后会自动启动CI(集成测试),有错就点进去看看,改错就好了。。

2.3.3 感谢

2023.7.25 终于看到自己的名字啦,哈哈哈。

会显示在这里,CHANGELOG OF V1.X
在这里插入图片描述

2.4 fork后切换到dev分支进行后续开发

参考:Github: Import upstream branch into fork

git fetch upstream
git checkout -b newbranch upstream/newbranch
# 例如:
git checkout -b CastleDream/ADD_BDD100k upstream/dev-1.x

# 第一次推送,可以在 git push 后加上 -u 参数以关联远程分支,这个origin还是自己的remote,不是upstream的那个,upstream用PR来交互
git push -u origin CastleDream/ADD_BDD100K
# 之后就直接push就可以
git push

参考:

2.4.1 fork并fetch所有分支

关于Fork

  • 以前fork是fork整个项目(所有分支),
  • 根据You can now fork a repo and copy only the default branch,2022年7月27之后,多了一个选择,可以只fork default branch
    在这里插入图片描述
  • 所以在fork mmsegmentation的时候,默认就是main分支,但是mmsegmentation的PR很乱,有的是提交在dev-1.x的,有的是在master分支上的。查看CHANGELOG OF V1.X这个文档,被接受的PR都是在dev-1.x分支的,所以还是基于这个开发吧
    在这里插入图片描述

所以如果在fork之后,还想要获取原始项目的其他分支,可以

# 2. 从自己fork的repo里clone
git clone git@github.com:CastleDream/mmsegmentation.git

# 3. 切换到有.git的文件夹里
cd mmsegmentation

# 4. 添加原代码库为上游代码库
git remote add upstream git@github.com:open-mmlab/mmsegmentation

# 5.检查 remote 是否添加成功
git remote -v
>origin	git@github.com:CastleDream/mmsegmentation.git (fetch)
origin	git@github.com:CastleDream/mmsegmentation.git (push)
upstream	git@github.com:open-mmlab/mmsegmentation (fetch)
upstream	git@github.com:open-mmlab/mmsegmentation (push)

# 6. 有了upstream之后,就可以fetch,把upstream上最新的所有内容都拉到本地
# 但是注意,需要保证本地没有什么冲突
# 比如 我就是在fork默认的main分支下执行这个命令,所有改动都不在main分支进行,所以这个分支一直很干净,不会有冲突什么的
git fetch upstream
# 显示结果如下,已经有了想要的`dev-1.x`和`master`分支

在这里插入图片描述
如果想要查看是不是可以tracked这些分支,可以

git remote show upstream

在这里插入图片描述
和网页上显示的open-mmlab/mmsegmentation的内容就一致了。

想要查看当前这个repo的远程有多少个分支,根据Find out which remote branch a local branch is tracking,可以

# 一般推荐用这个,更直观
git branch -vv
>* CastleDream/ADD_BDD100K     81c9f42 [origin/CastleDream/ADD_BDD100K] update readme
  CastleDream/support_BDD100K 221ac91 [origin/CastleDream/support_BDD100K] fix test_inferencer
  main                        e64548f [origin/main] [Doc] update repo list in README (#2949)
  upstream                    e64548f [Doc] update repo list in README (#2949)


# -r 就是remote
git branch -r
>origin/CastleDream/ADD_BDD100K
  origin/CastleDream/support_BDD100K
  origin/HEAD -> origin/main
  origin/main
  upstream/0.x
  upstream/1.x
  upstream/circleci-project-setup
  upstream/dev-1.x
  upstream/main
  upstream/master
  upstream/masterbak
  upstream/test-1.1
  upstream/test-1.x

2.4.2 基于dev分支创建新分支

# 其实分支名字不用加 CastleDream ,会自动显示为CastleDream:branchname的
git checkout -b CastleDream/ADD_BDD100K upstream/dev-1.x
>Branch 'CastleDream/ADD_BDD100K' set up to track remote branch 'dev-1.x' from 'upstream'.
Switched to a new branch 'CastleDream/ADD_BDD100K'

# 删除分支 可以 -d是 --delete  -D是 --delete --force的别称
git branch -d <branch_name>
git branch -D <branch_name>

checkout切换分支之后,之前其他分支的文件没有丢,再切换回去就可以了。。

3. 代码里的问题

3.1 自定义模块导入问题

文档是:Config-import the custom module

You should set `PYTHONPATH` to make `sys.path` include the directory which contains your custom module

报错代码是 mmengine/mmengine/config/config.py抛出的。

简单来说,就是要把你要添加的模块加到系统路径里,

比如文件结构是这样的:

mmsegmentation
	|---projects
		|---bdd100k_dataset
			|---mmseg
				|---datasets
					|---bdd100k.py
		  |---configs
		  	|---pspnet.py

要在pspnet.py中引入bdd100k.py

custom_imports = dict(imports=['projects.bdd100k_dataset.mmseg.datasets.bdd100k'])

添加的系统路径应该是

import sys
sys.path.append("XX/mmsegmentation")
# 也就是projects所在的目录(make `sys.path` include the directory which contains your custom module,包含projects的目录)

参考:Python import, sys.path, and PYTHONPATH Tutorial

3.2 test_inferencer.py单元测试报错

3.2.1 错误信息

tests/test_apis/test_inferencer.py F                                     [  2%]

>       infer = MMSegInferencer(cfg, ckpt_filename)

tests/test_apis/test_inferencer.py:99: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
mmseg/apis/mmseg_inferencer.py:79: in __init__
    model=model, weights=weights, device=device, scope=scope)
../.pyenv/versions/3.7.17/lib/python3.7/site-packages/mmengine/infer/infer.py:182: in __init__
    self.collate_fn = self._init_collate(cfg)
../.pyenv/versions/3.7.17/lib/python3.7/site-packages/mmengine/infer/infer.py:532: in _init_collate
    collate_fn = registry.get(cfg.test_dataloader.collate_fn)

if not isinstance(key, str):
            raise TypeError(
>               'The key argument of `Registry.get` must be a str, '
                f'got {type(key)}')
E           TypeError: The key argument of `Registry.get` must be a str, got <class 'function'>

../.pyenv/versions/3.7.17/lib/python3.7/site-packages/mmengine/registry/registry.py:442: TypeError
----------------------------- Captured stdout call -----------------------------
Loads checkpoint by local backend from path: /tmp/tmp2yg_z5oc
07/01 00:06:39 - mmengine - WARNING - Failed to search registry with scope "mmseg" in the "function" registry tree. As a workaround, the current "function" registry in "mmengine" is used to build instance. This may cause unexpected failure when running the built modules. Please check whether "mmseg" is a correct scope, or whether the registry is initialized

涉及到的脚本:

Loads checkpoint by local backend from path: yolov3_mobilenetv2_320_300e_coco_20210719_215349-d18dff72.pth
12/30 17:25:05 - mmengine - WARNING - The "visualizer" registry in mmdet did not set import location. Fallback to call mmdet.utils.register_all_modules instead.

3.2.2 修复

MapillaryVistasDatasets 这个数据集的配只有下面这一个区别

# 默认
tta_pipeline = [
    dict(type='LoadImageFromFile', backend_args=None),
 
# 改为   
tta_pipeline = [
    dict(type='LoadImageFromFile', file_client_args=dict(backend='disk')),

3.3 支持新数据集需要改的内容

其实可以参考以前的PR:

3.4 pre-commit报错

  • pre-commit安装的位置:
    pre-commit installed at .git/hooks/pre-commit
    
  • pre-commit修改的文件记录位置:/Users/yourname/.cache/pre-commit/patch1688256523-4459

报错内容

isort....................................................................Failed
- hook id: isort
- files were modified by this hook

Fixing ~/mmsegmentation/tests/test_datasets/test_dataset.py

yapf.....................................................................Failed
- hook id: yapf
- files were modified by this hook

和我的文件情况类似:

isort likes:
from mmseg.datasets import (
    ADE20KDataset, 
    BaseSegDataset, 
    BDD100KDataset, 
    ....
    iSAIDDataset)

yapf likes:
from mmseg.datasets import (
    ADE20KDataset, BaseSegDataset, BDD100KDataset, CityscapesDataset,
    COCOStuffDataset, DecathlonDataset, ISPRSDataset, LIPDataset,
    LoveDADataset, MapillaryDataset_v1, MapillaryDataset_v2, PascalVOCDataset,
    PotsdamDataset, REFUGEDataset, SynapseDataset, iSAIDDataset)

所以每次isort先改,保存,然后yapf再改,死循环。。

解决
根据Ignore imports #429

  1. 修改isort或者yapf的配置文件
    在这里插入图片描述
  2. ✅用from XXX import XXX as XXX,我采取的这种
    在这里插入图片描述
    from mmseg.datasets import ADE20KDataset as ADE20KDataset
    from mmseg.datasets import BaseSegDataset as BaseSegDataset
    from mmseg.datasets import BDD100KDataset as BDD100KDataset
    from mmseg.datasets import CityscapesDataset as CityscapesDataset
    from mmseg.datasets import COCOStuffDataset as COCOStuffDataset
    ....
    from mmseg.datasets import DecathlonDataset as DecathlonDataset
    
    这样isortyapf都可以满足了

参考:

3.5 macOS独有的_DS_store问题

根据How to remove .DS_Store files from git repositories

如果已经commit过了,才发现add了_DS_store,可以

git rm --cached .DS_Store

git add .

git commit -m "Remove .DS_Store from current directory"

git push 

如果已经push过了,可以

find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch

git add .

git commit -m "Remove .DS_Store from everywhere"

git push

在这里插入图片描述
为了防止以后还发生这个问题,可以做一个全局设置

echo .DS_Store >> ~/.gitignore_global
git config --global core.excludesfile ~/.gitignore_global

4. 结束

成功merge:https://github.com/open-mmlab/mmsegmentation/pull/3158

merge之后,会提示你可以删除这个branch了
在这里插入图片描述

  • 2023.7.2提交的,7.11收到了回复,7.14就Merge了,稍微等一等,也就还好,哈哈哈
  • 虽然是个比较简单的功能,但是第一次尝试成功!
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吨吨不打野

解决了问题,觉得还行就给点

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值