0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

第Ⅰ段:CVATでYOLOセグメンテーション用データを作る手順

0
Posted at

はじめに

最近は、SAM 3やSAM 2などの汎用セグメンテーションモデルを使って、画像中の物体を効率よく切り出せるようになってきました。
しかし、まだ十分にセグメンテーションされていない特定の物体を扱いたい場合や、自分の研究・業務で撮影した画像に合わせて認識させたい場合は、YOLOなどを使って追加学習する方法が今でも便利だと思います。
画像から対象物を検出するだけでなく、対象物の形まで取り出したい場合は、単なる物体検出ではなく、インスタンスセグメンテーションを使うと便利です。

たとえば、以下のような用途があります。

  • 特定の物体の領域を抽出したい
  • 個体ごとの輪郭を取りたい
  • 面積や形状を解析したい
  • YOLOでセグメンテーションモデルを学習したい
  • 推論結果を使って個数、面積、位置情報などを解析したい

この記事では、CVATを使って画像にセグメンテーションアノテーションを行い、Ultralytics YOLOで学習できる形式に出力するまでの流れを説明します。

YOLOでの学習と推論は、次の記事で扱います。

この記事の対象

この記事は、次のような人を想定しています。

  • CVATを使ってアノテーションデータを作りたい人
  • YOLOのセグメンテーションモデルを追加学習したい人
  • 自分の画像データで特定物体を認識させたい人
  • 物体の四角い枠だけでなく、輪郭や面積まで取りたい人
  • Windows環境で作業したい人

全体の流れ

この記事で行う作業は次の通りです。

画像を用意する
↓
CVATを準備する
↓
CVATに画像をアップロードする
↓
PolygonまたはMaskでアノテーションする
↓
Ultralytics YOLO Segmentation形式でExportする
↓
Exportしたラベルtxtを確認する
↓
次回、YOLOで学習する

使用するツール

この記事では以下を使います。

OS: Windows
アノテーションツール: CVAT
Export形式: Ultralytics YOLO Segmentation
次回使う学習モデル: YOLO11s-seg

CVATはブラウザ上で使えるアノテーションツールです。

画像、動画、物体検出、セグメンテーションなどのアノテーションに対応しています。

CVATの使い方の選択肢

CVATを使う方法は、大きく2つあります。

方法1: CVAT Onlineを使う
方法2: DockerでローカルPCにCVATを入れる

今すぐ試したい場合は、CVAT Onlineを使うのが簡単です。

一方で、研究室や組織内で画像を管理したい場合や、外部サービスに画像をアップロードしたくない場合は、Dockerを使ってローカルPCでCVATを動かす方法があります。

この記事では、方法2のDockerを使ったローカル環境でのCVAT導入を紹介します。

Dockerとは何か

Dockerは、ソフトウェアを動かすための環境をまとめて管理できる仕組みです。
普通にソフトウェアを入れる場合、Python、データベース、サーバー設定などを1つずつ準備する必要があります。
CVATも内部では複数のサービスを使うため、手作業で全部そろえるのは大変です。

Dockerを使うと、必要な環境をまとめて起動できます。

簡単に言うと、Dockerは次のようなものです。

アプリを動かすための環境を箱ごと用意する仕組み

CVATをローカルで使う場合、Docker Desktopを入れておくと、CVATに必要な環境を比較的簡単に起動できます。

事前にインストールするもの

ローカルPCでCVATを使う場合、事前に以下をインストールします。

Docker Desktop
Git

Docker Desktop

Docker Desktopは、Windows上でDockerを使うためのソフトです。

公式サイトからインストールできます。

https://www.docker.com/products/docker-desktop/

Windowsでは、Docker Desktopの動作にWSL2が必要になる場合があります。

インストール中にWSL2の有効化を求められた場合は、画面の案内に従って設定します。

Git

Gitは、CVATのソースコードを取得するために使います。
公式サイトからインストールできます。

https://git-scm.com/

CVATをローカルに入れる

Docker DesktopとGitをインストールしたら、PowerShellまたはコマンドプロンプトを開きます。
まず、CVATを置きたいフォルダに移動します。
例として、この記事では次の場所を使います。

C:\cvat_work

フォルダを作って移動します。

mkdir C:\cvat_work
cd /d C:\cvat_work

次に、CVATをGitHubから取得します。

git clone https://github.com/cvat-ai/cvat
cd cvat

CVATを起動します。

docker compose up -d

初回は必要なデータをダウンロードするため、少し時間がかかります。
Docker Desktopで複数のコンテナが起動していれば準備が進んでいます。

管理者ユーザーを作る

CVATを初回起動したら、管理者ユーザーを作ります。

以下を実行します。

docker exec -it cvat_server bash -ic 'python3 ~/manage.py createsuperuser'

実行すると、ユーザー名、メールアドレス、パスワードの入力を求められます。

例:

Username: admin
Email address: your_email@example.com
Password:
Password again:

パスワード入力中は、画面に文字が表示されないことがあります。

表示されなくても入力はされています。

CVATにアクセスする

ブラウザで以下を開きます。

http://localhost:8080

先ほど作成したユーザー名とパスワードでログインします。

ログインできれば、CVATの準備は完了です。

CVATでProjectまたはTaskを作る

CVATにログインしたら、まずProjectまたはTaskを作ります。

Taskだけでよい場合

小規模な作業や、画像セットが1つだけの場合はTaskだけで十分です。

Taskを作る
↓
画像をアップロードする
↓
ラベルを設定する
↓
アノテーションする

Projectを作るとよい場合

複数の画像セットを同じラベル体系で管理したい場合は、Projectを作ると便利です。

Projectを作る
↓
ラベルを設定する
↓
複数のTaskをProject内に作る
↓
同じラベル設定でアノテーションする

研究や業務で複数回に分けて画像を追加する場合は、Projectを使う方が管理しやすいです。

ラベルを作る

次に、アノテーションで使うラベルを作ります。

例として、3クラスに分ける場合は次のようにします。

target
non_target
ambiguous

意味は次のように決めておくと分かりやすいです。

target: 検出したい対象
non_target: 似ているが対象ではないもの
ambiguous: 判断が難しいもの

実際の研究や業務では、目的に合わせて変更します。

例:

crop
weed
water_area
road
ridge
soil
unknown

また、1クラスだけでよい場合は、次のようにしても構いません。

target

重要なのは、ラベル名と意味を途中で変えないことです。

学習データの途中でラベル名や意味が変わると、モデルが正しく学習しにくくなります。

ラベル設計で気をつけること

ラベルを作るときは、最初に対象の定義を決めておきます。

たとえば植物を対象にする場合でも、次のような違いがあります。

株全体を囲むのか
葉だけを囲むのか
見えている部分だけを囲むのか
影も含めるのか
枯れた部分を含めるのか
重なっている個体を分けるのか
まとめて1つにするのか

ここが曖昧だと、学習データの品質が下がります。

後から見返したときに自分でも判断がブレる場合があるため、簡単なルール表を作っておくのがおすすめです。

例:

対象物が半分以上見えている場合は囲む
影は含めない
枯れた部分は対象に含める
判断が難しいものはambiguousにする

画像をアップロードする

CVATでTaskを作成し、画像をアップロードします。

一般的には、以下の画像形式が使いやすいです。

jpg
jpeg
png
tif
tiff

ドローン画像や圃場画像では、tif形式を使うこともあります。

ただし、学習時に画像が読み込めない場合があるため、最初に流れを確認するときはjpgまたはpngで試すとトラブルが少ないです。

画像ファイル名について

画像ファイル名は、後でYOLO学習用データを作るときに重要になります。

おすすめは、英数字とアンダーバーだけでファイル名を作ることです。

良い例:

IMG_0001.jpg
IMG_0002.jpg
field_001_0001.jpg
field_001_0002.jpg

避けた方がよい例:

画像 1.jpg
調査地A(晴れ).jpg
2025年8月5日 畔 その1.jpg

日本語、空白、括弧、記号が入っていても動く場合はありますが、後でPythonスクリプトやYOLOで処理するときにトラブルの原因になることがあります。

ブログや論文補足資料に載せる場合も、個人名、地名、調査日などがファイル名に入っていると個人情報や研究情報が出てしまう可能性があります。

そのため、公開を意識する場合は、次のような汎用的な名前にしておくと安全です。

set_001_0001.jpg
set_001_0002.jpg
set_002_0001.jpg

アノテーション方法

YOLOのセグメンテーションモデルで学習する場合、Bounding Boxではなく、PolygonまたはMaskで囲みます。

Bounding Box: 四角で囲む検出用
Polygon: 点をつないで輪郭を囲むセグメンテーション用
Mask: 塗りつぶして領域を作るセグメンテーション用

今回使うのはセグメンテーションなので、基本的にはPolygonまたはMaskを使います。

Polygonで囲む場合

Polygonでは、対象の輪郭に沿って点を打ちます。

流れは次の通りです。

対象物の外周に沿ってクリックする
↓
最後に始点付近で閉じる
↓
ラベルを選択する
↓
保存する

細かく点を打つほど輪郭は正確になりますが、点が多すぎると作業時間が増えます。

最初は、対象の形が大きく崩れない程度に囲めば十分です。

ただし、面積を正確に測りたい場合は、ある程度ていねいに輪郭を取る必要があります。

Maskで塗る場合

Maskでは、ブラシのように対象領域を塗ることができます。

輪郭が複雑な対象や、細かい形を取りたい場合に便利です。

ただし、作業時間はPolygonより長くなることがあります。

また、YOLO Segmentation形式でExportする場合、最終的にはPolygon座標のような形に変換されることがあります。

そのため、まずは少数の画像でExportまで試し、ラベルtxtが想定通り出るか確認してから大量に作業するのがおすすめです。


Bounding BoxではなくSegmentationにする理由

Bounding Boxでは、対象物を四角で囲むだけです。

そのため、対象物の周りの背景も四角の中に含まれます。

一方、Segmentationでは、対象物の輪郭に沿って領域を作れます。

たとえば、次のような解析をしたい場合はSegmentationの方が向いています。

対象物の面積を測りたい
対象物の形状を解析したい
重なった個体を分けたい
背景をできるだけ除きたい
個体ごとのマスクがほしい

四角い枠だけでよい場合は物体検出でも十分ですが、形や面積が重要な場合はインスタンスセグメンテーションが便利です。

アノテーション時の注意点

1. 対象の定義を決めておく

最初に、何を対象として囲むのかを明確にします。
たとえば、植物を対象にする場合でも、次のような違いがあります。

株全体を囲むのか
葉だけを囲むのか
見えている部分だけを囲むのか
影も含めるのか
枯れた部分を含めるのか

ここが曖昧だと、学習データの品質が下がります。

2. 判断に迷うものは別クラスにする

判断が難しいものを無理にtargetまたはnon_targetに入れると、モデルが混乱することがあります。
その場合は、次のようなクラスを用意しておくと便利です。

ambiguous
unknown
ignore

ただし、クラスを増やしすぎると、各クラスに必要なデータ数も増えます。
最初は少ないクラス数で始め、必要に応じて増やす方が管理しやすいです。

3. 似ている背景も入れる

検出したい対象だけでなく、似ているが対象ではないものもデータに入れると、誤検出を減らしやすくなります。
たとえば、次のようなものです。

対象に似た背景
影
水面の反射
土
雑草
枯れた植物
別の作物

誤認識しやすいものが分かっている場合は、それを意識して学習データに含めることが重要です。

4. 画像条件を偏らせない

同じ日、同じ場所、同じ明るさの画像だけで学習すると、別の日や別の場所で精度が落ちることがあります。
できれば、以下を混ぜます。

晴れの日
曇りの日
明るい画像
暗い画像
対象が大きく写っている画像
対象が小さく写っている画像
背景が単純な画像
背景が複雑な画像
角度が違う画像
撮影距離が違う画像

モデルは、学習データに近い画像は得意になります。
逆に、学習データにない条件の画像は苦手になりやすいです。

どのくらいの枚数をアノテーションすればよいか

セグメンテーション用のデータを作るときに悩むのが、「何枚くらいアノテーションすればよいのか」という点です。

結論から言うと、何枚がベストかは対象物、画像の複雑さ、撮影条件、必要な精度によって変わります。
そのため、論文を見ても「必ず何枚が正解」とは言えません。
ただし、既存の研究や公開データセットを見ると、目安はあります。

研究事例から見るデータ数の目安

農業・植物系のセグメンテーション研究では、以下のような規模のデータセットが使われています。

事例 データ数の例 内容
Sesame Plant Segmentation Dataset train 206枚、val 43枚、test 43枚 ゴマ植物のYOLO形式セグメンテーションデータセット
GrowingSoy Dataset 1,000枚 大豆と雑草を対象にしたインスタンスセグメンテーションデータセット
RiceSEG 3,078枚 約50,000枚の水稲画像から代表画像を選び、6クラスで注釈したセグメンテーションデータセット
Microsoft COCO 約328,000枚、250万インスタンス 一般物体認識・検出・セグメンテーションの大規模ベンチマーク

ここから分かるのは、少量でも試すことはできますが、実用的に安定させるには画像数と多様性が重要ということです。

たとえば、かなり条件がそろっていて、対象物も単純な場合は、200〜300枚程度でも試験的なモデルは作れます。

一方で、撮影日、天気、角度、背景、対象物の大きさが変わる場合は、500〜1,000枚以上あった方が安定しやすくなります。

さらに、地域、季節、カメラ、照明条件まで含めて汎用的に使いたい場合は、数千枚規模のデータが必要になることがあります。

実際のアノテーション枚数の目安

個人的には、最初から大量にアノテーションするより、段階的に増やす方法がよいと思います。

まずは動作確認

最初は以下くらいから始めます。

100〜300枚

この段階では、モデルを完璧にすることよりも、作業の流れを確認することが目的です。

確認することは次の通りです。

CVATのExport形式が正しいか
YOLOで読み込める形式になっているか
ラベルと画像が正しく対応しているか
学習が正常に始まるか
推論結果が出るか

最初から1,000枚以上をアノテーションしてから形式ミスに気づくと、修正が大変です。
そのため、まずは少量で流れを確認します。

ある程度使えるモデルを作る段階

次に、実際に使えそうなモデルを作るなら、以下を目標にします。

500〜1,000枚

この段階では、同じような画像だけでなく、条件の違う画像を混ぜます。

明るい画像
暗い画像
晴れの日
曇りの日
対象が大きい画像
対象が小さい画像
背景が単純な画像
背景が複雑な画像
誤認識しやすい画像

特に重要なのは、推論したい画像と似た条件の画像を学習データに入れることです。

実用レベルを目指す段階

実際の現場で安定して使いたい場合は、以下を目標にします。

1クラスあたり1,000枚以上
できれば1,500枚以上
インスタンス数は1クラスあたり数千〜1万以上

Ultralyticsの学習ガイドでは、YOLO学習の目安として、1クラスあたり1,500画像以上、10,000インスタンス以上が推奨されています。
これは主に物体検出向けの目安ですが、セグメンテーションでも考え方は近いです。
つまり、単に画像枚数だけでなく、画像の中に対象物が何個写っているかも重要です。
たとえば、100枚の画像でも1枚に100個の対象が写っていれば、インスタンス数は多くなります。
逆に、1,000枚あっても1枚に1個しか対象がなければ、インスタンス数は1,000個です。

枚数よりも大事なこと

画像枚数は重要ですが、枚数だけ増やせばよいわけではありません。
セグメンテーションでは、次の点がとても重要です。

画像の多様性
ラベルの一貫性
対象物の大きさのばらつき
背景のばらつき
撮影条件のばらつき
誤認識しやすい例を入れること

同じ日に、同じ場所で、同じ角度から撮影した画像を1,000枚集めても、別の日や別の場所ではうまく推論できないことがあります。

一方で、300枚でも、いろいろな条件をバランスよく含んでいれば、意外とよく使える場合があります。

私の考え

推定対象の画像がどのようなものなのかを先に考えて、学習データを作る必要があります。
推論したい画像が多様であれば、学習データも多様にする必要があります。
晴れの日だけで学習したモデルに、曇りの日や影の多い画像を推論させると、誤認識が増えることがあります。
対象物が大きく写った画像だけで学習すると、小さく写った対象物を見落とすことがあります。
背景が単純な画像だけで学習すると、背景が複雑な画像で誤検出が増えることがあります。
そのため、私としては、次のように進めるのがよいと思います。

推論したい画像の条件を先に考える
↓
その条件をできるだけ学習データに入れる
↓
少量で学習して推論する
↓
失敗した画像を追加でアノテーションする
↓
再学習する

最初から完璧なデータセットを作ろうとするよりも、推論結果を見ながら、足りないパターンを追加していく方が現実的です。

Export形式

アノテーションが終わったら、CVATからデータをExportします。

YOLOのセグメンテーションで学習するため、Export形式は次を選びます。

Ultralytics YOLO Segmentation

ここで注意する点は、YOLO Detectionではなく、YOLO Segmentationを選ぶことです。

Detection形式は四角いBounding Box用です。

Segmentation形式はPolygonやMaskの輪郭情報を保存するための形式です。

YOLO Detection形式とYOLO Segmentation形式の違い

YOLO Detection形式は、1つの物体を1行で表し、中心座標と幅・高さを保存します。

class_id x_center y_center width height

一方、YOLO Segmentation形式では、輪郭の座標を保存します。

class_id x1 y1 x2 y2 x3 y3 ...

そのため、CVATでPolygonやMaskを作った場合は、必ずSegmentation形式でExportします。

Export後のフォルダ構成

CVATからExportすると、zipファイルがダウンロードされます。
zipを解凍すると、だいたい次のような構成になります。

exported_dataset/
├─ data.yaml
├─ images/
│  ├─ train/
│  └─ val/
└─ labels/
   ├─ train/
   └─ val/

CVATの設定やバージョンによっては、少し違う構成になることもあります。
重要なのは、labelsフォルダの中にtxtファイルがあることです。


ラベルtxtの中身を確認する

Exportしたら、ラベルtxtを開いて確認します。

例として、次のような内容になっていればセグメンテーション形式です。

0 0.321 0.456 0.333 0.459 0.348 0.461 0.350 0.480

先頭の0はクラスIDです。

その後ろに、Polygonの座標が並びます。

座標は画像サイズに対して0から1の範囲に正規化されています。

うまくExportできているか確認する

Export後は、必ず少数のファイルを確認します。

確認ポイントは次の通りです。

labelsフォルダにtxtファイルがあるか
空のtxtばかりになっていないか
class_idの数が想定通りか
座標が0〜1の範囲になっているか
Detection形式ではなくSegmentation形式になっているか

特に、次のような形式になっている場合はDetection形式です。

0 0.500 0.500 0.200 0.300

Detection形式では、class_idの後ろに4つの数値しかありません。

Segmentation形式では、class_idの後ろにpolygon座標がたくさん並びます。

この段階で確認しておくこと

次回のYOLO学習に進む前に、以下を確認しておきます。

CVATでPolygonまたはMaskを作った
Ultralytics YOLO Segmentation形式でExportした
labelsフォルダにtxtファイルがある
ラベルtxtがSegmentation形式になっている
画像ファイル名とラベルtxt名が対応している
個人情報を含まないフォルダ名に整理した

この確認をしておくと、次回の学習スクリプトでトラブルが少なくなります。

まとめ

この記事では、CVATでYOLOセグメンテーション用のデータを作る流れをまとめました。
重要な点は次の通りです。

Bounding BoxではなくPolygonまたはMaskでアノテーションする
Export形式はUltralytics YOLO Segmentationを選ぶ
ラベル名の意味を途中で変えない
画像条件を偏らせない
推論したい画像に近い条件を学習データに入れる
個人情報を含むパスは記事に載せない
データフォルダは分かりやすく整理する

アノテーション枚数については、対象や目的によって必要量が変わります。

最初は100〜300枚程度で流れを確認し、使えるモデルを目指す段階で500〜1,000枚、実用レベルでは1クラスあたり1,000〜1,500枚以上を目安にするとよいと思います。

ただし、枚数だけでなく、画像の多様性とラベルの一貫性がとても重要です。

次の記事では、このCVAT Exportデータを使って、YOLO11s-segで学習し、未ラベル画像を推論する手順を説明します。

参考文献・参考サイト

CVAT

CVAT公式サイト

https://www.cvat.ai/

CVAT GitHub

https://github.com/cvat-ai/cvat

CVAT 管理者ユーザー作成

https://docs.cvat.ai/docs/administration/community/basics/admin-account/

CVAT Ultralytics YOLO形式

https://docs.cvat.ai/docs/dataset_management/formats/format-yolo-ultralytics/

Docker / Git

Docker Desktop

https://www.docker.com/products/docker-desktop/

Git

https://git-scm.com/

Ultralytics YOLO

Ultralytics Docs

https://docs.ultralytics.com/

Ultralytics Tips for Best YOLO Training Results

https://docs.ultralytics.com/yolov5/tutorials/tips_for_best_training_results/

セグメンテーション・データセット関連

Meta SAM 3

https://ai.meta.com/research/sam3/

Microsoft COCO: Common Objects in Context

https://arxiv.org/abs/1405.0312

Sesame Plant Segmentation Dataset: A YOLO Formatted Annotated Dataset

https://arxiv.org/abs/2601.07970

From Seedling to Harvest: The GrowingSoy Dataset for Weed Detection in Soy Crops via Instance Segmentation

https://arxiv.org/abs/2406.00313

Global Rice Multi-Class Segmentation Dataset, RiceSEG

https://arxiv.org/abs/2504.02880
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?