セマンティック セグメンテーション データ セットを yolo 形式のデータ セットに変換する

序文

最近、リアルタイム計算を行っています。最初はセマンティックセグメンテーション unet を使用していましたが、サーバーレベルの GPU では推論が非常に遅いことがわかりましたが、精度は悪くありません。しかし、私たちが追求しているのはリアルタイム性能なので、私たちはまだターゲット検出を使用しています。最終的には yolov5 を選択しました


yolov5 データ セットについては誰もが知っているように、画像とテキストが必要な各アンカー ボックスを知る必要があります。図
ここに画像の説明を挿入します
#!/usr/bin/python

8 アノテーションに示すように、セマンティック セグメンテーション データ セットには json ファイルがあります。以下のフォルダーは、いくつかの json 形式ファイルが
json 形式でどのように見えるかを以下に示します。

ここに画像の説明を挿入します
カテゴリは 1 つだけです。ポイントは、元の画像にマークされている (labelme でマークされていない) いくつかのボックスの座標です。たとえば、私の土地にネズミの穴があり、それをマークする必要があるため、生成されます。 json形式のファイル

import argparse
import json
import os
import os.path as osp
import base64
import warnings
import PIL.Image
import yaml
from labelme import utils

def main():
	json_file = "D:/sd/裁切/8标注"

# freedom
list_path = os.listdir(json_file)
print('freedom =', json_file)
for i in range(0, len(list_path)):
    path = os.path.join(json_file, list_path[i])
    if os.path.isfile(path):

        data = json.load(open(path))
        img = utils.img_b64_to_arr(data['imageData'])
        lbl, lbl_names = utils.labelme_shapes_to_label(img.shape, data['shapes'])

        captions = ['%d: %s' % (l, name) for l, name in enumerate(lbl_names)]

        lbl_viz = utils.draw_label(lbl, img, captions)
        # out_dir = osp.basename(path).replace('.', '_')
        out_dir = osp.basename(path).split('.json')[0]
        save_file_name = out_dir
        # out_dir = osp.join(osp.dirname(path), out_dir)

        if not osp.exists(json_file + 'mask'):
            os.mkdir(json_file + 'mask')
        maskdir = json_file + 'mask'

        if not osp.exists(json_file + 'mask_viz'):
            os.mkdir(json_file + 'mask_viz')
        maskvizdir = json_file + 'mask_viz'

        out_dir1 = maskdir
        # if not osp.exists(out_dir1):
        #     os.mkdir(out_dir1)

        # PIL.Image.fromarray(img).save(out_dir1 + '\\' + save_file_name + '_img.png')
        PIL.Image.fromarray(lbl).save(out_dir1 + '/' + save_file_name + '.png')

        PIL.Image.fromarray(lbl_viz).save(maskvizdir + '/' + save_file_name +
                                          '_label_viz.png')


        with open(osp.join(out_dir1, 'label_names.txt'), 'w') as f:
            for lbl_name in lbl_names:
                f.write(lbl_name + '\n')

        warnings.warn('info.yaml is being replaced by label_names.txt')
        info = dict(label_names=lbl_names)
        with open(osp.join(out_dir1, 'info.yaml'), 'w') as f:
            yaml.safe_dump(info, f, default_flow_style=False)

        print('Saved to: %s' % out_dir1)
if __name__ == '__main__':
# base64path = argv[1]
	main()

変換結果:

画像に対応する txt ファイル (
ここに画像の説明を挿入します
100_0001_0007_1_4.jpg など) を生成しました。これは、上の図の txt に対応します。そのため、このアプローチでは、labelme を使用して 1 つずつラベルを付ける必要がなくなります (1 つずつラベルを付けると、非常に多くのオブジェクトを検出するには 1 年かかる) ため、この Python スクリプトは依然として非常に成功しています。
txt レンダリング:

カテゴリが 1 つしかないため、最初のものはカテゴリであり、次のものは各アンカー ボックスの値です。

皆さん、ありがとうございました

おすすめ

転載: blog.csdn.net/weixin_51038781/article/details/121938265