|
|
@@ -0,0 +1,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| 表示目标是否是一组对象|
|