python实现tsinghua-tencent 100000数据集的json文件转为xml文件

算法解决问题:

1,从json文件中抽取数据集中的小目标pne、p11、i5、w57四种交通标志数据集

2.小目标判断标注像素范围在[32,32]

3.转为对应的xml文件

4.标出选出的类别的个数

import os
import time
import json
import cv2


xml_head = '''<annotation>
    <folder>traffic-sign</folder>
    <!--文件名-->
    <filename>{}</filename>  
    <size>
        <width>2048</width>
        <height>2048</height>
        <depth>3</depth>
    </size>
    <segmented>0</segmented>
    <category>{}</category>
    '''
xml_obj = '''
    <object>     
        <!--图片中目标类别-->   
        <name>{}</name>
        <!--是否被裁减,0表示完整,1表示不完整-->
        <truncated>0</truncated>
        <!--是否容易识别,0表示容易,1表示困难-->
        <difficult>0</difficult>
        <bndbox>
            <xmin>{}</xmin>
            <ymin>{}</ymin>
            <xmax>{}</xmax>
            <ymax>{}</ymax>
        </bndbox>
    </object>
    '''
xml_end = '''
</annotation>'''
# json文件路径和用于存放xml文件的路径
anno = '/home/xiaobumidm/Yolo_mark-master/annotations.json'
xml_dir = '/home/xiaobumidm/Yolo_mark-master/jsonxml/'
labels = ['pne','p11','i5','w57']  # label for datasets
print("labels类型:",type(labels))
# 读取json文件内容,返回字典格式
with open(anno,'r',encoding='utf8')as fp:
    json_data = json.load(fp)
    #imgs数据,字典类型
    json_imgs=json_data['imgs']
    #记录小目标总数目,共2908
    count=0
    #count_pne的小目标数目
    count_pne=0
    #count_p11的小目标数目
    count_p11=0
    #count_i5的小目标数目
    count_i5=0
    #count_w57的小目标数目
    count_w57=0
    #count_pne_trian训练文件夹中pne数量
    count_pne_trian=0
    # count_p11_trian训练文件夹中p11数量
    count_p11_trian = 0
    # count_i5_trian训练文件夹中i5数量
    count_i5_trian = 0
    # count_w57_trian训练文件夹中w57数量
    count_w57_trian = 0
    #训练pne数量
    count_img_pne_train=0
    #训练p11数量
    count_img_p11_train=0
    #训练i5数量
    count_img_i5_train=0
    #训练w57数量
    count_img_w57_train=0
    # 测试pne数量
    count_img_pne_test=0
    # 测试p11数量
    count_img_p11_test=0
    # 测试i5数量
    count_img_i5_test=0
    # 测试w57数量
    count_img_w57_test=0

    #图片总数
    count_image=0;
    table=['pne']
    for item in json_imgs.items():
        #item是tuple类型 ,item元组中共有两个元素,一开始的ID和图片详细信息
        #detail_info为图片详细信息,是字典类型,含有path,objects,id三个key值
        detail_info=item[1]
        #path图片路径
        image_path=detail_info['path']
        if image_path.find('train')!=-1 or image_path.find('test')!=-1:
            #图片含有的目标,list类型
            image_objects=detail_info['objects']
            # 图片的id
            image_id = detail_info['id']
            # flag_category记录category的标记
            flag_category = ''
            #obj表示一个图片中目标信息
            obj=''
            for info in range(len(image_objects)):
                # object_info是object的详细信息,数据类型为字典,包含category,objects
                object_info = image_objects[info]
                #object_category是object的category,字符串
                object_category = object_info['category']
                # object_bbox为字典类型,存放目标信息xmin,ymin,xmax,ymax
                object_bbox = object_info['bbox']
                #x_rang目标的x间的大小,xmax-xmin
                x_rang=object_bbox['xmax']-object_bbox['xmin']
                #目标的y间的大小,ymax-ymin
                y_rang=object_bbox['ymax']-object_bbox['ymin']
                #flag=0
                if x_rang <= 32 and y_rang <= 32:
                    if object_category == 'pne':
                        if flag_category == '':
                            flag_category = object_category
                        obj+=xml_obj.format(labels[0],str(object_bbox['xmin']),str(object_bbox['ymin']),
                                            str(object_bbox['xmax']),str(object_bbox['ymax']))
                        if image_path.find('train') != -1:
                            count_pne_trian+=1
                        count_pne += 1
                        count += 1
                    if object_category == 'p11':
                        if flag_category == '':
                            flag_category = object_category
                        obj += xml_obj.format(labels[1], str(object_bbox['xmin']),
                                              str(object_bbox['ymin']),
                                              str(object_bbox['xmax']), str(object_bbox['ymax']))
                        if image_path.find('train') != -1:
                            count_p11_trian+=1
                        count_p11 += 1
                        count += 1
                    if object_category == 'i5':
                        if flag_category == '':
                            flag_category = object_category
                        obj += xml_obj.format(labels[2], str(object_bbox['xmin']),
                                              str(object_bbox['ymin']),
                                              str(object_bbox['xmax']), str(object_bbox['ymax']))
                        if image_path.find('train') != -1:
                            count_i5_trian+=1
                        count_i5 += 1
                        count += 1
                    if object_category == 'w57':
                        if flag_category == '':
                            flag_category = object_category
                        obj += xml_obj.format(labels[3], str(object_bbox['xmin']),
                                              str(object_bbox['ymin']),
                                              str(object_bbox['xmax']), str(object_bbox['ymax']))
                        if image_path.find('train') != -1:
                            count_w57_trian+=1
                        count_w57 += 1
                        count += 1
                    print('x_rang:', x_rang)
                    print('y_range:', y_rang)
            #表示有合适类别的小目标的时候开始创建xml文件,存放在了test和train文件夹下面
            if flag_category!='' :
                if image_path.find('train') != -1:
                    if flag_category=='pne':
                        count_img_pne_train+=1
                        xml_name = os.path.join(xml_dir + 'trains/pne/', str(image_id) + '.xml')
                    if flag_category=='p11':
                        count_img_p11_train+=1
                        xml_name = os.path.join(xml_dir + 'trains/p11/', str(image_id) + '.xml')
                    if flag_category=='i5':
                        count_img_i5_train+=1
                        xml_name = os.path.join(xml_dir + 'trains/i5/', str(image_id) + '.xml')
                    if flag_category=='w57':
                        count_img_w57_train+=1
                        xml_name = os.path.join(xml_dir + 'trains/w57/', str(image_id) + '.xml')
                else :
                    if flag_category=='pne':
                        count_img_pne_test+=1
                        xml_name = os.path.join(xml_dir + 'tests/pne/', str(image_id) + '.xml')
                    if flag_category=='p11':
                        count_img_p11_test+=1
                        xml_name = os.path.join(xml_dir + 'tests/p11/', str(image_id) + '.xml')
                    if flag_category=='i5':
                        count_img_i5_test+=1
                        xml_name = os.path.join(xml_dir + 'tests/i5/', str(image_id) + '.xml')
                    if flag_category=='w57':
                        count_img_w57_test+=1
                        xml_name = os.path.join(xml_dir + 'tests/w57/', str(image_id) + '.xml')
                count_image+=1
                print("xml_name:"+xml_name)
                print("image_id:",image_id)
                #xml的头部信息传入参数值,文件名字和类别
                head=xml_head.format(str(xml_name),str(flag_category))
                #xml的尾部信息
                end=xml_end
                #向xml文件中写入内容
                with open(xml_name, 'w') as f:
                    f.write(head+obj+end)
    print('count:', count)

    print('count_pne:', count_pne)
    print('count_pne_trian:',count_pne_trian)
    print('count_pne_test:',count_pne - count_pne_trian)

    print('count_p11:', count_p11)
    print('count_p11_trian:', count_p11_trian)
    print('count_p11_test:', count_p11 - count_p11_trian)

    print('count_i5:', count_i5)
    print('count_i5_trian:', count_i5_trian)
    print('count_i5_test:', count_i5 - count_i5_trian)

    print('count_w57:', count_w57)
    print('count_w57_trian:', count_w57_trian)
    print('count_w57e_test:', count_w57 - count_w57_trian)

    print('count_img_pne_train:',count_img_pne_train)
    print('count_img_p11_train:',count_img_p11_train)
    print('count_img_i5_train:',count_img_i5_train)
    print('count_img_w57_train:',count_img_w57_train)

    print('count_img_pne_test:',count_img_pne_test)
    print('count_img_p11_test:',count_img_p11_test)
    print('count_img_i5_test:',count_img_i5_test)
    print('count_img_w57_test:',count_img_w57_test)
    print('count_image:', count_image)


count值:

 

 

<think>好的,用户想要下载适用于Python的特定版本3.4.1的opencv-python。我需要先确认如何通过pip安装指定版本的包。记得pip安装时可以用==指定版本号,比如pip install opencv-python==3.4.1.xx。但具体版本号可能存在,需要检查是否存在。 接下来,用户可能需要知道从哪里下载或者如何找到对应的版本。PyPI上的opencv-python包通常会有不同的版本,但有时候旧版本可能不在官方源里,这时候需要添加镜像源,比如清华的镜像,这样下载更快更可靠。例如用户提到的引用[1]中使用了清华的镜像源,可以建议用户使用-i参数指定镜像。 另外,用户可能遇到安装问题,比如版本兼容性或依赖问题。比如,Python版本是否支持3.4.1的opencv,可能需要确认Python的版本是否匹配。例如,如果用户用的是Python3.6,可能需要对应的whl文件,如引用[3]中的cp36-cp36m的whl文件。如果用户遇到导入错误,像引用[4]中的ImportError,可能需要检查安装是否正确或者环境变量设置。 还需要提醒用户,某些旧版本可能不支持contrib模块,如果需要的话,可能需要安装opencv-contrib-python的特定版本,如引用[2]提到的。但要注意,3.4.1版本的contrib可能存在,需要具体查看。 最后,用户可能需要确认安装后的验证步骤,比如运行import cv2并检查版本。如果有问题,可能需要通过whl文件直接安装,或者使用conda环境,如引用[4]提到的anaconda安装方法。 总结步骤应该是:使用pip安装指定版本,添加镜像源,处理可能的依赖问题,验证安装,以及备选方案如whl文件或conda安装。</think>要下载适用于Python的OpenCV-Python 3.4.1版本,可通过以下步骤实现: ### 方法1:直接通过pip指定版本安装 ```bash pip install opencv-python==3.4.1.15 -i https://pypi.tuna.tsinghua.edu.cn/simple/ ``` - **说明**:`3.4.1.15`是OpenCV-Python 3.4.1的完整版本号,`-i`参数使用清华镜像加速下载[^1] - **验证安装**:执行Python后输入`import cv2; print(cv2.__version__)`,应输出`3.4.1` ### 方法2:手动安装预编译的WHL文件 1. 下载对应Python版本和系统的WHL文件- 官方历史版本:https://pypi.org/project/opencv-python/3.4.1.15/#files - 例如Python3.6的Windows版:`opencv_python-3.4.1+contrib-cp36-cp36m-win_amd64.whl`[^3] 2. 执行本地安装: ```bash pip install opencv_python-3.4.1.15-cp37-cp37m-win_amd64.whl ``` ### 常见问题解决 1. **模块导入错误**:若出现`ImportError: No module named 'cv2'`,可尝试: - 检查Python环境路径是否包含OpenCV安装目录 - 通过Anaconda创建独立环境再安装[^4] 2. **版本冲突**:使用虚拟环境隔离依赖: ```bash python -m venv opencv_env source opencv_env/bin/activate # Linux/Mac opencv_env\Scripts\activate.bat # Windows ``` ### 备选方案 若需包含额外模块(如SIFT),可安装`opencv-contrib-python`的对应版本: ```bash pip install opencv-contrib-python==3.4.1.15 [^2] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值