メモメモ
import cv2
import numpy as np
from keras.applications import VGG16
from keras.applications.vgg16 import preprocess_input
from keras.preprocessing import image
# 教師データの画像をロードして特徴量を抽出
teacher_image_path = 'path_to_your_teacher_image.jpg'
teacher_image = image.load_img(teacher_image_path, target_size=(224, 224)) # 画像を読み込み、サイズを224x224ピクセルにリサイズ
teacher_image = image.img_to_array(teacher_image) # 画像をnumpy配列に変換
teacher_image = np.expand_dims(teacher_image, axis=0) # 次元を追加して、モデル入力に合わせる
teacher_image = preprocess_input(teacher_image) # 画像をVGG16モデルに適した形式に前処理
# VGG16モデルをロードして特徴量を抽出
vgg16_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3)) # ImageNetで事前学習済みのVGG16モデルをロード
teacher_features = vgg16_model.predict(teacher_image) # 教師データの画像から特徴量を抽出
# 動画ファイルを読み込む
video_path = 'path_to_your_video.mp4'
cap = cv2.VideoCapture(video_path)
# 類似度の閾値を設定
threshold = 0.9
# フレームごとに処理
while True:
ret, frame = cap.read() # 動画から1フレームを読み込む
if not ret: # 動画の最後に到達したらループを抜ける
break
# フレームの前処理
frame = cv2.resize(frame, (224, 224)) # フレームを224x224ピクセルにリサイズ
frame = np.expand_dims(frame, axis=0) # 次元を追加して、モデル入力に合わせる
frame = preprocess_input(frame) # 画像をVGG16モデルに適した形式に前処理
# VGG16モデルで特徴量を抽出
frame_features = vgg16_model.predict(frame) # フレームから特徴量を抽出
# 類似度を計算
similarity = np.dot(teacher_features.flatten(), frame_features.flatten()) / (np.linalg.norm(teacher_features) * np.linalg.norm(frame_features)) # 内積を計算し、ベクトルのノルムで正規化して類似度を計算
# 類似度が閾値を超える場合は画像を保存
if similarity > threshold:
cv2.imwrite('similar_frame.jpg', frame)
# キャプチャを解放する
cap.release()