ibsocr1 commited on
Commit
2ab452d
·
verified ·
1 Parent(s): bcab37d

Upload 5 files

Browse files
Files changed (1) hide show
  1. app.py +9 -1
app.py CHANGED
@@ -24,6 +24,14 @@ else:
24
  BASE = Path("./data")
25
 
26
  ROOT = Path(__file__).resolve().parent
 
 
 
 
 
 
 
 
27
  IMAGE_DIR = BASE / "images"
28
  DATASET_FILE = BASE / "dataset.json"
29
  MODEL_DIR = BASE / "model"
@@ -389,7 +397,7 @@ def run_training(epochs, batch_size, learning_rate):
389
  build_coco()
390
  _training["message"] = "training RT-DETR"
391
  cmd = [
392
- sys.executable, str(ROOT / "training" / "train.py"),
393
  "--train-dir", str(GENERATED_DIR / "train"),
394
  "--val-dir", str(GENERATED_DIR / "val"),
395
  "--classes", str(CLASSES_FILE),
 
24
  BASE = Path("./data")
25
 
26
  ROOT = Path(__file__).resolve().parent
27
+
28
+ # Self-heal the training script if a deployment omitted the training/ directory.
29
+ _TRAINING_SCRIPT_B64 = "aW1wb3J0IGFyZ3BhcnNlCmltcG9ydCBqc29uCmZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aAoKaW1wb3J0IHRvcmNoCmZyb20gUElMIGltcG9ydCBJbWFnZQpmcm9tIHRvcmNoLnV0aWxzLmRhdGEgaW1wb3J0IERhdGFzZXQsIERhdGFMb2FkZXIKZnJvbSB0cWRtIGltcG9ydCB0cWRtCmZyb20gdHJhbnNmb3JtZXJzIGltcG9ydCBSVERldHJJbWFnZVByb2Nlc3NvciwgUlREZXRyRm9yT2JqZWN0RGV0ZWN0aW9uCgpCQVNFX01PREVMID0gIlBla2luZ1UvcnRkZXRyX3I1MHZkIgoKZGVmIGxvYWRfY2xhc3NlcyhwYXRoKToKICAgIHJldHVybiBbeC5zdHJpcCgpIGZvciB4IGluIFBhdGgocGF0aCkucmVhZF90ZXh0KCkuc3BsaXRsaW5lcygpIGlmIHguc3RyaXAoKV0KCmNsYXNzIENPQ09EZXRlY3Rpb25EYXRhc2V0KERhdGFzZXQpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGltYWdlX2RpciwgYW5ub3RhdGlvbl9maWxlLCBwcm9jZXNzb3IpOgogICAgICAgIHNlbGYuaW1hZ2VfZGlyID0gUGF0aChpbWFnZV9kaXIpCiAgICAgICAgc2VsZi5wcm9jZXNzb3IgPSBwcm9jZXNzb3IKICAgICAgICBjb2NvID0ganNvbi5sb2FkcyhQYXRoKGFubm90YXRpb25fZmlsZSkucmVhZF90ZXh0KCkpCiAgICAgICAgc2VsZi5pbWFnZXMgPSB7eFsiaWQiXTogeCBmb3IgeCBpbiBjb2NvWyJpbWFnZXMiXX0KICAgICAgICBjYXRzID0gc29ydGVkKGNvY29bImNhdGVnb3JpZXMiXSwga2V5PWxhbWJkYSB4OiB4WyJpZCJdKQogICAgICAgIHNlbGYuY2F0ZWdvcnlfaWRfdG9fbGFiZWwgPSB7Y1siaWQiXTogaSBmb3IgaSxjIGluIGVudW1lcmF0ZShjYXRzKX0KICAgICAgICBhbm5zID0ge30KICAgICAgICBmb3IgYSBpbiBjb2NvWyJhbm5vdGF0aW9ucyJdOgogICAgICAgICAgICBpZiBub3QgYS5nZXQoImlzY3Jvd2QiLCAwKToKICAgICAgICAgICAgICAgIGFubnMuc2V0ZGVmYXVsdChhWyJpbWFnZV9pZCJdLCBbXSkuYXBwZW5kKGEpCiAgICAgICAgc2VsZi5yZWNvcmRzID0gW10KICAgICAgICBmb3IgaW1hZ2VfaWQsIGluZm8gaW4gc2VsZi5pbWFnZXMuaXRlbXMoKToKICAgICAgICAgICAgc2VsZi5yZWNvcmRzLmFwcGVuZCh7CiAgICAgICAgICAgICAgICAiaW1hZ2VfaWQiOiBpbWFnZV9pZCwgImZpbGVfbmFtZSI6IGluZm9bImZpbGVfbmFtZSJdLAogICAgICAgICAgICAgICAgIndpZHRoIjogaW5mb1sid2lkdGgiXSwgImhlaWdodCI6IGluZm9bImhlaWdodCJdLAogICAgICAgICAgICAgICAgImFubm90YXRpb25zIjogYW5ucy5nZXQoaW1hZ2VfaWQsIFtdKQogICAgICAgICAgICB9KQoKICAgIGRlZiBfX2xlbl9fKHNlbGYpOiByZXR1cm4gbGVuKHNlbGYucmVjb3JkcykKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaWR4KToKICAgICAgICByID0gc2VsZi5yZWNvcmRzW2lkeF0KICAgICAgICBpbWFnZSA9IEltYWdlLm9wZW4oc2VsZi5pbWFnZV9kaXIgLyByWyJmaWxlX25hbWUiXSkuY29udmVydCgiUkdCIikKICAgICAgICBhbm5zID0gW10KICAgICAgICBmb3IgYSBpbiByWyJhbm5vdGF0aW9ucyJdOgogICAgICAgICAgICB4LHksdyxoID0gYVsiYmJveCJdCiAgICAgICAgICAgIGlmIHcgPD0gMCBvciBoIDw9IDA6IGNvbnRpbnVlCiAgICAgICAgICAgIGFubnMuYXBwZW5kKHsKICAgICAgICAgICAgICAgICJpZCI6IGFbImlkIl0sICJpbWFnZV9pZCI6IHJbImltYWdlX2lkIl0sCiAgICAgICAgICAgICAgICAiY2F0ZWdvcnlfaWQiOiBzZWxmLmNhdGVnb3J5X2lkX3RvX2xhYmVsW2FbImNhdGVnb3J5X2lkIl1dLAogICAgICAgICAgICAgICAgImJib3giOiBbeCx5LHcsaF0sICJhcmVhIjogZmxvYXQoYS5nZXQoImFyZWEiLHcqaCkpLAogICAgICAgICAgICAgICAgImlzY3Jvd2QiOiAwCiAgICAgICAgICAgIH0pCiAgICAgICAgZW5jb2RlZCA9IHNlbGYucHJvY2Vzc29yKAogICAgICAgICAgICBpbWFnZXM9aW1hZ2UsCiAgICAgICAgICAgIGFubm90YXRpb25zPXsiaW1hZ2VfaWQiOiByWyJpbWFnZV9pZCJdLCAiYW5ub3RhdGlvbnMiOiBhbm5zfSwKICAgICAgICAgICAgcmV0dXJuX3RlbnNvcnM9InB0IgogICAgICAgICkKICAgICAgICBlbmNvZGVkWyJwaXhlbF92YWx1ZXMiXSA9IGVuY29kZWRbInBpeGVsX3ZhbHVlcyJdLnNxdWVlemUoMCkKICAgICAgICBpZiAicGl4ZWxfbWFzayIgaW4gZW5jb2RlZDoKICAgICAgICAgICAgZW5jb2RlZFsicGl4ZWxfbWFzayJdID0gZW5jb2RlZFsicGl4ZWxfbWFzayJdLnNxdWVlemUoMCkKICAgICAgICBlbmNvZGVkWyJsYWJlbHMiXSA9IGVuY29kZWRbImxhYmVscyJdWzBdCiAgICAgICAgcmV0dXJuIGVuY29kZWQKCmRlZiBjb2xsYXRlX2ZuKGJhdGNoKToKICAgIG91dCA9IHsicGl4ZWxfdmFsdWVzIjogdG9yY2guc3RhY2soW3hbInBpeGVsX3ZhbHVlcyJdIGZvciB4IGluIGJhdGNoXSksCiAgICAgICAgICAgImxhYmVscyI6IFt4WyJsYWJlbHMiXSBmb3IgeCBpbiBiYXRjaF19CiAgICBpZiAicGl4ZWxfbWFzayIgaW4gYmF0Y2hbMF06CiAgICAgICAgb3V0WyJwaXhlbF9tYXNrIl0gPSB0b3JjaC5zdGFjayhbeFsicGl4ZWxfbWFzayJdIGZvciB4IGluIGJhdGNoXSkKICAgIHJldHVybiBvdXQKCmRlZiBldmFsdWF0ZShtb2RlbCwgbG9hZGVyLCBkZXZpY2UpOgogICAgbW9kZWwuZXZhbCgpOyB0b3RhbD0wOyBuPTAKICAgIHdpdGggdG9yY2gubm9fZ3JhZCgpOgogICAgICAgIGZvciBiYXRjaCBpbiBsb2FkZXI6CiAgICAgICAgICAgIGJhdGNoPXtrOih2LnRvKGRldmljZSkgaWYgdG9yY2guaXNfdGVuc29yKHYpIGVsc2UgdikgZm9yIGssdiBpbiBiYXRjaC5pdGVtcygpfQogICAgICAgICAgICB0b3RhbCArPSBmbG9hdChtb2RlbCgqKmJhdGNoKS5sb3NzLml0ZW0oKSk7IG4gKz0gMQogICAgbW9kZWwudHJhaW4oKQogICAgcmV0dXJuIHRvdGFsL21heChuLDEpCgpkZWYgbWFpbigpOgogICAgcD1hcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCiAgICBwLmFkZF9hcmd1bWVudCgiLS10cmFpbi1kaXIiLHJlcXVpcmVkPVRydWUpOyBwLmFkZF9hcmd1bWVudCgiLS12YWwtZGlyIixyZXF1aXJlZD1UcnVlKQogICAgcC5hZGRfYXJndW1lbnQoIi0tY2xhc3NlcyIscmVxdWlyZWQ9VHJ1ZSk7IHAuYWRkX2FyZ3VtZW50KCItLW91dHB1dC1kaXIiLGRlZmF1bHQ9Im1vZGVsIikKICAgIHAuYWRkX2FyZ3VtZW50KCItLWVwb2NocyIsdHlwZT1pbnQsZGVmYXVsdD0zMCk7IHAuYWRkX2FyZ3VtZW50KCItLWJhdGNoLXNpemUiLHR5cGU9aW50LGRlZmF1bHQ9MikKICAgIHAuYWRkX2FyZ3VtZW50KCItLWxlYXJuaW5nLXJhdGUiLHR5cGU9ZmxvYXQsZGVmYXVsdD0xZS01KTsgcC5hZGRfYXJndW1lbnQoIi0td2VpZ2h0LWRlY2F5Iix0eXBlPWZsb2F0LGRlZmF1bHQ9MWUtNCkKICAgIHAuYWRkX2FyZ3VtZW50KCItLW51bS13b3JrZXJzIix0eXBlPWludCxkZWZhdWx0PTIpCiAgICBhPXAucGFyc2VfYXJncygpCgogICAgY2xhc3Nlcz1sb2FkX2NsYXNzZXMoYS5jbGFzc2VzKQogICAgaWQybGFiZWw9e2k6biBmb3IgaSxuIGluIGVudW1lcmF0ZShjbGFzc2VzKX0KICAgIGxhYmVsMmlkPXtuOmkgZm9yIGksbiBpbiBlbnVtZXJhdGUoY2xhc3Nlcyl9CgogICAgcHJvYz1SVERldHJJbWFnZVByb2Nlc3Nvci5mcm9tX3ByZXRyYWluZWQoQkFTRV9NT0RFTCkKICAgIHRyYWluPUNPQ09EZXRlY3Rpb25EYXRhc2V0KFBhdGgoYS50cmFpbl9kaXIpLyJpbWFnZXMiLFBhdGgoYS50cmFpbl9kaXIpLyJhbm5vdGF0aW9ucy5qc29uIixwcm9jKQogICAgdmFsPUNPQ09EZXRlY3Rpb25EYXRhc2V0KFBhdGgoYS52YWxfZGlyKS8iaW1hZ2VzIixQYXRoKGEudmFsX2RpcikvImFubm90YXRpb25zLmpzb24iLHByb2MpCgogICAgaWYgbGVuKHRyYWluKT09MCBvciBsZW4odmFsKT09MDoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJUcmFpbmluZyBhbmQgdmFsaWRhdGlvbiBkYXRhc2V0cyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGltYWdlLiIpCiAgICBpZiBsZW4odHJhaW4uY2F0ZWdvcnlfaWRfdG9fbGFiZWwpIT1sZW4oY2xhc3Nlcykgb3IgbGVuKHZhbC5jYXRlZ29yeV9pZF90b19sYWJlbCkhPWxlbihjbGFzc2VzKToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJDT0NPIGNhdGVnb3JpZXMgZG8gbm90IG1hdGNoIGNsYXNzZXMudHh0LiBSZWJ1aWxkIHRoZSBkYXRhc2V0IGFmdGVyIHNhdmluZyB0aGUgY2xhc3Nlcy4iKQoKICAgIG1vZGVsPVJURGV0ckZvck9iamVjdERldGVjdGlvbi5mcm9tX3ByZXRyYWluZWQoCiAgICAgICAgQkFTRV9NT0RFTCxudW1fbGFiZWxzPWxlbihjbGFzc2VzKSxpZDJsYWJlbD1pZDJsYWJlbCxsYWJlbDJpZD1sYWJlbDJpZCwKICAgICAgICBpZ25vcmVfbWlzbWF0Y2hlZF9zaXplcz1UcnVlCiAgICApCiAgICBkZXZpY2U9dG9yY2guZGV2aWNlKCJjdWRhIiBpZiB0b3JjaC5jdWRhLmlzX2F2YWlsYWJsZSgpIGVsc2UgImNwdSIpCiAgICBtb2RlbC50byhkZXZpY2UpCgogICAgdHI9RGF0YUxvYWRlcih0cmFpbixiYXRjaF9zaXplPWEuYmF0Y2hfc2l6ZSxzaHVmZmxlPVRydWUsbnVtX3dvcmtlcnM9YS5udW1fd29ya2Vycyxjb2xsYXRlX2ZuPWNvbGxhdGVfZm4pCiAgICB2YT1EYXRhTG9hZGVyKHZhbCxiYXRjaF9zaXplPWEuYmF0Y2hfc2l6ZSxzaHVmZmxlPUZhbHNlLG51bV93b3JrZXJzPWEubnVtX3dvcmtlcnMsY29sbGF0ZV9mbj1jb2xsYXRlX2ZuKQogICAgb3B0PXRvcmNoLm9wdGltLkFkYW1XKG1vZGVsLnBhcmFtZXRlcnMoKSxscj1hLmxlYXJuaW5nX3JhdGUsd2VpZ2h0X2RlY2F5PWEud2VpZ2h0X2RlY2F5KQoKICAgIG91dGRpcj1QYXRoKGEub3V0cHV0X2Rpcik7IG91dGRpci5ta2RpcihwYXJlbnRzPVRydWUsZXhpc3Rfb2s9VHJ1ZSkKICAgIGJlc3Q9ZmxvYXQoImluZiIpCgogICAgZm9yIGVwb2NoIGluIHJhbmdlKGEuZXBvY2hzKToKICAgICAgICBtb2RlbC50cmFpbigpOyBydW5uaW5nPTAKICAgICAgICBiYXI9dHFkbSh0cixkZXNjPWYiZXBvY2gge2Vwb2NoKzF9L3thLmVwb2Noc30iKQogICAgICAgIGZvciBzdGVwLGJhdGNoIGluIGVudW1lcmF0ZShiYXIpOgogICAgICAgICAgICBiYXRjaD17azoodi50byhkZXZpY2UpIGlmIHRvcmNoLmlzX3RlbnNvcih2KSBlbHNlIHYpIGZvciBrLHYgaW4gYmF0Y2guaXRlbXMoKX0KICAgICAgICAgICAgbG9zcz1tb2RlbCgqKmJhdGNoKS5sb3NzCiAgICAgICAgICAgIGxvc3MuYmFja3dhcmQoKTsgb3B0LnN0ZXAoKTsgb3B0Lnplcm9fZ3JhZChzZXRfdG9fbm9uZT1UcnVlKQogICAgICAgICAgICBydW5uaW5nICs9IGZsb2F0KGxvc3MuaXRlbSgpKQogICAgICAgICAgICBiYXIuc2V0X3Bvc3RmaXgobG9zcz1mIntydW5uaW5nLyhzdGVwKzEpOi40Zn0iKQogICAgICAgIHZsPWV2YWx1YXRlKG1vZGVsLHZhLGRldmljZSkKICAgICAgICBwcmludChmInZhbGlkYXRpb25fbG9zcz17dmw6LjRmfSIpCiAgICAgICAgaWYgdmw8YmVzdDoKICAgICAgICAgICAgYmVzdD12bAogICAgICAgICAgICBtb2RlbC5zYXZlX3ByZXRyYWluZWQob3V0ZGlyKQogICAgICAgICAgICBwcm9jLnNhdmVfcHJldHJhaW5lZChvdXRkaXIpCiAgICAgICAgICAgIChvdXRkaXIvImNsYXNzZXMuanNvbiIpLndyaXRlX3RleHQoanNvbi5kdW1wcyh7ImlkMmxhYmVsIjppZDJsYWJlbCwibGFiZWwyaWQiOmxhYmVsMmlkfSxpbmRlbnQ9MikpCiAgICBtb2RlbC5zYXZlX3ByZXRyYWluZWQob3V0ZGlyKTsgcHJvYy5zYXZlX3ByZXRyYWluZWQob3V0ZGlyKQoKaWYgX19uYW1lX189PSJfX21haW5fXyI6IG1haW4oKQo="
30
+ TRAINING_DIR = ROOT / "training"
31
+ TRAIN_SCRIPT = TRAINING_DIR / "train.py"
32
+ if not TRAIN_SCRIPT.exists():
33
+ TRAINING_DIR.mkdir(parents=True, exist_ok=True)
34
+ TRAIN_SCRIPT.write_bytes(__import__("base64").b64decode(_TRAINING_SCRIPT_B64))
35
  IMAGE_DIR = BASE / "images"
36
  DATASET_FILE = BASE / "dataset.json"
37
  MODEL_DIR = BASE / "model"
 
397
  build_coco()
398
  _training["message"] = "training RT-DETR"
399
  cmd = [
400
+ sys.executable, str(TRAIN_SCRIPT),
401
  "--train-dir", str(GENERATED_DIR / "train"),
402
  "--val-dir", str(GENERATED_DIR / "val"),
403
  "--classes", str(CLASSES_FILE),