2121EFFICIENT_SAM_DIR = SCRIPT_DIR .parent
2222DEFAULT_MODELS_DIR = EFFICIENT_SAM_DIR / "models"
2323DEFAULT_RELEASE_DIR = EFFICIENT_SAM_DIR / "releases"
24- DEFAULT_RELEASE_TAG = "v0.1.0"
24+ DEFAULT_MODELS_JSON = EFFICIENT_SAM_DIR / "models.json"
25+ DEFAULT_RELEASE_TAG = "v0.2.0"
2526DEFAULT_RELEASE_BASE_URL = (
2627 "https://github.com/OpenShot/openshot-onnx/releases/download"
2728)
@@ -153,33 +154,59 @@ def package_model(variant: ModelVariant, model_path: Path, release_dir: Path) ->
153154 "asset" : zip_path .name ,
154155 "sha256" : sha256_file (zip_path ),
155156 "bytes" : zip_path .stat ().st_size ,
156- "model" : variant .model_name ,
157- "source_model" : variant .source_name ,
158- "model_sha256" : sha256_file (model_path ),
159- "input_size" : [1024 , 1024 ],
160- "recommended" : variant .recommended ,
161157 }
158+ if variant .recommended :
159+ entry ["recommended" ] = True
162160 print (f"Wrote { zip_path } " )
163161 return entry
164162
165163
166- def write_manifest (release_dir : Path , release_tag : str , release_base_url : str , entries : list [dict [str , object ]]) -> None :
164+ def model_sort_key (item : dict [str , object ]) -> tuple [int , str ]:
165+ order = {variant .id : index for index , variant in enumerate (VARIANTS .values ())}
166+ model_id = str (item ["id" ])
167+ return (order .get (model_id , len (order )), model_id )
168+
169+
170+ def catalog_entry (entry : dict [str , object ]) -> dict [str , object ]:
171+ keys = ("id" , "name" , "description" , "asset" , "sha256" , "bytes" , "recommended" )
172+ catalog = {key : entry [key ] for key in keys if key in entry }
173+ if not catalog .get ("recommended" , False ):
174+ catalog .pop ("recommended" , None )
175+ return catalog
176+
177+
178+ def write_manifest (
179+ models_json : Path ,
180+ release_tag : str ,
181+ release_base_url : str ,
182+ entries : list [dict [str , object ]],
183+ ) -> None :
184+ existing_models : dict [str , dict [str , object ]] = {}
185+ if models_json .exists ():
186+ existing = json .loads (models_json .read_text (encoding = "utf-8" ))
187+ for model in existing .get ("models" , []):
188+ existing_models [str (model ["id" ])] = catalog_entry (model )
189+
190+ updated_models = {** existing_models }
191+ for entry in entries :
192+ updated_models [str (entry ["id" ])] = catalog_entry (entry )
193+
167194 manifest = {
168- "schema" : 1 ,
169- "name" : "EfficientSAM OpenCV ONNX Models" ,
170- "release_tag" : release_tag ,
171- "download_base_url" : f"{ release_base_url } /{ release_tag } " ,
172- "models" : entries ,
195+ "version" : release_tag .removeprefix ("v" ),
196+ "release" : release_tag ,
197+ "base_url" : f"{ release_base_url .rstrip ('/' )} /{ release_tag } " ,
198+ "models" : sorted (updated_models .values (), key = model_sort_key ),
173199 }
174- path = release_dir / "efficient-sam-models.json"
175- path .write_text (json .dumps (manifest , indent = 2 , sort_keys = True ) + "\n " , encoding = "utf-8" )
176- print (f"Wrote { path } " )
200+ models_json . parent . mkdir ( parents = True , exist_ok = True )
201+ models_json .write_text (json .dumps (manifest , indent = 2 ) + "\n " , encoding = "utf-8" )
202+ print (f"Wrote { models_json } " )
177203
178204
179205def main () -> None :
180206 parser = argparse .ArgumentParser ()
181207 parser .add_argument ("--models-dir" , type = Path , default = DEFAULT_MODELS_DIR )
182208 parser .add_argument ("--release-dir" , type = Path , default = DEFAULT_RELEASE_DIR )
209+ parser .add_argument ("--models-json" , type = Path , default = DEFAULT_MODELS_JSON )
183210 parser .add_argument ("--release-tag" , default = DEFAULT_RELEASE_TAG )
184211 parser .add_argument ("--release-base-url" , default = DEFAULT_RELEASE_BASE_URL )
185212 parser .add_argument (
@@ -196,6 +223,7 @@ def main() -> None:
196223
197224 args .models_dir = args .models_dir .expanduser ().resolve ()
198225 args .release_dir = args .release_dir .expanduser ().resolve ()
226+ args .models_json = args .models_json .expanduser ().resolve ()
199227
200228 selected = VARIANTS .values () if args .variant == "all" else [VARIANTS [args .variant ]]
201229 entries = []
@@ -225,7 +253,7 @@ def main() -> None:
225253 validate_model (probe , model_path , args .release_dir / "_validate" / variant .id )
226254 entries .append (package_model (variant , model_path , args .release_dir ))
227255
228- write_manifest (args .release_dir , args .release_tag , args .release_base_url , entries )
256+ write_manifest (args .models_json , args .release_tag , args .release_base_url , entries )
229257
230258
231259if __name__ == "__main__" :
0 commit comments