From 0601176a42c7aec83412340b5278fc05c57a3c38 Mon Sep 17 00:00:00 2001 From: naman14 Date: Sat, 14 May 2016 00:07:05 +0530 Subject: [PATCH] preferneces and builder configure --- app/src/main/AndroidManifest.xml | 17 ++- .../java/com/naman14/arcade/MainActivity.java | 21 +++- .../com/naman14/arcade/SettingsActivity.java | 106 ++++++++++++++++++ app/src/main/res/layout/activity_settings.xml | 19 ++++ app/src/main/res/values-v21/styles.xml | 3 + app/src/main/res/values/arrays.xml | 15 +++ app/src/main/res/values/styles.xml | 4 + app/src/main/res/xml/preferences.xml | 34 ++++++ arcade/arcade.iml | 2 + arcade/src/main/AndroidManifest.xml | 10 +- arcade/src/main/assets/neural_style.lua | 5 +- .../naman14/arcade/library/ArcadeBuilder.java | 6 +- arcade/src/main/jni/arcade.cpp | 2 +- 13 files changed, 225 insertions(+), 19 deletions(-) create mode 100644 app/src/main/java/com/naman14/arcade/SettingsActivity.java create mode 100644 app/src/main/res/layout/activity_settings.xml create mode 100644 app/src/main/res/values/arrays.xml create mode 100644 app/src/main/res/xml/preferences.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 11c47c5..91a7466 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,27 +1,32 @@ + package="com.naman14.arcade"> - - + + + android:theme="@style/AppTheme"> + android:theme="@style/AppTheme.FullScreen"> + + diff --git a/app/src/main/java/com/naman14/arcade/MainActivity.java b/app/src/main/java/com/naman14/arcade/MainActivity.java index c95db39..ce1a41c 100644 --- a/app/src/main/java/com/naman14/arcade/MainActivity.java +++ b/app/src/main/java/com/naman14/arcade/MainActivity.java @@ -3,6 +3,7 @@ import android.animation.ArgbEvaluator; import android.animation.ObjectAnimator; import android.content.Intent; +import android.content.SharedPreferences; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -12,6 +13,7 @@ import android.os.Bundle; import android.os.Environment; import android.os.Handler; +import android.preference.PreferenceManager; import android.provider.MediaStore; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; @@ -114,6 +116,11 @@ public void onClick(View v) { }); builder = new ArcadeBuilder(MainActivity.this); + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); + builder.setImageSize(preferences.getInt("preference_image_size", 128)); + builder.setIterations(preferences.getInt("preference_iterations", 15)); + builder.setContentWeight(preferences.getInt("preference_content_weight", 20)); + builder.setStyleWeight(preferences.getInt("preference_style_weight", 200)); } @@ -127,8 +134,13 @@ public boolean onCreateOptionsMenu(Menu menu) { @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); - if (id == R.id.action_settings) { - return true; + switch (id) { + case android.R.id.home: + onBackPressed(); + break; + case R.id.action_settings: + startActivity(new Intent(MainActivity.this, SettingsActivity.class)); + break; } return super.onOptionsItemSelected(item); @@ -174,6 +186,7 @@ public void onBackPressed() { super.onBackPressed(); break; case STATE_STYLE_CHOOSE: + getSupportActionBar().setDisplayHomeAsUpEnabled(false); currentState = STATE_CONTENT_CHOOSE; content.setVisibility(View.VISIBLE); showLogoView(); @@ -244,6 +257,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case PICK_STYLE_IMAGE: currentState = STATE_BEGIN_STYLING; + getSupportActionBar().setDisplayHomeAsUpEnabled(true); builder.setStyleimage(filePath); ImageLoader.getInstance().displayImage(Uri.fromFile(new File(filePath)).toString(), styleImagePreview, options); handler.postDelayed(new Runnable() { @@ -260,6 +274,7 @@ public void run() { case PICK_CONTENT_IMAGE: builder.setContentImage(filePath); content.setVisibility(View.GONE); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); currentState = STATE_STYLE_CHOOSE; ImageLoader.getInstance().displayImage(Uri.fromFile(new File(filePath)).toString(), stylizedImage, options); handler.postDelayed(new Runnable() { @@ -404,7 +419,7 @@ protected String doInBackground(Void... params) { if (!myDir.exists()) myDir.mkdirs(); - File file = new File(myDir.getAbsolutePath(), name.replaceAll("\\s+","") + ".png"); + File file = new File(myDir.getAbsolutePath(), name.replaceAll("\\s+", "") + ".png"); if (file.exists()) file.delete(); try { FileOutputStream out = new FileOutputStream(file); diff --git a/app/src/main/java/com/naman14/arcade/SettingsActivity.java b/app/src/main/java/com/naman14/arcade/SettingsActivity.java new file mode 100644 index 0000000..c447764 --- /dev/null +++ b/app/src/main/java/com/naman14/arcade/SettingsActivity.java @@ -0,0 +1,106 @@ +package com.naman14.arcade; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.preference.Preference; +import android.preference.PreferenceFragment; +import android.preference.PreferenceManager; +import android.support.annotation.Nullable; +import android.support.v7.app.AlertDialog; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.text.InputType; +import android.view.MenuItem; +import android.widget.EditText; + +/** + * Created by naman on 13/05/16. + */ +public class SettingsActivity extends AppCompatActivity { + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_settings); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setTitle("Settings"); + getFragmentManager().beginTransaction().replace(R.id.container, new SettingsFragment()).commit(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) + super.onBackPressed(); + return super.onOptionsItemSelected(item); + } + + public static class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { + + SharedPreferences preferences; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.preferences); + + preferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); + findPreference("preference_iterations").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + showEditDialog(getActivity(), preferences, "Number of iterations", "Iterations", "preference_iterations"); + return true; + } + }); + findPreference("preference_style_weight").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + showEditDialog(getActivity(), preferences, "Style weight", "Style weight", "preference_style_weight"); + return true; + } + }); + findPreference("preference_content_weight").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + showEditDialog(getActivity(), preferences, "Content weight", "Content weight", "preference_content_weight"); + return true; + } + }); + findPreference("preference_defaults").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + preferences.edit().putInt("preference_iterations", 15).apply(); + preferences.edit().putInt("preference_style_weight", 200).apply(); + preferences.edit().putInt("preference_content_weight", 20).apply(); + preferences.edit().putInt("preference_image_size", 128).apply(); + return true; + } + }); + } + + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + findPreference(key).setSummary(String.valueOf(preferences.getInt(key, -1))); + } + } + + private static void showEditDialog(Context context, final SharedPreferences preferences, String title, String hint, final String key) { + AlertDialog.Builder alertDialog = new AlertDialog.Builder(context); + alertDialog.setTitle(title); + final EditText input = new EditText(context); + input.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED); + input.setHint(hint); + input.setText(String.valueOf(preferences.getInt(key, -1))); + alertDialog.setView(input); + alertDialog.setPositiveButton("Save", + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + preferences.edit().putInt(key, Integer.parseInt(input.getText().toString())).apply(); + } + }); + alertDialog.show(); + } +} diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml new file mode 100644 index 0000000..1453978 --- /dev/null +++ b/app/src/main/res/layout/activity_settings.xml @@ -0,0 +1,19 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml index 90e0b21..343ab10 100644 --- a/app/src/main/res/values-v21/styles.xml +++ b/app/src/main/res/values-v21/styles.xml @@ -3,6 +3,9 @@ + + diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml new file mode 100644 index 0000000..3b6439e --- /dev/null +++ b/app/src/main/res/values/arrays.xml @@ -0,0 +1,15 @@ + + + + 128 + 256 + 512 + + + + 128 + 256 + 512 + + + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 44f664f..ead4d74 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -7,11 +7,15 @@ @color/colorPrimaryDark @color/colorAccent + + diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml new file mode 100644 index 0000000..e8f9674 --- /dev/null +++ b/app/src/main/res/xml/preferences.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/arcade/arcade.iml b/arcade/arcade.iml index ab43d64..9e83632 100644 --- a/arcade/arcade.iml +++ b/arcade/arcade.iml @@ -71,6 +71,8 @@ + + diff --git a/arcade/src/main/AndroidManifest.xml b/arcade/src/main/AndroidManifest.xml index 93956c4..f42fb61 100644 --- a/arcade/src/main/AndroidManifest.xml +++ b/arcade/src/main/AndroidManifest.xml @@ -1,12 +1,12 @@ - + - - + android:largeHeap="true" + android:supportsRtl="true"> diff --git a/arcade/src/main/assets/neural_style.lua b/arcade/src/main/assets/neural_style.lua index 98a520c..3243f27 100644 --- a/arcade/src/main/assets/neural_style.lua +++ b/arcade/src/main/assets/neural_style.lua @@ -276,11 +276,14 @@ function stylize(params) local disp = deprocess(img:double()) disp = image.minmax { tensor = disp, min = 0, max = 1 } local filename = build_filename(params.output_image, t) + local isFinal = false; if t == params.num_iterations then + isFinal = true; filename = params.output_image end updateProgress("Saving image") image.save(filename, disp) +-- onImageSaved(filename, isFinal) end end @@ -317,7 +320,7 @@ function stylize(params) updateProgress('Running optimization with ADAM') for t = 1, params.num_iterations do updateProgress(string.format("Doing Iteration %i of %s ...", t, params.num_iterations)) --- updateIteration(t, params.num_iterations) + -- updateIteration(t, params.num_iterations) local x, losses = optim.adam(feval, img, optim_state) end updateProgress("Done") diff --git a/arcade/src/main/java/com/naman14/arcade/library/ArcadeBuilder.java b/arcade/src/main/java/com/naman14/arcade/library/ArcadeBuilder.java index b89021c..ab166a1 100644 --- a/arcade/src/main/java/com/naman14/arcade/library/ArcadeBuilder.java +++ b/arcade/src/main/java/com/naman14/arcade/library/ArcadeBuilder.java @@ -49,12 +49,12 @@ public ArcadeBuilder(Context context) { this.styleLayers = "relu0,relu3,relu7,relu12"; this.protoFIle = "/storage/emulated/0/models/train_val.prototxt"; this.modelFile = "/storage/emulated/0/models/nin_imagenet_conv.caffemodel"; - this.contentWeight = 100; - this.styleWeight = 100; + this.contentWeight = 20; + this.styleWeight = 200; this.printIterations = 1; this.saveIterations = 1; this.styleScale = 1L; - this.pooling = "avg"; + this.pooling = "max"; this.tvWeight = (long) 0.01; this.seed = 123; this.learningRate = 10; diff --git a/arcade/src/main/jni/arcade.cpp b/arcade/src/main/jni/arcade.cpp index b64e7ef..8114bcf 100644 --- a/arcade/src/main/jni/arcade.cpp +++ b/arcade/src/main/jni/arcade.cpp @@ -3,6 +3,7 @@ #include #include "torchandroid.h" #include +#include extern "C" { @@ -48,7 +49,6 @@ static void onImageSaved(lua_State *L) { //called from lua static void onIterationUpdate(lua_State *L) { - int n = lua_gettop(L); int i;