4 # Extract frame triplets from the UCF-101 dataset
5 # (http://crcv.ucf.edu/data/UCF101.php). Run as follows:
7 # ./extract-ucf101.sh dir/file.avi
9 # Or, with parallel from moreutils, you can do it for all videos
12 # parallel -j 12 ./extract-ucf101.sh -- $( find -name \*.avi )
14 # but do note that this will produce ~250 GB of PNGs, probably many
15 # more frames than you actually would get to use for training
16 # and likely straining the file system with ~5M files.
18 # The script will create a set of frame files that you can easily combine
19 # and use for training:
21 # for N in 1 2 3; do echo $N; cat $( find -name \*_frame$N.txt | sort -u ) > ../frame$N.txt; done
24 PREFIX=$( dirname $FILE )/$( basename $FILE | tr -c "a-zA-Z0-9_-" "_" )
28 rm -f ${PREFIX}_frame[123].tmp.txt ${PREFIX}_delayed1_*.png ${PREFIX}_delayed2_*.png
30 ffmpeg -loglevel error -i $FILE -vf scale=256:256 ${PREFIX}_%04d.png
31 NUM_FRAMES=$( ls -1 ${PREFIX}_*.png | sed 's/.*\([0-9]\{4\}\)\.png$/\1/' | tail -n 1 | sed 's/^0*//' )
33 # Verify that the frames contain some sort of motion (we use PSNR <35 dB as a proxy).
34 # Note that we need to check the entire triplet, since many of the videos seem to have
35 # been through some sort of pull-up, so there could be differences between n and n+2,
36 # but n and n+1 would essentially be identical. See v_BoxingPunchingBag_g09_c02.avi
38 for X in `seq 1 $(( NUM_FRAMES - 2 ))`; do
39 ln -s $( basename $( printf "%s_%04d.png" $PREFIX $(( X + 1 )) ) ) $( printf "%s_delayed1_%04d.png" $PREFIX $X )
40 ln -s $( basename $( printf "%s_%04d.png" $PREFIX $(( X + 2 )) ) ) $( printf "%s_delayed2_%04d.png" $PREFIX $X )
43 ffmpeg -loglevel error -i ${PREFIX}_delayed1_%04d.png -i ${PREFIX}_%04d.png -filter_complex "psnr=stats_file=${PREFIX}.d1.psnr" -f null /dev/null
44 ffmpeg -loglevel error -i ${PREFIX}_delayed1_%04d.png -i ${PREFIX}_delayed2_%04d.png -filter_complex "psnr=stats_file=${PREFIX}.d2.psnr" -f null /dev/null
46 cut -d" " -f1,6 < ${PREFIX}.d1.psnr > ${PREFIX}.d1.cut.psnr
47 cut -d" " -f1,6 < ${PREFIX}.d2.psnr > ${PREFIX}.d2.cut.psnr
49 join ${PREFIX}.d1.cut.psnr ${PREFIX}.d2.cut.psnr | sed 's/psnr_avg://g;s/n://;s/\.[0-9]*//g' | while read FRAMENO PSNR1 PSNR2; do
50 #echo FRAMENO=$FRAMENO PSNR1=$PSNR1 PSNR2=$PSNR2
51 if [ "$FRAMENO" -le $(( NUM_FRAMES - 2 )) ] && [ "$PSNR1" != "inf" ] && [ "$PSNR1" -lt 35 ] && [ "$PSNR2" != "inf" ] && [ "$PSNR2" -lt 35 ]; then
52 printf "%s_%04d.png\n" $PREFIX $(( FRAMENO + 0 )) >> ${PREFIX}_frame1.tmp.txt
53 printf "%s_%04d.png\n" $PREFIX $(( FRAMENO + 1 )) >> ${PREFIX}_frame2.tmp.txt
54 printf "%s_%04d.png\n" $PREFIX $(( FRAMENO + 2 )) >> ${PREFIX}_frame3.tmp.txt
58 for X in `seq 1 $(( NUM_FRAMES - 2 ))`; do
59 rm $( printf "%s_delayed1_%04d.png" $PREFIX $X )
60 rm $( printf "%s_delayed2_%04d.png" $PREFIX $X )
63 mv ${PREFIX}_frame1.tmp.txt ${PREFIX}_frame1.txt
64 mv ${PREFIX}_frame2.tmp.txt ${PREFIX}_frame2.txt
65 mv ${PREFIX}_frame3.tmp.txt ${PREFIX}_frame3.txt
66 rm -f ${PREFIX}.d1.psnr
67 rm -f ${PREFIX}.d2.psnr
68 rm -f ${PREFIX}.d1.cut.psnr
69 rm -f ${PREFIX}.d2.cut.psnr