背景画像上にカゴと魚を2段階で合成し、物体検出・セグメンテーション用の学習データセットを自動生成するツールです。
漁獲現場の画像データを増幅するため、魚画像をカゴテンプレートに配置し、さらにそのカゴを背景画像上にランダム配置する Copy-Paste Augmentation を実装しています。
魚画像 ──→ カゴに配置(Stage 1) ──→ カゴを背景に配置(Stage 2) ──→ 合成画像 + COCOアノテーション
flowchart LR
A["🐟 魚画像<br>(種ごとのフォルダ)"] --> B["🧺 Stage 1<br>カゴに魚を配置"]
C["🧺 カゴテンプレート"] --> B
B --> D["📦 Stage 2<br>カゴを背景に配置"]
E["🖼️ 背景画像"] --> D
D --> F["✅ 合成画像<br>+ COCO JSON"]
合成画像にはBBox(赤枠)とセグメンテーションマスク(赤色領域)が自動付与されます。
git clone https://github.com/ohnuma0529/20260218_MarineCopyAug.git
cd 20260218_MarineCopyAug
bash setup.sh
source .venv/bin/activatesetup.sh は以下を自動実行します:
- Python仮想環境(
.venv)の作成 - pipのアップグレード
- PyTorchのインストール(CUDA自動判定、なければCPU版)
requirements.txtの依存パッケージインストール
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
# GPU環境の場合(CUDA 12.1)
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121
# CPU環境の場合
pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu
pip install -r requirements.txt以下の3種類のデータを用意してください:
| データ | 説明 | config キー |
|---|---|---|
| 背景画像 | 魚のない背景画像群(.jpg / .png) |
paths.backgrounds_dir |
| カゴテンプレート | 透過PNG形式のカゴ画像 | paths.basket_template |
| 魚画像 | 種ごとのサブフォルダに格納された透過PNG | paths.fish_images_dir |
fish_images/
├── akamutsu/ # アカムツ
│ ├── 001.png
│ └── 002.png
├── buri/ # ブリ
│ ├── 001.png
│ └── ...
├── madai/ # マダイ
│ └── ...
└── ... # 他の種
Note: 魚画像は透過PNG(アルファチャンネル付き)が推奨です。アルファチャンネルからセグメンテーションマスクを自動生成します。
python generate.py --config config.yaml| 引数 | 説明 | デフォルト |
|---|---|---|
--config |
設定ファイルパス | config.yaml |
--images |
生成枚数(configをオーバーライド) | config値 |
--seed |
乱数シード(configをオーバーライド) | config値 |
--output-dir |
出力先ディレクトリ(configをオーバーライド) | config値 |
# テスト生成(10枚)
python generate.py --config config.yaml --images 10 --output-dir test_output
# 本番生成(200枚、config.yaml のデフォルト設定)
python generate.py --config config.yaml
# 500枚生成、シード変更
python generate.py --config config.yaml --images 500 --seed 42# --- 入出力パス ---
paths:
backgrounds_dir: "back" # 背景画像ディレクトリ
basket_template: "double_sync/basket.png" # カゴテンプレート画像
fish_images_dir: "onlyfish_crops" # 魚画像ディレクトリ
output_dir: "output" # 出力先
# --- 生成全般 ---
generation:
num_images: 200 # 生成枚数
seed: 0 # 乱数シード
# --- カゴ配置 ---
basket:
min_count: 1 # 1画像あたりの最小カゴ数
max_count: 5 # 1画像あたりの最大カゴ数
scale_min: 1.0 # スケール下限
scale_max: 2.0 # スケール上限
max_overlap_iou: 0.05 # カゴ間の最大IoU
# --- 魚配置 ---
fish:
min_per_basket: 5 # カゴあたりの最小魚数
max_per_basket: 10 # カゴあたりの最大魚数
max_overlap_iou: 0.3 # 魚間の最大IoU
min_center_dist_factor: 0.12 # 中心距離最小係数
rotation_range: [-30, 30] # 回転角度範囲(度)min_count/max_count: 1画像に配置するカゴの数の範囲。この範囲内でランダムに決定されます。scale_min/scale_max: カゴのスケール倍率。さらに0〜360度のランダム回転が適用されます。max_overlap_iou: カゴ同士のバウンディングボックスIoU上限。これを超える配置は却下されます。
min_per_basket/max_per_basket: 各カゴに配置する魚の数の範囲。max_overlap_iou: 魚同士のピクセルレベルIoU上限。min_center_dist_factor: 魚の中心間の最小距離(カゴ短辺に対する割合)。密集防止に使用。rotation_range: 魚画像の回転角度範囲(度)。スケールはカゴサイズに合わせ自動調整。
output/
├── images/ # 合成画像(PNG)
├── masks/ # インスタンスごとのバイナリマスク(PNG)
├── visuals/ # BBox + セグメンテーション可視化画像
└── annotations_coco.json # COCO形式アノテーション
{
"images": [
{"id": 1, "file_name": "synthetic_000000.png", "width": 3840, "height": 2160}
],
"annotations": [
{
"id": 1,
"image_id": 1,
"category_id": 1,
"segmentation": [[x1, y1, x2, y2, ...]],
"area": 23103,
"bbox": [x, y, width, height],
"iscrowd": 0
}
],
"categories": [
{"id": 1, "name": "akamutsu"},
{"id": 2, "name": "buri"}
]
}├── generate.py # エントリポイント(CLIから実行)
├── config.yaml # 合成パラメータ設定
├── setup.sh # 環境構築スクリプト
├── requirements.txt # Python依存パッケージ
├── .gitignore
├── README.md
└── copy_augment/ # メインパッケージ
├── __init__.py
├── config.py # 設定読み込み・バリデーション
├── fish_placer.py # Stage 1: カゴ内に魚を配置
├── basket_composer.py # Stage 2: カゴを背景に配置
├── image_transform.py # ランダム変換(スケール・回転)
├── mask_utils.py # マスク・IoU計算ユーティリティ
├── annotation_writer.py # COCOアノテーション出力
└── visualizer.py # 可視化描画
| モジュール | 主な責務 |
|---|---|
config.py |
YAML設定ファイルの読み込み、dataclassへのマッピング、バリデーション |
fish_placer.py |
カゴテンプレート上への魚画像の配置。IoU・中心距離ベースの重なり制御 |
basket_composer.py |
魚入りカゴを背景画像上にランダムスケール・回転で配置 |
image_transform.py |
魚画像のカゴサイズに応じたスケーリングとランダム回転 |
mask_utils.py |
アルファチャンネルからのマスク生成、IoU計算、ポリゴン変換、RGBA合成 |
annotation_writer.py |
COCOフォーマットのJSON構築・書き出し |
visualizer.py |
BBoxとセグメンテーションマスクのオーバーレイ描画 |
- Python 3.8+
- PyTorch(CUDA対応推奨、CPU版でも動作可)
- OpenCV, Pillow, NumPy, PyYAML