File size: 5,379 Bytes
4f3f330 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 | from glob import glob
import pandas as pd
import json
import os
def jsons_to_dataframe(json_dir):
# Initialize lists to store data
filename_list = []
image_id_list = []
width_list = []
height_list = []
category_name_list = []
bbox_list = []
# Iterate over each JSON file in the directory
for filename in os.listdir(json_dir):
if filename.endswith('.json'):
image_filename = filename.split('/')[-1].replace('.json', '.png')
image_id = int(filename.split('/')[-1].split('.')[0])
json_file = os.path.join(json_dir, filename)
# Load JSON data from file
with open(json_file, 'r') as f:
data = json.load(f)
# Extract relevant data from JSON
filename_value = image_filename#data['filename']
width_value = int(data['size']['width'])
height_value = int(data['size']['height'])
# Process each object in the JSON data
for obj in data['object']:
category_name = obj['name']
xmin = obj['bndbox']['xmin']
ymin = obj['bndbox']['ymin']
xmax = obj['bndbox']['xmax']
ymax = obj['bndbox']['ymax']
# Calculate width and height of the bbox
bbox_width = xmax - xmin
bbox_height = ymax - ymin
# Create bbox dictionary
bbox_dict = {
"xmin": xmin,
"ymin": ymin,
"width": bbox_width,
"height": bbox_height
}
# Append data to lists
filename_list.append(filename_value)
image_id_list.append(image_id)
width_list.append(width_value)
height_list.append(height_value)
category_name_list.append(category_name)
bbox_list.append(bbox_dict)
# Create DataFrame
df = pd.DataFrame({
'filename': filename_list,
'image_id': image_id_list,
'width': width_list,
'height': height_list,
'category_name': category_name_list,
'bbox': bbox_list
})
return df
# Example usage:
json_directory = '/content/final/train/annots/' # Replace with the directory containing your JSON files
df = jsons_to_dataframe(json_directory)
import pandas as pd
import json
# Example DataFrame
# Assuming df is your pandas DataFrame containing the annotations
# For demonstration, let's assume df is structured as per the provided example
# Define categories in the same order as provided
categories = [
{'id': 1, 'name': 'Active_IC'},
{'id': 2, 'name': 'capacitor'},
{'id': 3, 'name': 'connectors'},
{'id': 4, 'name': 'crystal'},
{'id': 5, 'name': 'diode'},
{'id': 6, 'name': 'fuse'},
{'id': 7, 'name': 'gnd'},
{'id': 8, 'name': 'headers'},
{'id': 9, 'name': 'inductor'},
{'id': 10, 'name': 'led'},
{'id': 11, 'name': 'nmos'},
{'id': 12, 'name': 'npn'},
{'id': 13, 'name': 'pmos'},
{'id': 14, 'name': 'pnp'},
{'id': 15, 'name': 'pwr'},
{'id': 16, 'name': 'pwr_connector'},
{'id': 17, 'name': 'resistor'},
{'id': 18, 'name': 'switch'}
]
def dataframe_to_coco_format(df):
# Initialize COCO format dictionary
coco_format = {
"info": {
"description": "COCO format dataset",
"version": "1.0",
"year": 2024,
"contributor": "Anonymous",
"date_created": "2024/06/30"
},
"licenses": [],
"categories": categories,
"images": [],
"annotations": []
}
# Track image IDs to ensure uniqueness
image_id_map = {}
# Iterate over DataFrame rows
for idx, row in df.iterrows():
image_id = row['image_id']
filename = row['filename']
width = row['width']
height = row['height']
category_name = row['category_name']
bbox = row['bbox']
# Add image information if not already added
if image_id not in image_id_map:
image_id_map[image_id] = len(coco_format['images']) + 1 # COCO image ID starts from 1
coco_format['images'].append({
'id': image_id_map[image_id],
'file_name': filename,
'width': width,
'height': height
})
# Find category ID
category_id = [cat['id'] for cat in categories if cat['name'] == category_name][0]
# Add annotation information
coco_format['annotations'].append({
'id': len(coco_format['annotations']) + 1, # COCO annotation ID starts from 1
'image_id': image_id_map[image_id],
'category_id': category_id,
'bbox': [bbox['xmin'], bbox['ymin'], bbox['width'], bbox['height']],
'area': bbox['width'] * bbox['height'],
'iscrowd': 0 # Assuming no crowds in the dataset
})
return coco_format
# Example usage:
# Assuming `df` is your pandas DataFrame obtained from `jsons_to_dataframe` function
# Convert DataFrame to COCO format
coco_data = dataframe_to_coco_format(df)
# Save COCO format JSON to a file
output_json_file = 'coco_format.json'
with open(output_json_file, 'w') as f:
json.dump(coco_data, f)
|