]> git.sesse.net Git - voxel-flow/blob - extract-ucf101.sh
Fix yet more no-movement rejection (we would reject A-A-B pulldown, but not A-B-B).
[voxel-flow] / extract-ucf101.sh
1 #! /bin/bash
2 set -e
3
4 # Extract frame triplets from the UCF-101 dataset
5 # (http://crcv.ucf.edu/data/UCF101.php). Run as follows:
6 #
7 #   ./extract-ucf101.sh dir/file.avi
8 #
9 # Or, with parallel from moreutils, you can do it for all videos
10 # over many cores:
11 #
12 #   parallel -j 12 ./extract-ucf101.sh -- $( find -name \*.avi )
13 #
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.
17 #
18 # The script will create a set of frame files that you can easily combine
19 # and use for training:
20 #
21 #  for N in 1 2 3; do echo $N; cat $( find -name \*_frame$N.txt | sort -u )  > ../frame$N.txt; done
22
23 FILE=$1
24 PREFIX=$( dirname $FILE )/$( basename $FILE | tr -c "a-zA-Z0-9_-" "_" )
25
26 echo $FILE
27
28 rm -f ${PREFIX}_frame[123].tmp.txt ${PREFIX}_delayed1_*.png ${PREFIX}_delayed2_*.png
29
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*//' )
32
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
37 # for an example.
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 )
41 done    
42
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
45
46 cut -d" " -f1,6 < ${PREFIX}.d1.psnr > ${PREFIX}.d1.cut.psnr
47 cut -d" " -f1,6 < ${PREFIX}.d2.psnr > ${PREFIX}.d2.cut.psnr
48
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
55         fi
56 done
57
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 )
61 done    
62
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
70