{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        #print(os.path.join(dirname, filename))\n        pass\n\n#create dir annotation\n#！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！\npath = '/kaggle/working/annotation'\nos.makedirs(path) \n    \n# You can write up to 5GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import csv\nimport os, ast\nfrom xml.dom import minidom","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 文件路径\nxml_dir = '/kaggle/working/annotation'\ncsv_filename = os.path.join('/kaggle/input/global-wheat-detection/', 'train.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 逐行读取csv文件\ndef create_xml(filename, bboxs):\n    width = 1024\n    height = 1024\n    depth = 3\n    # 1.创建DOM树对象\n    dom = minidom.Document()\n    # 2.创建根节点。每次都要用DOM对象来创建任何节点。\n    root_node = dom.createElement('annotation')\n    # 3.用DOM对象添加根节点\n    dom.appendChild(root_node)\n\n    filename_node = dom.createElement('filename')\n    root_node.appendChild(filename_node)\n    # 也用DOM创建文本节点，把文本节点（文字内容）看成子节点\n    name_text = dom.createTextNode(filename)\n    # 用添加了文本的节点对象（看成文本节点的父节点）添加文本节点\n    filename_node.appendChild(name_text)\n\n    # size\n    size_node = dom.createElement('size')\n    root_node.appendChild(size_node)\n    width_node = dom.createElement('width')\n    height_node = dom.createElement('height')\n    depth_node = dom.createElement('depth')\n    # width\n    size_node.appendChild(width_node)\n    width_text = dom.createTextNode(str(width))\n    width_node.appendChild(width_text)\n    # height\n    size_node.appendChild(height_node)\n    height_text = dom.createTextNode(str(height))\n    height_node.appendChild(height_text)\n    # depth\n    size_node.appendChild(depth_node)\n    depth_text = dom.createTextNode(str(depth))\n    depth_node.appendChild(depth_text)\n\n    for bbox in bboxs:\n        # 创建obejct\n        object_node = dom.createElement('object')\n        root_node.appendChild(object_node)\n        # 创建类别name\n        name_node = dom.createElement('name')\n        name_text = dom.createTextNode('Wheat')\n        name_node.appendChild(name_text)\n        object_node.appendChild(name_node)\n        # 创建bndbox\n        # bbox [xmin, ymin, width, height]\n        bbox = ast.literal_eval(bbox)\n        xmin, ymin = bbox[0], bbox[1]\n        xmax, ymax = xmin + bbox[2], ymin + bbox[3]\n\n        bndbox = dom.createElement('bndbox')\n        object_node.appendChild(bndbox)\n        # xmin\n        xmin_node = dom.createElement('xmin')\n        xmin_text = dom.createTextNode(str(xmin))\n        xmin_node.appendChild(xmin_text)\n        bndbox.appendChild(xmin_node)\n        # ymin\n        ymin_node = dom.createElement('ymin')\n        ymin_text = dom.createTextNode(str(ymin))\n        ymin_node.appendChild(ymin_text)\n        bndbox.appendChild(ymin_node)\n        # xmax\n        xmax_node = dom.createElement('xmax')\n        xmax_text = dom.createTextNode(str(xmax))\n        xmax_node.appendChild(xmax_text)\n        bndbox.appendChild(xmax_node)\n        # ymax\n        ymax_node = dom.createElement('ymax')\n        ymax_text = dom.createTextNode(str(ymax))\n        ymax_node.appendChild(ymax_text)\n        bndbox.appendChild(ymax_node)\n\n    # 每一个结点对象（包括dom对象本身）都有输出XML内容的方法，如：toxml()--字符串, toprettyxml()--美化树形格式。\n    try:\n        with open(os.path.join(xml_dir, filename) + '.xml', 'w', encoding='UTF-8') as fh:\n            # 4.writexml()第一个参数是目标文件对象，第二个参数是根节点的缩进格式，第三个参数是其他子节点的缩进格式，\n            # 第四个参数制定了换行格式，第五个参数制定了xml内容的编码。\n            dom.writexml(fh, indent='', addindent='\\t', newl='\\n', encoding='UTF-8')\n            #print('写入xml OK!')\n    except Exception as err:\n        print('错误信息：{0}'.format(err))\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def main():\n    with open(csv_filename, 'r', encoding=\"utf-8\") as csvfile:\n        reader = csv.DictReader(csvfile)\n        # 自动获取第一张照片的文件名，并设置为last_image\n        last_image = 'b6ab77fd7'\n        img_num = 1\n        bboxs = []\n        for row in reader:\n            if row['image_id'] == last_image:\n                # 叠加bbox [xmin, ymin, width, height]\n                bboxs.append(row['bbox'])\n            elif row['image_id'] != last_image:\n                # 创建xml文件\n                create_xml(last_image, bboxs)\n                last_image = row['image_id']\n                img_num += 1\n                # 重置bbox\n                bboxs.clear()\n                bboxs.append(row['bbox'])\n        print(img_num)\n        print('写入xml OK!')\n\n         ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"if __name__ == '__main__':\n    main()\n    #E there will be a bug here, the last CSV image data cannot be converted, but the impact is not big.","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}