概要
| 項目 | 
内容 | 
| 目的 ① | 
特定の人物を識別(画像 → QUBO 定式化 → 最小化) | 
| 目的 ② | 
複数フレーム間の人物の動きをトレース(量子ウォーク) | 
| 使用技術 | 
Qiskit / PennyLane(量子計算), Unity(UI・VR 連携), Python(API) | 
 Part 1: 特定人物認識(QUBO 定式化)
 問題定義
- 各人物の顔特徴ベクトルを用いて、入力画像と類似する人物を選択
 
- 最小エネルギー問題として定式化(QUBO)
 
 QUBO モデル
目的関数:
  最小化: E(x) = Σ_i (1 - similarity(query, person_i)) * x_i
  制約条件: Σ_i x_i = 1(1人だけ選択)
QUBO式:
  Q[i][j] = (1 - similarity_i) if i == j
          = λ(ペナルティ) if i ≠ j
 Qiskit コード例
from qiskit_optimization import QuadraticProgram
from qiskit_optimization.algorithms import MinimumEigenOptimizer
from qiskit.algorithms import QAOA
from qiskit.primitives import Sampler
from qiskit_optimization.converters import QuadraticProgramToQubo
similarities = [0.9, 0.3, 0.7, 0.1]  
n = len(similarities)
qp = QuadraticProgram()
for i in range(n):
    qp.binary_var(name=f'x{i}')
qp.minimize(linear=[(1 - s) for s in similarities])
qp.linear_constraint(linear=[1]*n, sense='==', rhs=1)
qubo = QuadraticProgramToQubo().convert(qp)
qaoa = QAOA(sampler=Sampler())
optimizer = MinimumEigenOptimizer(qaoa)
result = optimizer.solve(qubo)
print(result)
 Unity との連携例(人物認識)
IEnumerator PostImage(byte[] imageData)
{
    WWWForm form = new WWWForm();
    form.AddBinaryData("image", imageData, "capture.jpg", "image/jpeg");
    using (UnityWebRequest www = UnityWebRequest.Post("http://localhost:8000/identify", form))
    {
        yield return www.SendWebRequest();
        if (www.result == UnityWebRequest.Result.Success)
            Debug.Log("認識結果: " + www.downloadHandler.text);
    }
}
 Part 2: 人物トラッキング(量子ウォークモデル)
 モデル設計
- 人物の位置をグラフノードに対応づけ
 
- 時間ステップごとに量子ウォークさせて次の位置候補を予測
 
例:3x3 グリッド上の人物移動
  0 - 1 - 2
  |   |   |
  3 - 4 - 5
  |   |   |
  6 - 7 - 8
 量子ウォーク(Qiskit)
import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
from qiskit import QuantumCircuit, Aer, execute
G = nx.grid_2d_graph(3, 3)
adj_matrix = nx.adjacency_matrix(G).todense()
initial_state = np.zeros(9)
initial_state[4] = 1.0
qc = QuantumCircuit(4, 4)
qc.h([0, 1, 2, 3])
qc.measure([0, 1, 2, 3], [0, 1, 2, 3])
backend = Aer.get_backend('qasm_simulator')
counts = execute(qc, backend, shots=1024).result().get_counts()
print("位置遷移結果(上位):")
print(sorted(counts.items(), key=lambda x: -x[1])[:5])
 Unity との連携例(位置送信)
IEnumerator SendPosition(Vector2 pos)
{
    WWWForm form = new WWWForm();
    form.AddField("x", pos.x.ToString());
    form.AddField("y", pos.y.ToString());
    using (UnityWebRequest www = UnityWebRequest.Post("http://localhost:8000/track", form))
    {
        yield return www.SendWebRequest();
        Debug.Log("次の候補位置: " + www.downloadHandler.text);
    }
}
 システム構成(API 含む)
[Unity] カメラ映像 & 座標取得
   ↓
[Python FastAPIサーバー]
   ├─ 顔認識 → QUBO最適化(QAOA)
   ├─ 位置データ → 量子ウォークで次位置推定
   ↓
[Unity] 結果に基づきUI制御 or アバター誘導
 FastAPI サーバー例
from fastapi import FastAPI, UploadFile, Form
from fastapi.responses import JSONResponse
app = FastAPI()
@app.post("/identify")
async def identify(image: UploadFile):
    
    return JSONResponse(content={"name": "Person A", "score": 0.93})
@app.post("/track")
async def track(x: float = Form(...), y: float = Form(...)):
    
    return JSONResponse(content={"next_pos": [x+1, y]})
 まとめ
| 機能 | 
実現手法 | 
| 特定人物の認識 | 
類似度ベースで QUBO 化 → QAOA で最適化 | 
| 動きのトラッキング | 
グラフ上での量子ウォークシミュレーション | 
| Unity との連携 | 
HTTP 通信で Python と連携、VR/アバター対応可能 | 
 今後の拡張案
- 顔認識に 
face_recognition、姿勢検出に MediaPipe を導入 
- Unity で認識結果に応じてアバターや VR オブジェクト制御
 
- QUBO の複雑化:マルチ人物同時推定、複数フレーム同時処理
 
Discussion