如何在 python 中将 CSV 表转换为 COCO 格式?

Posted

技术标签:

【中文标题】如何在 python 中将 CSV 表转换为 COCO 格式?【英文标题】:How to convert a CSV table into COCO format in python? 【发布时间】:2020-10-14 02:54:41 【问题描述】:

我有一个包含以下列的 CSV 表:

column_names = ['image_id', 'xmin', 'ymin', 'width', 'height', 'xmax','ymax']

其中 xmin、ymin、xmax 和 ymax 表示包围某个对象的边界框;宽度和高度,图像尺寸;和 image_id,文件名(.JPG 文件)。由于想做物体检测,所以需要把这张表转换成COCO格式。令人惊讶的是,我在互联网上找不到这个问题的任何答案。

【问题讨论】:

你有关于COCO格式的信息吗?我只找到了format-data,但我不知道它对你有什么用处。我还发现了Guide to making own dataset in COCO Format 我没有改变任何东西。只是可能使用列名而不是任意行 [2] 来填充类别函数中的名称。这将使代码对列的排列保持不变 【参考方案1】:

我之前也遇到过同样的问题,后来发现这段代码很有帮助 您需要将列名更改为此列并更新 csv 文件

column_names =['filename','class','width', 'height','xmin','ymin','xmax','ymax']

然后试试这段代码

import numpy as np
import json
import pandas as pd

path = 'annotations.csv' # the path to the CSV file
save_json_path = 'traincoco.json'


data = pd.read_csv(path)

images = []
categories = []
annotations = []

category = 
category["supercategory"] = 'none'
category["id"] = 0
category["name"] = 'None'
categories.append(category)

data['fileid'] = data['filename'].astype('category').cat.codes
data['categoryid']= pd.Categorical(data['class'],ordered= True).codes
data['categoryid'] = data['categoryid']+1
data['annid'] = data.index

def image(row):
    image = 
    image["height"] = row.height
    image["width"] = row.width
    image["id"] = row.fileid
    image["file_name"] = row.filename
    return image

def category(row):
    category = 
    category["supercategory"] = 'None'
    category["id"] = row.categoryid
    category["name"] = row[2]
    return category

def annotation(row):
    annotation = 
    area = (row.xmax -row.xmin)*(row.ymax - row.ymin)
    annotation["segmentation"] = []
    annotation["iscrowd"] = 0
    annotation["area"] = area
    annotation["image_id"] = row.fileid

    annotation["bbox"] = [row.xmin, row.ymin, row.xmax -row.xmin,row.ymax-row.ymin ]

    annotation["category_id"] = row.categoryid
    annotation["id"] = row.annid
    return annotation

for row in data.itertuples():
    annotations.append(annotation(row))

imagedf = data.drop_duplicates(subset=['fileid']).sort_values(by='fileid')
for row in imagedf.itertuples():
    images.append(image(row))

catdf = data.drop_duplicates(subset=['categoryid']).sort_values(by='categoryid')
for row in catdf.itertuples():
    categories.append(category(row))

data_coco = 
data_coco["images"] = images
data_coco["categories"] = categories
data_coco["annotations"] = annotations
json.dump(data_coco, open(save_json_path, "w"), indent=4)

【讨论】:

它是否适用于具有多个对象的图像? 为什么名字是None?

以上是关于如何在 python 中将 CSV 表转换为 COCO 格式?的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中将文本表转换为 CSV

如何在python中将json转换为csv?

如何在 Angular 中将 csv 或 excel 文件转换为 sql 输入数组?

如何在 Python 中将多个 .txt 文件转换为 .csv 文件

如何在同一个Excel工作簿中将两个不同的CSV文件转换为两个工作表?

如何在 Python 中将 Azure Blob 文件 CSV 转换为 Excel