frame-bridge / tests /batch_test.py
MakiAi's picture
๐Ÿงช ใƒ†ใ‚นใƒˆใƒ•ใ‚กใ‚คใƒซใจใƒใƒƒใƒๅ‡ฆ็†ใƒ†ใ‚นใƒˆใฎ่ฟฝๅŠ 
0afaece
"""
Frame Bridge - ใƒใƒƒใƒๅ‡ฆ็†ใƒ†ใ‚นใƒˆ็”จใ‚นใ‚ฏใƒชใƒ—ใƒˆ
ใƒ•ใ‚ฉใƒซใƒ€ๅ†…ใฎๅ‹•็”ปใƒ•ใ‚กใ‚คใƒซใ‚’้ †ๆฌก็ตๅˆใ™ใ‚‹ใƒ†ใ‚นใƒˆใ‚นใ‚ฏใƒชใƒ—ใƒˆ
"""
import os
import sys
import argparse
from pathlib import Path
import sys
sys.path.append('..')
from src.frame_bridge import BatchProcessor
def main():
"""ใƒกใ‚คใƒณๅ‡ฆ็†"""
parser = argparse.ArgumentParser(description="Frame Bridge - ใƒใƒƒใƒๅ‹•็”ป็ตๅˆ")
parser.add_argument("--input", "-i", default="examples/assets/example/REI/input", help="ๅ…ฅๅŠ›ใƒ•ใ‚ฉใƒซใƒ€ (ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆ: examples/assets/example/REI/input)")
parser.add_argument("--output", "-o", default="examples/assets/example/REI/output", help="ๅ‡บๅŠ›ใƒ•ใ‚ฉใƒซใƒ€ (ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆ: examples/assets/example/REI/output)")
parser.add_argument("--exclude-edge", action="store_true", default=True, help="ๆœ€ๅˆใจๆœ€ๅพŒใฎใƒ•ใƒฌใƒผใƒ ใ‚’้™คๅค– (ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆ: True)")
parser.add_argument("--include-edge", action="store_true", help="ๆœ€ๅˆใจๆœ€ๅพŒใฎใƒ•ใƒฌใƒผใƒ ใ‚’ๅซใ‚ใ‚‹")
parser.add_argument("--mode", "-m", choices=["sequential", "pairwise"], default="sequential",
help="็ตๅˆใƒขใƒผใƒ‰: sequential(้ †ๆฌก็ตๅˆ) ใพใŸใฏ pairwise(ใƒšใ‚ข็ตๅˆ)")
parser.add_argument("--filename", "-f", default="merged_sequence.mp4", help="ๅ‡บๅŠ›ใƒ•ใ‚กใ‚คใƒซๅ (sequentialใƒขใƒผใƒ‰ใฎใฟ)")
args = parser.parse_args()
print("๐ŸŽฌ Frame Bridge - ใƒใƒƒใƒๅ‡ฆ็†ใƒ†ใ‚นใƒˆ")
print("=" * 60)
print(f"๐Ÿ“ ๅ…ฅๅŠ›ใƒ•ใ‚ฉใƒซใƒ€: {args.input}")
print(f"๐Ÿ“ ๅ‡บๅŠ›ใƒ•ใ‚ฉใƒซใƒ€: {args.output}")
print(f"๐Ÿ”„ ๅ‡ฆ็†ใƒขใƒผใƒ‰: {args.mode}")
if args.mode == "sequential":
print(f"๐Ÿ“„ ๅ‡บๅŠ›ใƒ•ใ‚กใ‚คใƒซๅ: {args.filename}")
print()
# ๅ…ฅๅŠ›ใƒ•ใ‚ฉใƒซใƒ€ใฎๅญ˜ๅœจใƒใ‚งใƒƒใ‚ฏ
if not os.path.exists(args.input):
print(f"โŒ ๅ…ฅๅŠ›ใƒ•ใ‚ฉใƒซใƒ€ใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“: {args.input}")
return
# ใ‚จใƒƒใ‚ธใƒ•ใƒฌใƒผใƒ ้™คๅค–่จญๅฎš
exclude_edge_frames = not args.include_edge if args.include_edge else args.exclude_edge
print(f"๐ŸŽฏ ใ‚จใƒƒใ‚ธใƒ•ใƒฌใƒผใƒ ้™คๅค–: {'ๆœ‰ๅŠน' if exclude_edge_frames else '็„กๅŠน'}")
print()
# ใƒใƒƒใƒใƒ—ใƒญใ‚ปใƒƒใ‚ตใ‚’ๅˆๆœŸๅŒ–
processor = BatchProcessor(output_dir=args.output, exclude_edge_frames=exclude_edge_frames)
# ๅ‹•็”ปใƒ•ใ‚กใ‚คใƒซใฎ็ขบ่ช
video_files = processor.get_video_files(args.input)
if len(video_files) < 2:
print("โŒ ็ตๅˆใซใฏๆœ€ไฝŽ2ใคใฎๅ‹•็”ปใƒ•ใ‚กใ‚คใƒซใŒๅฟ…่ฆใงใ™")
return
print(f"โœ… ๆคœๅ‡บใ•ใ‚ŒใŸๅ‹•็”ปใƒ•ใ‚กใ‚คใƒซ: {len(video_files)}ๅ€‹")
for i, file in enumerate(video_files):
print(f" {i+1}. {os.path.basename(file)}")
print()
# ๅ‡ฆ็†ใƒขใƒผใƒ‰ใซๅฟœใ˜ใฆๅฎŸ่กŒ
if args.mode == "sequential":
print("๐Ÿ”„ ้ †ๆฌก็ตๅˆๅ‡ฆ็†ใ‚’้–‹ๅง‹...")
success, final_output, results = processor.process_sequential_merge(args.input, args.filename)
if success:
print(f"โœ… ้ †ๆฌก็ตๅˆๅฎŒไบ†!")
print(f"๐Ÿ“ ๆœ€็ต‚ๅ‡บๅŠ›: {final_output}")
print(f"๐Ÿ“Š ใƒ•ใ‚กใ‚คใƒซใ‚ตใ‚คใ‚บ: {os.path.getsize(final_output) / (1024*1024):.1f} MB")
else:
print("โŒ ้ †ๆฌก็ตๅˆใซๅคฑๆ•—ใ—ใพใ—ใŸ")
elif args.mode == "pairwise":
print("๐Ÿ”„ ใƒšใ‚ขใƒฏใ‚คใ‚บ็ตๅˆๅ‡ฆ็†ใ‚’้–‹ๅง‹...")
success, output_files, results = processor.process_pairwise_merge(args.input)
if success:
print(f"โœ… ใƒšใ‚ขใƒฏใ‚คใ‚บ็ตๅˆๅฎŒไบ†!")
print(f"๐Ÿ“ ๅ‡บๅŠ›ใƒ•ใ‚กใ‚คใƒซๆ•ฐ: {len(output_files)}")
for i, file in enumerate(output_files):
size_mb = os.path.getsize(file) / (1024*1024)
print(f" {i+1}. {os.path.basename(file)} ({size_mb:.1f} MB)")
else:
print("โŒ ใƒšใ‚ขใƒฏใ‚คใ‚บ็ตๅˆใซๅคฑๆ•—ใ—ใพใ—ใŸ")
# ใƒฌใƒใƒผใƒˆ็”Ÿๆˆ
print("\n" + "=" * 60)
print("๐Ÿ“‹ ๅ‡ฆ็†ใƒฌใƒใƒผใƒˆ:")
report_path = Path(args.output) / "batch_report.txt"
report = processor.generate_report(results, str(report_path))
print(report)
print("๐ŸŽ‰ ใƒใƒƒใƒๅ‡ฆ็†ๅฎŒไบ†๏ผ")
if __name__ == "__main__":
main()