由于标注精灵不需安装,而labelme安装有些麻烦,刚开始标注多边形的数据时使用标注精灵,但是这破软件使用不友好,标注后修改极为麻烦,实在难以忍受他了,改用labelme了,但是前面标注了一些数据json格式和labelme完全不一样,怎么才能转化到labelme,对一个稍微熟悉json格式的人来说,这其实so easy,下面记录一下。
1、标注精灵的多边形json格式如下:
2、labelme的多边形json格式如下,左边是其整体结构,右边是其中一个多边形的具体展开结构,其标注图片和上面一样:
3、标注的多边形json格式转化为labelme的多边形json格式的python程序
有了上面两种json的具体结构形式,就可以动手写转化程序了,前面的结构分析是最主要的,下面直接上转化代码:
#utf-8
import os
import json
def BiaoZhuJinLinData2LabelMeData(AnnotFilePath,SaveDataDir):
LabelMeJsonData={}
LabelMeJsonData['version']="5.2.9"
LabelMeJsonData['flags']={}
LabelMeJsonData['shapes']=[]
LabelMeJsonData["imagePath"]='1'
LabelMeJsonData["imageData"]=None
LabelMeJsonData["imageHeight"]=1
LabelMeJsonData["imageWidth"]=1
shapes=[]
with open(AnnotFilePath,'r') as FId:
AnnotStr=json.load(FId)
object=AnnotStr['outputs']['object']
if object:
for objectText in object:
name=objectText['name']
polygon=objectText['polygon']
xs,ys=[],[]
for LocName in polygon.keys():
LocVal=polygon[LocName]
if LocName[0]=='x':
xs.append(float(LocVal))
elif LocName[0]=='y':
ys.append(float(LocVal))
assert len(xs)==len(ys),'xs is inequal ys'
xys = []
for i in range(len(xs)):
xys.append([xs[i],ys[i]])
#print(xys)
shape = {}
shape["label"]=name
shape["points"]=xys
shape["group_id"]=None
shape["shape_type"]="polygon"
shape["flags"]={}
shapes.append(shape)
LabelMeJsonData['shapes']=shapes
_,imagePath=os.path.split(AnnotStr['path'])
LabelMeJsonData["imagePath"]=imagePath
width=AnnotStr['size']['width']
height=AnnotStr['size']['height']
depth=AnnotStr['size']['depth']
LabelMeJsonData["imageHeight"]=height
LabelMeJsonData["imageWidth"]=width
print(LabelMeJsonData)
_,AnnotFileName=os.path.split(AnnotFilePath)
LabelMeJsonPath=os.path.join(SaveDataDir,AnnotFileName)
with open(LabelMeJsonPath,'w' ) as f:
json.dump(LabelMeJsonData,f,indent=4)
if __name__=='__main__':
AnnotFilePath= '201906022236072977594.json'
SaveDataDir='NewLabelMeData'
os.makedirs(SaveDataDir,0o777, True)
BiaoZhuJinLinData2LabelMeData(AnnotFilePath, SaveDataDir)#使用for循环批量转化
好了看看是不是很简单吧