Browse Source

Resolve "copy model to project folder"

Eric Tröbs 4 years ago
parent
commit
12437038ff

+ 9 - 0
pycs/projects/Project.py

@@ -1,3 +1,4 @@
+from json import load
 from os import path
 from uuid import uuid1
 
@@ -17,6 +18,14 @@ class Project(ObservableDict):
         for key in obj['data'].keys():
             obj['data'][key] = MediaFile(obj['data'][key], self)
 
+        # load model data
+        folder = path.join('projects', obj['id'], 'model')
+        with open(path.join(folder, 'distribution.json'), 'r') as file:
+            model = load(file)
+            model['path'] = folder
+
+            obj['model'] = model
+
         # initialize super
         super().__init__(obj, parent)
 

+ 11 - 8
pycs/projects/ProjectManager.py

@@ -1,7 +1,7 @@
 from glob import glob
 from json import load, dump
 from os import path, mkdir
-from shutil import rmtree
+from shutil import rmtree, copytree
 from time import time
 from uuid import uuid1
 
@@ -39,29 +39,32 @@ class ProjectManager(ObservableDict):
         with open(path.join('projects', uuid, 'project.json'), 'w') as file:
             copy = self[uuid].copy()
             del copy['jobs']
+            del copy['model']
 
             dump(copy, file, indent=4)
 
     def create_project(self, name, description, model):
         # create dict representation
         uuid = str(uuid1())
+
+        # create project directory
+        folder = path.join('projects', uuid)
+        mkdir(folder)
+
+        # copy model to project directory
+        copytree(self.parent['models'][model]['path'], path.join(folder, 'model'))
+
+        # create project object
         self[uuid] = Project({
             'id': uuid,
             'name': name,
             'description': description,
             'created': int(time()),
-            'pipeline': {
-                'model-distribution': model
-            },
             'data': {},
             'labels': {},
             'jobs': {}
         }, self)
 
-        # create project directory
-        folder = path.join('projects', uuid)
-        mkdir(folder)
-
         # create project.json
         self.write_project(uuid)
 

+ 7 - 5
webui/src/components/media/annotated-image.vue

@@ -7,7 +7,7 @@
 
     <annotation-box v-if="current"
                     :image="image"
-                    :supports="model.supports"
+                    :supports="project.model.supports"
                     :position="current"/>
 
     <annotation-box v-for="(result, index) in predictions"
@@ -19,7 +19,7 @@
                     :socket="socket"
                     :box-url="mediaUrl + '/' + result.id"
                     :labels="project.labels"
-                    :supports="model.supports"
+                    :supports="project.model.supports"
                     @move="move"
                     @resize="resize"/>
   </div>
@@ -31,7 +31,7 @@ import AnnotationBox from "@/components/media/annotation-box";
 export default {
   name: "annotated-image",
   components: {AnnotationBox},
-  props: ['data', 'project', 'model', 'socket'],
+  props: ['data', 'project', 'socket'],
   mounted: function () {
     window.addEventListener("resize", this.resizeEvent);
 
@@ -80,7 +80,8 @@ export default {
           .filter(k => 'x' in k);
     },
     events: function () {
-      if (this.model.supports.includes('bounding-boxes') || this.model.supports.includes('labeled-bounding-boxes'))
+      if (this.project.model.supports.includes('bounding-boxes')
+          || this.project.model.supports.includes('labeled-bounding-boxes')) {
         return {
           'touchstart': this.press,
           'touchmove': this.track,
@@ -90,8 +91,9 @@ export default {
           'mouseup': this.release,
           'dragstart': e => e.stopPropagation()
         }
-      else
+      } else {
         return {}
+      }
     }
   },
   methods: {

+ 2 - 3
webui/src/components/media/annotated-media-view.vue

@@ -2,7 +2,7 @@
   <div class="annotated-media-view">
     <div class="media">
       <annotated-image :data="currentMedia"
-                       :project="currentProject" :model="currentModel"
+                       :project="currentProject"
                        :socket="socket"/>
     </div>
 
@@ -13,7 +13,6 @@
                      :control="showMediaSelector"
                      @control="showMediaSelector = $event"
                      :project="currentProject"
-                     :model="currentModel"
                      :data="currentMedia"
                      :socket="socket"/>
     </div>
@@ -36,7 +35,7 @@ import MediaControl from "@/components/media/media-control";
 export default {
   name: "annotated-media-view",
   components: {MediaControl, AnnotatedImage, MediaSelector},
-  props: ['currentProject', 'currentModel', 'socket'],
+  props: ['currentProject', 'socket'],
   data: function () {
     return {
       current: 0,

+ 1 - 1
webui/src/components/media/annotation-box.vue

@@ -7,7 +7,7 @@
 
     <div class="buttons">
       <template v-if="!immutable">
-        <div v-if="position.label" class="label-text">{{ currentLabel.name }}</div>
+        <div v-if="position.label" class="label-text">{{ currentLabel !== undefined ? currentLabel.name : '' }}</div>
 
         <img v-if="confirmationButton"
              alt="confirm" src="@/assets/icons/check.svg"

+ 2 - 2
webui/src/components/media/media-control.vue

@@ -33,7 +33,7 @@
       &gt;
     </button-input>
 
-    <button-input type="transparent" v-if="model.supports.includes('labeled-images')">
+    <button-input type="transparent" v-if="project.model.supports.includes('labeled-images')">
       <img alt="label" src="@/assets/icons/tag.svg"
            :class="{tagged: currentLabel}"
            @touchstart.stop @mousedown.stop
@@ -64,7 +64,7 @@ import ButtonRow from "@/components/base/button-row";
 export default {
   name: "media-control",
   components: {ButtonRow, ButtonInput},
-  props: ['hasPrevious', 'hasNext', 'control', 'data', 'project', 'model', 'socket'],
+  props: ['hasPrevious', 'hasNext', 'control', 'data', 'project', 'socket'],
   data: function () {
     return {
       showLabelSelection: false

+ 2 - 10
webui/src/components/projects/project-data-view-window.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="project-data-view-window">
-    <annotated-media-view :currentProject="currentProject" :currentModel="currentModel" :socket="socket"/>
+    <annotated-media-view :currentProject="currentProject" :socket="socket"/>
   </div>
 </template>
 
@@ -10,15 +10,7 @@ import AnnotatedMediaView from "@/components/media/annotated-media-view";
 export default {
   name: "project-data-view-window",
   components: {AnnotatedMediaView},
-  props: ['status', 'socket', 'currentProject'],
-  computed: {
-    currentModel: function () {
-      if (this.currentProject.pipeline['model-distribution'] in this.status.models)
-        return this.status.models[this.currentProject.pipeline['model-distribution']];
-
-      return false;
-    }
-  }
+  props: ['status', 'socket', 'currentProject']
 }
 </script>