2_[实例分割]数据标注.md 5.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
## 2. 使用LabelMe标注「目标检测」及「实例分割」任务数据

### 2.1 准备工作     

* **2.1.1** 对收集的图像划分为训练、验证(非必须)、测试三个部分的数据集,分别存放于对应的文件夹中。     
* **2.1.2** 创建与图像文件夹相对应的文件夹,用于存储标注的json文件。
* **2.1.3** 点击”Open Dir“按钮,选择需要标注的图像所在的文件夹打开,则”File List“对话框中会显示所有图像所对应的绝对路径。      

### 2.2 目标检测标注    

* **2.2.1** 打开矩形框标注工具,具体如下图所示     

<div align=center><img width="800" height="450" src="./pics/detection1.png"/></div>        

* **2.2.2** 使用拖拉的方式对目标物体进行标识,并在弹出的对话框中写明对应label(当label已存在时点击即可),具体如下图所示:    

<div align=center><img width="800" height="450" src="./pics/detection3.png"/></div>        

当框标注错误时,可点击右侧的“Edit Polygons”再点击标注框,通过拖拉进行修改,也可再点击“Delete Polygon”进行删除。       

* **2.2.3** 点击右侧”Save“,将标注结果保存到***2.1.1***中创建的文件夹中
  【注意】当所使用的模型是类似Mask R-CNN这类模型时,虽是目标检测模型,但却需要实例分割信息,具体参见***2.3***

### 2.3 实例分割标注     

* **2.3.1** 点击右侧的“Create Polygons”以打点的方式圈出目标的轮廓,并在弹出的对话框中写明对应label(当label已存在时点击即可),具体如下提所示:

<div align=center><img width="800" height="450" src="./pics/detection2.png"/></div>      

当框标注错误时,可点击右侧的“Edit Polygons”再点击标注框,通过拖拉进行修改,也可再点击“Delete Polygon”进行删除。          

* **2.3.2** 点击右侧”Save“,将标注结果保存到***2.1.1***中创建的文件夹中。       

【注意】***2.2.2***和***2.3.1***中在在定义label名字时,都用英文命名,同时在名字后加上“_0”或“_1”分别代表目标是一个对象(iscrowd=0)还是一组对象(iscrowd=1)。一个对象表示能用一个矩形框(或大于等于一个多边形框)就能将一个独立对象表示出来,当需要使用多个多边形来表示一个对象时,在“_0”后加上同一个数字代表同一个对象;一组对象表示同一类型对象联系太紧密只能用一个矩形框(或一个多边形框)将一组对象圈出来。例如下图在进行目标检测标注时,水果单堆分割成一个个水果较不容易,所以将其定义为一组水果对象,label定为“fruit_1” ;在进行实例分割标注时,装饰品无法用一个多边形框表示出来,所以使用3个label为“decoration_00”的多边形表示。
<div align=center><img width="800" height="450" src="./pics/detection4.png"/></div>   


## 2.4 对LabelMe标注数据的转换
目标检测中常用的数据集是COCO数据集,由于LabelMe标注的结果是.json文件与图像文件一一对应,而COCO数据集的标注文件则是一个数据集对应一个,所以需要将LabelMe数据集转换为COCO数据集格式。      

COCO的数据目录结构如下:
```
data/mydataset/
|-- annotations
    |-- instance_train.json 
    |-- instance_test.json 
    |-- instance_val.json 
|-- train
|-- test
|-- val
```
其中,`annotations`用于存放.json文件,`train\test\val`用于存放图像文件。           

针对训练、验证(非必须)、测试三个部分的数据集,分别在命令行中执行下述命令进行转换:
```cmd
# 进入Anaconda环境后,安装下述python包
# 安装numpy
pip install numpy
# 安装PIL
pip install Pillow
# 转换
cd ./DataAnnotation
python ./labelme2coco.py \
       --image_input_dir ~/Users/image/ \
       --json_input_dir ~/Users/json/ \
# --image_input_dir:3.1.1的步骤一中创建的图像文件夹路径
# --json_input_dir:image_input_dir所对应的存放LabelMe标注文件的文件夹路径
# 最终转换的json文件存放在image_input_dir父目录下的anatations文件夹下

```

转换后的标注文件为每个数据集(训练或验证(非必须)或测试)分别对应一个.json文件。转换后的.json文件的合适如下所示:
```python
info{
    "year": int,
    "version": str,
    "description": str,
    "contributor": str,
    "url": str,
    "date_created": datetime,
}
license[
    {
        "id": int,
        "name": str,
        "url": str,
    },
    ...
]
// 以上信息对目标检测作用不大所以并未转换
image[
    {
        "id": int,
        "width": int,
        "height": int,
        "file_name": str
    },
    ...
]
categories[
    {
        "supercategory": str,
        "id": int,
        "naeme": str
    },
    ...
]
annotation[
    {
        "id": int,    
        "image_id": int,
        "category_id": int,
        "segmentation": list,
        "area": float,
        "bbox": [x,y,width,height],
        "iscrowd": 0 or 1,
    },
    ...
]    
```
相关标签含义:

|标签|备注|
|-----|-----|
|image/width| 图像宽度|
|image/height| 图像高度|
|image/file_name| 图像在文件夹中的名字|
|categories/supercategory| 父类名字|
|categories/name| 类别名字|
|annotation/segmentation| 横纵坐标点构成的list|
|annotation/area| 目标框面积的大小|
|annotation/bbox| 目标矩形框的左上角坐标及矩形宽高|
|annotation/iscrowd| 表示目标是否是一组对象|