ラズパイ5のカメラから動画取り込んでリアルタイムの認識は、
https://isehara-3lv.sakura.ne.jp/blog/2025/03/29/yoloを使ってみる/
でやってみたけれど、EfficientNetとの比較をラズパイ5でやってみる
Yoloのコードは極めてシンプルだけれども、EfficientNet(TFlite上で動作)は
前処理(cv2使用)やラベルテキスト(ImageNetLabels.txt)からの抽出処理を自前でやらないといけない、まあコードはLLM生成ではありますが
判定を甘くして、上位5個の候補を出力しています、TF(Tensor Flow)だともう少しコードは簡単らしいけれども
# 画面全体から尤もらしい物体を選択する
import cv2
import numpy as np
import matplotlib.pyplot as plt
import tflite_runtime.interpreter as tflite
# モデルロード
interpreter = tflite.Interpreter("EfB3_imagenet.tflite")
interpreter.allocate_tensors()
# 入出力情報
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
# 画像前処理
img_path = "test.jpg"
img = cv2.imread(img_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img_resized = cv2.resize(img, (300, 300))
input_data = np.expand_dims(img_resized, axis=0).astype("float32")
# 推論
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]['index'])[0]
# ラベル読み込み
with open("ImageNetLabels.txt", "r") as f:
labels = [line.strip() for line in f.readlines()]
if labels[0].lower() == "background":
labels = labels[1:] # ずれを修正
# 結果表示
top_k = output_data.argsort()[::-1][:5]
for i in top_k:
print(f"{labels[i]}: {output_data[i]*100:.2f}%")
# 結果を画像に描画
for i, idx in enumerate(top_k):
label = labels[idx]
score = output_data[idx]
cv2.putText(img, f"{label}: {score*100:.2f}%", (10, 30 + i*30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)
# 表示と終了処理
img_bgr = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
while True:
cv2.imshow("Window", img)
if cv2.waitKey(1) & 0xFF == ord('q'): # qキーで終了
break
cv2.destroyAllWindows()
<Yolo>
<EfficientNet>
ということで目的によっての使い分けですが、person検出目的ならばYoloだろうというのが現時点、EfficientNetのラベルテキスト(ImageNetLabels.txt
)にはpersonというラベルは存在してません
人検出で軽量化を目指すなら、TFlite + efficientdet_lite0.tfliteのような解もありそうですが、ラベル(coco_lables.txt)には80分類ぐらいあります、ちなみにyoloは50分類
admin