图片标注工具。它是用 Python 编写的,并使用 Qt 作为其图形界面。
Wikipedia:LabelMe 是由麻省理工学院计算机科学与人工智能实验室 (CSAIL) 创建的一个项目,它提供带有注释的数字图像数据集。该数据集是动态的、免费使用的,并且对公众贡献开放。 LabelMe 最适用的用途是计算机视觉研究。截至 2010 年 10 月 31 日,LabelMe 拥有 187,240 个图像、62,197 个带注释的图像和 658,992 个标记对象。
LabelMe 不是标记整个图像(这也将每个图像限制为包含单个对象),而是通过指定包含对象的多边形边界框来允许对图像中的多个对象进行注释。
先创建 anaconda 虚拟环境 labelme,对应更改自己的python版本,我的是3.7
conda create -n labelme python=3.7
创建好后,激活虚拟环境
conda activate labelme
labelme 正常运转需要各种依赖的包,先下载pyqt和pillow
conda install pyqt
conda install pillow
出现这样情况的一路输入y,然后enter
安装labelme
pip install labelme==3.16.2
!!!注意这里面如果出现网络错误,需要把代理关一下
Collecting package metadata (current_repodata.json): failed CondaHTTPError: HTTP 000 connection failed
进入桌面的anaconda prompt(假设你已经安装好了anaconda),激活labelme环境
activate labelme
labelme
默认快捷键
下一张图片D
上一张图片A
保存图片ctrl+S
编辑标注的框ctrl+J
创建矩形框进行标注ctrl+R
修改快捷键的方法
安装目录下面有个.labelmerc文件,用记事本打开,然后我这里是把保存快捷键加了空格,把编辑操作改成ctrl+G,方便左手一只手操作,嘿嘿嘿。
分析json文件
{"version": "3.15.2",
"flags": {},
"shapes": # 每个对象的形状
[{# 第一个对象
"label": "candida", # 第一个对象的标签
"line_color": null,
"fill_color": null,
"points": [# 边缘是由点构成,将这些点连在一起就是对象的边缘多边形
[185.0, 807.0],# 第一个点 x 坐标
[367.0, 947.0] # 第一个点 y 坐标
],
"shape_type": "rectangle",
"flags": {}}],
"lineColor": [0, 255, 0, 128],
"fillColor": [255, 0, 0, 128],
"imagePath": "2_23.jpg", # 原始图片的路径
"imageData": null,
"imageHeight": 1024,
"imageWidth": 1024}
分析完json文件按照需求设计脚本吧。。。
删除没有标注的空白图片
def deleteblank(path):
for root,dirs,files in os.walk(path):
for file in files:
fileName = os.path.join(root,file)
if file.find(".json") != -1:
with open(fileName,"r") as f:
data = json.load(f)
if len(data['shapes']) == 0:
fileImage = os.path.join(root,file.split('.')[0]+'.jpg')
print(fileName)
print(fileImage)
os.remove(fileName)
os.remove(fileImage)
删除图片的边缘标注框
def deletemargin(path):
for root, dirs, files in os.walk(path):
cnt = 0
cnt0 = 0
for file in files:
fileName = os.path.join(root, file)
if file.find(".json") != -1:
with open(fileName, "r+") as f:
data = json.load(f)
try:
for i in range(len(data['shapes'])):
# print(data['shapes'][i]['points'])
pointlist = data['shapes'][i]['points']#由两个点组成
fileImage = os.path.join(root, file.split('.')[0] + '.jpg')
numlist = []
numlist.append(pointlist[0][0])
numlist.append(pointlist[0][1])
numlist.append(pointlist[1][0])
numlist.append(pointlist[1][1])
print(numlist)
for j in iter(numlist):
if j == 0.0 or j == 1024.0:
print(fileName)
cnt = cnt+1
data['shapes'][i] = 0
break
except:
print(fileName+'越界')
#从后往前删除shape列表中的元素0
for i in range(len(data['shapes'])-1,-1,-1):
if data['shapes'][i] == 0:
data['shapes'].pop(i)
cnt0 = cnt0+1
print(data['shapes'])
print('\n')
#修改后的data数据保存到json文件
f.seek(0)#定位文件位置
f.truncate()#清空原来的json内容
json.dump(data,f)
print(cnt,cnt0)
安装和labelme一样,创建虚拟环境,然后pip即可
安装教程略(把labelme教程中的labelme换成labelimg即可)
每次使用在anconda里面输入下面即可启动。
activate labelimg
labelimg
w创建矩形框
ctrl+s保存标注好的标签
注:当按下空格时,用户可以将图像标记为已验证,将出现绿色背景。
space将当前图像标记为已验证;这在自动创建数据集时使用,然后用户可以浏览所有图片并标记它们而不是注释它们
【这里面说一下保存,我打开view里面的自动保存后发现上下翻图片的时时候并不成功,ctrl+s呢可以保存文件,但是这两种再打开文件还是看不到矩形框,而是采用按一次空格保存文件后再按一次空格,然后前后翻图片才可以保证标注框还在原来的图片上,有点奇怪】
a切换上一张
d切换下一张
github使用说明链接
labelme保存的结果是json文件,labelimg保存的结果是xml文件