Labelme是一款经典的标注工具,支持目标检测、语义分割、实例分割等任务。今天总结一下安装流程以及过程中遇到的问题
为了不影响其他python环境,建议新建一个环境。(不想新建可以跳过)
这里以创建一个名为labelme_env
,python版本为3.8的环境为例:
conda create -n labelme_env python=3.8
创建完成后,进入新环境:
conda activate labelme_env
安装非常简单,直接使用pip
安装即可:
pip install labelme
安装完成后在终端输入labelme
即可启动:
labelme
这里建议大家按照我提供的目录格式事先准备好数据,然后在该根目录下启动labelme
(注意启动目录位子,因为标注json文件中存储的图片路径都是以该目录作为相对路径的)
img_data: 存放你要标注的所有图片
data_annotated: 存放后续标注好的所有json文件
label.txt: 所有类别信息
虽然在labelme中能够在标注时添加标签,但我个人强烈建议事先创建一个label.txt
标签(放在上述位置中),然后启动labelme时直接读取。标签格式如下:
__ignore__
_background_
dog
cat
每一行代表一个类型的名称,前两行是固定格式__ignore__
和_background_
都加上,否则后续使用作者提供的转换脚本(转换成PASCAL VOC格式和MS COCO格式)时会报错。也就是从第三行开始就是我们需要分割的目标类别。这里以分割猫狗为例。
在这里,因为是新手,又没法从自己电脑的文件中找到不同环境下安装的labelme,所以不知道在哪怎么创建标签label.txt
,所以找了CMD创建文件的方法及CMD打开常用工具的命令,我使用的是第一种,在新的环境中直接在cmd输入echo a 2>file.txt,创建了一个txt文件,发现就是在C:\Users\用户名 下面,然后我直接点开txt文件添加的标签。
1、echo a 2>file.txt
echo是回显命令,会回显命令后面字符串内容。
"2”表示错误输出的句柄,此例中没有错误输出,所以创建了没有内容的空文件。
其实>默认都是重定向了句柄1,即标准输出句柄。比如cd.>a.txt,其实就是cd. 1>a.txt。
同样,句柄3到9也可以使用在本例中,它们是未经定义的句柄,也不会有输出,如 echo a 3>a.txt。
2、cd .>a.txt
cd.表示改变当前目录为当前目录,即等于没改变;而且此命令不会有输出。
“>”表示把命令输出写入到文件。后面跟着a.txt,就表示写入到a.txt。
而此例中命令不会有输出,所以就创建了没有内容的空文件。
cd >1.txt也是可以的。
3、copy nul a.txt
nul表示空设备,从概念上讲,它不可见,存在于每个目录中,可以把它看成一个特殊的“文件”,它没有内容;一般可把输出写入到nul,来达到屏蔽输出的目的,如pause>nul,此命令执行效果是暂停,并且不会显示“请按任意键继续…”。
此例子表示将空设备复制到a.txt,同样创建了没有内容的空文件。
4、type nul>a.txt
type是打开文件的命名,类似Linux的cat。此例子表示显示空设备的内容,并写入到a.txt。
除此之外,如果不想用这种方式创建标签,可以直接在labelme中创建,下面继续说明:
在创建好标签后,启动labelme并读取标签文件(注意启动根目录),其中--labels
指定了标签文件的路径。
labelme --labels label.txt
读取标签后,我们在界面右侧能够看到Label List
中已经载入了刚刚我们自己创建的标签文件,并且不同类别用不同的颜色表示。(如果没有创建标签,list中是空白的,不要着急下面会说明)
点击界面左侧的Open
或OpenDir
打开文件或文件夹,这里就选择我们刚刚说好的img_data
(该文件夹中存储了所有后续需要标注的图片):
养成良好习惯,先将保存路径设置好。
先点击左上角File,Change Output Dir设置标注结果的保存目录,这里就设置成前面说好的data_annotated。
建议将Save With Image Data取消掉,默认是选中的。如果选中,会在保存的标注结果中将图像数据也保存在.json文件中(个人觉得没必要,还占空间)。
首先点击左侧的CreatePolygons按钮开始绘制多边形,然后用鼠标标记一个一个点把目标边界给标注出来(鼠标放置在第一个点上,点击一下会自动闭合边界)。标注后会弹出一个选择类别的选择框,选择对应类别即可。
如果标注完一个目标后想修改目标边界,可以点击工具左侧的EditPolygons按钮,然后选中要修改的目标,拖拉边界点即可进行微调。如果要在边界上新增点,把鼠标放在边界上点击鼠标右键选择Add Point to Edge即可新增边界点。如果要删除点,把鼠标放在边界点上点击鼠标右键选择Remove Selected Point即可删除边界点。
此时,如果没有list,可以在这里直接创建标签。
Polygons
外还有矩形Retangle
、Circle
圆形、Point
点等。
Save
按钮即可保存标注结果,默认每张图片的标注信息都用一个json文件存储。标注得到的json文件格式如下,将一张图片中的所有目标的坐标都保存在shapes列表中,列表中每个元素对应一个目标,其中label记录了该目标的类别名称。points记录了一个目标的左右坐标信息。其他信息不在赘述。根据以下信息,其实自己就可以写个脚本取读取目标信息了。
{
"version": "4.5.9",
"flags": {},
"shapes": [
{
"label": "dog",
"points": [
[
108.09090909090907,
687.1818181818181
],
....
[
538.090909090909,
668.090909090909
],
[
534.4545454545454,
689.0
]
],
"group_id": null,
"shape_type": "polygon",
"flags": {}
}
],
"imagePath": "../img_data/1.jpg",
"imageData": null,
"imageHeight": 690,
"imageWidth": 690
}