めもめもめも

import cv2
import numpy as np
from keras.applications import VGG16
from keras.applications.vgg16 import preprocess_input
from keras.preprocessing import image
import os

# フレームを保存するフォルダを作成
if not os.path.exists('frames_with_zero_crossings'):
   os.makedirs('frames_with_zero_crossings')

# 教師データの画像フォルダ
teacher_images_folder = 'path_to_your_teacher_images_folder'

# 教師データの画像をロードして特徴量を抽出し、平均を計算
def extract_features_and_compute_average(images_folder):
   images_features = []
   for filename in os.listdir(images_folder):
       img_path = os.path.join(images_folder, filename)
       img = image.load_img(img_path, target_size=(224, 224))
       img = image.img_to_array(img)
       img = np.expand_dims(img, axis=0)
       img = preprocess_input(img)
       features = vgg16_model.predict(img)
       images_features.append(features.flatten())
   images_features = np.array(images_features)
   return np.mean(images_features, axis=0)

# VGG16モデルをロードして特徴量を抽出
vgg16_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))

# 教師データ群の特徴量を抽出し、平均を計算
teacher_features = extract_features_and_compute_average(teacher_images_folder)

# 動画ファイルを読み込む
video_path = 'path_to_your_video.mp4'
cap = cv2.VideoCapture(video_path)

# フレームごとの特徴量のリストを初期化
frame_features_list = []

# フレームごとに処理
while True:
   ret, frame = cap.read()
   if not ret:
       break

   # フレームの前処理
   frame = cv2.resize(frame, (224, 224))
   frame = np.expand_dims(frame, axis=0)
   frame = preprocess_input(frame)

   # VGG16モデルで特徴量を抽出
   frame_features = vgg16_model.predict(frame)
   frame_features_list.append(frame_features.flatten())  # フレームごとの特徴量をリストに追加

# キャプチャを解放する
cap.release()

# フレームごとの特徴量の変化を計算
frame_features_array = np.array(frame_features_list)

# 各特徴量の時間微分を計算し、0となる時間を取得してフレームを保存
for i in range(frame_features_array.shape[1]):
   diff = np.diff(frame_features_array[:, i])  # 時間微分を計算
   zero_crossings = np.where(np.diff(np.signbit(diff)))[0]  # 時間微分が0をまたぐ点のインデックスを取得
   print(f'Feature {i+1}:')
   for crossing in zero_crossings:
       frame_time = crossing  # 時間微分が0となるフレームの時間を取得
       cap.set(cv2.CAP_PROP_POS_FRAMES, frame_time)  # キャプチャの位置を設定
       ret, frame = cap.read()  # フレームを読み込む
       if ret:
           cv2.imwrite(f'frames_with_zero_crossings/frame_{i+1}_time_{frame_time}.jpg', frame)  # フレームを保存

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