FacebookにYouTubeのプレイリストを貼り付けようとするとChromeがハングアップします(たまたま調子悪いだけとは思いますが、なんか確執のようなものを勘繰っちゃいますね…)。
ということで、こちらにいくつか掲載します。Ultraliticsを使って取得した人物の体の各部位を利用した実装例です。基本的な構造はシンプルで、結果のフレームから欲しい情報を抜き出して、都度必要な加工をする、という流れになります。
# 大まかな流れ
results = model.predict("your-movie.mov", stream=True)
for r in results:
img = r.orig_img
cv2.putText(img,"boxes: %d" % (len(r.boxes)),(2,300),cv2.FONT_HERSHEY_DUPLEX,1.0,(255,0,0))
cv2.putText(img,"names: %s" % (" ".join(r.names.values())),(2,340),cv2.FONT_HERSHEY_DUPLEX,1.0,(255,0,0))
# :
for xy in r.keypoints.xy:
if len(xy) != 17: continue # keypointsが取れていない場合はスキップ
leye = xy[1] # left eye 左目
cv2.circle(img,(int(leye[0]),int(leye[1])),10,(0,0,255),2)
# :
実際に動いているコードはGoogle Colabのノートを参照してください。以下はサンプルの動画を加工してみた例です。
両目、両手首の位置、および両目の位置から類推して頭を囲む円を描画:
頭の位置に帽子を被せてみる:
右手があがった(=鼻の位置より高くなる)時にだけ右手に赤丸を表示。手があがっていたフレーム(画像)の枚数を左側に表示:
参考までに、デフォルトで描画されるフレーム:
いくつかサンプルを作る過程でGemini(AI)のアドバイスがかなり助けになりました。特に、numpyを使った行列演算は答えが分かれば「なるほど」と思えるのですが、最初は何ができるのか分からず戸惑いがちです。そういう場面で、次々にサジェストを出してくれるのは助かります。 幾らかはウェブ検索に頼るのですが、ドローンが上空から車を追跡するサンプルなんかが見つかったりして、世の中のきな臭さを感じてしまいます。 学校の授業で使う長閑なサンプルでゆったりと研究が出来るというのは、ある意味、とても恵まれた状況なのかもしれません。