結論

MediaPipeは、Googleが公開している、画像・動画から手・顔・体の位置(ランドマーク)を求めるオープンソースのライブラリです。Pythonでは pip install mediapipe で入れ、モデルファイル(.task)を読み込んで Tasks API で使います。以前の mp.solutions は今の版(0.10.30以降)には入っていません。

この記事でわかること

  • 手・顔・姿勢推定を自作の合成画像で動かした結果と処理時間
  • mp.solutions が無いエラーの原因と Tasks API への書き換え表
  • BGRのまま渡すと検出0件になるなど、OpenCVと組み合わせるときの落とし穴

2026年10月29日更新|mediapipe 1.2.0・0.10.21・Python 3.12で実行確認

MediaPipe を使う流れは、どのタスクでもほぼ同じです。画像を RGB の mp.Image にして、モデルを読み込んだタスクに渡し、返ってきた点の座標を使います。

flowchart TD
    A[カメラ・動画・画像] --> B[OpenCVで読む<br>色の順はBGR]
    B --> C[RGBに変換して<br>mp.Imageにする]
    M[モデル .task] --> D
    C --> D[Tasks API<br>HandLandmarkerなど]
    D --> E[ランドマーク<br>x・y・zの点]
    E --> F[描画・角度・判定]

よく調べられることの答えを先にまとめます。

知りたいこと 答え 詳しい節
MediaPipeとは Google のオープンソースの認識ライブラリ。手21点・顔478点・体33点などをCPUで求める MediaPipeとは
MediaPipe のインストール python -m pip install mediapipe。今の版は Python 3.9〜3.14、Intel Mac 向けは無い インストール
mp.solutions が使えない 0.10.30 から同梱されていない。Tasks API に書き換えるか、0.10.21 に固定する 旧Solutionsとの違い
MediaPipe の使い方(Python) モデル→Options→create_from_options→mp.Image→detect の5手順 Tasks APIの使い方
手の検出・姿勢推定のコード HandLandmarker・PoseLandmarker。結果は正規化座標(0〜1)の点の並び 手の検出/姿勢推定
OpenCV との組み合わせ cv2 は BGR。cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) を忘れると検出0件になった OpenCVとの組み合わせ
処理は速いか CPU 2コアで顔検出 2.2ms、手 19.9ms、姿勢 32.9ms(1枚・中央値) 処理時間の実測
エラーが出た 多いのはモデルのパス違い・色の順・実行モードとメソッドの不一致 よくあるエラー

確認環境:Ubuntu 24.04.5 LTS(Intel Xeon 2.10GHz・2 vCPU。ほかの作業と同居したマシン)の上で、Python 3.12.3 の venv に mediapipe 1.2.0(2026年10月27日公開の版)を pip で入れ、import・mp.Image の作成・各タスクの初期化・エラーの文言・描画の関数を実行しました。容量を抑えるため、依存の opencv-contrib-python 5.0.0.93 は opencv-python-headless 4.11.0.86 に入れ替えています(numpy 2.5.4)。Tasks API 用のモデル(.task)は、この環境から storage.googleapis.com への接続が拒否された(HTTP 403)ため取得できず、Tasks API の検出結果とモデルの一覧は Google の公式ドキュメントで確かめました。実際の検出は、PyPI から入れた mediapipe 0.10.21(旧 Solutions。モデルが同梱されている最後の系統)で行い、入力には OpenCV で描いた自作の合成画像(顔・開いた手・全身の図。実在の人の写真は使っていません)を使いました。カメラはこの環境に無いため、動画は自作の mp4 と、画像を少しずつずらしたフレームで代わりにしています。処理時間は、1回目を除いた10回の中央値です。図は mermaid 11.16.0 で描画を確かめています(確認日 2026年10月29日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「MediaPipeとは・使い方|Pythonで手・顔・姿勢推定と旧API移行」

MediaPipeとは(何ができるか・仕組み)

この節では、MediaPipe が何をするライブラリで、どんな部品からできているかが分かります。

MediaPipe は、Google が公開している機械学習の部品集で、画像・動画・音声・テキストを、学習済みのモデルで処理するためのライブラリです。いちばん使われているのは画像の認識で、カメラに映った手の関節21点、顔の478点、体の33点といった「ランドマーク(目印の点)」の座標を、GPU が無くても動く速さで求められます。Android・Web(JavaScript)・Python・iOS で同じタスクを使えるのが特徴です。ライセンスは Apache 2.0(PyPI の表示)です。

公式の説明では、MediaPipe Solutions は次の4つでできています。

1

MediaPipe Tasks

各言語から呼ぶ API とライブラリ。Python の mediapipe.tasks がこれ。

この記事の中心

2

MediaPipe Models

タスクごとの学習済みモデル。.task や .tflite のファイルで配られる。

別にダウンロードする

3

Model Maker

自分のデータでモデルを作り直す道具。ジェスチャー認識・画像分類・物体検出などが対象。

カスタマイズ用

4

MediaPipe Studio

ブラウザでタスクを試し、比べる画面。コードを書かずに結果を見られる。

試す用

ランドマークと「検出」の違い

MediaPipe の結果には、大きく2種類あります。

  • 検出(Detection):「どこに顔があるか」を四角い枠(バウンディングボックス)で返します。顔検出(Face Detector)や物体検出がこれです。
  • ランドマーク(Landmark):手の指先・肘・目尻など、決まった部位の点の座標を返します。手(Hand Landmarker)・顔(Face Landmarker)・姿勢(Pose Landmarker)がこれで、「姿勢推定」は体のランドマークを求めることを指します。

どちらも、中では「まず対象のおおよその場所を見つけるモデル」と「その範囲を切り出して細かい点を求めるモデル」の2段で動きます。手なら手のひらの検出→21点、姿勢なら人の検出→33点です。動画では、前のフレームの位置を使って1段目を省く(トラッキング)ため、静止画より速くなります。この差は後の節で実測しています。モデルの中身(ニューラルネットワーク)の仕組みは、関連記事「ニューラルネットワークとは|仕組み・学習・AttentionをNumPyで実演」で扱っています。

なお、MediaPipe の顔のタスクは「顔がどこにあるか・どんな形か」を求めるもので、「誰の顔か」を見分ける顔認証の機能はありません。

MediaPipeでできること(タスク一覧と対応環境)

この節では、MediaPipe の画像系のタスクで何が分かるか、Python で使えるか、以前の Solutions では何という名前だったかが分かります。

画像系のタスクは11種類あり、公式の対応表では全部が Python に対応しています。以前の Solutions の名前で書かれた記事やコードを読むときは、右の列で対応を確かめます。

タスク(Python のクラス) 分かること 以前の Solutions
Face Detector(FaceDetector) 顔の枠と6点(両目・鼻先・口・両耳の付け根) Face Detection
Face Landmarker(FaceLandmarker) 顔の478点、表情の係数52個 Face Mesh・Iris
Hand Landmarker(HandLandmarker) 手の21点、左右の判定 Hands
Gesture Recognizer(GestureRecognizer) 手の形(グー・パー・親指を立てる等)+手の21点 なし(新しく追加)
Pose Landmarker(PoseLandmarker) 体の33点、人の領域のマスク(任意) Pose
Holistic Landmarker(HolisticLandmarker) 顔・両手・体をまとめて Holistic
Object Detector(ObjectDetector) 物の種類と枠 Object Detection
Image Segmenter(ImageSegmenter) 画素ごとの分類(人・髪・背景など) Selfie/Hair Segmentation
Image Classifier・Image Embedder・Interactive Segmenter 画像の分類、特徴ベクトル、指定した点の物体の切り抜き なし

このほか、音声の分類(audio)、テキストの分類・言語の判定(text)も Python から使えます。1.2.0 の mediapipe.tasks.python.vision を実際に読み込むと、上の表のクラスがすべて入っていました(HolisticLandmarker も含む)。

以前の Solutions のうち、Box Tracking・Objectron・KNIFT・AutoFlip などは後継が無いまま、2023年3月1日でサポートが終わっています(公式の「Legacy solutions」の記載)。

MediaPipeのインストール(pip・Pythonの版・OS)

この節では、MediaPipe を Python に入れる手順と、入るものの大きさ、対応する Python・OS が分かります。

venv(仮想環境)を作り、python -m pip install mediapipe で入れます。公式の Python 向けページは「Python 3.9 以降」「pip 20.3 以降」としています。

1

venv を作って有効にする

プロジェクトのフォルダーで python -m venv .venv。Linux・Mac は source .venv/bin/activate、Windows は .venv\Scripts\activate。

ほかの OpenCV と混ざらないようにする

2

pip で入れる

python -m pip install mediapipe。手元では依存を含めて21個のパッケージが入った。

約480MB

3

版を確かめる

python -c "import mediapipe as mp; print(mp.__version__)" で 1.2.0 と出ることを見る。

import に約0.6秒

4

モデルを取得する

使うタスクの .task ファイルを公式のページからダウンロードし、コードから読める場所に置く。pip では入らない。

次の節で一覧

python -m venv .venv
source .venv/bin/activate
python -m pip install mediapipe
python -c "import mediapipe as mp; print(mp.__version__)"
Successfully installed absl-py-2.5.1 certifi-2026.10.23 cffi-2.1.1 contourpy-1.4.0 cycler-0.12.1 flatbuffers-25.12.19 fonttools-4.68.0 kiwisolver-1.5.1 matplotlib-3.11.2 mediapipe-1.2.0 numpy-2.5.4 opencv-contrib-python-5.0.0.93 packaging-26.3 pillow-13.0.0 pycparser-3.12 pyparsing-3.3.3 python-dateutil-3.0.0 six-1.17.0 sounddevice-0.5.6 tzdata-2026.6
1.2.0

venv の作り方と、有効にできないときの直し方は関連記事「Python venvの使い方|作成・有効化コマンド早見表と有効化できない時の直し方」で扱っています。

入るものの大きさ(実測)

venv 全体で 483MB になり、いちばん大きいのは MediaPipe 本体ではなく、依存の opencv-contrib-python(206MB)でした。

パッケージ 入った版 大きさ 役割
opencv-contrib-python 5.0.0.93 206MB 描画の関数が使う。画像の読み書き
mediapipe 1.2.0 124MB 本体(中身はほぼ libmediapipe.so の1ファイル)
numpy 2.5.4 57MB 画像の配列
matplotlib・fonttools ほか 3.11.2 ほか 約77MB 3次元の点を描く関数が使う

1.2.0 では、import mediapipe の時点で描画用のモジュールが読み込まれ、その中で cv2 と matplotlib が import されます。手元で sys.modules を見ると、import mediapipe だけで両方が読み込まれていました。import にかかった時間は5回で 598〜696ms で、そのうち numpy・cv2・matplotlib だけで約480ms でした。

容量を抑えたい場合、opencv-contrib-python を opencv-python-headless(画面表示の機能を除いた版)に入れ替えても、import・画像の作成・描画は動きました。ただし pip は依存が足りないと警告します。

$ pip check
mediapipe 1.2.0 requires opencv-contrib-python, which is not installed.

pip の版の指定や requirements.txt の書き方は、関連記事「pipコマンド一覧|installのバージョン指定とrequirements.txt」で扱っています。

対応する Python と OS(PyPI で確認)

1.x の wheel は Python の版を問わない形(py3-none)で配られ、PyPI の分類は Python 3.9〜3.14 です。Intel Mac 向けの wheel は 0.10.21(2025年2月6日公開)が最後です。

版(公開日) 配られている環境 Python 主な依存
1.2.0(2026年10月27日) Windows x64・ARM64、Mac(Apple シリコン)、Linux x86_64・aarch64 3.9〜3.14 numpy・opencv-contrib-python・matplotlib ほか
0.10.30(2025年12月16日) Windows x64、Mac(Apple シリコン)、Linux x86_64 py3 共通 absl-py・numpy・sounddevice・flatbuffers の4つ
0.10.21(2025年2月6日) Windows x64、Mac(Intel・Universal)、Linux x86_64 3.9〜3.12 numpy<2・protobuf 4・jax・jaxlib ほか

合う wheel が無い環境では、pip は次のように止まります。Python 3.13 で 0.10.21 を指定したときの原文です(3.13 向けの wheel が無いため、選べる版に 0.10.30 以降だけが並びます)。

ERROR: Could not find a version that satisfies the requirement mediapipe==0.10.21 (from versions: 0.10.30, 0.10.31, 0.10.32, 0.10.33, 0.10.35, 1.0.0, 1.0.1, 1.1.0, 1.1.1, 1.2.0)
ERROR: No matching distribution found for mediapipe==0.10.21

Intel Mac(macosx_11_0_x86_64)+Python 3.13 を指定して取得しようとすると、(from versions: none) となり、どの版も選べませんでした。Intel Mac で使うなら、Python 3.12 以下+0.10.21 という組み合わせになります。

旧Solutions(mp.solutions)とTasks APIの違い

この節では、mp.solutions を使うコードが動かなくなった理由と、Tasks API への書き換え方が分かります。

以前の書き方 mp.solutions.hands などは、0.10.30 以降の pip の配布物に入っていません。ネットで多く見かけるコードをそのまま 1.2.0 で動かすと、次のエラーになります。

$ python -c "import mediapipe as mp; mp.solutions.hands"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AttributeError: module 'mediapipe' has no attribute 'solutions'

1.2.0 の mediapipe の直下にあったのは Image・ImageFormat・tasks の3つだけでした。PyPI の wheel の中身(ファイルの一覧)を版ごとに数えると、違いがはっきりします。

版 ファイル数 solutions のファイル 同梱のモデル(.tflite) 中心の仕組み
0.10.21 760 23 14 Python の拡張モジュール
0.10.30 168 0 0 libmediapipe.so(C の API)
1.2.0 165 0 0 libmediapipe.so(C の API)

同じ「手の検出」でも書き方が違う

以前の Solutionsmp.solutions.hands.Hands() を作り、NumPy の配列を process() に渡す。モデルは pip の中に入っていた
→
Tasks API.task のパスを Options に書き、mp.Image を detect() に渡す。モデルは自分で取得して置く

公式は Solutions のサポートを2023年3月1日に終えている

書き換え対応表(手・姿勢・顔)

以前の Solutions Tasks API 注意
mp.solutions.hands.Hands vision.HandLandmarker モデル hand_landmarker.task が必要
static_image_mode=True running_mode=RunningMode.IMAGE 動画は VIDEO、カメラは LIVE_STREAM
max_num_hands=2 num_hands=2 既定はどちらも1
min_detection_confidence min_hand_detection_confidence タスクごとに名前が変わる
hands.process(rgb_array) landmarker.detect(mp_image) 配列をそのまま渡せない
results.multi_hand_landmarks result.hand_landmarks .landmark を付けずにリストとして読む
multi_handedness[i].classification[0].label handedness[i][0].category_name 値は Left・Right
mp.solutions.pose.Pose(model_complexity=0/1/2) vision.PoseLandmarker+lite/full/heavy の .task モデルのファイルで重さを選ぶ
results.pose_landmarks.landmark result.pose_landmarks[0] 複数人に対応した形(num_poses)
FaceDetection(model_selection=0/1) vision.FaceDetector+short_range/full_range 枠はピクセル単位(origin_x・origin_y・width・height)
FaceMesh(refine_landmarks=True) vision.FaceLandmarker 478点。表情の係数は output_face_blendshapes=True

0.10.21 に固定して以前のコードを動かす判断

以前のコードを今すぐ動かす必要があるだけなら、Python 3.12 以下で pip install mediapipe==0.10.21 とする方法があります。手元でも、0.10.21 の mp.solutions は動き、この記事の検出の実物はこの版で取りました。ただし次の制約があります。

  • Python 3.13 以降では入りません(上の pip のエラー)。
  • 依存に numpy<2・protobuf<5・jax・jaxlib があり、新しいライブラリと同じ venv に入れるとぶつかりやすくなります。
  • 同梱されていないモデル(姿勢の lite と heavy)は、初回に storage.googleapis.com から自動でダウンロードされます。オフラインや社内のプロキシの下では、ここで止まります(エラーの節に原文)。
  • 公式のサポートは終わっており、不具合が直る見込みはありません。

新しく書くコードは Tasks API で書き、以前のコードは上の対応表で少しずつ置き換えるのが安全です。

Tasks APIの使い方(モデル・Options・実行モード)

この節では、Tasks API の共通の書き方(5手順)と、モデルの取得先、3つの実行モードの違いが分かります。

どのタスクも「モデルのパス → Options → create_from_options → mp.Image → detect」の順で書きます。クラス名の「Hand」を「Pose」「Face」に替えれば、ほぼ同じ形で使えます。

  1. 1モデルを置くhand_landmarker.task などを公式のページから取得する
  2. 2BaseOptions にパスを書くpython.BaseOptions(model_asset_path="...")
  3. 3タスクの Options を作る実行モード・検出する数・しきい値
  4. 4create_from_options でタスクを作るwith 文で使うと最後に閉じられる
  5. 5mp.Image を渡して結果を受け取るdetect・detect_for_video・detect_async

モデルファイルの一覧(公式)

モデルは各タスクの公式ページの「Models」に載っており、次の形の URL で配られています(いずれも float16)。

https://storage.googleapis.com/mediapipe-models/hand_landmarker/hand_landmarker/float16/latest/hand_landmarker.task
https://storage.googleapis.com/mediapipe-models/pose_landmarker/pose_landmarker_lite/float16/latest/pose_landmarker_lite.task
https://storage.googleapis.com/mediapipe-models/face_detector/blaze_face_short_range/float16/latest/blaze_face_short_range.tflite
https://storage.googleapis.com/mediapipe-models/face_landmarker/face_landmarker/float16/latest/face_landmarker.task
タスク モデルのファイル 入力の大きさ(公式)
手 hand_landmarker.task 192×192 と 224×224(手のひら検出+21点)
姿勢 pose_landmarker_lite/full/heavy.task 人の検出 224×224、33点 256×256
顔検出 blaze_face_short_range.tflite(近距離)ほか 128×128
顔ランドマーク face_landmarker.task 顔検出+478点+表情の3つのモデル入り

この環境では、上の URL への接続がプロキシに拒否され(curl: (56) CONNECT tunnel failed, response 403)、モデルを取得できませんでした。社内のネットワークで同じことが起きたら、ブラウザで取得したファイルを置くか、取得先を許可してもらいます。

3つの実行モード

running_mode 入力 呼ぶメソッド 結果の受け取り方
IMAGE(既定) 1枚の画像 detect(image) 戻り値
VIDEO 動画ファイルのフレーム detect_for_video(image, ts_ms) 戻り値(前のフレームを使って追跡)
LIVE_STREAM カメラの映像 detect_async(image, ts_ms) result_callback に届く

VIDEO と LIVE_STREAM では、フレームごとにミリ秒のタイムスタンプを渡します。値は前のフレームより大きくなければなりません。実行モードとコールバックの組み合わせが合わないと、モデルを読む前に次のエラーになりました(1.2.0 の原文)。

ValueError: The vision task is in live stream mode, a user-defined result callback must be provided.
ValueError: The vision task is in image or video mode, a user-defined result callback should not be provided.

mp.Image の作り方

入力はファイルからも、NumPy の配列からも作れます。

import mediapipe as mp
import numpy as np

image = mp.Image.create_from_file("hand.png")          # ファイルから(RGBで読まれる)
rgb = np.zeros((480, 640, 3), np.uint8)                 # 高さ・幅・3チャンネル
image = mp.Image(image_format=mp.ImageFormat.SRGB, data=rgb)
print(image.width, image.height, image.channels)       # 640 480 3

1.2.0 の ImageFormat には SRGB・SRGBA・GRAY8・GRAY16・SRGB48・SRGBA64・VEC32F1・VEC32F2・VEC32F4 がありました。640×480 の配列からの作成は1枚 0.06〜0.07ms で、処理全体から見ればほぼ無視できる時間です。配列の作り方・形の変え方は関連記事「NumPyの使い方 基本一覧|配列の作成・演算・形状変更」で扱っています。

手の検出(Hand Landmarker)の使い方と21点

この節では、手のランドマークを求めるコードと、結果の読み方、左右の判定の注意が分かります。

HandLandmarker は、手のひらを見つけたあと、手首・指の関節・指先の21点の座標を返します。公式の Python ガイドの形に沿ったコードです。

import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

base_options = python.BaseOptions(model_asset_path="hand_landmarker.task")
options = vision.HandLandmarkerOptions(base_options=base_options, num_hands=2)

with vision.HandLandmarker.create_from_options(options) as landmarker:
    image = mp.Image.create_from_file("hand.png")
    result = landmarker.detect(image)

for i, hand in enumerate(result.hand_landmarks):
    label = result.handedness[i][0].category_name   # Left / Right
    tip = hand[8]                                   # 人差し指の先
    print(label, round(tip.x, 3), round(tip.y, 3), round(tip.z, 3))

結果(HandLandmarkerResult)の中身は、1.2.0 で調べると handedness・hand_landmarks・hand_world_landmarks の3つでした。点(NormalizedLandmark)は x・y・z・visibility・presence・name を持ちます。

  • x・y:画像の幅・高さを1とした位置(0〜1)。ピクセルにするには幅・高さを掛けます。
  • z:手首を基準にした奥行き。値が小さいほどカメラに近い。
  • hand_world_landmarks:画像の大きさに左右されない3次元の座標。

21点の番号

番号 部位 番号 部位
0 手首(WRIST) 9〜12 中指(12が先)
1〜4 親指(4が先) 13〜16 薬指(16が先)
5〜8 人差し指(8が先) 17〜20 小指(20が先)

自作の画像で動かした結果

Tasks API のモデルは取得できなかったため、同じ「手のひら検出+21点」の構成を持つ 0.10.21 の Solutions で、OpenCV で描いた開いた手の図(640×480)を処理しました。

import cv2
import mediapipe as mp   # 0.10.21

img = cv2.cvtColor(cv2.imread("hand.png"), cv2.COLOR_BGR2RGB)
with mp.solutions.hands.Hands(static_image_mode=True, max_num_hands=2) as hands:
    r = hands.process(img)
h = r.multi_handedness[0].classification[0]
lm = r.multi_hand_landmarks[0].landmark
print(h.label, round(h.score, 3), len(lm))
print("wrist", round(lm[0].x, 3), round(lm[0].y, 3), "index_tip", round(lm[8].x, 3), round(lm[8].y, 3), round(lm[8].z, 3))
Right 0.878 21
wrist 0.487 0.832 index_tip 0.69 0.195 -0.167

線で描いただけの手でも21点がそろい、点を描き戻すと指の関節の位置に重なりました。人差し指の先の z が -0.167 と、手首より手前と判定されています。

左右(handedness)は鏡に映った前提

公式のドキュメント(Solutions の Hands)は、左右の判定は「入力が左右反転された画像(自撮りのカメラ)である」前提で、そうでなければアプリ側で左右を入れ替えるよう説明しています。同じ画像を cv2.flip(img, 1) で左右反転すると、判定が入れ替わりました。

入力 判定 スコア
元の画像(640×480) Right 0.878
左右反転 Left 0.619
半分に縮小(320×240) Right 0.661
4分の1に縮小(160×120) Right 0.768
90度回転・180度回転 Right 0.770・0.852
BGR のまま(RGB に変換しない) 検出なし ―
白黒にしてから3チャンネルに戻す 検出なし ―

背面のカメラや、反転していない動画を使うときは、表示の左右と判定の左右が逆になることがあります。必要なら判定を入れ替えるか、入力を反転してから渡します。なお、この結果は肌の色だけで描いた図の場合で、色の情報を失うと検出できませんでした。実際の写真では結果が変わることがあります。

Options の既定値(公式)は、num_hands が1、min_hand_detection_confidence・min_hand_presence_confidence・min_tracking_confidence がいずれも0.5です。1.2.0 の HandLandmarkerOptions の引数を調べても同じ値でした。

顔検出と顔ランドマーク(Face Detector・Face Landmarker)

この節では、顔の枠だけを求める Face Detector と、顔の形を478点で求める Face Landmarker の使い分けが分かります。

「顔があるか・どこか」だけなら Face Detector、目・口の形や表情まで必要なら Face Landmarker を使います。

Face Detector(顔検出)

顔の枠と6点(両目・鼻先・口・両耳の付け根)

0.10.21 に同梱の近距離用モデルは 0.22MB。手元で1枚 2.2ms

人数を数える・顔の位置で切り抜く

Face Landmarker(顔ランドマーク)

顔の478点と、表情の係数52個(任意)

顔検出のモデルを内側に含む

まばたき・口の開き・顔の向きを求める

from mediapipe.tasks import python
from mediapipe.tasks.python import vision
import mediapipe as mp

options = vision.FaceDetectorOptions(
    base_options=python.BaseOptions(model_asset_path="blaze_face_short_range.tflite"),
    min_detection_confidence=0.5)
with vision.FaceDetector.create_from_options(options) as detector:
    result = detector.detect(mp.Image.create_from_file("face.png"))
for d in result.detections:
    b = d.bounding_box                     # ピクセル単位
    print(d.categories[0].score, b.origin_x, b.origin_y, b.width, b.height, len(d.keypoints))

Tasks API の枠(BoundingBox)は origin_x・origin_y・width・height のピクセル単位で、6点(NormalizedKeypoint)は 0〜1 の座標です。以前の Solutions の枠は 0〜1 の比率(relative_bounding_box)だったので、書き換えのときに単位が変わる点に注意します。

自作の画像で動かした結果(0.10.21)

顔だけを大きく描いた画像(face.png)と、全身の図の中に小さな顔がある画像(body.png)で、近距離用と遠距離用のモデルを比べました。

モデル face.png(顔が大きい) body.png(顔が小さい) 何も無い画像 時間(中央値)
近距離(model_selection=0) 1件・0.884 1件・0.812 0件 2.2ms
遠距離(model_selection=1) 1件・0.812 1件・0.894 0件 4.8ms
顔の478点(FaceMesh・refine) 478点 ― 0点 4.9ms

大きな顔は近距離用、小さな顔は遠距離用のほうがスコアが高く、モデルの説明(近距離=自撮り、遠距離=背面のカメラ)のとおりの差が出ました。face.png の枠は比率で x 0.325・y 0.339・幅 0.369・高さ 0.492、点は6つでした。refine を有効にした FaceMesh は虹彩の点を含む478点で、Tasks API の Face Landmarker と同じ点の数です。

OpenCV の顔検出(Haar)との比較

OpenCV に入っている Haar 特徴の顔検出(haarcascade_frontalface_default.xml)でも、同じ2枚で顔を1件ずつ見つけました。時間は face.png で 40.2ms、body.png で 47.2ms で、MediaPipe の近距離用(2.2ms)より1桁遅い結果でした。Haar は点(目・鼻の位置)を返さないため、顔の向きや表情を扱うなら MediaPipe が向いています。

顔の画像は、人によっては個人情報にあたります。社内のシステムで扱うときは、保存するか・座標だけ残すか・誰が見られるかを先に決めておきます。

姿勢推定(Pose Landmarker)の使い方と33点

この節では、体の33点を求めるコード、点の番号、関節の角度の求め方、モデルの選び方が分かります。

PoseLandmarker は、人を見つけたあと、顔(0〜10)・上半身(11〜22)・下半身(23〜32)の33点を返します。運動のフォームの確認、姿勢の記録、ジェスチャーの操作などに使われます。

from mediapipe.tasks import python
from mediapipe.tasks.python import vision
import mediapipe as mp

options = vision.PoseLandmarkerOptions(
    base_options=python.BaseOptions(model_asset_path="pose_landmarker_lite.task"),
    running_mode=vision.RunningMode.IMAGE,
    num_poses=1,
    output_segmentation_masks=False)
with vision.PoseLandmarker.create_from_options(options) as landmarker:
    result = landmarker.detect(mp.Image.create_from_file("body.png"))
if result.pose_landmarks:
    nose = result.pose_landmarks[0][0]
    print(len(result.pose_landmarks[0]), nose.x, nose.y, nose.visibility)
番号 部位
0〜10 鼻、左右の目(内側・中央・外側)、左右の耳、口の左右
11・12 左肩・右肩
13〜16 左右の肘(13・14)、左右の手首(15・16)
17〜22 左右の小指・人差し指・親指
23〜28 左右の腰(23・24)、膝(25・26)、足首(27・28)
29〜32 左右のかかと、つま先

自作の全身の図で動かした結果(0.10.21・model_complexity=1)

body.png: landmarks=33 med=32.9ms nose=(0.501,0.135) vis=1.000 Lwrist=(0.727,0.508) vis=0.950 world=True
face.png: none med=11.7ms
blank.png: none med=10.5ms

全身の図では33点がそろい、点を描き戻すと肩・肘・膝・足首の位置に重なりました。顔だけの画像と何も無い画像では、人が見つからず結果は空でした。「LEFT(左)」は写っている人から見た左で、正面を向いた人の左手首は画像の右側(x 0.727)に出ます。

関節の角度を求める

3点の座標から角度を求めれば、肘や膝の曲がり具合を数値にできます。正規化座標のままでは縦横比がずれるので、先にピクセルに直します。

import numpy as np

def angle(a, b, c):
    """b を頂点とした角度(度)"""
    ba, bc = a - b, c - b
    cos = np.dot(ba, bc) / (np.linalg.norm(ba) * np.linalg.norm(bc))
    return np.degrees(np.arccos(np.clip(cos, -1.0, 1.0)))

h, w = 640, 480
lm = result.pose_landmarks[0]            # 0.10.21 では results.pose_landmarks.landmark
p = lambda i: np.array([lm[i].x * w, lm[i].y * h])
print(round(angle(p(11), p(13), p(15)), 1))   # 左肩・左肘・左手首
LEFT_SHOULDER 300 166 1.0
LEFT_ELBOW 330 249 0.985
LEFT_WRIST 349 324 0.95
173.4

腕をほぼまっすぐ下ろした図なので、左肘の角度は173.4度でした。visibility(見えている確からしさ)が低い点は、隠れていたり画面の外だったりするので、角度の計算から外すと安定します。

lite・full・heavy の選び方

モデルは lite(軽い)・full・heavy(重いが精度が高い)の3つで、入力の大きさは同じです(公式)。以前の Solutions の model_complexity は 0=lite、1=full、2=heavy にあたります。0.10.21 の pip の配布物には full だけが入っており、lite と heavy は初回に自動でダウンロードされる作りでした。まず lite でカメラの速さを確かめ、精度が足りなければ full、heavy へ上げます。

OpenCVとの組み合わせ(カメラ・動画・BGRとRGB)

この節では、OpenCV で読んだカメラ・動画を MediaPipe に渡す書き方と、色の順・タイムスタンプ・描画の注意が分かります。

OpenCV の cv2.imread や VideoCapture が返す画像は BGR の順です。MediaPipe は RGB を前提にしているので、渡す前に必ず変換します。

BGR pixel [36, 118, 196] -> RGB [196, 118, 36]

この変換を忘れても、エラーは出ません。手の節の表のとおり、手の図を BGR のまま渡すと検出が0件になりました。「エラーは出ないのに何も検出されない」ときは、まず色の順を疑います。

動画ファイルを VIDEO モードで処理する

import cv2
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

options = vision.PoseLandmarkerOptions(
    base_options=python.BaseOptions(model_asset_path="pose_landmarker_lite.task"),
    running_mode=vision.RunningMode.VIDEO)

cap = cv2.VideoCapture("input.mp4")
fps = cap.get(cv2.CAP_PROP_FPS)
with vision.PoseLandmarker.create_from_options(options) as landmarker:
    i = 0
    while True:
        ok, frame = cap.read()
        if not ok:
            break
        rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=rgb)
        result = landmarker.detect_for_video(mp_image, int(i * 1000 / fps))
        i += 1
cap.release()

自作の 30fps・60フレームの mp4 で、このループの前半(読み込み→変換→mp.Image)を 1.2.0 で動かしました。

fps 30.0 frames 60
read 60 frames; cvtColor 0.093 ms/frame; mp.Image 0.541 ms/frame
timestamps(ms) first5 [0, 33, 66, 100, 133] last 1966

色の変換は1フレーム 0.09ms、mp.Image の作成は 0.54ms で、推論(手で約20ms)に比べれば小さな時間です。タイムスタンプは i * 1000 / fps で 0・33・66・100… と増えていきます。同じ値を2回渡したり、逆戻りさせたりしないようにします。

カメラを LIVE_STREAM モードで処理する

import time
import cv2
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

def on_result(result, output_image, timestamp_ms):
    print(timestamp_ms, len(result.hand_landmarks))

options = vision.HandLandmarkerOptions(
    base_options=python.BaseOptions(model_asset_path="hand_landmarker.task"),
    running_mode=vision.RunningMode.LIVE_STREAM,
    result_callback=on_result)

with vision.HandLandmarker.create_from_options(options) as landmarker:
    cap = cv2.VideoCapture(0)
    while cap.isOpened():
        ok, frame = cap.read()
        if not ok:
            break
        frame = cv2.flip(frame, 1)                       # 自撮りの向きにそろえる
        rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        landmarker.detect_async(mp.Image(image_format=mp.ImageFormat.SRGB, data=rgb),
                                int(time.monotonic() * 1000))
    cap.release()

LIVE_STREAM では、結果は別のスレッドからコールバックに届きます。画面に描くときは、コールバックで結果を変数にしまい、メインのループで描くと扱いやすくなります。この環境にはカメラが無いため、このコードは公式の Python ガイドの形に沿って書いたもので、カメラでは動かしていません。

点を画像に描く(1.2.0 の drawing_utils)

1.2.0 にも描画の関数があり、Tasks API の結果(点のリスト)をそのまま渡せます。手元では、自分で作った21点を描かせて動作を確かめました(1回 0.58ms)。

from mediapipe.tasks.python.vision import drawing_utils, HandLandmarksConnections

for hand in result.hand_landmarks:
    drawing_utils.draw_landmarks(frame, hand, HandLandmarksConnections.HAND_CONNECTIONS)
cv2.imwrite("out.png", frame)        # frame は OpenCV の BGR の画像

エラーにならない落とし穴(実測)

  • 1BGR のまま渡さないエラーは出ず、手の図の検出が0件になった。cv2.cvtColor で RGB にする
  • 2透過 PNG(4チャンネル)を SRGB で渡さない1.2.0 はエラーにせず受け取り、2画素目が [255, 10, 20] と色がずれた。SRGBA を指定するか、3チャンネルに変換する
  • 3mp.Image は変数に入れてから使うmp.Image(...).numpy_view() と1行で書くと、3回とも [45, 121, 70] などでたらめな値になった。変数に入れれば正しい値
  • 4cv2.imread の戻り値を確かめるパスが違うと None が返り、次の行で AttributeError になる。if img is None で止める

画像のサイズ変更や形式の変換を先に済ませたい場合は、関連記事「Python Pillowで画像処理|リサイズ・トリミング・形式変換のコード集」で扱っています。Pillow で開いた画像は RGB なので、np.asarray(img.convert("RGB")) をそのまま mp.Image に渡せます。

MediaPipeの処理時間の実測(CPUだけで何ms?)

この節では、GPU の無い2コアの環境で、顔・手・姿勢の処理に1枚あたり何 ms かかったかが分かります。

2.2ms顔検出(近距離)640×480・1枚の中央値
19.9ms手の21点(full)動画の追跡では 8.8ms
32.9ms姿勢の33点(full)人がいない画像は 10.5ms
処理(0.10.21・CPU) 対象が写った画像 何も無い画像 範囲(10回)
顔検出・近距離 2.2ms 1.9ms 1.7〜9.6ms
顔検出・遠距離 4.8ms 4.7ms 4.6〜5.2ms
顔の478点 4.9ms 2.0ms 4.7〜5.1ms
手・lite(model_complexity=0) 14.6ms 9.1ms 13.2〜20.2ms
手・full(model_complexity=1) 19.9ms 10.2ms 19.2〜21.3ms
姿勢・full 32.9ms 10.5ms 29.8〜36.5ms
(参考)OpenCV Haar の顔検出 40.2ms 11.1ms ―

何も無い画像で速いのは、1段目の検出で対象が見つからず、2段目(点を求めるモデル)を動かさないためです。手の lite は full より約3割速く、スコアは 0.533 と低めでした。

動画では追跡で半分以下になる

手の図を1フレームに3ピクセルずつ横に動かした60フレームを、静止画として毎回検出する設定と、追跡を使う設定で比べました。

設定 検出できたフレーム 1フレームの中央値 最初のフレーム
static_image_mode=True(毎回検出) 60/60 19.8ms 46.8ms
static_image_mode=False(追跡) 60/60 8.8ms 55.0ms

追跡では2フレーム目以降の手のひら検出が省かれ、19.8ms から 8.8ms に縮みました。Tasks API では VIDEO・LIVE_STREAM モードがこの追跡にあたり、公式も「遅延を減らすために追跡を使う」と説明しています。30fps(1フレーム33ms)に間に合わせたいなら、動画には IMAGE ではなく VIDEO を使います。

公式が載せている Pixel 6 での値は、手(full)が CPU 17.12ms・GPU 12.27ms、顔検出(近距離)が CPU 2.94ms・GPU 7.41ms です。小さなモデルでは GPU のほうが遅いこともある、という点も参考になります。手元の値は、ほかの作業と同居した2コアのマシンでの値で、マシンや画像によって変わります。

MediaPipeのよくあるエラーと直し方

この節では、MediaPipe で出たエラーの原文と、その原因・直し方が分かります。

多いのは「モデルのパス」「入力の形と色」「実行モードの組み合わせ」の3つです。原文はすべて手元で出たものです。

エラーの原文 原因 直し方
AttributeError: module 'mediapipe' has no attribute 'solutions' 0.10.30 以降に Solutions が入っていない Tasks API に書き換える。急ぐなら Python 3.12 以下で 0.10.21
FileNotFoundError: Unable to open file at hand_landmarker.task モデルが無い・パスが違う(1.2.0) モデルを取得し、絶対パスか実行場所からの相対パスを書く
RuntimeError: Unable to open file at /…/hand_landmarker.task 同じ原因(0.10.21 の Tasks API は RuntimeError) 同上
RuntimeError: Unable to open zip archive. .task として壊れたファイル(途中で切れたダウンロード、HTML のエラーページの保存など) ファイルの大きさを確かめ、取得し直す
ValueError: The model is not a valid Flatbuffer buffer model_asset_buffer にモデルでないバイト列を渡した open(…, "rb").read() で読んだモデルを渡す
ValueError: The vision task is in live stream mode, a user-defined result callback must be provided. LIVE_STREAM なのに result_callback が無い コールバックを渡す。不要なら VIDEO にする
ValueError: Unsupported image format: SRGB (expected VEC32F1, VEC32F2, or VEC32F4 for float data) float の配列を SRGB で渡した uint8(0〜255)に直す
FileNotFoundError: Can't find file: nofile.jpg create_from_file のパスが違う パスと実行場所を確かめる
ValueError: Input image must contain three channel rgb data. 0.10.21 の Solutions に4チャンネル(透過 PNG)を渡した cv2.COLOR_BGRA2RGB で3チャンネルにする
IndexError: tuple index out of range 0.10.21 の Solutions に白黒(2次元)の配列を渡した cv2.COLOR_GRAY2RGB で3チャンネルにする
TypeError: Cannot cast array data from dtype('float32') to dtype('uint8') according to the rule 'safe' 0.10.21 の Solutions に float の配列を渡した (img * 255).astype(np.uint8)
AttributeError: 'NoneType' object has no attribute 'shape' cv2.imread が読めず None を返した 直前の can't open/read file の警告を見てパスを直す
ValueError: _graph is None in SolutionBase close した(with を抜けた)あとに process を呼んだ with の中で処理する

以前の Solutions でモデルの自動ダウンロードが止まる

0.10.21 で姿勢の model_complexity=0 か 2 を指定すると、同梱されていないモデルを storage.googleapis.com の mediapipe-assets から取得しにいきます。この環境では、プロキシに拒否されて次のように止まりました。回線が無い環境では、末尾の文言が名前解決の失敗などに変わります。

Downloading model to /…/site-packages/mediapipe/modules/pose_landmark/pose_landmark_lite.tflite
URLError: <urlopen error Tunnel connection failed: 403 Forbidden>

社内のネットワークで使うなら、接続できる環境で一度取得したファイルを同じ場所に置くか、同梱されている model_complexity=1 を使います。

pip で入らない・ぶつかる

  • No matching distribution found for mediapipe:その Python・OS 向けの wheel がありません。Intel Mac、32ビットの Python、3.13 以降での 0.10.21 指定で起きます。python -VV で版とビット数を確かめます。
  • OpenCV が2種類入っている:opencv-python と opencv-contrib-python と opencv-python-headless は、どれも同じ cv2 という名前で入ります。複数入れると、後から入れたものが上書きし、消すと共有のファイルまで消えることがあります。venv を分け、1種類だけにします。

判断表:MediaPipeのAPI・モデル・版の選び方

この節では、作りたいものに合わせて、どの API・モデル・版を選ぶかが分かります。

やりたいこと・状況 選ぶもの 理由
新しく Python で作る 最新版+Tasks API Solutions はサポート終了。今の pip に入っていない
以前のコードをすぐ動かす Python 3.12 以下+0.10.21 に固定 書き換えずに動く。ただし numpy<2 など制約が多い
Intel Mac で動かす Python 3.12 以下+0.10.21、または別の環境 0.10.30 以降に Intel Mac 向けの wheel が無い
顔があるかだけ知りたい Face Detector(近距離/遠距離) 最も軽い。手元で 2.2ms
まばたき・口・表情 Face Landmarker+blendshapes 478点と52個の係数が出る
手の形でボタン操作 Gesture Recognizer 手の21点に加え、決まった手の形の名前が返る
フォーム確認・関節の角度 Pose Landmarker(まず lite) 33点と visibility。足りなければ full・heavy
カメラでリアルタイム LIVE_STREAM(動画ファイルは VIDEO) 追跡で1フレームの時間が半分以下になった
ブラウザだけで動かす Web 版(JavaScript の Tasks) 同じタスクとモデルが Web にもある(公式の対応表)

MediaPipe と OpenCV の違い

よく一緒に名前が出ますが、役割が違います。OpenCV は画像を読む・変換する・描く・カメラを扱う道具箱で、MediaPipe は学習済みのモデルで「手・顔・体がどこにあるか」を求める部品です。実際のプログラムでは、OpenCV でカメラから読み、MediaPipe で点を求め、OpenCV で描いて表示する、という分担になります。OpenCV にも顔検出(Haar・DNN)はありますが、手の21点や体の33点を直接返す機能は標準では持っていません。

1OpenCV が受け持つ

カメラ・動画の読み込み、BGR→RGB の変換、サイズ変更、点や線の描画、画面の表示と保存。

2MediaPipe が受け持つ

手のひら・人・顔の検出と、ランドマークの座標の推定。動画での追跡。

3自分で書く

座標から角度・距離・状態(手を挙げた等)を求める判定と、その結果をどう使うか。

よくある質問

Q. MediaPipeとは何ですか? A. Google が公開しているオープンソースのライブラリで、画像・動画から手・顔・体のランドマーク(点の座標)や物体を、学習済みのモデルで求めます。Python・Android・iOS・Web で使え、ライセンスは Apache 2.0 です。

Q. MediaPipe は無料で、商用でも使えますか? A. ライブラリは Apache 2.0 で配られており、無料です。商用で使うときは、ライブラリのライセンスに加えて、使うモデルごとのモデルカード(公式ページからリンクされている説明書)の条件も確かめます。

Q. mp.solutions が使えません。 A. 0.10.30 以降の pip の配布物に Solutions は入っていません。AttributeError: module 'mediapipe' has no attribute 'solutions' が出たら、Tasks API に書き換えます。急ぐときは Python 3.12 以下で mediapipe==0.10.21 に固定すると、以前のコードがそのまま動きました。

Q. MediaPipe はどの Python の版で使えますか? A. 1.2.0 の PyPI の分類は Python 3.9〜3.14 です。以前の 0.10.21 は 3.9〜3.12 だけで、3.13 では入りません。

Q. モデルファイル(.task)はどこにありますか? A. 各タスクの公式ページの「Models」の節にダウンロードのリンクがあります。pip では入らないので、取得してコードの model_asset_path に書きます。

Q. GPU は必要ですか? A. なくても動きます。この記事の値はすべて GPU の無い2コアの CPU で、顔検出 2.2ms、手 19.9ms、姿勢 32.9ms でした。BaseOptions には CPU・GPU を選ぶ delegate がありますが、公式の Python 向けのセットアップのページには GPU の手順が載っていないため、CPU で間に合う設計にしておくのが無難です。

Q. 手の左右が逆に出ます。 A. 左右の判定は、自撮りのように左右反転された画像を前提にしています。手元でも、同じ画像を反転すると Right が Left に変わりました。背面のカメラや反転していない動画では、入力を cv2.flip(frame, 1) で反転するか、判定を入れ替えます。

Q. エラーは出ないのに何も検出されません。 A. まず、OpenCV の BGR を RGB に変換しているかを確かめます。手元では BGR のまま渡すと検出が0件でした。次に、しきい値(min_..._confidence)を下げる、対象が小さすぎないか(顔なら遠距離用のモデル)を確かめます。

Q. 動画で処理が遅いです。 A. IMAGE モードで毎フレーム検出していないかを見ます。追跡を使う設定(Tasks API の VIDEO・LIVE_STREAM)にすると、手元では1フレーム 19.8ms から 8.8ms に縮みました。姿勢なら lite のモデルに替える、入力を縮小する、も効きます。

Q. Web(JavaScript)でも使えますか? A. 使えます。公式の対応表では、手・顔・姿勢・ジェスチャーなどの画像系のタスクは Web にも対応しており、同じモデルを使います。ブラウザで試すだけなら MediaPipe Studio でコードを書かずに結果を見られます。

まとめ

  • MediaPipe は Google のオープンソースの認識ライブラリ。手21点・顔478点・体33点などのランドマークを、GPU が無くても求められる。
  • Python は pip install mediapipe(1.2.0・Python 3.9〜3.14)。venv で約480MB。モデル(.task)は別に取得して model_asset_path に書く。
  • mp.solutions は 0.10.30 以降に無い。Tasks API に書き換える(対応表)か、Python 3.12 以下で 0.10.21 に固定する。
  • OpenCV の画像は BGR。RGB に変換しないとエラーは出ずに検出0件になった。透過 PNG や一時オブジェクトの numpy_view() も値が壊れる。
  • CPU 2コアで顔検出 2.2ms・手 19.9ms・姿勢 32.9ms。動画は追跡(VIDEO・LIVE_STREAM)で手が 8.8ms になった。

次に読むとよい記事です。環境づくりは関連記事「Python venvの使い方|作成・有効化コマンド早見表と有効化できない時の直し方」と関連記事「pipコマンド一覧|installのバージョン指定とrequirements.txt」で、結果の座標の計算は関連記事「NumPyの使い方 基本一覧|配列の作成・演算・形状変更」で扱っています。

参考・出典

確認日はいずれも 2026年10月29日です。

  • Google AI Edge「MediaPipe Solutions guide」(タスクの一覧・対応表・Legacy solutions):https://developers.google.com/edge/mediapipe/solutions/guide
  • Google AI Edge「Setup guide for Python」:https://developers.google.com/edge/mediapipe/solutions/setup_python
  • Google AI Edge「Hand landmarks detection guide」:https://developers.google.com/edge/mediapipe/solutions/vision/hand_landmarker
  • Google AI Edge「Hand landmarks detection guide for Python」:https://developers.google.com/edge/mediapipe/solutions/vision/hand_landmarker/python
  • Google AI Edge「Pose landmark detection guide」:https://developers.google.com/edge/mediapipe/solutions/vision/pose_landmarker
  • Google AI Edge「Face detection guide」:https://developers.google.com/edge/mediapipe/solutions/vision/face_detector
  • Google AI Edge「Face landmark detection guide」:https://developers.google.com/edge/mediapipe/solutions/vision/face_landmarker
  • PyPI「mediapipe」(版の一覧・配布ファイル・依存):https://pypi.org/project/mediapipe/
  • GitHub「google-ai-edge/mediapipe」:https://github.com/google-ai-edge/mediapipe
  • OpenCV「Color conversions」(cvtColor の変換):https://docs.opencv.org/4.x/de/d25/imgproc_color_conversions.html
  • MediaPipe(GitHub)「docs/solutions/hands.md」(以前の Solutions の Hands。左右の判定・z の説明):https://github.com/google-ai-edge/mediapipe/blob/master/docs/solutions/hands.md

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「MediaPipeとは・使い方|Pythonで手・顔・姿勢推定と旧API移行」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ
参加受付中

AI駆動開発、 無料セミナー