json2voc

每个图片一个.json文件标注,生成list
其中.json文件内容为:

{
  "version": "4.5.6",
  "flags": {},
  "shapes": [
    {
      "label": "card",
      "line_color": null,
      "fill_color": null,
      "points": [
        [
          251.78217821782175,
          126.73267326732673
        ],
        [
          407.2079207920792,
          106.93069306930693
        ],
        [
          442.3564356435644,
          346.53465346534654
        ],
        [
          291.86138613861385,
          377.7227722772277
        ]
      ],
      "shape_type": "polygon",
      "flags": {}
    }
  ],
  "lineColor": [
    0,
    255,
    0,
    128
  ],
  "fillColor": [
    255,
    0,
    0,
    128
  ],
  "imagePath": "1621317954959.jpg",
  "imageData":hSZp2KTFACUUHrRiiwXP/2Q==",
  "imageHeight": 480,
  "imageWidth": 640
}

相应code:

#!/usr/bin/python3
import os
import cv2 
import json
import shutil
                             
headstr = """                             
<annotation>                               
    <folder>VOC</folder>                   
    <filename>%s</filename>                
    <source>                               
        <database>My Database</database>   
        <annotation>COCO</annotation>      
        <image>flickr</image>              
        <flickrid>NULL</flickrid>          
    </source>                              
    <owner>                                
        <flickrid>NULL</flickrid>          
        <name>company</name>               
    </owner>                               
    <size>                                 
        <width>%d</width>                  
        <height>%d</height>                
        <depth>%d</depth>                  
    </size>                  
    <segmented>0</segmented> 
"""                          
                   
objstr = """                    
    <object>                     
        <name>%s</name>          
        <pose>Unspecified</pose> 
        <truncated>0</truncated> 
        <difficult>0</difficult> 
        <bndbox>                 
            <xmin>%d</xmin>      
            <ymin>%d</ymin>      
            <xmax>%d</xmax>      
            <ymax>%d</ymax>      
        </bndbox>                
    </object>                    
"""                              
  
tailstr = '''   
</annotation>    
'''              

def mkr(path):               
    if os.path.exists(path): 
        shutil.rmtree(path)  
        os.mkdir(path)       
    else:                    
        os.mkdir(path)       

def write_xml(anno_path,head, objs, tail):                  
    f = open(anno_path, "w")                                
    f.write(head)                                           
    for obj in objs:                                        
        f.write(objstr%(obj[0],obj[1],obj[2],obj[3],obj[4]))
    f.write(tail)                                           

def jsonload(data,label):
    objs=[]    
    print('data------------',data['shapes'][0])
    points0=data['shapes'][0]['points'][0]
    points1=data['shapes'][0]['points'][1]
    points2=data['shapes'][0]['points'][2]
    points3=data['shapes'][0]['points'][3]

    points0_x=int(points0[0])
    points0_y=int(points0[1])
    points1_x=int(points1[0])
    points1_y=int(points1[1])

    points2_x=int(points2[0])
    points2_y=int(points2[1])
    points3_x=int(points3[0])
    points3_y=int(points3[1])

    leftpoint_x=min(points0_x,points1_x,points2_x,points3_x)
    leftpoint_y=min(points0_y,points1_y,points3_y,points3_y)

    rightpoint_x=max(points0_x,points1_x,points2_x,points3_x)
    rightpoint_y=max(points0_y,points1_y,points3_y,points3_y)

    object_height=rightpoint_y-leftpoint_y
    object_width=rightpoint_x-leftpoint_x

    if object_height<1:
        print('height is wrong!')
    if object_width < 1:
        print('width is wrong!')

    height=data['imageHeight']
    width=data['imageWidth']
    #obj=[label,leftpoint_x,leftpoint_y,rightpoint_x,rightpoint_y,width,height]
    obj=[label,leftpoint_x,leftpoint_y,rightpoint_x,rightpoint_y]
    objs.append(obj)
    return objs

def save_annotations_and_imgs(filename,objs):                 
    anno_path=anno_dir+filename[:-3]+'xml'
    img_path = os.path.join(dataDir,filename)                                                                                  
    dst_imgpath=os.path.join(img_dir,filename)                                         
                                                                         
    img=cv2.imread(img_path)                                             
    #if (img.shape[2] == 1):                                             
    #    print(filename + " not a RGB image")                            
     #   return                                                          
    shutil.copy(img_path, dst_imgpath)                                   
                                                                         
    head=headstr % (filename, img.shape[1], img.shape[0], img.shape[2])  
    tail = tailstr                                                       
    write_xml(anno_path,head, objs, tail)                                

if __name__ == '__main__':
    jsonlist='jsonlist.txt'
    f_json=open(jsonlist)
    lines=f_json.readlines()
    label='paper'  #相应标签设置

    savepath="data/"  
    img_dir=savepath+'images/'      
    anno_dir=savepath+'Annotations/'
    dataDir= 'path/to/images'
    mkr(img_dir)                 
    mkr(anno_dir) 
    
    for line in lines:
        print('------------------------------')
        line_tmp=line.strip().split(' ')[0]
        filepath,filename=os.path.split(line_tmp)
        filename_tmp=filename.replace('.json','.jpg')
        print('filename',filename)
 
        with open(line_tmp, 'r') as f:
            data = json.load(f) 
        json_str = json.dumps(data)
        data = json.loads(json_str)
        objs = jsonload(data,label)
        save_annotations_and_imgs(filename_tmp, objs) 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值