メモメモ

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()

いいなと思ったら応援しよう!