-
Notifications
You must be signed in to change notification settings - Fork 0
/
splitdata.sh
executable file
·101 lines (80 loc) · 2.76 KB
/
splitdata.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#!/bin/bash
clear
#Verifica se foi passado algum percentual de divisão entre train e test.
#O percentual se refere ao train. O restante é de test.
#Caso nada seja informado, o valor de 50% é assumido
if [[ $# -eq 0 ]]; then
echo "Nenhum percentual de treinamento informado. Assumindo 50%."
PERC_TRAIN=0.5
elif [[ $(echo "$1 > 1" | bc) -eq 1 ]]; then
echo 'Percentual de treinamento deve ser no intervalo [0,1].'
exit 1
else
PERC_TRAIN=$1
fi
#Remove os diretórios de train e test anteriores
rm -rf "train"
rm -rf "test"
PERC_TRAIN_FULL=$(echo "$PERC_TRAIN * 100" | bc | xargs printf "%.0f")
#Verifica os diretórios de imagens presentes para a divisão
#TARGET_DIRS=`ls -l . | egrep '^d' | awk '{print $9}'`
OLFIFS=$IFS
IFS=$'\n'
TARGET_DIRS=`ls -d */ | sed 's/\//\\n/g'`
#exit 1
TOTAL_FILES=$(find $TARGET_DIRS -type f -printf x | wc -c)
TOTAL_TRAIN=$(echo "$TOTAL_FILES * $PERC_TRAIN" | bc | xargs printf "%.0f")
TOTAL_TEST=$(echo $TOTAL_FILES-$TOTAL_TRAIN | bc)
echo 'Diretórios alvo: ' $TARGET_DIRS
echo 'Total de arquivos: ' $TOTAL_FILES
echo 'Percentual de imagens de treino: ' $PERC_TRAIN_FULL'%'
echo 'Total de Imagens de Treino: ' $TOTAL_TRAIN
echo 'Total de Imagens de Teste: ' $TOTAL_TEST
#cria subdiretórios train e test
mkdir "train"
mkdir "test"
touch "train/train.txt"
touch "test/test.txt"
rm -rf labels.txt
#Cria subdiretórios de cada base em train e test
#Cria labels baseadas nos diretórios
for dir in $TARGET_DIRS; do
echo 'Criando diretórios train/test para '$dir
mkdir 'train/'$dir
mkdir 'test/'$dir
echo "$dir" >> labels.txt
done
#Copia as labels para train e test
cp labels.txt "train/"
cp labels.txt "test/"
for dir in $TARGET_DIRS; do
DIRFILES=`ls $dir | sort -R`
TOTAL_FILES=$(find $dir -type f -printf x | wc -c)
TOTAL_TRAIN=$(echo "$TOTAL_FILES * $PERC_TRAIN" | bc | xargs printf "%.0f")
echo 'Copiando '$TOTAL_TRAIN' imagens de treino de '$dir
if [[ $TOTAL_TRAIN -gt 0 ]]; then
TRAINFILES=`echo "${DIRFILES}" | head -$TOTAL_TRAIN`
for trains in $TRAINFILES; do
`cp $dir/$trains train/$dir`
FPATH=`readlink -f train/$dir/$trains`
FLABEL=$(echo `grep -n $dir train/labels.txt | cut -d : -f1` - 1 | bc)
`echo $FPATH' '$FLABEL >> train/train.txt`
done
shuf train/train.txt > train/temp.txt
mv train/temp.txt train/train.txt
fi
TOTAL_TEST=$(echo $TOTAL_FILES-$TOTAL_TRAIN | bc)
echo 'Copiando '$TOTAL_TEST' imagens de teste de '$dir
if [[ $TOTAL_TEST -gt 0 ]]; then
TESTFILES=`echo "${DIRFILES}" | tail -$TOTAL_TEST`
for tests in $TESTFILES; do
`cp $dir/$tests test/$dir`
FPATH=`readlink -f test/$dir/$tests`
FLABEL=$(echo `grep -n $dir test/labels.txt | cut -d : -f1` - 1 | bc)
`echo $FPATH' '$FLABEL >> test/test.txt`
done
shuf test/test.txt > test/temp.txt
mv test/temp.txt test/test.txt
fi
done
IFS=$OLDIFS