Parcourir la source

Add of feature choices

Jérôme BUISINE il y a 4 ans
Parent
commit
beb4716c41
12 fichiers modifiés avec 110 ajouts et 73 suppressions
  1. 3 1
      .gitignore
  2. 0 0
      __init__.py
  3. 11 6
      make_dataset.py
  4. 1 0
      models_info/models_comparisons.csv
  5. 5 3
      modules/config.py
  6. 21 0
      modules/features.py
  7. 0 17
      modules/metrics.py
  8. 12 5
      reconstruct.py
  9. 10 5
      reconstruct_keras.py
  10. 20 11
      run.sh
  11. 26 24
      run_keras.sh
  12. 1 1
      write_result_keras.py

+ 3 - 1
.gitignore

@@ -1,10 +1,12 @@
 .vscode
 *.png
 
+dataset
 data
 saved_models
 reconstructed
+results
 
-models_info/models_comparisons.csv
+results/models_comparisons.csv
 
 __pycache__

+ 0 - 0
__init__.py


+ 11 - 6
make_dataset.py

@@ -4,13 +4,14 @@ import pandas as pd
 import os, sys, argparse
 
 import modules.config as cfg
+from modules.features import compute_feature
 
-def compute_files(_n, _each_row, _each_column):
+def compute_files(_n, _feature_choice, _each_row, _each_column):
     """
     Read all folders and files of scenes in order to compute output dataset
     """
 
-    output_dataset_filename = cfg.output_file_prefix + _n + '_column_' + _each_column + '_row_' + _each_row + '.csv'
+    output_dataset_filename = cfg.output_file_prefix + _feature_choice +'_' + _n + '_column_' + _each_column + '_row_' + _each_row + '.csv'
 
     output_dataset_filename = os.path.join(cfg.output_data_folder, output_dataset_filename)
 
@@ -66,7 +67,9 @@ def compute_files(_n, _each_row, _each_column):
                             # if mean != pixel_values[0]:
                             saved_row += str(mean)
 
-                            for val in pixel_values:
+                            data = compute_feature(_feature_choice, pixel_values)
+
+                            for val in data:
                                 saved_row += ';' + str(val)
 
                             saved_row += '\n'
@@ -89,15 +92,17 @@ def main():
     parser = argparse.ArgumentParser(description="Compute .csv dataset file")
 
     parser.add_argument('--n', type=str, help='Number of pixel values approximated to keep')
+    parser.add_argument('--feature', type=str, help='Feature choice to compute from samples', choices=cfg.features_list)
     parser.add_argument('--each_row', type=str, help='Keep only values from specific row', default=1)
     parser.add_argument('--each_column', type=str, help='Keep only values from specific column', default=1)
     args = parser.parse_args()
 
-    param_n = args.n
-    param_each_row = args.each_row
+    param_n           = args.n
+    param_feature     = args.feature
+    param_each_row    = args.each_row
     param_each_column = args.each_column
 
-    compute_files(param_n, param_each_row, param_each_column)
+    compute_files(param_n, param_feature, param_each_row, param_each_column)
 
 if __name__== "__main__":
     main()

+ 1 - 0
models_info/models_comparisons.csv

@@ -0,0 +1 @@
+test_sponza1_2_2;655360;0.8592476468953387;

+ 5 - 3
modules/config.py

@@ -1,5 +1,5 @@
 output_data_folder              = "data"
-folder_scenes_path              = ".."
+folder_scenes_path              = "dataset"
 models_information_folder       = 'models_info'
 saved_models_folder             = 'saved_models'
 reconstructed_folder            = 'reconstructed'
@@ -12,8 +12,10 @@ number_of_columns               = 512
 
 kind_of_models                  = ["SGD", "Ridge", "SVR"]
 
-global_result_filepath          = "models_info/models_comparisons.csv"
-global_result_filepath_keras    = "models_info/models_comparisons_keras.csv"
+global_result_filepath          = "results/models_comparisons.csv"
+global_result_filepath_keras    = "results/models_comparisons_keras.csv"
+
+features_list                   = ['samples', 'variances']
 
 scenes_list                     = ['Exterieur01', 'Boulanger', 'CornellBoxNonVide', 'CornellBoxNonVideTextureArcade', 'CornellBoxVide', 'Bar1', 'CornellBoxNonVideTextureDegrade', 'CornellBoxNonVideTextureDamier', 'CornellBoxVideTextureDamier', 'CornellBoxNonVide', 'Sponza1', 'Bureau1_cam2']
 

+ 21 - 0
modules/features.py

@@ -0,0 +1,21 @@
+from . import config as config
+
+import numpy as np
+
+def compute_feature(feature_choice, samples):
+
+    data = []
+
+    if feature_choice == 'samples':
+        data = samples
+
+    if feature_choice == 'variances':
+
+        incr_samples = []
+        
+        # evolution of variance
+        for sample in samples:
+            incr_samples.append(sample)
+            data.append(np.var(incr_samples))
+
+    return data

+ 0 - 17
modules/metrics.py

@@ -1,17 +0,0 @@
-import numpy as np
-
-def coefficient_of_determination(_y, _predicted):
-    
-    y = np.asarray(_y)
-    predicted = np.asarray(_predicted)
-
-    y_mean = y.mean()
-
-    numerator_sum = 0
-    denominator_sum = 0
-
-    for id_val, val in enumerate(y):
-        numerator_sum += (predicted[id_val] - y_mean) * (predicted[id_val] - y_mean)
-        denominator_sum += (val - y_mean) * (val - y_mean)
-    
-    return numerator_sum / denominator_sum

+ 12 - 5
reconstruct.py

@@ -8,13 +8,15 @@ from sklearn import svm
 from sklearn.utils import shuffle
 
 import modules.config as cfg
-import modules.metrics as metrics
+from modules.features import compute_feature
+
+from ipfml import metrics
 
 from joblib import dump, load
 
 from PIL import Image
 
-def reconstruct(_scene_name, _model_path, _n):
+def reconstruct(_scene_name, _model_path, _n, _feature_choice):
     
     # construct the empty output image
     output_image = np.empty([cfg.number_of_rows, cfg.number_of_columns])
@@ -41,7 +43,10 @@ def reconstruct(_scene_name, _model_path, _n):
                 # predict the expected pixel value
                 lines = [float(l)/255. for l in f.readlines()]
                 pixel_values = lines[0:int(_n)]
-                pixels.append(pixel_values)
+
+                data = compute_feature(_feature_choice, pixel_values)
+
+                pixels.append(data)
 
         # predict column pixels and fill image column by column
         pixels_predicted = clf.predict(pixels)
@@ -64,12 +69,14 @@ def main():
     parser.add_argument('--scene', type=str, help='Scene name to reconstruct', choices=cfg.scenes_list)
     parser.add_argument('--model_path', type=str, help='Model file path')
     parser.add_argument('--n', type=str, help='Number of pixel values approximated to keep')
+    parser.add_argument('--feature', type=str, help='Feature choice to compute from samples', choices=cfg.features_list)
     parser.add_argument('--image_name', type=str, help="The ouput image name")
 
     args = parser.parse_args()
 
     param_scene_name = args.scene
-    param_n = args.n
+    param_n          = args.n
+    param_feature    = args.feature
     param_model_path = args.model_path
     param_image_name = args.image_name
 
@@ -77,7 +84,7 @@ def main():
     if not param_n:
         param_n = param_model_path.split('_')[0]
 
-    output_image = reconstruct(param_scene_name, param_model_path, param_n)
+    output_image = reconstruct(param_scene_name, param_model_path, param_n, param_feature)
 
     if not os.path.exists(cfg.reconstructed_folder):
         os.makedirs(cfg.reconstructed_folder)

+ 10 - 5
reconstruct_keras.py

@@ -6,13 +6,13 @@ import os, sys, argparse
 from keras.models import model_from_json
 
 import modules.config as cfg
-import modules.metrics as metrics
+from modules.features import compute_feature
 
 from joblib import dump, load
 
 from PIL import Image
 
-def reconstruct(_scene_name, _model_path, _n):
+def reconstruct(_scene_name, _model_path, _n, _feature_choice):
     
     # construct the empty output image
     output_image = np.empty([cfg.number_of_rows, cfg.number_of_columns])
@@ -46,7 +46,10 @@ def reconstruct(_scene_name, _model_path, _n):
                 # predict the expected pixel value
                 lines = [float(l)/255. for l in f.readlines()]
                 pixel_values = lines[0:int(_n)]
-                pixel_values = np.array(pixel_values).reshape(1, (int(_n)))
+
+                data = compute_feature(_feature_choice, pixel_values)
+                pixel_values = np.array(data).reshape(1, (int(_n)))
+
                 # predict pixel per pixel
                 pixels_predicted.append(model.predict(pixel_values))
                 
@@ -68,12 +71,14 @@ def main():
     parser.add_argument('--scene', type=str, help='Scene name to reconstruct', choices=cfg.scenes_list)
     parser.add_argument('--model_path', type=str, help='Json model file path')
     parser.add_argument('--n', type=str, help='Number of pixel values approximated to keep')
+    parser.add_argument('--feature', type=str, help='Feature choice to compute from samples', choices=cfg.features_list)
     parser.add_argument('--image_name', type=str, help="The ouput image name")
 
     args = parser.parse_args()
 
     param_scene_name = args.scene
-    param_n = args.n
+    param_n          = args.n
+    param_feature    = args.feature
     param_model_path = args.model_path
     param_image_name = args.image_name
 
@@ -81,7 +86,7 @@ def main():
     if not param_n:
         param_n = param_model_path.split('_')[0]
 
-    output_image = reconstruct(param_scene_name, param_model_path, param_n)
+    output_image = reconstruct(param_scene_name, param_model_path, param_n, param_feature)
 
     if not os.path.exists(cfg.reconstructed_folder):
         os.makedirs(cfg.reconstructed_folder)

+ 20 - 11
run.sh

@@ -1,5 +1,5 @@
-# erase "models_info/models_comparisons.csv" file and write new header
-file_path='models_info/models_comparisons.csv'
+# erase "results/models_comparisons.csv" file and write new header
+file_path='results/models_comparisons.csv'
 
 erased=$1
 
@@ -13,23 +13,32 @@ if [ "${erased}" == "Y" ]; then
     echo 'model_name; number_of_approximations; coeff_of_determination;' >> ${file_path}
 fi
 
-for n in {3,4,5,6,7,8,9,10,15,20,25,30}; do
-    for model in {"SGD","Ridge"}; do
+for feature in {'variances','samples'}; do
+    for n in {3,4,5,6,7,8,9,10,15,20,25,30}; do
         for row in {1,2,3,4,5}; do
             for column in {1,2,3,4,5}; do
 
                 # Run creation of dataset and train model
-                DATASET_NAME="data/dataset_${n}_column_${column}_row_${row}.csv"
-                MODEL_NAME="${n}_column_${column}_row_${row}_${model}"
+                DATASET_NAME="data/dataset_${n}_${feature}_column_${column}_row_${row}.csv"
 
                 if ! grep -q "${MODEL_NAME}" "${file_path}"; then
-                    echo "Run computation for model ${MODEL_NAME}"
+                    echo "Run computation data for model ${MODEL_NAME}"
 
-                    # python make_dataset.py --n ${n} --each_row ${row} --each_column ${column}
-                    python train_model.py --data ${DATASET_NAME} --model ${model}
-                else
-                    echo "${MODEL_NAME} results already computed.."
+                    python make_dataset.py --n ${n} --feature ${feature} --each_row ${row} --each_column ${column}
                 fi
+
+                for model in {"SGD","Ridge"}; do
+
+                    MODEL_NAME="${n}_${feature}_column_${column}_row_${row}_${model}"
+
+                    if ! grep -q "${MODEL_NAME}" "${file_path}"; then
+                        echo "Run computation for model ${MODEL_NAME}"
+
+                        python train_model.py --data ${DATASET_NAME} --model ${model}
+                    else
+                        echo "${MODEL_NAME} results already computed.."
+                    fi
+                done
             done
         done
     done

+ 26 - 24
run_keras.sh

@@ -1,5 +1,5 @@
-# erase "models_info/models_comparisons.csv" file and write new header
-file_path='models_info/models_comparisons_keras.csv'
+# erase "results/models_comparisons.csv" file and write new header
+file_path='results/models_comparisons_keras.csv'
 
 erased=$1
 
@@ -13,28 +13,30 @@ if [ "${erased}" == "Y" ]; then
     echo 'model_name; number_of_approximations; coeff_of_determination; MSE 10 samples; MSE 1000 samples;' >> ${file_path}
 fi
 
-for n in {3,4,5,6,7,8,9,10,15,20,25,30}; do
-   for row in {1,2,3,4,5}; do
-       for column in {1,2,3,4,5}; do
-
-            # Run creation of dataset and train model
-            DATASET_NAME="data/dataset_${n}_column_${column}_row_${row}.csv"
-            MODEL_NAME="${n}_column_${column}_row_${row}_KERAS"
-            IMAGE_RECONSTRUCTED="Sponza1_${n}_${row}_${column}.png"
-
-            if ! grep -q "${MODEL_NAME}" "${file_path}"; then
-                echo "Run computation for model ${MODEL_NAME}"
-
-                # Already computed..
-                #python make_dataset.py --n ${n} --each_row ${row} --each_column ${column}
-                python train_model_keras.py --data ${DATASET_NAME} --model_name ${MODEL_NAME}
-
-                # TODO : Add of reconstruct process for image ?
-                python reconstruct_keras.py --n ${n} --model_path saved_models/${MODEL_NAME}.json --scene Sponza1 --image_name ${IMAGE_RECONSTRUCTED}
-                python write_result_keras.py --n ${n} --model_path saved_models/${MODEL_NAME}.json --scene Sponza1 --image_path reconstructed/${IMAGE_RECONSTRUCTED} --data ${DATASET_NAME} --iqa mse &
-            else
-                echo "${MODEL_NAME} results already computed.."
-            fi
+for feature in {'variances','samples'}; do
+    for n in {3,4,5,6,7,8,9,10,15,20,25,30}; do
+    for row in {1,2,3,4,5}; do
+        for column in {1,2,3,4,5}; do
+
+                # Run creation of dataset and train model
+                DATASET_NAME="data/dataset_${n}_${feature}_column_${column}_row_${row}.csv"
+                MODEL_NAME="${n}_${feature}_column_${column}_row_${row}_${model}"
+                IMAGE_RECONSTRUCTED="Sponza1_${feature}_${n}_${row}_${column}.png"
+
+                if ! grep -q "${MODEL_NAME}" "${file_path}"; then
+                    echo "Run computation for model ${MODEL_NAME}"
+
+                    # Already computed..
+                    python make_dataset.py --n ${n} --feature ${feature} --each_row ${row} --each_column ${column}
+                    python train_model_keras.py --data ${DATASET_NAME} --model_name ${MODEL_NAME}
+
+                    # TODO : Add of reconstruct process for image ?
+                    python reconstruct_keras.py --n ${n} --feature ${feature} --model_path saved_models/${MODEL_NAME}.json --scene Sponza1 --image_name ${IMAGE_RECONSTRUCTED}
+                    python write_result_keras.py --n ${n} --feature ${feature} --model_path saved_models/${MODEL_NAME}.json --scene Sponza1 --image_path reconstructed/${IMAGE_RECONSTRUCTED} --data ${DATASET_NAME} --iqa mse &
+                else
+                    echo "${MODEL_NAME} results already computed.."
+                fi
+            done
         done
     done
 done

+ 1 - 1
write_result_keras.py

@@ -9,12 +9,12 @@ from sklearn.model_selection import train_test_split
 from sklearn.preprocessing import MinMaxScaler
 
 import modules.config as cfg
-import modules.metrics as metrics
 
 from joblib import dump, load
 from PIL import Image
 
 import ipfml.iqa.fr as fr
+from ipfml import metrics
 
 
 n_samples_image_name_postfix = "_samples_mean.png"