6
6
7
7
import json
8
8
import logging
9
+ from random import randint
9
10
10
11
from deepdataspace .constants import DatasetFileType
11
12
from deepdataspace .constants import DatasetStatus
13
+ from deepdataspace .constants import DatasetType
12
14
from deepdataspace .constants import ErrCode
13
- from deepdataspace .constants import LabelType
14
15
from deepdataspace .model import DataSet
15
16
from deepdataspace .model .image import Image
16
17
from deepdataspace .plugins .coco2017 import COCO2017Importer
19
20
from deepdataspace .utils .http import format_response
20
21
from deepdataspace .utils .http import parse_arguments
21
22
from deepdataspace .utils .http import raise_exception
22
- from deepdataspace .constants import DatasetType
23
23
24
24
logger = logging .getLogger ("django" )
25
25
@@ -68,9 +68,9 @@ class ImagesView(BaseAPIView):
68
68
Argument ("dataset_id" , str , Argument .QUERY , required = True ),
69
69
Argument ("category_id" , str , Argument .QUERY , required = False ),
70
70
Argument ("flag" , int , Argument .QUERY , required = False ),
71
- Argument ("label_id" , str , Argument .QUERY , required = False ),
72
71
Argument ("page_num" , Argument .PositiveInt , Argument .QUERY , default = 1 ),
73
- Argument ("page_size" , Argument .PositiveInt , Argument .QUERY , default = 100 )
72
+ Argument ("page_size" , Argument .PositiveInt , Argument .QUERY , default = 100 ),
73
+ Argument ("offset" , int , Argument .QUERY , required = False , default = None ),
74
74
]
75
75
76
76
def get (self , request ):
@@ -79,7 +79,7 @@ def get(self, request):
79
79
- GET /api/v1/images
80
80
"""
81
81
82
- dataset_id , category_id , flag , label_id , page_num , page_size = parse_arguments (request , self .get_args )
82
+ dataset_id , category_id , flag , page_num , page_size , offset = parse_arguments (request , self .get_args )
83
83
84
84
dataset = DataSet .find_one ({"_id" : dataset_id })
85
85
if dataset is None :
@@ -92,73 +92,108 @@ def get(self, request):
92
92
93
93
filters = {}
94
94
if category_id is not None :
95
- filters = {"objects" : {
96
- "$elemMatch" : {
97
- "category_id" : category_id ,
98
- "label_type" : {"$in" : [LabelType .User , LabelType .GroundTruth ]}}}
99
- }
95
+ filters ["objects.category_id" ] = category_id
100
96
101
97
if flag is not None :
102
98
filters ["flag" ] = flag
103
99
104
100
total = Image (dataset_id ).count_num (filters )
105
101
106
- image_list = []
107
- offset = max (0 , page_size * (page_num - 1 ))
102
+ if offset is None :
103
+ skip = max (0 , page_size * (page_num - 1 ))
104
+ else :
105
+ skip = 0
106
+ page_num = None
107
+ if offset == - 1 : # generate a random offset
108
+ includes = {"_id" : 1 , "idx" : 1 }
109
+ max_idx = Image (dataset_id ).find_many (filters , includes ,
110
+ sort = [("idx" , - 1 )],
111
+ skip = 0 , size = 1 ,
112
+ to_dict = True )
113
+ max_idx = list (max_idx )[0 ]["idx" ]
114
+
115
+ min_idx = Image (dataset_id ).find_many (filters , includes ,
116
+ sort = [("idx" , 1 )],
117
+ skip = 0 , size = 1 ,
118
+ to_dict = True )
119
+ min_idx = list (min_idx )[0 ]["idx" ]
120
+
121
+ offset = randint (min_idx , max_idx )
122
+
123
+ # try the best to return at least page_size objects
124
+ if max_idx - offset + 1 < page_size :
125
+ offset = max (min_idx , max_idx - page_size + 1 )
126
+ filters ["idx" ] = {"$gte" : offset }
127
+ elif offset >= 0 : # query by specified offset
128
+ filters ["idx" ] = {"$gte" : offset }
129
+ else :
130
+ raise_exception (ErrCode .BadRequest , f"invalid offset value[{ offset } ]" )
131
+
132
+ if skip > total :
133
+ data = {
134
+ "image_list" : [],
135
+ "offset" : offset ,
136
+ "page_size" : page_size ,
137
+ "page_num" : page_num ,
138
+ "total" : total
139
+ }
140
+ return format_response (data , enable_cache = True )
108
141
109
- includes = {"id" , "idx" , "flag" , "objects" , "metadata" , "type" , "width" , "height" , "url" ,
110
- "url_full_res" }
142
+ includes = {"id" , "idx" , "flag" , "objects" , "metadata" ,
143
+ "type" , "width" , "height" , "url" , " url_full_res" }
111
144
includes = {i : 1 for i in includes }
112
145
113
146
req_scheme = request .scheme
114
147
req_host = request .META ["HTTP_HOST" ]
115
148
req_prefix = f"{ req_scheme } ://{ req_host } "
116
149
117
- if offset <= total :
118
- for image in Image (dataset_id ).find_many (filters , includes ,
119
- sort = [("idx" , 1 )],
120
- skip = offset ,
121
- size = page_size ,
122
- to_dict = True ):
123
- for obj in image ["objects" ]:
124
- obj ["source" ] = obj ["label_type" ] # TODO keep for compatibility, delete this in the future
150
+ image_list = []
151
+ for image in Image (dataset_id ).find_many (filters ,
152
+ includes ,
153
+ sort = [("idx" , 1 )],
154
+ skip = skip ,
155
+ size = page_size ,
156
+ to_dict = True ):
157
+ for obj in image ["objects" ]:
158
+ obj ["source" ] = obj ["label_type" ] # TODO keep for compatibility, delete this in the future
125
159
126
- alpha = obj .get ("alpha" , "" )
127
- if alpha is None :
128
- obj ["alpha" ] = ""
129
- elif not alpha .startswith ("http" ):
130
- obj ["alpha" ] = f"{ req_prefix } { alpha } "
160
+ alpha = obj .get ("alpha" , "" )
161
+ if alpha is None :
162
+ obj ["alpha" ] = ""
163
+ elif not alpha .startswith ("http" ):
164
+ obj ["alpha" ] = f"{ req_prefix } { alpha } "
131
165
132
- if obj ["segmentation" ] is None :
133
- obj ["segmentation" ] = ""
166
+ if obj ["segmentation" ] is None :
167
+ obj ["segmentation" ] = ""
134
168
135
- obj ["caption" ] = obj ["caption" ] or ""
169
+ obj ["caption" ] = obj ["caption" ] or ""
136
170
137
- obj .pop ("compare_result" , None )
171
+ obj .pop ("compare_result" , None )
138
172
139
- image_url = image ["url" ]
140
- image_url = concat_url (req_prefix , image_url )
173
+ image_url = image ["url" ]
174
+ image_url = concat_url (req_prefix , image_url )
141
175
142
- image_url_full_res = image ["url_full_res" ] or image_url
143
- image_url_full_res = concat_url (req_prefix , image_url_full_res )
176
+ image_url_full_res = image ["url_full_res" ] or image_url
177
+ image_url_full_res = concat_url (req_prefix , image_url_full_res )
144
178
145
- desc = image .pop ("metadata" ) or "{}"
179
+ desc = image .pop ("metadata" ) or "{}"
146
180
147
- image .update ({
148
- "desc" : desc ,
149
- "metadata" : json .loads (desc ),
150
- "url" : image_url ,
151
- "url_full_res" : image_url_full_res
152
- })
181
+ image .update ({
182
+ "desc" : desc ,
183
+ "metadata" : json .loads (desc ),
184
+ "url" : image_url ,
185
+ "url_full_res" : image_url_full_res
186
+ })
153
187
154
- image ["caption" ] = ""
155
- if caption_generator :
156
- image ["caption" ] = caption_generator (image )
188
+ image ["caption" ] = ""
189
+ if caption_generator :
190
+ image ["caption" ] = caption_generator (image )
157
191
158
- image_list .append (image )
192
+ image_list .append (image )
159
193
160
194
data = {
161
195
"image_list" : image_list ,
196
+ "offset" : offset ,
162
197
"page_size" : page_size ,
163
198
"page_num" : page_num ,
164
199
"total" : total
0 commit comments