欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

labelme图像标注

程序员文章站 2022-05-30 13:29:53
...

详细安装过程参考:https://github.com/wkentaro/labelme

一、环境:ubuntu 16.04   + python 2.7

1、终端下载:

sudo apt-get install python-pyqt5  # PyQt5
sudo pip install labelme

2、下载上述github的文件

终端输入 labelme,即打开软件,点击“open”打开需要标注的图像,选择对目标区域进行标注。标注完成后点击save,产生一个json文件。进入labelme安装目录,因为在终端下安装的,所以我的在/usr/local/bin/

3、终端执行

labelme_json_to_dataset 你的路径/你的json文件名.json //这里的文件名根据自己的实际情况更改
即可得到一个文件夹,有五个文件,分别是:*.png, info.yaml , label.png, label_viz.png,label_names.txt。 其中label.pnginfo.yaml是我们需要用到的,label.png相当于mask 文件。

(注:此处直接在终端下运行,而不是在某个文件里的终端路径,因为labelme直接安装的)

如:labelme_json_to_dataset /home/qf/labelme-master/examples/tutorial/image_0001.json

4、分析json文件

首先看看标记完成的json文件长什么样子

{
  "imageData": "something too long", # 原图像数据 通过该字段可以解析出原图像数据
  "shapes": [ # 每个对象的形状
    { # 第一个对象
      "points": [ # 边缘是由点构成,将这些点连在一起就是对象的边缘多边形
        [
          165.90909090909093, # 第一个点 x 坐标
          36.909090909090935  # 第一个点 y 坐标
        ],
        ……
        [
          240.90909090909093,
          15.909090909090935
        ],
        [
          216.90909090909093, # 最后一个点 会闭合到第一个点完成封闭的多边形 x 坐标
          31.909090909090935 # y 坐标
        ]
      ],
      "fill_color": null,
      "label": "cat_1",  # 第一个对象的标签
      "line_color": null
    },
    {  # 第二个对象
      "points": [
        [
          280.90909090909093,
          31.909090909090935
        ],
        ……
        [
          362.90909090909093,
          20.909090909090935
        ],
        [
          339.90909090909093,
          32.909090909090935
        ]
      ],
      "fill_color": null,
      "label": "cat_2", # 第二个对象的标签
      "line_color": null
    }
  ],
  "fillColor": [
    255,
    0,
    0,
    128
  ],
  "imagePath": "/home/wu/1.jpg", # 原始图片的路径
  "lineColor": [
    0,
    255,
    0,
    128
  ]
}

5、通过json文件提取信息

方式1:利用/usr/local/bin/labelme_draw_json

即终端下直接运行:labelme_draw_json /home/qf/labelme-master/examples/tutorial/image_0001.json

方式2:采用下面的程序labelme_draw_json.py

# -*- coding:utf-8 -*-
#!/usr/bin/env python

import argparse
import json
import matplotlib.pyplot as plt

from labelme import utils


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('json_file')
    args = parser.parse_args()

    json_file = args.json_file

    data = json.load(open(json_file)) # 加载json文件

    img = utils.img_b64_to_array(data['imageData']) # 解析原图片数据
    lbl, lbl_names = utils.labelme_shapes_to_label(img.shape, data['shapes']) # 解析'shapes'中的字段信息,解析出每个对象的mask与对应的label   lbl存储 mask,lbl_names 存储对应的label
    # lal 像素取值 0、1、2 其中0对应背景,1对应第一个对象,2对应第二个对象
    # 使用该方法取出每个对象的mask mask=[] mask.append((lbl==1).astype(np.uint8)) # 解析出像素值为1的对象,对应第一个对象 mask 为0、1组成的(0为背景,1为对象)
    # lbl_names  ['background','cat_1','cat_2']

    captions = ['%d: %s' % (l, name) for l, name in enumerate(lbl_names)]
    lbl_viz = utils.draw_label(lbl, img, captions)

    plt.subplot(121)
    plt.imshow(img)
    plt.subplot(122)
    plt.imshow(lbl_viz)
    plt.show()
    
    #####################################################################
    #以下均可打印出来
    data['imageData'] # 原图数据 str
    data['shapes'] # 每个对像mask及label  list
    len(data['shapes']) # 返回对象个数 int
    print('label1:',data['shapes'][0]['label']) # 返回第一个对象的标签 str
    data['shapes'][0]['points'] # 返回第一个对象的边界点 list
    data['shapes'][0]['points'][0] # 返回第一个对象的边界点第一个点 list

    data['imagePath'] # 原图路径 str
    data['fillColor'] # 填充颜色(边界内部) list
    data['lineColor'] # 边界线颜色  list


if __name__ == '__main__':
    main()

终端下运行:python labelme_draw_json.py /home/qf/labelme-master/examples/tutorial/image_0001.json

6、查看label.png图像,可以利用/usr/local/bin/labelme_draw_label_png

终端下运行:labelme_draw_label_png /home/qf/labelme-master/examples/tutorial/image_0001_json/label.png

7、获取json文件中的label,并保存到txt文件中(read_jsons.py)

# -*- coding: utf-8 -*
#!/usr/bin/env python
import json,os


def readjson():
    f = open("/home/qf/labelme-master/examples/tutorial/lab.txt",'a')
    path = '/home/qf/labelme-master/examples/tutorial/1'#指定文件夹路径
    files = os.listdir(path)#得到文件夹下的所有文件名称
    print(files)
    #s = []
    for file in files:
        #if not os.path.isdir(file):#判断是否为文件夹,如果不是则继续
        with open(path+'/'+file,'r') as fr:#用with打开文件
            data = json.load(fr) # 用json中的load方法,将json串转换成字典
            lab = data['shapes'][0]['label']  #注意多重结构的读取语法  
            f.write(lab+' ')
             
            #s.append(lab)#保存所有字典到列表中
    #return s
    f.close()


if __name__ == '__main__':
    readjson()

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

二、windows7 +python3.6下安装labelme:

事先电脑已经安装好了anaconda,否则按下面目录进行:

1.先下载安装anaconda:https://www.anaconda.com/download/选择适合自己Python版本的
2.安装好在程序里选择prompt,就相当于windows下的cmd,只不过运行目录直接在anaconda下

labelme图像标注


3.在prompt里依次输入
conda create --name=labelme python=3.6(这一步python=*选择自己的Python版本)
activate labelme(这一步Ubuntu系统source activate labelme)
conda install pyqt
pip install labelme

4.我在最后pip install labelme的时候出现两个错误:

出现`UnicodeDecodeError` 错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb6 in position 33: invalid start byte  

用编辑器打开Python36\Lib\site-packages\pip\compat\__init__.py,将第75行`return s.decode('utf_8')` 修改为`return s.decode('cp936')` 
重新`pip install labelme , 安装成功

安装成功后,输入labelme启动失败,报错No module named  yaml

采用pip install yaml和easy_install python-yaml都不行,只能去重新下载yaml的安装包

http://pyyaml.org/wiki/PyYAML

labelme图像标注

我选择的是ZIP packagehttp://pyyaml.org/download/pyyaml/PyYAML-3.12.zip

解压后,

cd PyYAML-3.12

 python setup.py install

重新pip install labelme,成功

输入labelme,启动成功