
前提
下記URLにあるTecoGANでのgoogle colabでのデモを実行しています。
https://colab.research.google.com/github/sony/nnabla-examples/blob/master/interactive-demos/tecogan.ipynb#scrollTo=N9Vr4CIDxL6f
実現したいこと
Do it with your own video!以下のコードを参考に
自分の動画でもTecoGANを実装したい。
発生している問題・エラーメッセージ
from google.colab import files video = files.upload() #ローカルドライブからdemo_mov1.mp4という2秒程度の動画をアップロード video = "demo_mov1.mp4" play_video(video) #動画が動作することを確認 import os ext = os.path.splitext(list(video.keys())[-1])[-1] #上記のコードで下記のエラーが出てしまいます。 エラーメッセージ 'str' object has no attribute 'keys'
以下コードの続きです。
おかしな点があればご指摘いただければ幸いです。
os.rename(list(video.keys())[-1], "input_video".format(ext)) input_video = "input_video" + ext #フレームを抽出し、低解像度版を作成 width=!ffprobe -v error -select_streams v:0 -show_entries stream=width -of csv=p=0 demo_mov1.mp4 height=!ffprobe -v error -select_streams v:0 -show_entries stream=height -of csv=p=0 demo_mov1.mp4 new_height = int(height[0])*200 // int(width[0]) new_height = 4*round(new_height/4) !mkdir -p frames/demo_mov1.mp4 !ffmpeg -i $demo_mov1.mp4 -vf "fps=10, scale=200:$new_height" frames/demo_mov1.mp4/frame_%04d.png !ffmpeg -i frames/demo_mov1.mp4/frame_%04d.png -r 24/1 -y user_video_lr.mp4 #TecoGANを適用 !python generate.py --model tecogan_model.h5 --input-dir-lr frames/demo_mov1.mp4/ --output-dir results/user !ffmpeg -i results/user/output_frame_%04d.png -r 24/1 -y user_video_hr.mp4 play_video("demo_mov1.mp4") play_video("user_video_hr.mp4")
試したこと
input_videoとdemo_mov1.mp4が混同している気がします。
ご教示いただければ幸いです。よろしくお願いします。

オリジナルのコードをちゃんと読んでいないのでカンで書きます。
'str' object has no attribute 'keys'
とあり、video = "demo_mov1.mp4"としているため、video.keys()でstr.keys()のフォーマットになってこけているようです。ここまでは別に良くて、解決したい、が本音と思います。
ext = os.path.splitext(list(video.keys())[-1])[-1]
この一行はたぶん拡張子を取りたいのではないでしょうか?なので、
解決策1 ext=".mp4"のように決め打ちする
解決策2 ext = os.path.splitext(video)[1]として拡張子だけ取り出す。
困ったらコメントください。
video = "demo_mov1.mp4"
play_video(video)
↓ 修正
play_video("demo_mov1.mp4")
で、どうでしょうか?
【追記】
video = files.upload()
の「video」は、今エラーが出てる行だけではなく、
os.rename(list(video.keys())[-1], "input_video".format(ext))
でも使ってるので、
video = "demo_mov1.mp4"
として上書きしてはダメだと思います
ご指摘ありがとうございます。
1. ext=".mp4"として
2.video = "demo_mov1.mp4" の上書きをやめたところ
input_videoまで動作確認ができました。
その後、続きのコードで
!ffmpeg -i $input_video -vf "fps=10, scale=200:$new_height" frames/input_video/frame_%04d.png
!ffmpeg -i frames/input_video/frame_%04d.png -r 24/1 -y user_video_lr.mp4
を実行するとそれぞれ
-vf: No such file or directory
[image2 @ 0x556017a66000] Could find no file with path 'frames/input_video/frame_%04d.png' and index in the range 0-4
frames/input_video/frame_%04d.png: No such file or directory
と出てきてしまいます。
改善点ありますでしょうか?よろしくお願いします。
> 以下コードの続きです。
おかしな点があればご指摘いただければ幸いです。
オリジナルのコードでは
os.rename(list(video.keys())[-1], "input_video".format(ext))
ではなく
os.rename(list(video.keys())[-1], "input_video{}".format(ext))
で、オリジナル通りのコードを実行するとして、以下書きます
上記コードを実行したら、アップロードした「demo_mov1.mp4」のファイル名は「input_video.mp4」に変わってるので、それ以降のコードで「demo_mov1.mp4」を使っても、その名前のファイルは存在しないのでエラーになります
【追記】
質問の「以下コードの続きです。」のコードのあちこちに「demo_mov1」と書かれてますが、それらは全部ダメです
質問の「以下コードの続きです。」のコードではなく、オリジナルのコードの「Do it with your own video!」以下をそのまま実行させてみてください
> 1. ext=".mp4"として
2.video = "demo_mov1.mp4" の上書きをやめた
私のコメントの通りに
video = "demo_mov1.mp4"
play_video(video)
↓ 修正
play_video("demo_mov1.mp4")
として「video」を上書きしてない場合は、fourteenlengthさんのコメントの
> 解決策1 ext=".mp4"のように決め打ちする
> 解決策2 ext = os.path.splitext(video)[1]として拡張子だけ取り出す。
はどちらも不要で、オリジナルの下記のコードで大丈夫なはずです
ext = os.path.splitext(list(video.keys())[-1])[-1]
jbpb0様
ご指摘のように{}が抜けており改善すると動作が確認できました。
なぜ、{}が必要だったのでしょうか?
> なぜ、{}が必要だったのでしょうか?
間違ってる
os.rename(list(video.keys())[-1], "input_video".format(ext))
を実行した直後に
!ls -ltr
を実行して、そこにあるファイル名を確認してみてください
「input_video.mp4」は無くて、「input_video」が有りますよね
なお、正しい
os.rename(list(video.keys())[-1], "input_video{}".format(ext))
を実行した後だと「input_video.mp4」が有るので、もし「input_video.mp4」が有るなら、それを削除してから、動画ファイルのアップロードからやり直してから、確認してみてください
大変よくわかりました。
多数ご指摘いただきましてありがとうございました。

回答1件
あなたの回答
tips
プレビュー