セマンティックセグメンテーションにおける単一カテゴリおよび複数カテゴリの画像データのラベル付け、およびグレーレベルのカテゴリ変換

いいでしょう、上のコードファーマーズバックガーデン」をクリックしてスター」 パブリックアカウントを選択してください

  注目の記事、すぐに配信

前号では、セマンティックセグメンテーションモデルの基本構造と一般的に使用されるデータセットについて説明しました。この号では、セマンティックセグメンテーションデータセットの作成について説明します。

全体的な製造ステップ:

 

1. labelmeを使用して画像データに注釈を付け、画像に対応するx.jsonファイルを生成します。

2. labelmeの下にある組み込み関数labelme_json_to_datasetを実行し、画像に対応するx_jsonファイル手動で生成します(またはコードを使用して一度に処理および生成します)。

3. 2番目のステップで生成されたフォルダー内のファイルを処理して、セマンティックイメージlabel.pngを生成します。

4.セマンティックイメージをカテゴリグレースケールイメージ(最終的なトレーニングラベルファイル)に変換します。

1.ファイルディレクトリ構造:

2.正式に生産を開始

最初のステップ:マーキングソフトウェアのインストール

1.アナコンダプロンプトで環境を作成します

conda create --name = labelImg python = 3.6

2.アクティブにして、確立したばかりの新しい環境に入ります。

condaはlabelImgをアクティブにします

3.インストールインターフェイスはpyqt5パッケージをサポートします

pip install pyqt5 -i https://pypi.douban.com/simple/

4.labelmeをダウンロードしてインストールします

pip install labelme -i https://pypi.douban.com/simple/

5.コマンドlabelmeを入力して、データラベル付けのプログラムを開始します

ステップ2:注釈を付ける

A.単一カテゴリのラベル付け-つまり、各画像には1つのターゲットしかありません

[1]コマンドラインにコマンドlabelmeを入力し、ラベリングインターフェイスを開いてから、ラベリングする画像が配置されているフォルダを開いてラベリングします。

Opendir“” Test_Image“”->ポリゴンの作成->保存->次の画像

[2]すべての画像にマークが付けられると、マークされたファイルはx.jsonファイルとして保存され、作成が完了した後、ディレクトリのbeforeフォルダーに配置されます。

VS2017を使用して、マークした領域の各ピクセルの情報を含むJsonファイルのコンテンツを表示します

[3] labelme独自の関数labelme_json_to_datasetを使用して、各jsonファイル形式をセマンティックイメージデータに手動で変換します。

1. jsonファイルが配置されている場所にcdします。cmdD:Test_Image

2.現在のlabelmeがインストールされている環境のラベルを表示し、アクティブ化します

3. labelme_json_to_datasetを使用して、各画像の注釈ファイルx.json形式を順番に手動で処理し、各画像部分カテゴリラベルの対応するセマンティック画像であるx_jsonファイルを生成します(このプロセスでは、xを手動で修正する必要があります。処理する.jsonファイル、それはより面倒です、あなたは直接変換するコードを書くことができます)

コマンド:labelme_json_to_data [x.json]-> labelmeによって生成されたjsonファイル名

以下に示すように、各画像のx.jsonファイルに対応する部分的なカテゴリラベルが各x_jsonファイルに保存されます。

各画像x_jsonファイルのローカルカテゴリタグコンテンツのコンテンツ:

注釈:

img.png:トレーニング中に使用する必要がある対応する部分的な元のjpgファイル

label.png:トレーニング中に使用するセマンティックイメージに注釈を付けます

label_names.txt:この画像のターゲットカテゴリ名

label_viz.png:ラベルの視覚化。ラベルが正しいかどうかを確認するために使用されます

1回限りのコード変換:json_to_dataset.py

上記の次のx_jsonファイルと同じファイルコンテンツを生成します

import argparseimport jsonimport osimport os.path as ospimport warnings
import PIL.Imageimport yaml
from labelme import utilsimport base64
def main():    count = os.listdir("./before/") for i in range(0, len(count)):        path = os.path.join("./before", count[i])
# 找到before文件中以json为结尾的文件并且打开if os.path.isfile(path) and path.endswith('json'):            data = json.load(open(path))
if data['imageData']:                imageData = data['imageData']else:                imagePath = os.path.join(os.path.dirname(path), data['imagePath'])with open(imagePath, 'rb') as f:                    imageData = f.read()                    imageData = base64.b64encode(imageData).decode('utf-8')            img = utils.img_b64_to_arr(imageData)            label_name_to_value = {'_background_': 0}for shape in data['shapes']:                label_name = shape['label']if label_name in label_name_to_value:                    label_value = label_name_to_value[label_name]else:                    label_value = len(label_name_to_value)                    label_name_to_value[label_name] = label_value
# label_values must be dense            label_values, label_names = [], []for ln, lv in sorted(label_name_to_value.items(), key=lambda x: x[1]):                label_values.append(lv)                label_names.append(ln)assert label_values == list(range(len(label_values)))
            lbl = utils.shapes_to_label(img.shape, data['shapes'], label_name_to_value)
            captions = ['{}: {}'.format(lv, ln)for ln, lv in label_name_to_value.items()]            lbl_viz = utils.draw_label(lbl, img, captions)            out_dir = osp.basename(count[i]).replace('.', '_')            out_dir = osp.join(osp.dirname(count[i]), out_dir)            out_dir = osp.join("output",out_dir)
if not osp.exists(out_dir):                os.mkdir(out_dir)
            PIL.Image.fromarray(img).save(osp.join(out_dir, 'img.png'))
            utils.lblsave(osp.join(out_dir, 'label.png'), lbl)            PIL.Image.fromarray(lbl_viz).save(osp.join(out_dir, 'label_viz.png'))
with open(osp.join(out_dir, 'label_names.txt'), 'w') as f:for lbl_name in label_names:                    f.write(lbl_name + '\n')
            warnings.warn('info.yaml is being replaced by label_names.txt')            info = dict(label_names=label_names)with open(osp.join(out_dir, 'info.yaml'), 'w') as f:                yaml.safe_dump(info, f, default_flow_style=False)
            print('Saved to: %s' % out_dir)
if __name__ == '__main__':    main()

各画像に対応するローカルセマンティックカテゴリラベルを取得した後(各画像について、グレースケールカテゴリが変換された後、それは猫などのマーキングターゲットに属し、領域内のピクセルの値は1であり、マーキングターゲットの画像ではありませんエリア(背景)のピクセル値は0です)。

新しい画像がデータセットに追加された場合、この画像には対象の犬が1人しかいません。対象の犬のカテゴリをトレーニングセットに追加するには、犬のローカルカテゴリラベルをグローバルカテゴリラベルに変換する必要があります。つまり、トレーニング中に背景が表示されます。ピクセル値は0、猫のピクセル値は1、犬のピクセル値は2など)

[4]ローカルカテゴリラベル->グローバルカテゴリラベル(カテゴリグレースケール変換)

各画像に対応する取得したローカルトレーニングラベルファイルlabel.pngをグローバルトレーニングラベルファイルに変換し、pngフォルダに配置します。このプロセスには、カテゴリグレースケール操作も含まれます。

get_jpg_and_png.py操作を実行して、各画像のグローバルカテゴリラベルファイルとカテゴリグレースケール変換を取得します。つまり、画像の背景ピクセルの値は0です。ターゲットが猫の場合、ピクセル値は1です。ターゲットが犬の場合、そのピクセル値は2です。

ここでの最終的なグローバルトレーニングラベルは、単一チャネルのグレースケール画像です。ピクセル値の範囲は0〜255です。ここでは、ピクセル値が1と2であるため、すべて黒です。グレースケール画像では、値は比較的小さくなっています。 、差が比較的小さいため、ディスプレイはすべて黒になります。

カテゴリグレースケール画像:

猫の写真に対応するカテゴリグレースケール画像が配置されている領域のピクセルの値はすべて1であるのに対し、背景に対応するピクセルの値はすべて0であることがわかります

1. ここでは、最初にグローバルクラス名を含む新しいclass_name.txtを作成する必要があります

2. class_name.txtファイルを使用して、イメージのローカルカテゴリラベルファイルをグローバルカテゴリラベルファイルに変換します。変換コードは次のとおりです。get_jpg_and_png.py

import os
from PIL import Image
import numpy as np
def main():
    # 读取原文件夹
    count = os.listdir("./before/") 
    for i in range(0, len(count)):
        # 如果里的文件以jpg结尾
        # 则寻找它对应的png
        if count[i].endswith("jpg"):
            path = os.path.join("./before", count[i])
            img = Image.open(path)
            img.save(os.path.join("./jpg", count[i]))


            # 找到对应的png
            path = "./output/" + count[i].split(".")[0] + "_json/label.png"
            img = Image.open(path)


            # 找到全局的类
            class_txt = open("./before/class_name.txt","r")
            class_name = class_txt.read().splitlines()
            # ["bk","cat","dog"] 全局的类
            # 打开x_json文件里面存在的类,称其为局部类
            with open("./output/" + count[i].split(".")[0] + "_json/label_names.txt","r") as f:
                names = f.read().splitlines()
                # ["bk","dog"] 局部的类
                # 新建一张空白图片
                new = Image.new("RGB",[np.shape(img)[1],np.shape(img)[0]])


                # 找到局部的类在全局中的类的序号
                for name in names:
                    # index_json是x_json文件里存在的类label_names.txt,局部类
                    index_json = names.index(name)
                    # index_all是全局的类,
                    index_all = class_name.index(name)


                    # 将局部类转换成为全局类
                    # 将原图img中像素点的值为index_json的像素点乘以其在全局中的像素点的所对应的类的序号 得到 其实际在数据集中像素点的值
                    # 比如dog,在局部类(output/x_json/label_names)中它的序号为1,dog在原图中的像素点的值也为1.
                    # 但是在全局的类(before/classes.txt)中其对应的序号为2,所以在新的图片中要将局部类的像素点的值*全局类的序号,从而得到标签文件
                    new = new + np.expand_dims(index_all*(np.array(img) == index_json),-1)


            new = Image.fromarray(np.uint8(new))
            # 将转变后的得到的新的最终的标签图片保存到make_dataset/png文件夹下
            new.save(os.path.join("./png", count[i].replace("jpg","png")))
            # 找到新的标签文件中像素点值的最大值和最小值,最大值为像素点对应的类在class_name.txt中的序号,最小值为背景,即0
            print(np.max(new),np.min(new))




if __name__ == '__main__':
    main()

3.最後に、我々はそのtrain_data.txtで、データセットとオリジナルラベルの間に1対1の対応に上記のjpg下で得られた文書やPNGファイルのget_train_txt.py内容を使用します

[5]最終トレーニングモデルデータセットのスタイル:jpgフォルダー(元の画像)+ pngフォルダー(グローバルグレースケールカテゴリラベル)+ train_data.txt(元の画像とラベルの対応)、トレーニングするモデルに配置します次号では、MobileNetに基づくSegNetのセマンティックセグメンテーションモデルについて説明します。

B.マルチカテゴリアノテーション-つまり、画像に複数のターゲットがあります

マーキングプロセスは上記と同様です。画像上の複数のターゲットが順番にマーキングされ、生成されたx_jsonファイルの内容は単一のターゲットマーキングと同じです。

グローバルクラス名を含む新しいclass_name.txtを作成し、カテゴリのグレースケールを変換し、get_jpg_and_png.py使用して変換します。猫に対応する領域のピクセル値は、カテゴリ1に対応する1であり、犬の対応する領域のピクセルにも同じことが当てはまります。ポイントの値は2で、カテゴリ2に対応し、背景領域のピクセルの値は0です。

クラスグレー変換後、モデルをトレーニングできます。

最終的なトレーニングモデルデータセットのスタイル:jpgフォルダー(元の画像)+ pngフォルダー(グローバルグレースケールカテゴリラベル)+ train_data.txt(元の画像とラベルの対応)、トレーニングするモデルに入れて、次の問題MobileNetに基づくSegNetのセマンティックセグメンテーションモデルについて説明します。

了解しました。データのラベル付けの部分はここにあります。すべての処理ファイルコード、返信キーワード:プロジェクトの実際の戦闘、あなたはそれを得ることができます。

素晴らしいお勧め:

新しいチュートリアル画像セグメンテーションシリーズ

画像セグメンテーションシリーズ<->セマンティックセグメンテーション

もっとプレミアムコンテンツ?あなたが見るのを待っています

おすすめ

転載: blog.csdn.net/weixin_45192980/article/details/109685569