現在yolo-v3への学習を行っており、新たなデータを得ました。
しかし、jsonデータを編集しなければならないことに気づきました。
JSON
1{ 2 "annotation": [ 3 { 4 "area": 16104, 5 "bbox": [ 6 7 202, 8 190, 9 132, 10 122 11 ], 12 "category_id": "3", 13 "id": 1, 14 "image_id": 1, 15 "iscrowd": 0, 16 "segmentation": [ 17 [ 18 202, 19 190, 20 202, 21 312, 22 334, 23 312, 24 334, 25 190 26 ] 27 ] 28 }, 29 { 30 "area": 6776, 31 "bbox": [ 32 405, 33 193, 34 88, 35 77 36 ], 37 "category_id": "3", 38 "id": 2, 39 "image_id": 1, 40 "iscrowd": 0, 41 "segmentation": [ 42 [ 43 405, 44 193, 45 405, 46 270, 47 493, 48 270, 49 493, 50 193 51 ] 52 ] 53 }, 54 { 55 "area": 1344, 56 "bbox": [ 57 80, 58 220, 59 48, 60 28 61 ], 62 "category_id": "3", 63 "id": 3, 64 "image_id": 1, 65 "iscrowd": 0, 66 "segmentation": [ 67 [ 68 80, 69 220, 70 80, 71 248, 72 128, 73 248, 74 128, 75 220 76 ] 77 ] 78 }, 79 { 80 "area": 952, 81 "bbox": [ 82 129, 83 219, 84 28, 85 34 86 ], 87 "category_id": "3", 88 "id": 4, 89 "image_id": 1, 90 "iscrowd": 0, 91 "segmentation": [ 92 [ 93 129, 94 219, 95 129, 96 253, 97 157, 98 253, 99 157, 100 219 101 ] 102 ] 103 } 104 ], 105 "image": { 106 "file_name": "FLIR_00001", 107 "height": 512, 108 "id": 1, 109 "width": 640 110 } 111}
上記のJSONをデータを、
jsonファイルと一致した画像のファイルパス bboxの座標category_id bboxの座標category_id bboxの座標category_id
上記のjsonデータの例(4つのバウンディングボックスがあるから4つ必要)
path/img1.jpg 202,190,132,122,3 405,193,88,77,3 80,220,48,28,3 129,219,28,34,3
と言う様にしたいです。
色々コードを調べながらやろうとするのですがうまくいきません。
python
1mport json 2import os 3import glob 4import random 5from natsort import natsorted 6 7 8def convert_vott_to_kerasyolo3txt(image_dir, train_txt_save_path, classes_txt_save_path): 9 10 path = './FLIR_ADAS/training/Annotations/*.json' 11 12 l = glob.glob(path) 13 random.shuffle(l) 14 15 for files in natsorted(l): 16 17 row_list = [] 18 19 with open(files) as f: 20 dic = json.load(f) 21 tag_set = set() 22 23 visited_frames = dic['annotation'] 24 visited_frames = visited_frames.keys() 25 26 frames = 'annotation'[1] 27 # frame_keys = frames.keys() 28 29 for visited in visited_frames: 30 # if visited in frame_keys: # framesに存在するkeyのみ 31 if visited in frames: 32 img_annotation_list = frames[visited] 33 for item in img_annotation_list: 34 tags = item['category_id'] 35 for t in tags: 36 tag_set.add(t) 37 38 tag_dic = {} 39 tag_list = list(tag_set) 40 tag_list.sort() 41 for i, tag in enumerate(tag_list): 42 tag_dic[tag] = i 43 44 for visited in visited_frames: 45 if visited in frame_keys: # framesに存在するkeyのみ 46 img_annotation_list = frames[visited] 47 48 row_text = os.path.join(image_dir, visited) 49 50 for item in img_annotation_list: 51 box = item['bbox'] 52 tags = item['category_id'] 53 54 for tag in tags: 55 row_text = row_text + ' {},{},{},{},{}'.format(int(box['x1']),int(box['y1']),int(box['x2']),int(box['y2']), int(tag_dic[tag])) 56 57 if len(img_annotation_list) != 0: 58 row_list.append(row_text) 59 60 train_txt = '\n'.join(row_list) 61 62 print(train_txt) 63 64 f = open(train_txt_save_path, 'w') 65 f.write(train_txt) 66 f.close() 67 68 classes_txt = '\n'.join(tag_list) 69 70 f = open(classes_txt_save_path, 'w') 71 f.write(classes_txt) 72 f.close() 73 74 75def _main(): 76 # json_path = './FLIR_ADAS/training/Annotations' # VoTTのアノテーション情報が記録されたjsonファイルのパス 77 image_dir = ',/FLIR_ADAS/training/PreviewData' # 画像が保存されたディレクトリのパス 78 train_txt_save_path = 'my_train.txt' # keras-yolo3で学習に使うアノテーション用のテキストファイルの保存先のパス 79 classes_txt_save_path = 'model_data/my_classes.txt' # keras-yolo3で学習に使うラベル用のテキストファイルの保存先のパス 80 81 convert_vott_to_kerasyolo3txt( 82 image_dir=image_dir, 83 train_txt_save_path=train_txt_save_path, 84 classes_txt_save_path=classes_txt_save_path 85 ) 86 87if __name__ == '__main__': 88 _main()
上記のコードは、全然ダメです。
もし宜しければ、回答よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー