ビデオ ラベラー入門
ビデオ ラベラー アプリには、ビデオやイメージ シーケンス内で、軸方向に整列したまたは回転した四角形関心領域 (ROI) ラベル、ポリライン ROI ラベル、ピクセル ROI ラベル、シーン ラベルを簡単にマークできる方法が用意されています。
ラベル付けされたデータを使用して、イメージ分類器、オブジェクト検出器、セマンティック セグメンテーション ネットワーク、およびインスタンス セグメンテーション ネットワークなどのアルゴリズムの検証や学習ができます。ROI ラベルを作成するためにラベル付け描画ツールを選択する際には、用途を考慮します。用途に適したラベル タイプと描画ツールを選択する方法の詳細については、ROI ラベル、サブラベル、属性を参照してください。
この例では、以下の方法を示して、アプリの使用方法を紹介します。
ビデオのイメージ フレームに手動でラベルを付ける。
オートメーション アルゴリズムを使用して、イメージ フレーム全体に自動的にラベルを付ける。
ラベル付きのグラウンド トゥルース データをエクスポートする。
ROI とシーン ラベルの定義
"ROI ラベル" は、軸方向に整列したまたは回転した四角形、ポリライン、ピクセル、多角形のいずれかの関心領域に対応します。これらのラベルには "cars" などのラベル名と作成した領域などの 2 つのコンポーネントが含まれます。
"シーン ラベル" は、"sunny" などのシーンの性質を表します。このラベルはフレームに関連付けることができます。
ラベル付けされていないデータの読み込み
プログラムでアプリを開き、ビデオを読み込みます。ビデオは VideoReader
で読み取り可能なファイル形式でなければなりません。
videoLabeler('visiontraffic.avi')
ビデオを調査します。再生ボタン をクリックしてビデオ全体を再生するか、スライダー
を使用してフレーム間を移動します。
対応するタイムスタンプをもつイメージ シーケンスを読み込むには、[インポート] 、 [イメージのシーケンス] を選択します。アプリは、imread
でサポートされるすべてのイメージ ファイル形式をサポートしています。追加のファイル形式を読み取るために、imageDatastore
を作成して ReadFcn
プロパティを使用できます。
VideoReader
または imread
で読み取れないカスタム データ ソースを読み込むには、ラベル付けでのカスタム イメージ ソース リーダーの使用を参照してください。
ラベル定義の作成
描画するラベルを定義します。この例では、アプリ内でラベルを直接定義します。代わりに MATLAB® コマンド ラインからラベルを描画するには、labelDefinitionCreator
を使用します。
時間間隔の設定
ビデオ全体にラベルを付けることや、ビデオの一部から開始することができます。この例では、読み込んだビデオ内に 5 秒の時間範囲でラベルを付けます。ビデオの下のテキスト ボックスに、次の時間を秒単位で入力します。
[現在時間] ボックスに
5
と入力し、Enter キーを押します。[開始時間] ボックスに
5
と入力してスライダーを時間範囲の開始位置に配置します。[終了時間] ボックスに
10
と入力します。
オプションとして、時間範囲に調整を加えるには、赤色の間隔フラグをクリックしてドラッグします。
これで、アプリ全体がこの特定の時間範囲に焦点を当てるように設定できました。ビデオはこの間隔内のみ再生され、この間隔のみにラベル付けとオートメーション アルゴリズムが適用されます。間隔は、フラグを移動することでいつでも変更できます。
時間範囲が再生セクション全体に広がるように拡張するには、[時間区間へのズームイン] をクリックします。
ROI ラベルの作成
"ROI ラベル" は、イメージの関心領域 (ROI) に対応するラベルです。以下の ROI ラベル タイプを定義できます。
Rectangle
— 車両、ボート、建物など、イメージ内のオブジェクトの周りに 2 次元の四角形境界ボックス ラベルを描画します。Rotated Rectangle
— 車両、ボート、建物など、イメージ内のオブジェクトの周りに、回転した四角形の 2 次元境界ボックス ラベルを描画します。Projected cuboid
— 車両、ボート、建物など、イメージ内のオブジェクトの周りに 3 次元の境界ボックス ラベルを描画します。Line
— 車線境界線などのラインにラベルを付けるためにライン ROI を描画します。Pixel label
— セマンティック セグメンテーション用に、道路や空などのさまざまなクラスにラベルを付けるため、ピクセルを描画します。ピクセルのラベル付けの詳細については、セマンティック セグメンテーションのピクセルのラベル付けを参照してください。Polygon
— オブジェクトの周りに多角形ラベルを描画します。同じクラスの個別のインスタンスにラベルを付けることができます。インスタンス セグメンテーション ネットワークおよびセマンティック セグメンテーション ネットワーク用に多角形 ROI ラベルを描画する方法の詳細については、Label Objects Using Polygonsを参照してください。
これらの ROI ラベルの定義の詳細については、ROI ラベル、サブラベル、属性を参照してください。
この例では、車両の種類をラベル付けするための vehicle
グループを定義してから、Car
および Truck
の 2 つの [四角形]
ROI ラベルを作成します。ラベルを作成したら、[ROI ラベルの表示] ドロップダウン メニューを使用し、[ポイント時]、[常時] または [なし] を選択することで、ラベル付け中に ROI ラベル名をどう表示するかを制御できます。既定では、ROI をポイントしたときに名前が表示されます。
左側の [ROI ラベル] ペインで [ラベル] をクリックします。
Car
という名前の[四角形]
のラベルを作成します。オプションで、プレビューの色をクリックすることで、ラベルの色を変えられます。
[グループ]
ドロップダウン メニューから、[新規グループ]
を選択し、グループにVehicle
という名前を付けます。[OK] をクリックします。
[Vehicle] のグループ名は、作成されたラベル [Car] と共に [ROI ラベル] ペインに表示されます。リストのラベルを左クリックして上下にドラッグすると、リスト内の別の位置またはグループに移動できます。
2 つ目のラベルを追加するために、[ラベル] をクリックします。ラベルに Truck という名前を付け、[Vehicle] グループが選択されていることを確認します。[OK] をクリックします。
2 台の車両の周りに、マウスを使って四角形の [Car] ROI を描画します。
サブラベルの作成
"サブラベル" は、親 ROI ラベルに対応する ROI ラベルのタイプです。各サブラベルは、[ROI ラベル] ペインで定義された特定のラベルに属している (特定のラベルの子である) 必要があります。たとえば、運転シーンの場合、vehicle ラベルにヘッドライト、ナンバー プレート、ホイールなどのサブラベルがある可能性があります。サブラベルの詳細については、ROI ラベル、サブラベル、属性を参照してください。
ヘッドライトのサブラベルを定義します。
左側の [ROI ラベル] ペインで [Car] ラベルをクリックします。
[サブラベル] をクリックします。
headlight
という名前の[四角形]
のサブラベルを作成し、必要に応じて説明を記述します。[OK] をクリックします。[ROI ラベル] ペインに [headlight] サブラベルが表示されます。サブラベルは、選択した ROI ラベル [Car] の下に入れ子にされており、親ラベルと同じ色が付けられています。
ラベルに複数のサブラベルを追加できます。サブラベルをドラッグ アンド ドロップし、リスト内で並べ替えることもできます。さらに編集を行うにはラベルを右クリックします。
[ROI ラベル] ペインで [headlight] サブラベルを選択します。
イメージ フレームで、[Car] ラベルを選択します。選択するとラベルは黄色に変化します。[Car] ラベル (親 ROI) を選択してからサブラベルを追加しなければなりません。
それぞれの乗用車の [headlight] のサブラベルを描画します。
前の手順を繰り返して、別の乗用車のヘッドライトにラベルを付けます。ラベルをより正確に描画するには、ラベル付けウィンドウの右上隅にあるパンやズームのオプションを使用します。
サブラベルは四角形 ROI ラベルまたはポリライン ROI ラベルと一緒にしか使用できません。また、サブラベルが独自のサブラベルを持つことはできません。サブラベルの使用の詳細については、サブラベルと属性を使用したグラウンド トゥルース データへのラベル付けを参照してください。
ラベルとサブラベルの表示/非表示
[ROI ラベル] ペインの アイコンを使用して、ラベル付きビデオのラベルまたはサブラベルを表示したり非表示にしたりできます。
は、ラベルまたはサブラベルを定義した後にのみ表示されます。既定では、アプリはすべてのラベルとサブラベルを表示します。
ラベルまたはサブラベルを非表示にするには、ラベルまたはサブラベル名の横にある アイコンをクリックします。アプリは、対応するラベルまたはサブラベルを非表示にし、
アイコンを表示します。
| |
属性の作成
"ROI 属性" では、ROI ラベルまたはサブラベルに関する追加情報を指定します。たとえば、運転シーンの場合、属性は車両のタイプや色を含む場合があります。海洋のシーンでは、ヨットのタイプや帆の数などが属性に含まれます。これらのタイプの ROI 属性を定義できます。
Numeric Value
— ラベル付けされた車両のドアの数やヨットの帆の数など、数値スカラーの属性を指定します。String
— 車両やボートの色など、string スカラーの属性を指定します。Logical
— 車両が動いているか、ボートが帆走しているかなど、logical の true または false の属性を指定します。List
— 車両やボートのメーカーやモデルなど、事前定義された文字列で構成されるドロップダウン リストの属性を指定します。
これらの属性タイプの詳細については、ROI ラベル、サブラベル、属性を参照してください。
車両タイプの属性を追加します。
左側の [ROI ラベル] ペインで [Car] ラベルを選択し、[属性] をクリックします。
[属性名] ボックスに
carType
と入力します。属性タイプを[List]
に設定します。[リスト項目] セクションに、
Sedan
、Hatchback
、SUV
、Wagon
など、さまざまな車両の種類を 1 行に 1 つ入力します。必要に応じて属性に説明を加えて、[OK] をクリックします。属性フィールドの横に表示される情報アイコンをポイントすると、追加した説明が表示されます。イメージ フレームで、[Car] ROI ラベルを選択します。[属性とサブラベル] ペインで、その車両に適切な [carType] 属性を選択します。
前の手順を繰り返して、別の車両に [carType] 属性を割り当てます。
サブラベルに属性を追加することもできます。[headlight] サブラベルに、ヘッドライトが点灯しているかどうかを示す属性を追加します。
左側の [ROI ラベル] ペインで [headlight] サブラベルを選択し、[属性] をクリックします。
[属性名] ボックスに
isOn
と入力します。属性タイプを[Logical]
に設定します。[既定値] は[Empty]
の設定のままにしておき、必要に応じて説明を記述して、[OK] をクリックします。ビデオ フレームでヘッドライトを選択します。適切な [isOn] 属性値を設定するか、属性値を
[Empty]
に設定されたままにします。前の手順を繰り返して、別の車両の [isOn] 属性を設定します。
属性を削除するには、ROI ラベルまたはサブラベルを右クリックして、削除する属性を選択します。属性を削除すると、以前に作成したすべての ROI ラベルの注釈から属性情報が削除されます。
シーン ラベルの作成
"シーン ラベル" は、シーン全体に関する追加情報を定義します。シーン ラベルは、ライティングのような条件、気象条件、または車線変更などのイベントの説明に使用します。
シーン ラベルを作成して、イメージに適用します。
アプリの左側のペインで、[ROI ラベル] タブの隣にある [シーン ラベル] タブを選択します。
[新しいシーン ラベルの定義] をクリックし、[ラベル名] ボックスに
daytime
という名前のシーン ラベルを入力します。シーン ラベルの内容に合わせてラベル定義の色を薄い青に変更します。[色] パラメーターの下で、カラー プレビューをクリックし、標準の薄い青色を選択します。次に、[OK] をクリックして色の選択ウィンドウを閉じます。
[グループ] パラメーターを既定の
[None]
のままにして、[OK] をクリックします。[シーン ラベル] ペインにシーン ラベルの定義が表示されます。[ラベルの追加] をクリックして、
daytime
ラベルをシーンに適用します。シーン ラベルの隣にチェックマークが表示されます。シーン ラベルを編集または削除するには、[ラベルの編集] または [ラベルの削除] を選択します。
グラウンド トゥルースのラベル付け
ここまでは、ビデオ内の 1 つのフレームのみにラベルを付けてきました。残りのフレームにラベルを付けるには、いかのいずれかのオプションを選択します。
グラウンド トゥルースに手動でラベルを付ける
右矢印キーをクリックして次のフレームに進む場合、前のフレームの ROI ラベルは引き継がれません。[sunny] シーン ラベルは時間範囲全体に適用したので、このラベルのみが各フレームに適用されます。
フレームを 1 つずつ進み、ラベルとサブラベルの ROI を手動で描画します。また、これらの ROI の属性情報も更新します。
オートメーション アルゴリズムを使用してグラウンド トゥルースにラベルを付ける
ラベル付け処理を高速化するために、アプリ内でオートメーション アルゴリズムを使用できます。独自のオートメーション アルゴリズムを定義する (ラベル付け用オートメーション アルゴリズムの作成および時間的オートメーション アルゴリズム参照) ことも、組み込みのオートメーション アルゴリズムを使用することもできます。この例では、組み込みの点追跡アルゴリズムを使用してグラウンド トゥルースにラベルを付けます。
この例では、[Car] ROI ラベルのラベル付けのみを自動化します。組み込みのオートメーション アルゴリズムは、サブラベルと属性の自動化はサポートしていません。
自動化するラベルを選択します。ビデオの最初のフレームで、Ctrl キーを押しながら、2 つの [Car] ラベルの注釈をクリックして選択します。ラベルは黄色で強調表示されます。
アプリのツールストリップから、[アルゴリズムの選択] 、 [ポイント トラッカー] を選択します。このアルゴリズムは、Kanade-Lucas-Tomasi (KLT) アルゴリズムを使用して短い間隔における 1 つ以上の四角形 ROI を追跡します。
(オプション) オートメーション設定を構成します。たとえば、選択した [Car] ラベルをオートメーション セッションにインポートできるように、[選択した ROI をインポート] が選択されていることを確認します。
[自動化] をクリックして、オートメーション セッションを開きます。アルゴリズムの指示が左側のペインに表示され、選択したラベルを自動化に使用できます。
[実行] をクリックして、選択した ROI をその区間で追跡します。
アルゴリズムの実行結果を確認します。
後でシーンに現れる車両にはラベルが付いていません。ラベルの付いていない車両には初期 ROI ラベルがなかったため、アルゴリズムによって追跡されませんでした。[実行を元に戻す] をクリックします。スライダーを使用して、各車両が最初に現れるフレームを探します。各車両の周りに [vehicle] ROI を描画して、再度 [実行] をクリックします。
フレームを 1 つずつ進み、ROI を手動で移動、サイズ変更、削除、または追加して、オートメーション アルゴリズムの結果を改善します。
アルゴリズムの結果に満足した場合は、[確定] をクリックします。または、セッション中に生成されたラベルを破棄して、代わりに手動でラベルを付ける場合は、[キャンセル] をクリックします。[キャンセル] ボタンでは、アプリ セッションではなく、アルゴリズム セッションがキャンセルされます。
これで、オプションでサブラベルと属性情報を使用して、残りのフレームに手動でラベルを付けられるようになりました。
ラベルをさらに評価するために、ラベル付きのグラウンド トゥルースの視覚的な概要を表示できます。アプリのツールストリップから、[ラベルの概要を表示] を選択します。この概要を使用して、フレーム、ラベルの頻度、およびシーンの状態を比較できます。詳細については、グラウンド トゥルース ラベルの概要の表示を参照してください。この概要は、サブラベルや属性をサポートしていません。
ラベル付きのグラウンド トゥルースのエクスポート
ラベル付きのグラウンド トゥルースを MAT ファイルや、MATLAB ワークスペースの変数にエクスポートできます。いずれの場合も、ラベル付きのグラウンド トゥルースは groundTruth
オブジェクトとして保存されます。このオブジェクトを使用して、深層学習ベースのコンピューター ビジョン アルゴリズムに学習させることができます。詳細については、オブジェクト検出およびセマンティック セグメンテーション用の学習データを参照してください。
メモ
ピクセル データをエクスポートする場合、ピクセル ラベル データとグラウンド トゥルース データは別個のファイルに保存されますが、フォルダーは同一です。エクスポートしたピクセル ラベルを扱う場合の考慮事項については、ラベラー アプリにおけるエクスポートしたピクセル ラベルの保存方法を参照してください。
この例では、ラベル付きのグラウンド トゥルースを MATLAB ワークスペースにエクスポートします。アプリのツールストリップから、[ラベルをエクスポート] 、 [ワークスペースへ] を選択します。エクスポートした MATLAB 変数は gTruth
です。
エクスポートした groundTruth
オブジェクトのプロパティを表示します。エクスポートしたオブジェクトの情報は、以下に示す情報と異なる可能性があります。
gTruth
gTruth = groundTruth with properties: DataSource: [1×1 groundTruthDataSource] LabelDefinitions: [2x6 table] LabelData: [531×3 timetable]
データ ソース
DataSource
は、イメージまたはビデオへのパスとタイムスタンプを含む groundTruthDataSource
オブジェクトです。このオブジェクトのプロパティを表示します。
gTruth.DataSource
ans = groundTruthDataSource for a video file with properties Source: ...matlab\toolbox\vision\visiondata\visiontraffic.avi TimeStamps: [531×1 duration]
ラベルの定義
LabelDefinitions
は、ラベル定義に関する情報を含む table です。この table は、ビデオ フレームに描画されたラベルに関する情報を含みません。ラベル定義を独自の MAT ファイルに保存するには、アプリのツールストリップから、[ラベルをエクスポート] 、 [ファイルへ] を選択します。次に、[ファイルのインポート] を選択することで、これらのラベル定義を別のアプリ セッションにインポートできます。
ラベル定義 table を表示します。各行は、ROI ラベル定義またはシーン ラベル定義に関する情報を含みます。ピクセル ラベル データをエクスポートした場合、LabelDefinitions
table には、各ピクセル ラベル定義の ID 番号を含む PixelLabelID
列も含まれます。
gTruth.LabelDefinitions
ans = 3×6 table Name Type LabelColor Group Description Hierarchy _________ _________ ____________ ___________ ___________ ____________ {'Car' } Rectangle {1×3 double} {'Vehicle'} {0×0 char} {1×1 struct} {'Truck'} Rectangle {1×3 double} {'Vehicle'} {0×0 char} {0×0 double} {'Sunny'} Scene {1×3 double} {'Weather'} {0×0 char} {0×0 double}
LabelDefinitions
内の Hierarchy
列は、親 ROI ラベルのサブラベルと属性定義に関する情報を格納します。
Car
ラベルのサブラベルと属性情報を表示します。
gTruth.LabelDefinitions.Hierarchy{1}
ans = struct with fields: numDoors: [1×1 struct] color: [1×1 struct] inMotion: [1×1 struct] carType: [1×1 struct] headlight: [1×1 struct] Type: Rectangle Description: ''
headlight
サブラベルに関する情報を表示します。
gTruth.LabelDefinitions.Hierarchy{1}.headlight
ans = struct with fields: Type: Rectangle Description: '' Color: [0.5862 0.8276 0.3103] isOn: [1×1 struct]
carType
属性に関する情報を表示します。
gTruth.LabelDefinitions.Hierarchy{1}.carType
ans = struct with fields: ListItems: {3×1 cell} Description: ''
ラベル データ
LabelData
は、ビデオ全体の各タイムスタンプで描画された ROI ラベルに関する情報を含む timetable です。この timetable は、1 つのラベルにつき 1 つの列を含みます。
timetable の最初の数行を表示します。最初のいくつかのタイムスタンプは、車両が何も検出されなかったことを示しています。また、sunny
シーン ラベルは false
です。このような結果になったのは、ビデオのこの部分にラベルが付けられていなかったからです。5 ~ 10 秒の時間範囲のみにラベルが付けられていました。次のコードは、sunny
のシーン ラベルが付けられた区間を表示します。
labelData = gTruth.LabelData; gTruthInterval = labelData(timerange('00:00:05','00:00:10'),:); head(gTruthInterval)
ans = 8×3 timetable Time Car Truck sunny __________ ____________ ____________ _____ 5.005 sec [1×2 struct] [1×0 struct] true 5.0384 sec [1×2 struct] [1×0 struct] true 5.0717 sec [1×2 struct] [1×0 struct] true 5.1051 sec [1×2 struct] [1×0 struct] true 5.1385 sec [1×2 struct] [1×0 struct] true 5.1718 sec [1×2 struct] [1×0 struct] true 5.2052 sec [1×2 struct] [1×0 struct] true 5.2386 sec [1×2 struct] [1×0 struct] true
ラベルを含む 5 ~ 10 秒の間隔の timetable の最初の数行を表示します。
gTruthInterval = labelData(timerange('00:00:05','00:00:10'),:); head(gTruthInterval)
ans = 8×3 timetable Time Car Truck sunny __________ ____________ ____________ _____ 5.005 sec [1×2 struct] [1×0 struct] true 5.0384 sec [1×2 struct] [1×0 struct] true 5.0717 sec [1×2 struct] [1×0 struct] true 5.1051 sec [1×2 struct] [1×0 struct] true 5.1385 sec [1×2 struct] [1×0 struct] true 5.1718 sec [1×2 struct] [1×0 struct] true 5.2052 sec [1×2 struct] [1×0 struct] true 5.2386 sec [1×2 struct] [1×0 struct] true
各 Car
ラベルに関して、構造体は境界ボックスの位置と、サブラベルと属性に関する情報を含んでいます。
時間範囲の開始位置における車両の境界ボックスの位置を表示します。境界ボックスの位置は、次に示すものと異なる可能性があります。
gTruthInterval(1,:).Car{1}.Position % [x y width height], in pixels
ans = 1×4 single row vector 415.8962 82.4737 130.8474 129.3805 ans = 1×4 single row vector 235.2182 1.0000 117.0611 55.3500
アプリ セッションの保存
アプリのツール ストリップから [保存] を選択し、アプリ セッションの MAT ファイルを保存します。保存されたセッションには、データ ソース、ラベル定義、およびラベル付きのグラウンド トゥルースが含まれます。また、アプリのレイアウトなど、セッションの基本設定も含まれます。レイアウト オプションを変更するには、[レイアウト] を選択します。
セッション中はいつでも [新規セッション] を選択して新規セッションを開始できます。現在のセッションを保存するか、キャンセルするかを選択できます。
アプリ セッション MAT ファイルは、[エクスポート] 、 [ファイルから] を選択してエクスポートするグラウンド トゥルース MAT ファイルとは別のものです。ラベル付きのグラウンド トゥルース データを共有するには、ベスト プラクティスとして、アプリ セッション MAT ファイルを共有するのではなく、groundTruth
オブジェクトを含むグラウンド トゥルース MAT ファイルを共有します。詳細については、ラベル付きのグラウンド トゥルース データの共有と保存を参照してください。
参考
アプリ
オブジェクト
labelDefinitionCreator
|groundTruth
|groundTruthDataSource
|vision.labeler.mixin.Temporal
|vision.labeler.AutomationAlgorithm