画像AI開発の環境構築の流れのメモ
昔はpoetryを用いていたのですが、今はuvが便利と聞いたのでそのメモです。
uvのwindowsへのインストール
下記の方法でインストールできます。 [Python]Windows環境でuvを使った効率的な仮想環境構築!インストールからVS Codeでのデバッグまで|こはた
プロジェクトの作成
uv init project-name
venvの構築(python 3.11をインストールする例)
2026年7月時点、python 3.12以上を使用するとOpemMMLabのインストールで嵌りやすいそうです。
cd project-name uv venv --python 3.11 uv python pin 3.11
pytorchのインストール(CUDA12.1の例)
pyproject.tomlのdependencies以降に以下を追記する
[project]
dependencies = [
"torch",
"torchvision"
]
[[tool.uv.index]]
name = "pytorch-cu121"
url = "https://download.pytorch.org/whl/cu121"
explicit = true
[tool.uv.sources]
torch = [{ index = "pytorch-cu121" }]
torchvision = [{ index = "pytorch-cu121" }]
[tool.ruff]
line-length = 120
[tool.ruff.lint]
select = ["E", "F", "W", "I", "B", "N", "UP", "SIM", "RUF", "PLR0915"]
[tool.pytest.ini_options]
testpaths = ["tests"]
[tool.pyright]
typeCheckingMode = "basic"
[dependency-groups]
dev = [
"mlflow>=3.14.0",
"pre-commit>=4.6.0",
"pyright>=1.1.411",
"pytest>=9.1.1",
"pytest-watch>=4.2.0",
"ruff>=0.15.21",
"ruff-format>=0.5.2",
]
編集後にuv syncを実行する
設定を変更する
Ctrl + Shift + PでVSCodeのsettings.jsonを開き以下を加える。これによりRuffがリアルタイムにコードを解析してくれる。
{ "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.fixAll": true }, "python.linting.enabled": false, "ruff.lint.run": "onType" }
.precommit-config.yamlを作成し、以下を記載する。これによりgitにcommitする際にRuff, Pyright, 単体テストが走り、失敗するとcommitできないようになる。
repos: - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.13.0 hooks: - id: ruff - id: ruff-format - repo: local hooks: - id: pyright name: run pyright entry: uv run pyright language: system pass_filenames: false - id: pytest name: run pytest entry: uv run pytest tests/ language: system pass_filenames: false
その後に以下を実行する。
uv run pre-commit install
git commitを通すためのダミー単体テストを作成し、initial commitする
mkdir tests
test_dummy.pyを作成する
def test_dummy() -> None: assert True
画像AIの学会情報メモ
| 名称 | 概要 | 開催月 |
| ファクトリーイノベーションWeek | 製造業の課題解決をテーマに、スマート工場、ロボデックス、カーボンニュートラル、人手不足対策、安全・環境改善などの展示会で構成される総合展。 |
2月 9月 |
| GTC | NVIDIA主催のAI・アクセラレーテッドコンピューティング会議。GPU、AIインフラ、生成AI、フィジカルAI、ロボティクス、データセンター技術などを扱う。 | 3月 |
| WACV | コンピュータビジョンの応用寄りテーマに強い国際会議。実世界応用、産業応用、認識・検出・解析技術などを扱う。 | 3月 |
| Embedded Vision Summit | 組込みビジョン、エッジAI、実装・製品化に焦点を当てたカンファレンス&展示会。製品開発者、技術サプライヤー、エンジニア向け。 | 5月 |
| SSII | 画像センシング分野の学術シンポジウム。画像学術界と画像産業界の動向を扱い、研究者・技術者の議論の場として運営されている。 | 6月 |
| CVPR | コンピュータビジョン・パターン認識分野のトップ国際会議。画像認識、動画理解、3Dビジョン、生成AI、マルチモーダルなど広範な研究が集まる。 | 6月 |
| MIRU | 画像の認識・理解技術に関する国内最大規模の会議。大学・産業界の研究者、技術者、学生が、基礎から応用まで最新研究を発表・議論する場。 |
8月 |
| AIMST | 製造業・産業オートメーション向けのIndustrial AI会議。AI製造、SCADA、IT/OT、サイバーセキュリティ、デジタル変革などを扱う。 |
8月 |
| ECCV | 欧州系の主要コンピュータビジョン国際会議。偶数年開催で、CV・機械学習分野の研究発表、ワークショップ、チュートリアルが行われる。 |
9月 |
| ViEW | 画像処理・ビジョン技術の「実利用」に重点を置くワークショップ。外観検査を起点に、医療・農業・モビリティなど応用分野も広い。 |
12月 |
| 国際画像機器展 | 国内最大級のマシンビジョン・画像処理関連展示会。FA、ロボティクス、社会インフラ、セキュリティ、医療・ライフサイエンスなどの応用を扱う。 | 12月 |
アノテーションミス自動検出の方法まとめ
高性能な画像AIを開発するためには以下が重要と考えられます。
- モデルそのものの性能
- データの量
- データの質
昨今では非常に優れたモデルが開発されており、むやみに精度を求めて最新の物を利用する必要性は薄れています。そこでデータそのものが益々重要になっていることからデータの質を担保する手段の1つとしてアノテーションミスを減らすことが重要です。ここではアノテーションミスをアノテーションミス候補の自動検出+目視で行う場合のアノテーションミス候補の自動検出を説明します。(画像AI開発における)アノテーションミスを自動検出する方法は大まかに以下があると考えます。
- ありえないデータを弾く
- 学習後の推論結果・特徴量を利用する
- 学習中のダイナミクスを利用する
"1. ありえないデータを弾く"はラベルが範囲外、例えばラベルを0 ~ 9までしか規定していないのに10というラベルがあったらおかしいとか、画像サイズが1920×1280なのにBBOXに2000という値が入っていたらおかしいと判断する方法です。 "2. 学習後の推論結果・得容量を利用する"に関して、"Confident Learning"(学習後のモデルの予測結果とラベルを比較する)や"SimiFeat"(データの特徴量とラベルの関係を比較する。データAとデータBの特徴が似ているのにラベルが異なるのであればミスを疑う)があります。 "3. 学習中のダイナミクスを利用する"に関して、代表的な手法としてAUM (Area Under the Margin) があり、学習中にモデルがラベルと同等の予測値をどの程度返していたかを見るような方法があります。
また、これらをサポートするライブラリとしては以下のようなものがあります。
cleanvision: 画像データの簡易品質チェックを行うライブラリ
画像AI開発における学習データの簡易品質チェックを実施したいと考えていたのですが、cleanvisionというライブラリがありました。 これを使用すると以下の全て、もしくは指定した項目に該当する画像を検出してもらえます。
- 重複した画像
- ほぼ同じ画像
- ボケた画像
- 情報の無い画像
- 暗すぎる画像
- 明るすぎる画像
- グレースケール画像
- アスペクト比異常画像
- サイズ異常画像
Datasheets for Datasets
収集したデータセットの文書化に関する論文。自身が収集したデータセットを他の人が利用することを想定し、他の人にとってデータセットを理解できるものにするため何を記録しておくべきか確認したいという動機で確認した。
Motivation
データセットが作成された背景
- 何の目的で作成されたのか
- 誰が作成したのか
Composition
データセットに何が含まれているか
- 各データが何を表すか
- 機密情報や個人情報が含まれているか
Collection Process
データがどのように収集されたか
- 誰からどのようにデータを集めたのか
- 同意は取られているか
- どんな手段(センサー、スクレイピング、etc)で取得したか
- 収集時期や地域
Preprocessing
データを公開する前にどのような処理をしているか
- データの削除、補完等の有無
- ラベル付けの方法
- ラベルの品質確認の実施有無
Uses
データセットの想定用途と非推奨用途
- どんなタスクに使う想定か
- 商用利用できるか
- 医療等の高リスク領域で使用して良いか
- 使うべきでない用途があるか
Distribution
データセットがどのように配布されるか
- どこで入手できるか
- ライセンスは何か
- 利用制限はあるか
- 再配布可能か
Maintenance
データセットが今後どのように管理されるか
- 更新予定があるか
- 誤りがあった場合に修正されるか
- 問い合わせ先があるか
画像AIプロジェクト 実践ハンドブックを読んでの備忘録
久々に画像AIプロジェクトを担当することになったため、復習のため表題の本を読み自身にとってのポイントをメモします。 書籍は自身にとって振り返りに良いものでしたが、画像AIプロジェクト未経験者が読んでも記載がサラッとしており理解は難しいと思われます。 また、参考文献が記載されていないことはマイナスでした。 例えば合成データは実データ8-9割+合成データ1-2割でブレンドすることで最も高い精度向上が得られると記載があるのですが、それに対する文献の記載が無い。最先端の学術会議よりも先進的な企業が「どうやって現場にAIをデプロイしたか」を語るテックブログやカンファレンスに注目するとあるのですが、具体的な照会が無いといった部分です。
第一章
- モデルはSOTAにこだわらない
- 研究での評価は固定された公開データセットで行われ、現場データと乖離があることが多い
- 加えてSOTAモデルは巨大な計算資源を必要とすることがある
- 精度、速度、運用コストといった複数の観点でモデルを選定する
- Papers with Codeは閉鎖されており、モデル情報収集のハブはHugging Faceとなっている
第二章
- 開発はPython/PyTorchで実施、本番環境へのデプロイはONNX等の共通規格を介して推論環境に最適化するという二段構えパイプラインを初期段階から想定する
- 物体検出における標準はUltralytics社のYOLOv8、YOLOv11(AGPL-3.0のためライセンスに注意)
- ライセンスが問題になるならYOLOXやRT-DETRは代表的な代替となる
- インスタンスセグメンテーションが必要であればDetectron2
- アノテーション効率化に有用なモデルとしてSAMがある
第三章
- アノテーションデータのフォーマットは様々なものがある。実務におけるベストプラクティスは情報量の多いCOCO形式で一元化し、学習を実行するパイプラインでYOLO形式への変換等を行う
- 暗黙知を言語化してアノテーション仕様書を作成する。特にエッジケースの定義、バウンディングボックスの引き方等アノテータでバラツキが出ないようにする
- 代表的なアノテーションツールとしてCVAT、LabelStudioがある
第四章
- 特にメモしたい点なし
第五章
- 最新すぎるモデルを採用した場合、ONNXがサポートしている標準的なオペレータに変換できないリスクがでる
- デプロイメントパイプラインはPyTorchモデルをONNX変換⇒量子化/最適化の実行⇒推論
- 推論サーバーではDynamic Batching / 複数モデルの同時実行 / 無停止でのモデルアップデートをサポートしているTriton Inference Serverの導入が必要
- モデルを管理するため、実験管理としてMLFlowやW&B、データバージョン管理としてDVCがある
第六章
- リリースしたモデルを更新するかの判定にはゴールドデータセットへの推論結果で判断する
第七章
- モデルの精度が劣化する原因はデータドリフト、コンセプトドリフトがある
- 劣化を監視する方法として確信度の分布変化、人間が介在する率の上昇などがある
- 再学習するデータを選定するアプローチにActive Learningがある
【PyTorch】Macro Soft F1 Lossを実装する
マルチラベル問題の評価指標の一つにMacro F1というものがあります。 Macro F1はそのままでは微分できないのでロス関数には適さないのですが、評価指標を微分可能にしてロス関数にしてしまおうという考えもあるようです。
リンクではMacro F1をロス関数に適用出来るようにしたMacro Soft F1 LossのKeras実装があるのですが、PyTorch版を実装しました。sigmoid + binary crossentropyと比較するとロスと正解率が結びつきやすいのは利点ですが、バッチサイズを十分に取らないといけなさそうなロス関数という印象です。
import torch import torch.nn as nn class MacroSoftF1Loss(nn.Module): def __init__(self, consider_true_negative, sigmoid_is_applied_to_input): super(MacroSoftF1Loss, self).__init__() self._consider_true_negative = consider_true_negative self._sigmoid_is_applied_to_input = sigmoid_is_applied_to_input def forward(self, input_, target): target = target.float() if self._sigmoid_is_applied_to_input: input = input_ else: input = torch.sigmoid(input_) TP = torch.sum(input * target, dim=0) FP = torch.sum((1 - input) * target, dim=0) FN = torch.sum(input * (1 - target), dim=0) F1_class1 = 2 * TP / (2 * TP + FP + FN + 1e-8) loss_class1 = 1 - F1_class1 if self._consider_true_negative: TN = torch.sum((1 - input) * (1 - target), dim=0) F1_class0 = 2*TN/(2*TN + FP + FN + 1e-8) loss_class0 = 1 - F1_class0 loss = (loss_class0 + loss_class1)*0.5 else: loss = loss_class1 macro_loss = loss.mean() return macro_loss
