diff --git a/api/models.py b/api/models.py index 8a836b8..a814d0b 100644 --- a/api/models.py +++ b/api/models.py @@ -34,11 +34,12 @@ class Video(models.Model): else: raise TooLargeFile() - def create_comic(self, frames_mode=0, rl_mode=0): + def create_comic(self, frames_mode=0, rl_mode=0, image_assessment_mode=0): keyframes, keyframes_extraction_time = KeyFramesExtractor.get_keyframes( video=self, frames_mode=frames_mode, - rl_mode=rl_mode + rl_mode=rl_mode, + image_assessment_mode=image_assessment_mode ) stylized_keyframes, stylization_time = StyleTransfer.get_stylized_frames(frames=keyframes) comic_image, layout_generation_time = LayoutGenerator.get_layout(frames=stylized_keyframes) diff --git a/api/serializers.py b/api/serializers.py index 7c956db..47c7c05 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -8,6 +8,7 @@ class VideoSerializer(serializers.Serializer): file = serializers.FileField() frames_mode = serializers.IntegerField(min_value=0, max_value=1, default=settings.DEFAULT_FRAMES_SAMPLING_MODE) rl_mode = serializers.IntegerField(min_value=0, max_value=1, default=settings.DEFAULT_RL_MODE) + image_assessment_mode = serializers.IntegerField(min_value=0, max_value=1, default=settings.DEFAULT_IMAGE_ASSESSMENT_MODE) def validate(self, attrs): file = attrs.get("file") @@ -22,3 +23,4 @@ class YouTubeDownloadSerializer(serializers.Serializer): url = serializers.URLField() frames_mode = serializers.IntegerField(min_value=0, max_value=1, default=settings.DEFAULT_FRAMES_SAMPLING_MODE) rl_mode = serializers.IntegerField(min_value=0, max_value=1, default=settings.DEFAULT_RL_MODE) + image_assessment_mode = serializers.IntegerField(min_value=0, max_value=1, default=settings.DEFAULT_IMAGE_ASSESSMENT_MODE) diff --git a/api/views.py b/api/views.py index 54343bd..77cde9d 100644 --- a/api/views.py +++ b/api/views.py @@ -21,7 +21,8 @@ class Comixify(APIView): video = Video.objects.create(file=video_file) comic_image, timings = video.create_comic( frames_mode=serializer.validated_data["frames_mode"], - rl_mode=serializer.validated_data["rl_mode"] + rl_mode=serializer.validated_data["rl_mode"], + image_assessment_mode=serializer.validated_data["image_assessment_mode"] ) comic, from_nparray_time = Comic.create_from_nparray(comic_image, video) timings['from_nparray_time'] = from_nparray_time @@ -52,7 +53,8 @@ class ComixifyFromYoutube(APIView): video.save() comic_image, timings = video.create_comic( frames_mode=serializer.validated_data["frames_mode"], - rl_mode=serializer.validated_data["rl_mode"] + rl_mode=serializer.validated_data["rl_mode"], + image_assessment_mode=serializer.validated_data["image_assessment_mode"] ) comic, from_nparray_time = Comic.create_from_nparray(comic_image, video) timings['from_nparray_time'] = from_nparray_time diff --git a/frontend/client/App.js b/frontend/client/App.js index 275c605..db415a3 100644 --- a/frontend/client/App.js +++ b/frontend/client/App.js @@ -31,13 +31,15 @@ class App extends React.Component { drop_errors: [], result_comics: null, framesMode: "0", - rlMode: "0" + rlMode: "0", + imageAssessment: "0" }; this.onVideoDrop = this.onVideoDrop.bind(this); this.onModelChange = this.onModelChange.bind(this); this.handleResponse = this.handleResponse.bind(this); this.onYouTubeSubmit = this.onYouTubeSubmit.bind(this); this.onSamplingChange = this.onSamplingChange.bind(this); + this.onImageAssessmentChange = this.onImageAssessmentChange.bind(this); } static onVideoUploadProgress(progressEvent) { let percentCompleted = Math.round( @@ -56,6 +58,12 @@ class App extends React.Component { this.setState({ framesMode: value }) + } + onImageAssessmentChange(e) { + let value = e.currentTarget.value; + this.setState({ + imageAssessment: value + }) } handleResponse(res) { if (res.data["status_message"] === "ok") { @@ -70,11 +78,12 @@ class App extends React.Component { } } processVideo(video) { - let { framesMode, rlMode } = this.state + let { framesMode, rlMode, imageAssessment } = this.state; let data = new FormData(); data.append("file", video); data.set('frames_mode', parseInt(framesMode)); data.set('rl_mode', parseInt(rlMode)); + data.set("image_assessment_mode", parseInt(imageAssessment)); post(COMIXIFY_API, data, { headers: { "content-type": "multipart/form-data" }, onUploadProgress: App.onVideoUploadProgress @@ -102,11 +111,12 @@ class App extends React.Component { this.processVideo(files[0]); } submitYouTube(link) { - let { framesMode, rlMode } = this.state; + let { framesMode, rlMode, imageAssessment } = this.state; post(FROM_YOUTUBE_API, { url: link, frames_mode: parseInt(framesMode), - rl_mode: parseInt(rlMode) + rl_mode: parseInt(rlMode), + image_assessment_mode: parseInt(imageAssessment) }) .then(this.handleResponse) .catch(err => { @@ -132,7 +142,9 @@ class App extends React.Component { }); } render() { - let { state, drop_errors, result_comics, framesMode, rlMode, videoId } = this.state; + let { + state, drop_errors, result_comics, framesMode, rlMode, videoId, imageAssessment + } = this.state; let showUsage = [ App.appStates.INITIAL, App.appStates.UPLOAD_ERROR, @@ -198,9 +210,30 @@ class App extends React.Component { onChange={this.onModelChange} /> + +
+ Image assessment: + + + +
- )} + )} {showUsage && ( 1?r-1:0),a=1;a1&&void 0!==arguments[1]?arguments[1]:$;return t.setState(function(t){var r=t.stateValue;return{stateValue:n(r,e)}},function(){return r(t.state.stateValue)})},o=e,p()(t,o)}return h()(a,r),a.prototype.initializeStateValue=function(){return void 0!==o?"function"==typeof o?o(this.props):o:n(void 0,{type:"@@recompose/INIT"})},a.prototype.render=function(){var n;return u(i()({},this.props,((n={})[e]=this.state.stateValue,n[t]=this.dispatch,n)))},a}(r.Component)}},Y=function(e){return e},K=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Y;return function(o){var a=void 0,i=void 0;return function(u){return e(u)?(a=a||Object(r.createFactory)(t(o)))(u):(i=i||Object(r.createFactory)(n(o)))(u)}}},G=function(e){return function(t){var n=Object(r.createFactory)(e);return function(e){return n(e)}}},X=function(e){function t(){return c()(this,t),p()(this,e.apply(this,arguments))}return h()(t,e),t.prototype.render=function(){return null},t}(r.Component),Q=function(e){return X},Z=function(e){return function(t){var n=Object(r.createFactory)(t);return function(t){function r(){return c()(this,r),p()(this,t.apply(this,arguments))}return h()(r,t),r.prototype.shouldComponentUpdate=function(t){return e(this.props,t)},r.prototype.render=function(){return n(this.props)},r}(r.Component)}},J=function(e){return Z(function(e,t){return!l()(e,t)})(e)},ee=function(e){return Z(function(t,n){return!l()(U(n,e),U(t,e))})},te=function(e){var t=e.propTypes,n=_()(t||{});return ee(n)(e)},ne=function(e,t){return function(n){var o=Object(r.createFactory)(n),a=function(e){function n(){var r,o,a;c()(this,n);for(var i=arguments.length,u=Array(i),l=0;l=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};r.forEach(["delete","get","head"],function(e){u.headers[e]={}}),r.forEach(["post","put","patch"],function(e){u.headers[e]=r.merge(a)}),e.exports=u}).call(this,n(75))},function(e,t,n){var r=n(18);e.exports=function(e,t){if(!r(e))return e;var n,o;if(t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;if("function"==typeof(n=e.valueOf)&&!r(o=n.call(e)))return o;if(!t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;throw TypeError("Can't convert object to primitive value")}},function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:n)(e)}},function(e,t,n){var r=n(48)("keys"),o=n(34);e.exports=function(e){return r[e]||(r[e]=o(e))}},function(e,t,n){var r=n(10),o=n(11),a=o["__core-js_shared__"]||(o["__core-js_shared__"]={});(e.exports=function(e,t){return a[e]||(a[e]=void 0!==t?t:{})})("versions",[]).push({version:r.version,mode:n(33)?"pure":"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})},function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t,n){var r=n(45);e.exports=function(e){return Object(r(e))}},function(e,t){e.exports={}},function(e,t,n){var r=n(24),o=n(221),a=n(49),i=n(47)("IE_PROTO"),u=function(){},l=function(){var e,t=n(83)("iframe"),r=a.length;for(t.style.display="none",n(222).appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("