はじめに
業務においてPythonで画像認識処理を行う必要があったので、調べてまとめてみた。
一部業務などでは使えない(ライセンスが厳しい)ものもあるので気を付ける。
ライセンスなどは記事公開時点から変更されている場合があります。
ライブラリを利用する場合には、必ず最新情報をご確認ください。
OpenCV
ライセンス: Apache-2.0(商用利用可)
これを使っておけばだいたいのことはなんとかなるという感じのライブラリ。
画像・動画の読み込み・書き出し、フィルタリング、特徴点検出、物体追跡、カメラキャリブレーションなど、古典的な画像処理から一部のDNNモデル実行まで幅広く対応している。
主な機能:
- 画像の読み込み・変換・書き出し(
cv2.imread,cv2.imwrite) - フィルタリング・エッジ検出(Canny, Sobel など)
- 特徴点検出・マッチング(SIFT, ORB など)
- 物体検出・追跡(Haar Cascade, DNN モジュール)
- カメラキャリブレーション・ステレオビジョン
- 動画の処理(FFmpegのライセンスに気をつける)
import cv2
img = cv2.imread("image.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 100, 200)
Torchvision
ライセンス: BSD-3-Clause(商用利用可)
PyTorch(TensorFlowと並ぶ機械学習フレームワーク)エコシステムの一部として提供されるコンピュータビジョン専用ライブラリ。
ResNet, VGG, EfficientNet などの学習済みモデルや、COCO・ImageNet などのデータセット、データ拡張用のtransformsが揃っている。
主な機能:
- 学習済みモデルの提供(ResNet, MobileNet, Faster R-CNN など)
- 画像変換・データ拡張(
torchvision.transforms) - 標準データセットのロード(
torchvision.datasets)
from torchvision import transforms
transform = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]),
])
ultralytics(YOLO)
ライセンス: AGPL-3.0(⚠️ 業務利用注意) / 商用利用には Enterprise ライセンスが必要
YOLO(You Only Look Once)シリーズの最新実装を提供するライブラリ。
物体検出・インスタンスセグメンテーション・姿勢推定・画像分類など多タスクに対応しており、速度と精度のバランスに優れており使いやすいが、商用利用しづらいのが企業的には難点。
主な機能:
- 物体検出・追跡・セグメンテーション・姿勢推定
- 数行のコードで推論・ファインチューニングが可能
- ONNX, TensorRT, CoreML など多フォーマットへのエクスポート
from ultralytics import YOLO
model = YOLO("yolo11n.pt")
results = model("image.jpg")
results[0].show()
YOLOX
ライセンス: Apache-2.0(商用利用可)
Megvii(顔認識プラットフォームであるFace++で有名)が開発したアンカーフリーのYOLOシリーズ実装。
YOLOv3〜v5 を性能面で上回ることを目標として開発され、MegEngine・ONNX・TensorRT・ncnn・OpenVINO など多様な推論バックエンドに対応。
ultralytics 版のYOLOがAGPL-3.0であるのに対し、Apache-2.0 で利用できる点が業務用途での強み。
主な機能:
- アンカーフリーによるシンプルな検出パイプライン
- Decoupled Head(分離ヘッド)による精度向上
- 各種エクスポート形式(ONNX, TensorRT など)のサポート
MediaPipe
ライセンス: Apache-2.0(商用利用可)
Google が開発したクロスプラットフォームの ML パイプラインフレームワーク。
リアルタイムのメディア処理(動画・音声)に特化しており、手・顔・姿勢の検出など、すぐに使えるソリューションを少ないコードで利用できる。Python 以外に C++, Android, iOS にも対応。
主な機能:
- 顔検出・顔ランドマーク
- 手のランドマーク・ジェスチャ認識
- 姿勢推定(全身・上半身)
- 物体検出・画像分類(TFLite ベース)
# 古いバージョン(v0.10.21など)で動かす
import mediapipe as mp
mp_hands = mp.solutions.hands
hands = mp_hands.Hands()
補足:
最新バージョンではsolutionsがなくなってるなど変更点も多い。
コーディングエージェントとかは使ってくるので、その場合v0.10.30よりも前にする必要がある。(参考記事)
scikit-image
ライセンス: BSD-3-Clause(商用利用可)
NumPy・SciPy と親和性の高い画像処理ライブラリ。ディープラーニングではなく、フィルタリング・形態素解析・セグメンテーション・特徴抽出など古典的な画像処理アルゴリズムが豊富に揃っている。
学術・研究用途での実績が多く(学習がOpenCVより容易だそう)、コードの品質はピアレビューで担保されている。
主な機能:
- フィルタリング・エッジ検出(Canny, Sobel など)
- 画像セグメンテーション(watershed, SLIC など)
- 幾何変換・色空間変換
- 特徴量抽出(HOG, LBP など)
from skimage import io, filters
image = io.imread("image.png", as_gray=True)
edges = filters.sobel(image)
detectron2
ライセンス: Apache-2.0(商用利用可)
Facebook AI Research(現 Meta AI Research)が開発した物体検出・セグメンテーションフレームワーク。
PyTorchベースで動作し、Faster R-CNN, Mask R-CNN, Panoptic Segmentation, DensePose など最先端アルゴリズムを豊富にサポートする。モデルはTorchScript形式やCaffe2形式にエクスポートして本番環境へのデプロイが可能。
主な機能:
- 物体検出(Faster R-CNN, RetinaNet など)
- インスタンスセグメンテーション(Mask R-CNN)
- パノプティックセグメンテーション
- キーポイント検出(姿勢推定)
- 大規模な学習済みモデル Zoo
from detectron2.engine import DefaultPredictor
from detectron2.config import get_cfg
cfg = get_cfg()
# ... config設定後
predictor = DefaultPredictor(cfg)
outputs = predictor(image)
ライセンス早見表
| ライブラリ | ライセンス | 商用利用 | 備考 |
|---|---|---|---|
| OpenCV | Apache-2.0 | ✅ 可 | |
| Torchvision | BSD-3-Clause | ✅ 可 | |
| ultralytics | AGPL-3.0 / Enterprise | ⚠️ 要確認 | 商用は有償ライセンス必要 |
| YOLOX | Apache-2.0 | ✅ 可 | |
| MediaPipe | Apache-2.0 | ✅ 可 | |
| scikit-image | BSD-3-Clause | ✅ 可 | |
| detectron2 | Apache-2.0 | ✅ 可 |
使った範囲での使用感など
OpenCV
- いろいろ機能があって便利
- 特化してどうこうと言ったことなら他のものを使った方が良いかもしれないが、頑張ればこれだけでもできそう
Torchvision
- 自分では使っていないが、PyTorch使うのであれば便利そうだと思う。
- 学習済みデータセットはPyTorch (Meta) かTensorFlow (Google) というのが多いから自分で使わなくても内部では使っているということが多そう。
MediaPipe
- 人の姿勢判定が便利。人物を切り抜く時とかに「人体らしさ」とかを考えられるのは良い。
ultralytics
- 業務で使おうとしたら使えなかった。AGPLは厳しい。
- 個人的に使うなら便利そう。
その他
- 使ってないから正直わからないが、思ったことを書いておく。
- YOLOX: おおよそYOLOを互換できそうなので、使いやすくはありそう。
- scikit-image: どちらかというと学術目的になると思う。自分でチューニングするならアリかも。
- detectron2: ディープラーニング手法が色々あって面白そう。これも自分で精度の欲しい学習とかするなら良さそう。
終わりに
Pythonでの画像認識において、検索したときによくみるのがYOLOだったが、ultralyticsのライセンスがAGPLで商業利用が難しいので代替は何があるのかということで調べてみた。
これ以外にもライブラリはあるし、TensorFlowやPyTorchで使える学習済みモデルなども多くあるが、気になったものをまとめてみた。
最近だとLLMベースのもの(マルチモーダルLLM)も良い精度のものもあるらしいので(現行のモデルに突っ込んだら普通にやってくれると思うし)、ローカルLLMで良い精度のものが出ないかな、とか思う。
自分で使えるようになっていきたい。