You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

916 lines
39 KiB
Python

# Generated by Django 2.1.5 on 2019-02-21 12:25
import cvat.apps.engine.models
from django.db import migrations, models
import django.db.models.deletion
from django.conf import settings
from cvat.apps.dataset_manager.task import _merge_table_rows
# some modified functions to transer annotation
def _bulk_create(db_model, db_alias, objects, flt_param):
if objects:
if flt_param:
if 'postgresql' in settings.DATABASES["default"]["ENGINE"]:
return db_model.objects.using(db_alias).bulk_create(objects)
else:
ids = list(db_model.objects.using(db_alias).filter(**flt_param).values_list('id', flat=True))
db_model.objects.using(db_alias).bulk_create(objects)
return list(db_model.objects.using(db_alias).exclude(id__in=ids).filter(**flt_param))
else:
return db_model.objects.using(db_alias).bulk_create(objects)
def get_old_db_shapes(shape_type, db_job):
def _get_shape_set(db_job, shape_type):
if shape_type == 'polygons':
return db_job.labeledpolygon_set
elif shape_type == 'polylines':
return db_job.labeledpolyline_set
elif shape_type == 'boxes':
return db_job.labeledbox_set
elif shape_type == 'points':
return db_job.labeledpoints_set
def get_values(shape_type):
if shape_type == 'polygons':
return [
('id', 'frame', 'points', 'label_id', 'group_id', 'occluded', 'z_order', 'client_id',
'labeledpolygonattributeval__value', 'labeledpolygonattributeval__spec_id',
'labeledpolygonattributeval__id'), {
'attributes': [
'labeledpolygonattributeval__value',
'labeledpolygonattributeval__spec_id',
'labeledpolygonattributeval__id'
]
}, 'labeledpolygonattributeval_set'
]
elif shape_type == 'polylines':
return [
('id', 'frame', 'points', 'label_id', 'group_id', 'occluded', 'z_order', 'client_id',
'labeledpolylineattributeval__value', 'labeledpolylineattributeval__spec_id',
'labeledpolylineattributeval__id'), {
'attributes': [
'labeledpolylineattributeval__value',
'labeledpolylineattributeval__spec_id',
'labeledpolylineattributeval__id'
]
}, 'labeledpolylineattributeval_set'
]
elif shape_type == 'boxes':
return [
('id', 'frame', 'xtl', 'ytl', 'xbr', 'ybr', 'label_id', 'group_id', 'occluded', 'z_order', 'client_id',
'labeledboxattributeval__value', 'labeledboxattributeval__spec_id',
'labeledboxattributeval__id'), {
'attributes': [
'labeledboxattributeval__value',
'labeledboxattributeval__spec_id',
'labeledboxattributeval__id'
]
}, 'labeledboxattributeval_set'
]
elif shape_type == 'points':
return [
('id', 'frame', 'points', 'label_id', 'group_id', 'occluded', 'z_order', 'client_id',
'labeledpointsattributeval__value', 'labeledpointsattributeval__spec_id',
'labeledpointsattributeval__id'), {
'attributes': [
'labeledpointsattributeval__value',
'labeledpointsattributeval__spec_id',
'labeledpointsattributeval__id'
]
}, 'labeledpointsattributeval_set'
]
(values, merge_keys, prefetch) = get_values(shape_type)
db_shapes = list(_get_shape_set(db_job, shape_type).prefetch_related(prefetch).values(*values).order_by('frame'))
return _merge_table_rows(db_shapes, merge_keys, 'id')
def get_old_db_paths(db_job):
db_paths = db_job.objectpath_set
for shape in ['trackedpoints_set', 'trackedbox_set', 'trackedpolyline_set', 'trackedpolygon_set']:
db_paths.prefetch_related(shape)
for shape_attr in ['trackedpoints_set__trackedpointsattributeval_set', 'trackedbox_set__trackedboxattributeval_set',
'trackedpolygon_set__trackedpolygonattributeval_set', 'trackedpolyline_set__trackedpolylineattributeval_set']:
db_paths.prefetch_related(shape_attr)
db_paths.prefetch_related('objectpathattributeval_set')
db_paths = list (db_paths.values('id', 'frame', 'group_id', 'shapes', 'client_id', 'objectpathattributeval__spec_id',
'objectpathattributeval__id', 'objectpathattributeval__value',
'trackedbox', 'trackedpolygon', 'trackedpolyline', 'trackedpoints',
'trackedbox__id', 'label_id', 'trackedbox__xtl', 'trackedbox__ytl',
'trackedbox__xbr', 'trackedbox__ybr', 'trackedbox__frame', 'trackedbox__occluded',
'trackedbox__z_order','trackedbox__outside', 'trackedbox__trackedboxattributeval__spec_id',
'trackedbox__trackedboxattributeval__value', 'trackedbox__trackedboxattributeval__id',
'trackedpolygon__id' ,'trackedpolygon__points', 'trackedpolygon__frame', 'trackedpolygon__occluded',
'trackedpolygon__z_order', 'trackedpolygon__outside', 'trackedpolygon__trackedpolygonattributeval__spec_id',
'trackedpolygon__trackedpolygonattributeval__value', 'trackedpolygon__trackedpolygonattributeval__id',
'trackedpolyline__id', 'trackedpolyline__points', 'trackedpolyline__frame', 'trackedpolyline__occluded',
'trackedpolyline__z_order', 'trackedpolyline__outside', 'trackedpolyline__trackedpolylineattributeval__spec_id',
'trackedpolyline__trackedpolylineattributeval__value', 'trackedpolyline__trackedpolylineattributeval__id',
'trackedpoints__id', 'trackedpoints__points', 'trackedpoints__frame', 'trackedpoints__occluded',
'trackedpoints__z_order', 'trackedpoints__outside', 'trackedpoints__trackedpointsattributeval__spec_id',
'trackedpoints__trackedpointsattributeval__value', 'trackedpoints__trackedpointsattributeval__id')
.order_by('id', 'trackedbox__frame', 'trackedpolygon__frame', 'trackedpolyline__frame', 'trackedpoints__frame'))
db_box_paths = list(filter(lambda path: path['shapes'] == 'boxes', db_paths ))
db_polygon_paths = list(filter(lambda path: path['shapes'] == 'polygons', db_paths ))
db_polyline_paths = list(filter(lambda path: path['shapes'] == 'polylines', db_paths ))
db_points_paths = list(filter(lambda path: path['shapes'] == 'points', db_paths ))
object_path_attr_merge_key = [
'objectpathattributeval__value',
'objectpathattributeval__spec_id',
'objectpathattributeval__id'
]
db_box_paths = _merge_table_rows(db_box_paths, {
'attributes': object_path_attr_merge_key,
'shapes': [
'trackedbox__id', 'trackedbox__xtl', 'trackedbox__ytl',
'trackedbox__xbr', 'trackedbox__ybr', 'trackedbox__frame',
'trackedbox__occluded', 'trackedbox__z_order', 'trackedbox__outside',
'trackedbox__trackedboxattributeval__value',
'trackedbox__trackedboxattributeval__spec_id',
'trackedbox__trackedboxattributeval__id'
],
}, 'id')
db_polygon_paths = _merge_table_rows(db_polygon_paths, {
'attributes': object_path_attr_merge_key,
'shapes': [
'trackedpolygon__id', 'trackedpolygon__points', 'trackedpolygon__frame',
'trackedpolygon__occluded', 'trackedpolygon__z_order', 'trackedpolygon__outside',
'trackedpolygon__trackedpolygonattributeval__value',
'trackedpolygon__trackedpolygonattributeval__spec_id',
'trackedpolygon__trackedpolygonattributeval__id'
]
}, 'id')
db_polyline_paths = _merge_table_rows(db_polyline_paths, {
'attributes': object_path_attr_merge_key,
'shapes': [
'trackedpolyline__id', 'trackedpolyline__points', 'trackedpolyline__frame',
'trackedpolyline__occluded', 'trackedpolyline__z_order', 'trackedpolyline__outside',
'trackedpolyline__trackedpolylineattributeval__value',
'trackedpolyline__trackedpolylineattributeval__spec_id',
'trackedpolyline__trackedpolylineattributeval__id'
],
}, 'id')
db_points_paths = _merge_table_rows(db_points_paths, {
'attributes': object_path_attr_merge_key,
'shapes': [
'trackedpoints__id', 'trackedpoints__points', 'trackedpoints__frame',
'trackedpoints__occluded', 'trackedpoints__z_order', 'trackedpoints__outside',
'trackedpoints__trackedpointsattributeval__value',
'trackedpoints__trackedpointsattributeval__spec_id',
'trackedpoints__trackedpointsattributeval__id'
]
}, 'id')
for db_box_path in db_box_paths:
db_box_path.attributes = list(set(db_box_path.attributes))
db_box_path.type = 'box_path'
db_box_path.shapes = _merge_table_rows(db_box_path.shapes, {
'attributes': [
'trackedboxattributeval__value',
'trackedboxattributeval__spec_id',
'trackedboxattributeval__id'
]
}, 'id')
for db_polygon_path in db_polygon_paths:
db_polygon_path.attributes = list(set(db_polygon_path.attributes))
db_polygon_path.type = 'poligon_path'
db_polygon_path.shapes = _merge_table_rows(db_polygon_path.shapes, {
'attributes': [
'trackedpolygonattributeval__value',
'trackedpolygonattributeval__spec_id',
'trackedpolygonattributeval__id'
]
}, 'id')
for db_polyline_path in db_polyline_paths:
db_polyline_path.attributes = list(set(db_polyline_path.attributes))
db_polyline_path.type = 'polyline_path'
db_polyline_path.shapes = _merge_table_rows(db_polyline_path.shapes, {
'attributes': [
'trackedpolylineattributeval__value',
'trackedpolylineattributeval__spec_id',
'trackedpolylineattributeval__id'
]
}, 'id')
for db_points_path in db_points_paths:
db_points_path.attributes = list(set(db_points_path.attributes))
db_points_path.type = 'points_path'
db_points_path.shapes = _merge_table_rows(db_points_path.shapes, {
'attributes': [
'trackedpointsattributeval__value',
'trackedpointsattributeval__spec_id',
'trackedpointsattributeval__id'
]
}, 'id')
return db_box_paths + db_polygon_paths + db_polyline_paths + db_points_paths
def process_shapes(db_job, apps, db_labels, db_attributes, db_alias):
LabeledShape = apps.get_model('engine', 'LabeledShape')
LabeledShapeAttributeVal = apps.get_model('engine', 'LabeledShapeAttributeVal')
new_db_shapes = []
new_db_attrvals = []
for shape_type in ['boxes', 'points', 'polygons', 'polylines']:
for shape in get_old_db_shapes(shape_type, db_job):
new_db_shape = LabeledShape()
new_db_shape.job = db_job
new_db_shape.label = db_labels[shape.label_id]
new_db_shape.group = shape.group_id
if shape_type == 'boxes':
new_db_shape.type = cvat.apps.engine.models.ShapeType.RECTANGLE
new_db_shape.points = [shape.xtl, shape.ytl, shape.xbr, shape.ybr]
else:
new_db_shape.points = shape.points.replace(',', ' ').split()
if shape_type == 'points':
new_db_shape.type = cvat.apps.engine.models.ShapeType.POINTS
elif shape_type == 'polygons':
new_db_shape.type = cvat.apps.engine.models.ShapeType.POLYGON
elif shape_type == 'polylines':
new_db_shape.type = cvat.apps.engine.models.ShapeType.POLYLINE
new_db_shape.frame = shape.frame
new_db_shape.occluded = shape.occluded
new_db_shape.z_order = shape.z_order
for attr in shape.attributes:
db_attrval = LabeledShapeAttributeVal()
db_attrval.shape_id = len(new_db_shapes)
db_attrval.spec = db_attributes[attr.spec_id]
db_attrval.value = attr.value
new_db_attrvals.append(db_attrval)
new_db_shapes.append(new_db_shape)
new_db_shapes = _bulk_create(LabeledShape, db_alias, new_db_shapes, {"job_id": db_job.id})
for db_attrval in new_db_attrvals:
db_attrval.shape_id = new_db_shapes[db_attrval.shape_id].id
_bulk_create(LabeledShapeAttributeVal, db_alias, new_db_attrvals, {})
def process_paths(db_job, apps, db_labels, db_attributes, db_alias):
TrackedShape = apps.get_model('engine', 'TrackedShape')
LabeledTrack = apps.get_model('engine', 'LabeledTrack')
LabeledTrackAttributeVal = apps.get_model('engine', 'LabeledTrackAttributeVal')
TrackedShapeAttributeVal = apps.get_model('engine', 'TrackedShapeAttributeVal')
tracks = get_old_db_paths(db_job)
new_db_tracks = []
new_db_track_attrvals = []
new_db_shapes = []
new_db_shape_attrvals = []
for track in tracks:
db_track = LabeledTrack()
db_track.job = db_job
db_track.label = db_labels[track.label_id]
db_track.frame = track.frame
db_track.group = track.group_id
for attr in track.attributes:
db_attrspec = db_attributes[attr.spec_id]
db_attrval = LabeledTrackAttributeVal()
db_attrval.track_id = len(new_db_tracks)
db_attrval.spec = db_attrspec
db_attrval.value = attr.value
new_db_track_attrvals.append(db_attrval)
for shape in track.shapes:
db_shape = TrackedShape()
db_shape.track_id = len(new_db_tracks)
db_shape.frame = shape.frame
db_shape.occluded = shape.occluded
db_shape.z_order = shape.z_order
db_shape.outside = shape.outside
if track.type == 'box_path':
db_shape.type = cvat.apps.engine.models.ShapeType.RECTANGLE
db_shape.points = [shape.xtl, shape.ytl, shape.xbr, shape.ybr]
else:
db_shape.points = shape.points.replace(',', ' ').split()
if track.type == 'points_path':
db_shape.type = cvat.apps.engine.models.ShapeType.POINTS
elif track.type == 'polygon_path':
db_shape.type = cvat.apps.engine.models.ShapeType.POLYGON
elif track.type == 'polyline_path':
db_shape.type = cvat.apps.engine.models.ShapeType.POLYLINE
for attr in shape.attributes:
db_attrspec = db_attributes[attr.spec_id]
db_attrval = TrackedShapeAttributeVal()
db_attrval.shape_id = len(new_db_shapes)
db_attrval.spec = db_attrspec
db_attrval.value = attr.value
new_db_shape_attrvals.append(db_attrval)
new_db_shapes.append(db_shape)
new_db_tracks.append(db_track)
new_db_tracks = _bulk_create(LabeledTrack, db_alias, new_db_tracks, {"job_id": db_job.id})
for db_attrval in new_db_track_attrvals:
db_attrval.track_id = new_db_tracks[db_attrval.track_id].id
_bulk_create(LabeledTrackAttributeVal, db_alias, new_db_track_attrvals, {})
for db_shape in new_db_shapes:
db_shape.track_id = new_db_tracks[db_shape.track_id].id
new_db_shapes = _bulk_create(TrackedShape, db_alias, new_db_shapes, {"track__job_id": db_job.id})
for db_attrval in new_db_shape_attrvals:
db_attrval.shape_id = new_db_shapes[db_attrval.shape_id].id
_bulk_create(TrackedShapeAttributeVal, db_alias, new_db_shape_attrvals, {})
def copy_annotations_forward(apps, schema_editor):
db_alias = schema_editor.connection.alias
Task = apps.get_model('engine', 'Task')
AttributeSpec = apps.get_model('engine', 'AttributeSpec')
for task in Task.objects.all():
print("run anno migration for the task {}".format(task.id))
db_labels = {db_label.id:db_label for db_label in task.label_set.all()}
db_attributes = {db_attr.id:db_attr for db_attr in AttributeSpec.objects.filter(label__task__id=task.id)}
for segment in task.segment_set.prefetch_related('job_set').all():
db_job = segment.job_set.first()
print("run anno migration for the job {}".format(db_job.id))
process_shapes(db_job, apps, db_labels, db_attributes, db_alias)
process_paths(db_job, apps, db_labels, db_attributes, db_alias)
def _save_old_shapes_to_db(apps, db_shapes, db_attributes, db_alias, db_job):
def _get_shape_class(shape_type):
if shape_type == 'polygons':
return apps.get_model('engine', 'LabeledPolygon')
elif shape_type == 'polylines':
return apps.get_model('engine', 'LabeledPolyline')
elif shape_type == 'boxes':
return apps.get_model('engine', 'LabeledBox')
elif shape_type == 'points':
return apps.get_model('engine', 'LabeledPoints')
def _get_shape_attr_class(shape_type):
if shape_type == 'polygons':
return apps.get_model('engine', 'LabeledPolygonAttributeVal')
elif shape_type == 'polylines':
return apps.get_model('engine', 'LabeledPolylineAttributeVal')
elif shape_type == 'boxes':
return apps.get_model('engine', 'LabeledBoxAttributeVal')
elif shape_type == 'points':
return apps.get_model('engine', 'LabeledPointsAttributeVal')
shapes = [
list(filter(lambda s: s.type == cvat.apps.engine.models.ShapeType.RECTANGLE, db_shapes)),
list(filter(lambda s: s.type == cvat.apps.engine.models.ShapeType.POLYLINE, db_shapes)),
list(filter(lambda s: s.type == cvat.apps.engine.models.ShapeType.POLYGON, db_shapes)),
list(filter(lambda s: s.type == cvat.apps.engine.models.ShapeType.POINTS, db_shapes)),
]
for i, shape_type in enumerate(['boxes', 'polylines', 'polygons', 'points']):
new_db_shapes = []
new_db_attrvals = []
for shape in shapes[i]:
db_shape = _get_shape_class(shape_type)()
db_shape.job = shape.job
db_shape.label = shape.label
db_shape.group_id = shape.group
if shape.type == cvat.apps.engine.models.ShapeType.RECTANGLE:
db_shape.xtl = shape.points[0]
db_shape.ytl = shape.points[1]
db_shape.xbr = shape.points[2]
db_shape.ybr = shape.points[3]
else:
point_iterator = iter(shape.points)
db_shape.points = ' '.join(['{},{}'.format(point, next(point_iterator)) for point in point_iterator])
db_shape.frame = shape.frame
db_shape.occluded = shape.occluded
db_shape.z_order = shape.z_order
for attr in list(shape.labeledshapeattributeval_set.all()):
db_attrval = _get_shape_attr_class(shape_type)()
if shape.type == cvat.apps.engine.models.ShapeType.POLYGON:
db_attrval.polygon_id = len(new_db_shapes)
elif shape.type == cvat.apps.engine.models.ShapeType.POLYLINE:
db_attrval.polyline_id = len(new_db_shapes)
elif shape.type == cvat.apps.engine.models.ShapeType.RECTANGLE:
db_attrval.box_id = len(new_db_shapes)
else:
db_attrval.points_id = len(new_db_shapes)
db_attrval.spec = db_attributes[attr.spec_id]
db_attrval.value = attr.value
new_db_attrvals.append(db_attrval)
new_db_shapes.append(db_shape)
new_db_shapes = _bulk_create(_get_shape_class(shape_type), db_alias, new_db_shapes, {"job_id": db_job.id})
for db_attrval in new_db_attrvals:
if shape_type == 'polygons':
db_attrval.polygon_id = new_db_shapes[db_attrval.polygon_id].id
elif shape_type == 'polylines':
db_attrval.polyline_id = new_db_shapes[db_attrval.polyline_id].id
elif shape_type == 'boxes':
db_attrval.box_id = new_db_shapes[db_attrval.box_id].id
else:
db_attrval.points_id = new_db_shapes[db_attrval.points_id].id
_bulk_create(_get_shape_attr_class(shape_type), db_alias, new_db_attrvals, {})
def _save_old_tracks_to_db(apps, db_shapes, db_attributes, db_alias, db_job):
def _get_shape_class(shape_type):
if shape_type == 'polygon_paths':
return apps.get_model('engine', 'TrackedPolygon')
elif shape_type == 'polyline_paths':
return apps.get_model('engine', 'TrackedPolyline')
elif shape_type == 'box_paths':
return apps.get_model('engine', 'TrackedBox')
elif shape_type == 'points_paths':
return apps.get_model('engine', 'TrackedPoints')
def _get_shape_attr_class(shape_type):
if shape_type == 'polygon_paths':
return apps.get_model('engine', 'TrackedPolygonAttributeVal')
elif shape_type == 'polyline_paths':
return apps.get_model('engine', 'TrackedPolylineAttributeVal')
elif shape_type == 'box_paths':
return apps.get_model('engine', 'TrackedBoxAttributeVal')
elif shape_type == 'points_paths':
return apps.get_model('engine', 'TrackedPointsAttributeVal')
tracks = [
list(filter(lambda t: t.trackedshape_set.first().type == cvat.apps.engine.models.ShapeType.RECTANGLE, db_shapes)),
list(filter(lambda t: t.trackedshape_set.first().type == cvat.apps.engine.models.ShapeType.POLYLINE, db_shapes)),
list(filter(lambda t: t.trackedshape_set.first().type == cvat.apps.engine.models.ShapeType.POLYGON, db_shapes)),
list(filter(lambda t: t.trackedshape_set.first().type == cvat.apps.engine.models.ShapeType.POINTS, db_shapes)),
]
ObjectPath = apps.get_model('engine', 'ObjectPath')
ObjectPathAttributeVal = apps.get_model('engine', 'ObjectPathAttributeVal')
for i, shape_type in enumerate(['box_paths', 'polyline_paths', 'polygon_paths', 'points_paths', ]):
new_db_paths = []
new_db_path_attrvals = []
new_db_shapes = []
new_db_shape_attrvals = []
for path in tracks[i]:
db_path = ObjectPath()
db_path.job = db_job
db_path.label = path.label
db_path.frame = path.frame
db_path.group_id = path.group
# db_path.client_id = path.client_id
if shape_type == 'polygon_paths':
db_path.shapes = 'polygons'
elif shape_type == 'polyline_paths':
db_path.shapes = 'polylines'
elif shape_type == 'box_paths':
db_path.shapes = 'boxes'
elif shape_type == 'points_paths':
db_path.shapes = 'points'
for attr in list(path.labeledtrackattributeval_set.all()):
db_attrspec = db_attributes[attr.spec_id]
db_attrval = ObjectPathAttributeVal()
db_attrval.track_id = len(new_db_paths)
db_attrval.spec = db_attrspec
db_attrval.value = attr.value
new_db_path_attrvals.append(db_attrval)
for shape in list(path.trackedshape_set.all()):
db_shape = _get_shape_class(shape_type)()
db_shape.track_id = len(new_db_paths)
if shape_type == 'box_paths':
db_shape.xtl = shape.points[0]
db_shape.ytl = shape.points[1]
db_shape.xbr = shape.points[2]
db_shape.ybr = shape.points[3]
else:
point_iterator = iter(shape.points)
db_shape.points = ' '.join(['{},{}'.format(point, next(point_iterator)) for point in point_iterator])
db_shape.frame = shape.frame
db_shape.occluded = shape.occluded
db_shape.z_order = shape.z_order
db_shape.outside = shape.outside
for attr in list(shape.trackedshapeattributeval_set.all()):
db_attrspec = db_attributes[attr.spec_id]
db_attrval = _get_shape_attr_class(shape_type)()
if shape_type == 'polygon_paths':
db_attrval.polygon_id = len(new_db_shapes)
elif shape_type == 'polyline_paths':
db_attrval.polyline_id = len(new_db_shapes)
elif shape_type == 'box_paths':
db_attrval.box_id = len(new_db_shapes)
elif shape_type == 'points_paths':
db_attrval.points_id = len(new_db_shapes)
db_attrval.spec = db_attrspec
db_attrval.value = attr.value
new_db_shape_attrvals.append(db_attrval)
new_db_shapes.append(db_shape)
new_db_paths.append(db_path)
new_db_paths = _bulk_create(ObjectPath, db_alias, new_db_paths, {"job_id": db_job.id})
for db_attrval in new_db_path_attrvals:
db_attrval.track_id = new_db_paths[db_attrval.track_id].id
_bulk_create(ObjectPathAttributeVal, db_alias, new_db_path_attrvals, {})
for db_shape in new_db_shapes:
db_shape.track_id = new_db_paths[db_shape.track_id].id
db_shapes = _bulk_create(_get_shape_class(shape_type), db_alias, new_db_shapes, {"track__job_id": db_job.id})
for db_attrval in new_db_shape_attrvals:
if shape_type == 'polygon_paths':
db_attrval.polygon_id = db_shapes[db_attrval.polygon_id].id
elif shape_type == 'polyline_paths':
db_attrval.polyline_id = db_shapes[db_attrval.polyline_id].id
elif shape_type == 'box_paths':
db_attrval.box_id = db_shapes[db_attrval.box_id].id
elif shape_type == 'points_paths':
db_attrval.points_id = db_shapes[db_attrval.points_id].id
_bulk_create(_get_shape_attr_class(shape_type), db_alias, new_db_shape_attrvals, {})
def copy_annotations_backward(apps, schema_editor):
Task = apps.get_model('engine', 'Task')
AttributeSpec = apps.get_model('engine', 'AttributeSpec')
db_alias = schema_editor.connection.alias
for task in Task.objects.all():
db_attributes = {db_attr.id:db_attr for db_attr in AttributeSpec.objects.filter(label__task__id=task.id)}
for segment in task.segment_set.prefetch_related('job_set').all():
db_job = segment.job_set.first()
db_shapes = list(db_job.labeledshape_set
.prefetch_related("label")
.prefetch_related("labeledshapeattributeval_set"))
_save_old_shapes_to_db(apps, db_shapes, db_attributes, db_alias, db_job)
db_tracks = list(db_job.labeledtrack_set
.select_related("label")
.prefetch_related("labeledtrackattributeval_set")
.prefetch_related("trackedshape_set__trackedshapeattributeval_set"))
_save_old_tracks_to_db(apps, db_tracks, db_attributes, db_alias, db_job)
class Migration(migrations.Migration):
dependencies = [
('engine', '0016_attribute_spec_20190217'),
]
operations = [
migrations.CreateModel(
name='LabeledImageAttributeVal',
fields=[
('id', models.BigAutoField(primary_key=True, serialize=False)),
('value', cvat.apps.engine.models.SafeCharField(max_length=64)),
('spec', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='engine.AttributeSpec')),
],
options={
'abstract': False,
'default_permissions': (),
},
),
migrations.CreateModel(
name='LabeledShapeAttributeVal',
fields=[
('id', models.BigAutoField(primary_key=True, serialize=False)),
('value', cvat.apps.engine.models.SafeCharField(max_length=64)),
('spec', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='engine.AttributeSpec')),
],
options={
'abstract': False,
'default_permissions': (),
},
),
migrations.CreateModel(
name='LabeledTrackAttributeVal',
fields=[
('id', models.BigAutoField(primary_key=True, serialize=False)),
('value', cvat.apps.engine.models.SafeCharField(max_length=64)),
('spec', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='engine.AttributeSpec')),
],
options={
'abstract': False,
'default_permissions': (),
},
),
migrations.CreateModel(
name='TrackedShape',
fields=[
('type', models.CharField(choices=[('rectangle', 'RECTANGLE'), ('polygon', 'POLYGON'), ('polyline', 'POLYLINE'), ('points', 'POINTS')], max_length=16)),
('occluded', models.BooleanField(default=False)),
('z_order', models.IntegerField(default=0)),
('points', cvat.apps.engine.models.FloatArrayField()),
('id', models.BigAutoField(primary_key=True, serialize=False)),
('frame', models.PositiveIntegerField()),
('outside', models.BooleanField(default=False)),
],
options={
'default_permissions': (),
},
),
migrations.CreateModel(
name='TrackedShapeAttributeVal',
fields=[
('id', models.BigAutoField(primary_key=True, serialize=False)),
('value', cvat.apps.engine.models.SafeCharField(max_length=64)),
('shape', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='engine.TrackedShape')),
('spec', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='engine.AttributeSpec')),
],
options={
'abstract': False,
'default_permissions': (),
},
),
migrations.CreateModel(
name='LabeledImage',
fields=[
('id', models.BigAutoField(primary_key=True, serialize=False)),
('frame', models.PositiveIntegerField()),
('group', models.PositiveIntegerField(null=True)),
],
options={
'abstract': False,
'default_permissions': (),
},
),
migrations.CreateModel(
name='LabeledShape',
fields=[
('id', models.BigAutoField(primary_key=True, serialize=False)),
('frame', models.PositiveIntegerField()),
('group', models.PositiveIntegerField(null=True)),
('type', models.CharField(choices=[('rectangle', 'RECTANGLE'), ('polygon', 'POLYGON'), ('polyline', 'POLYLINE'), ('points', 'POINTS')], max_length=16)),
('occluded', models.BooleanField(default=False)),
('z_order', models.IntegerField(default=0)),
('points', cvat.apps.engine.models.FloatArrayField()),
],
options={
'abstract': False,
'default_permissions': (),
},
),
migrations.CreateModel(
name='LabeledTrack',
fields=[
('id', models.BigAutoField(primary_key=True, serialize=False)),
('frame', models.PositiveIntegerField()),
('group', models.PositiveIntegerField(null=True)),
],
options={
'abstract': False,
'default_permissions': (),
},
),
migrations.AddField(
model_name='labeledimage',
name='job',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='engine.Job'),
),
migrations.AddField(
model_name='labeledtrack',
name='job',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='engine.Job'),
),
migrations.AddField(
model_name='labeledshape',
name='job',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='engine.Job'),
),
migrations.AddField(
model_name='labeledimage',
name='label',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='engine.Label'),
),
migrations.AddField(
model_name='labeledshape',
name='label',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='engine.Label'),
),
migrations.AddField(
model_name='labeledtrack',
name='label',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='engine.Label'),
),
migrations.AddField(
model_name='trackedshape',
name='track',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='engine.LabeledTrack'),
),
migrations.AddField(
model_name='labeledtrackattributeval',
name='track',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='engine.LabeledTrack'),
),
migrations.AddField(
model_name='labeledshapeattributeval',
name='shape',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='engine.LabeledShape'),
),
migrations.AddField(
model_name='labeledimageattributeval',
name='image',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='engine.LabeledImage'),
),
migrations.RunPython(
code=copy_annotations_forward,
reverse_code=copy_annotations_backward,
),
migrations.RemoveField(
model_name='labeledbox',
name='job',
),
migrations.RemoveField(
model_name='labeledbox',
name='label',
),
migrations.RemoveField(
model_name='labeledboxattributeval',
name='box',
),
migrations.RemoveField(
model_name='labeledboxattributeval',
name='spec',
),
migrations.RemoveField(
model_name='labeledpoints',
name='job',
),
migrations.RemoveField(
model_name='labeledpoints',
name='label',
),
migrations.RemoveField(
model_name='labeledpointsattributeval',
name='points',
),
migrations.RemoveField(
model_name='labeledpointsattributeval',
name='spec',
),
migrations.RemoveField(
model_name='labeledpolygon',
name='job',
),
migrations.RemoveField(
model_name='job',
name='max_shape_id',
),
migrations.RemoveField(
model_name='labeledpolygon',
name='label',
),
migrations.RemoveField(
model_name='labeledpolygonattributeval',
name='polygon',
),
migrations.RemoveField(
model_name='labeledpolygonattributeval',
name='spec',
),
migrations.RemoveField(
model_name='labeledpolyline',
name='job',
),
migrations.RemoveField(
model_name='labeledpolyline',
name='label',
),
migrations.RemoveField(
model_name='labeledpolylineattributeval',
name='polyline',
),
migrations.RemoveField(
model_name='labeledpolylineattributeval',
name='spec',
),
migrations.RemoveField(
model_name='objectpath',
name='job',
),
migrations.RemoveField(
model_name='objectpath',
name='label',
),
migrations.RemoveField(
model_name='objectpathattributeval',
name='spec',
),
migrations.RemoveField(
model_name='objectpathattributeval',
name='track',
),
migrations.RemoveField(
model_name='trackedbox',
name='track',
),
migrations.RemoveField(
model_name='trackedboxattributeval',
name='box',
),
migrations.RemoveField(
model_name='trackedboxattributeval',
name='spec',
),
migrations.RemoveField(
model_name='trackedpoints',
name='track',
),
migrations.RemoveField(
model_name='trackedpointsattributeval',
name='points',
),
migrations.RemoveField(
model_name='trackedpointsattributeval',
name='spec',
),
migrations.RemoveField(
model_name='trackedpolygon',
name='track',
),
migrations.RemoveField(
model_name='trackedpolygonattributeval',
name='polygon',
),
migrations.RemoveField(
model_name='trackedpolygonattributeval',
name='spec',
),
migrations.RemoveField(
model_name='trackedpolyline',
name='track',
),
migrations.RemoveField(
model_name='trackedpolylineattributeval',
name='polyline',
),
migrations.RemoveField(
model_name='trackedpolylineattributeval',
name='spec',
),
migrations.DeleteModel(
name='LabeledBox',
),
migrations.DeleteModel(
name='LabeledBoxAttributeVal',
),
migrations.DeleteModel(
name='LabeledPoints',
),
migrations.DeleteModel(
name='LabeledPointsAttributeVal',
),
migrations.DeleteModel(
name='LabeledPolygon',
),
migrations.DeleteModel(
name='LabeledPolygonAttributeVal',
),
migrations.DeleteModel(
name='LabeledPolyline',
),
migrations.DeleteModel(
name='LabeledPolylineAttributeVal',
),
migrations.DeleteModel(
name='ObjectPath',
),
migrations.DeleteModel(
name='ObjectPathAttributeVal',
),
migrations.DeleteModel(
name='TrackedBox',
),
migrations.DeleteModel(
name='TrackedBoxAttributeVal',
),
migrations.DeleteModel(
name='TrackedPoints',
),
migrations.DeleteModel(
name='TrackedPointsAttributeVal',
),
migrations.DeleteModel(
name='TrackedPolygon',
),
migrations.DeleteModel(
name='TrackedPolygonAttributeVal',
),
migrations.DeleteModel(
name='TrackedPolyline',
),
migrations.DeleteModel(
name='TrackedPolylineAttributeVal',
),
]