EasyCV/docs/source/tutorials/EasyCV图像分割Mask2Former.ipynb

372 lines
10 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
"cells": [
{
"cell_type": "markdown",
"id": "69debbc2-30e8-4390-805a-cb6ebad35f3f",
"metadata": {
"tags": []
},
"source": [
"## EasyCV图像分割-Mask2Former\n",
"本文将介绍如何利用EasyCV使用Transformer-based图像分割算法[Mask2Former](https://arxiv.org/pdf/2112.01527.pdf)进行图像分割模型的训练,以及如何利用训练好的模型进行图像分割预测\n",
" \n"
]
},
{
"cell_type": "markdown",
"id": "b9ef9614-cb63-487f-bafb-c62c90ae607b",
"metadata": {},
"source": [
"## 运行环境要求\n",
"\n",
"PAI-Pytorch镜像 or 原生Pytorch1.8+以上环境 GPU机器 内存32G以上"
]
},
{
"cell_type": "markdown",
"id": "f855f736-c08a-44c2-b1c1-33a8e7043864",
"metadata": {
"tags": []
},
"source": [
"## 安装依赖包\n",
"\n",
"注: 在PAI-DSW docker中无需安装相关依赖可跳过此部分 在本地notebook环境中执行\n"
]
},
{
"cell_type": "markdown",
"id": "43e60ee5-f52f-4045-bc69-4a123731a5a5",
"metadata": {},
"source": [
"1、 首先安装pytorch和对应版本的torchvision支持Pytorch1.8以上版本"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f97b2295-4d67-4a83-8637-ecde48fa3001",
"metadata": {},
"outputs": [],
"source": [
"# install pytorch and torch vision\n",
"! conda install --yes pytorch==1.10.0 torchvision==0.11.0 -c pytorch"
]
},
{
"cell_type": "markdown",
"id": "ff3ed9f8-703d-416e-8b70-10a8ce029e8d",
"metadata": {},
"source": [
"2、获取torch和cuda版本安装对应版本的mmcv和nvidia-dali"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c95571d5-3065-40b3-ad53-dc3063db8604",
"metadata": {},
"outputs": [],
"source": [
"import torch\n",
"import os\n",
"os.environ['CUDA']='cu' + torch.version.cuda.replace('.', '')\n",
"os.environ['Torch']='torch'+torch.version.__version__.replace('+PAI', '')\n",
"!echo \"cuda version: $CUDA\"\n",
"!echo \"pytorch version: $Torch\""
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ce3dca16-9baf-42f8-94c4-5ea7f087d61e",
"metadata": {},
"outputs": [],
"source": [
"# install some python deps\n",
"! pip install mmdet\n",
"! pip install mmcv-full==1.4.4 -f https://download.openmmlab.com/mmcv/dist/${CUDA}/${Torch}/index.html\n",
"! pip install http://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/third_party/nvidia_dali_cuda100-0.25.0-1535750-py3-none-manylinux2014_x86_64.whl"
]
},
{
"cell_type": "markdown",
"id": "3dee3a99-191a-4515-97dd-80841db43775",
"metadata": {},
"source": [
"3、 安装EasyCV算法包"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "7f03f9e9-6029-4918-b8dc-533db9c7fae3",
"metadata": {},
"outputs": [],
"source": [
"pip install pai-easycv"
]
},
{
"cell_type": "markdown",
"id": "3483904d-91dd-44c4-a486-246aa38d4124",
"metadata": {},
"source": [
"4、 简单验证"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "4d382373-76a0-4fbc-b09f-5d082aab5104",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"from easycv.apis import *"
]
},
{
"cell_type": "markdown",
"id": "6da90a06",
"metadata": {},
"source": [
"5、安装deformable_attention"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5a5d35b9",
"metadata": {},
"outputs": [],
"source": [
"import easycv\n",
"print(easycv.__file__)\n",
"# 进入easycv安装目录编译deformable_attention\n",
"! cd /home/pai/lib/python3.6/site-packages/easycv/thirdparty/deformable_attention && python setup.py build install "
]
},
{
"cell_type": "markdown",
"id": "29bb3d55-d00b-453b-9522-c686260e325c",
"metadata": {},
"source": [
"## 数据准备\n",
"\n",
"接下来介绍基于coco数据集的实例分割训练示例你可以下载[COCO2017](https://cocodataset.org/#download)数据也可以使用我们提供了示例COCO数据"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9492b324-17d9-4963-b7dd-a49f684c54c3",
"metadata": {},
"outputs": [],
"source": [
"! wget http://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/data/small_coco_demo/small_coco_demo.tar.gz && tar -zxf small_coco_demo.tar.gz"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5fdc9dc3-0886-493f-be5b-f858eff72164",
"metadata": {},
"outputs": [],
"source": [
"# 重命名文件夹\n",
"! mkdir -p data/ && mv small_coco_demo database/coco"
]
},
{
"cell_type": "markdown",
"id": "dfcdc227",
"metadata": {},
"source": [
"data/coco格式如下\n",
"\n",
"```shell\n",
"data/coco/\n",
"├── annotations\n",
"│ ├── instances_train2017.json\n",
"│ └── instances_val2017.json\n",
"├── train2017\n",
"│ ├── 000000005802.jpg\n",
"│ ├── 000000060623.jpg\n",
"│ ├── 000000086408.jpg\n",
"│ ├── 000000118113.jpg\n",
"│ ├── 000000184613.jpg\n",
"│ ├── 000000193271.jpg\n",
"│ ├── 000000222564.jpg\n",
"│ ...\n",
"│ └── 000000574769.jpg\n",
"└── val2017\n",
" ├── 000000006818.jpg\n",
" ├── 000000017627.jpg\n",
" ├── 000000037777.jpg\n",
" ├── 000000087038.jpg\n",
" ├── 000000174482.jpg\n",
" ├── 000000181666.jpg\n",
" ├── 000000184791.jpg\n",
" ├── 000000252219.jpg\n",
" ...\n",
" └── 000000522713.jpg\n",
"```"
]
},
{
"cell_type": "markdown",
"id": "c9bd7101-3072-417c-ac54-5d7d254b31b4",
"metadata": {},
"source": [
"## 模型训练\n",
"\n",
"这个Demo中我们采用[Mask2Former](https://arxiv.org/pdf/2112.01527.pdf)图像分割算法训练ResNet50主干网络 下载示例配置文件"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ab669385-8525-4694-8388-148ba1c2753a",
"metadata": {},
"outputs": [],
"source": [
"! rm -rf mask2former_r50_8xb2_e50_instance.py\n",
"! wget https://raw.githubusercontent.com/alibaba/EasyCV/master/configs/segmentation/mask2former/mask2former_r50_8xb2_e50_instance.py"
]
},
{
"cell_type": "markdown",
"id": "2890d267-6b95-47e6-9b51-83402446fa7f",
"metadata": {},
"source": [
"为了适配小数据我们对配置文件mask2former_r50_8xb2_e50_instance.py做如下字段的修改减少训练epoch数目加大打印日志的频率\n",
"\n",
"```python\n",
"\n",
"total_epochs = 3\n",
"\n",
"#optimizer.lr -> 0.000001\n",
"# optimizer\n",
"optimizer = dict(\n",
" type='AdamW',\n",
" lr=0.000001,\n",
" weight_decay=0.05,\n",
" eps=1e-8,\n",
" betas=(0.9, 0.999),\n",
" paramwise_options={\n",
" 'backbone': dict(lr_mult=0.1),\n",
" 'query_embed': dict(weight_decay=0.),\n",
" 'query_feat': dict(weight_decay=0.),\n",
" 'level_embed': dict(weight_decay=0.),\n",
" 'norm': dict(weight_decay=0.),\n",
" })\n",
"\n",
"# log_config.interval 1\n",
"log_config = dict(interval=1)\n",
"\n",
"```\n",
"\n",
"注意: 如果是使用COCO完整数据训练为了保证效果建议使用单机8卡进行训练\n",
"\n",
"为了保证模型效果,我们在[预训练模型](http://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/EasyCV/modelzoo/segmentation/mask2former_r50_instance/epoch_50.pth)基础上finetune 执行如下命令启动训练"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "aaf88f46-a578-4dfc-a33f-afa0357f734a",
"metadata": {},
"outputs": [],
"source": [
"!python -m easycv.tools.train mask2former_r50_8xb2_e50_instance.py --work_dir work_dir/segmentatino/mask2former_r50_instance --load_from http://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/EasyCV/modelzoo/segmentation/mask2former_r50_instance/epoch_50.pth"
]
},
{
"cell_type": "markdown",
"id": "fc43e194-d8e7-4796-af3a-1f64663b9744",
"metadata": {},
"source": [
"### 预测"
]
},
{
"cell_type": "markdown",
"id": "2cc9e6fc",
"metadata": {},
"source": [
"下载测试图片"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "973d5bd4",
"metadata": {},
"outputs": [],
"source": [
"! wget http://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/EasyCV/modelzoo/segmentation/000000123213.jpg"
]
},
{
"cell_type": "markdown",
"id": "3ecb723f",
"metadata": {},
"source": [
"使用训练好的模型进行图像分割预测"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5a5a3632",
"metadata": {},
"outputs": [],
"source": [
"import torch\n",
"import cv2\n",
"from IPython.display import Image\n",
"from easycv.predictors.segmentation import Mask2formerPredictor\n",
"\n",
"\n",
"predictor = Mask2formerPredictor(model_path='work_dir/segmentatino/mask2former_r50_instance/epoch_3.pth',\n",
" config_file='mask2former_r50_8xb2_e50_instance.py',\n",
" task_mode='instance')\n",
"img = cv2.imread('000000123213.jpg')\n",
"predict_out = predictor(['000000123213.jpg'])\n",
"instance_img = predictor.show_instance(img, **predict_out[0])\n",
"cv2.imwrite('instance_out.jpg',instance_img)\n",
"display(Image('000000123213.jpg'))\n",
"display(Image('instance_out.jpg'))"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3.6.13 ('torch1.10')",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.13"
},
"vscode": {
"interpreter": {
"hash": "ffac244d5fb3e091416ac35ee470bc03f8b6d092e3cccc2d90f82acef7653459"
}
}
},
"nbformat": 4,
"nbformat_minor": 5
}