ibsocr1 commited on
Commit
d0b7f8a
·
verified ·
1 Parent(s): 6690b1f

Upload 5 files

Browse files
Files changed (2) hide show
  1. app.py +1 -1
  2. training/train.py +4 -4
app.py CHANGED
@@ -26,7 +26,7 @@ else:
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():
 
26
  ROOT = Path(__file__).resolve().parent
27
 
28
  # Self-heal the training script if a deployment omitted the training/ directory.
29
+ _TRAINING_SCRIPT_B64 = "aW1wb3J0IGFyZ3BhcnNlCmltcG9ydCBqc29uCmZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aAoKaW1wb3J0IHRvcmNoCmZyb20gUElMIGltcG9ydCBJbWFnZQpmcm9tIHRvcmNoLnV0aWxzLmRhdGEgaW1wb3J0IERhdGFzZXQsIERhdGFMb2FkZXIKZnJvbSB0cWRtIGltcG9ydCB0cWRtCmZyb20gdHJhbnNmb3JtZXJzIGltcG9ydCBSVERldHJJbWFnZVByb2Nlc3NvciwgUlREZXRyRm9yT2JqZWN0RGV0ZWN0aW9uCgpCQVNFX01PREVMID0gIlBla2luZ1UvcnRkZXRyX3I1MHZkIgoKZGVmIGxvYWRfY2xhc3NlcyhwYXRoKToKICAgIHJldHVybiBbeC5zdHJpcCgpIGZvciB4IGluIFBhdGgocGF0aCkucmVhZF90ZXh0KCkuc3BsaXRsaW5lcygpIGlmIHguc3RyaXAoKV0KCmNsYXNzIENPQ09EZXRlY3Rpb25EYXRhc2V0KERhdGFzZXQpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGltYWdlX2RpciwgYW5ub3RhdGlvbl9maWxlLCBwcm9jZXNzb3IpOgogICAgICAgIHNlbGYuaW1hZ2VfZGlyID0gUGF0aChpbWFnZV9kaXIpCiAgICAgICAgc2VsZi5wcm9jZXNzb3IgPSBwcm9jZXNzb3IKICAgICAgICBjb2NvID0ganNvbi5sb2FkcyhQYXRoKGFubm90YXRpb25fZmlsZSkucmVhZF90ZXh0KCkpCiAgICAgICAgc2VsZi5pbWFnZXMgPSB7eFsiaWQiXTogeCBmb3IgeCBpbiBjb2NvWyJpbWFnZXMiXX0KICAgICAgICBjYXRzID0gc29ydGVkKGNvY29bImNhdGVnb3JpZXMiXSwga2V5PWxhbWJkYSB4OiB4WyJpZCJdKQogICAgICAgIHNlbGYuY2F0ZWdvcnlfaWRfdG9fbGFiZWwgPSB7Y1siaWQiXTogaSBmb3IgaSxjIGluIGVudW1lcmF0ZShjYXRzKX0KICAgICAgICBhbm5zID0ge30KICAgICAgICBmb3IgYSBpbiBjb2NvWyJhbm5vdGF0aW9ucyJdOgogICAgICAgICAgICBpZiBub3QgYS5nZXQoImlzY3Jvd2QiLCAwKToKICAgICAgICAgICAgICAgIGFubnMuc2V0ZGVmYXVsdChhWyJpbWFnZV9pZCJdLCBbXSkuYXBwZW5kKGEpCiAgICAgICAgc2VsZi5yZWNvcmRzID0gW10KICAgICAgICBmb3IgaW1hZ2VfaWQsIGluZm8gaW4gc2VsZi5pbWFnZXMuaXRlbXMoKToKICAgICAgICAgICAgc2VsZi5yZWNvcmRzLmFwcGVuZCh7CiAgICAgICAgICAgICAgICAiaW1hZ2VfaWQiOiBpbWFnZV9pZCwgImZpbGVfbmFtZSI6IGluZm9bImZpbGVfbmFtZSJdLAogICAgICAgICAgICAgICAgIndpZHRoIjogaW5mb1sid2lkdGgiXSwgImhlaWdodCI6IGluZm9bImhlaWdodCJdLAogICAgICAgICAgICAgICAgImFubm90YXRpb25zIjogYW5ucy5nZXQoaW1hZ2VfaWQsIFtdKQogICAgICAgICAgICB9KQoKICAgIGRlZiBfX2xlbl9fKHNlbGYpOiByZXR1cm4gbGVuKHNlbGYucmVjb3JkcykKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaWR4KToKICAgICAgICByID0gc2VsZi5yZWNvcmRzW2lkeF0KICAgICAgICBpbWFnZSA9IEltYWdlLm9wZW4oc2VsZi5pbWFnZV9kaXIgLyByWyJmaWxlX25hbWUiXSkuY29udmVydCgiUkdCIikKICAgICAgICBhbm5zID0gW10KICAgICAgICBmb3IgYSBpbiByWyJhbm5vdGF0aW9ucyJdOgogICAgICAgICAgICB4LHksdyxoID0gYVsiYmJveCJdCiAgICAgICAgICAgIGlmIHcgPD0gMCBvciBoIDw9IDA6IGNvbnRpbnVlCiAgICAgICAgICAgIGFubnMuYXBwZW5kKHsKICAgICAgICAgICAgICAgICJpZCI6IGFbImlkIl0sICJpbWFnZV9pZCI6IGludChpZHgpLAogICAgICAgICAgICAgICAgImNhdGVnb3J5X2lkIjogc2VsZi5jYXRlZ29yeV9pZF90b19sYWJlbFthWyJjYXRlZ29yeV9pZCJdXSwKICAgICAgICAgICAgICAgICJiYm94IjogW3gseSx3LGhdLCAiYXJlYSI6IGZsb2F0KGEuZ2V0KCJhcmVhIix3KmgpKSwKICAgICAgICAgICAgICAgICJpc2Nyb3dkIjogMAogICAgICAgICAgICB9KQogICAgICAgIGVuY29kZWQgPSBzZWxmLnByb2Nlc3NvcigKICAgICAgICAgICAgaW1hZ2VzPWltYWdlLAogICAgICAgICAgICBhbm5vdGF0aW9ucz17ImltYWdlX2lkIjogaW50KGlkeCksICJhbm5vdGF0aW9ucyI6IGFubnN9LAogICAgICAgICAgICByZXR1cm5fdGVuc29ycz0icHQiCiAgICAgICAgKQogICAgICAgIGVuY29kZWRbInBpeGVsX3ZhbHVlcyJdID0gZW5jb2RlZFsicGl4ZWxfdmFsdWVzIl0uc3F1ZWV6ZSgwKQogICAgICAgIGlmICJwaXhlbF9tYXNrIiBpbiBlbmNvZGVkOgogICAgICAgICAgICBlbmNvZGVkWyJwaXhlbF9tYXNrIl0gPSBlbmNvZGVkWyJwaXhlbF9tYXNrIl0uc3F1ZWV6ZSgwKQogICAgICAgIGVuY29kZWRbImxhYmVscyJdID0gZW5jb2RlZFsibGFiZWxzIl1bMF0KICAgICAgICByZXR1cm4gZW5jb2RlZAoKZGVmIGNvbGxhdGVfZm4oYmF0Y2gpOgogICAgb3V0ID0geyJwaXhlbF92YWx1ZXMiOiB0b3JjaC5zdGFjayhbeFsicGl4ZWxfdmFsdWVzIl0gZm9yIHggaW4gYmF0Y2hdKSwKICAgICAgICAgICAibGFiZWxzIjogW3hbImxhYmVscyJdIGZvciB4IGluIGJhdGNoXX0KICAgIGlmICJwaXhlbF9tYXNrIiBpbiBiYXRjaFswXToKICAgICAgICBvdXRbInBpeGVsX21hc2siXSA9IHRvcmNoLnN0YWNrKFt4WyJwaXhlbF9tYXNrIl0gZm9yIHggaW4gYmF0Y2hdKQogICAgcmV0dXJuIG91dAoKZGVmIGV2YWx1YXRlKG1vZGVsLCBsb2FkZXIsIGRldmljZSk6CiAgICBtb2RlbC5ldmFsKCk7IHRvdGFsPTA7IG49MAogICAgd2l0aCB0b3JjaC5ub19ncmFkKCk6CiAgICAgICAgZm9yIGJhdGNoIGluIGxvYWRlcjoKICAgICAgICAgICAgYmF0Y2g9e2s6KHYudG8oZGV2aWNlKSBpZiB0b3JjaC5pc190ZW5zb3IodikgZWxzZSB2KSBmb3Igayx2IGluIGJhdGNoLml0ZW1zKCl9CiAgICAgICAgICAgIHRvdGFsICs9IGZsb2F0KG1vZGVsKCoqYmF0Y2gpLmxvc3MuaXRlbSgpKTsgbiArPSAxCiAgICBtb2RlbC50cmFpbigpCiAgICByZXR1cm4gdG90YWwvbWF4KG4sMSkKCmRlZiBtYWluKCk6CiAgICBwPWFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKICAgIHAuYWRkX2FyZ3VtZW50KCItLXRyYWluLWRpciIscmVxdWlyZWQ9VHJ1ZSk7IHAuYWRkX2FyZ3VtZW50KCItLXZhbC1kaXIiLHJlcXVpcmVkPVRydWUpCiAgICBwLmFkZF9hcmd1bWVudCgiLS1jbGFzc2VzIixyZXF1aXJlZD1UcnVlKTsgcC5hZGRfYXJndW1lbnQoIi0tb3V0cHV0LWRpciIsZGVmYXVsdD0ibW9kZWwiKQogICAgcC5hZGRfYXJndW1lbnQoIi0tZXBvY2hzIix0eXBlPWludCxkZWZhdWx0PTMwKTsgcC5hZGRfYXJndW1lbnQoIi0tYmF0Y2gtc2l6ZSIsdHlwZT1pbnQsZGVmYXVsdD0yKQogICAgcC5hZGRfYXJndW1lbnQoIi0tbGVhcm5pbmctcmF0ZSIsdHlwZT1mbG9hdCxkZWZhdWx0PTFlLTUpOyBwLmFkZF9hcmd1bWVudCgiLS13ZWlnaHQtZGVjYXkiLHR5cGU9ZmxvYXQsZGVmYXVsdD0xZS00KQogICAgcC5hZGRfYXJndW1lbnQoIi0tbnVtLXdvcmtlcnMiLHR5cGU9aW50LGRlZmF1bHQ9MikKICAgIGE9cC5wYXJzZV9hcmdzKCkKCiAgICBjbGFzc2VzPWxvYWRfY2xhc3NlcyhhLmNsYXNzZXMpCiAgICBpZDJsYWJlbD17aTpuIGZvciBpLG4gaW4gZW51bWVyYXRlKGNsYXNzZXMpfQogICAgbGFiZWwyaWQ9e246aSBmb3IgaSxuIGluIGVudW1lcmF0ZShjbGFzc2VzKX0KCiAgICBwcm9jPVJURGV0ckltYWdlUHJvY2Vzc29yLmZyb21fcHJldHJhaW5lZChCQVNFX01PREVMKQogICAgdHJhaW49Q09DT0RldGVjdGlvbkRhdGFzZXQoUGF0aChhLnRyYWluX2RpcikvImltYWdlcyIsUGF0aChhLnRyYWluX2RpcikvImFubm90YXRpb25zLmpzb24iLHByb2MpCiAgICB2YWw9Q09DT0RldGVjdGlvbkRhdGFzZXQoUGF0aChhLnZhbF9kaXIpLyJpbWFnZXMiLFBhdGgoYS52YWxfZGlyKS8iYW5ub3RhdGlvbnMuanNvbiIscHJvYykKCiAgICBpZiBsZW4odHJhaW4pPT0wIG9yIGxlbih2YWwpPT0wOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlRyYWluaW5nIGFuZCB2YWxpZGF0aW9uIGRhdGFzZXRzIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgaW1hZ2UuIikKICAgIGlmIGxlbih0cmFpbi5jYXRlZ29yeV9pZF90b19sYWJlbCkhPWxlbihjbGFzc2VzKSBvciBsZW4odmFsLmNhdGVnb3J5X2lkX3RvX2xhYmVsKSE9bGVuKGNsYXNzZXMpOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNPQ08gY2F0ZWdvcmllcyBkbyBub3QgbWF0Y2ggY2xhc3Nlcy50eHQuIFJlYnVpbGQgdGhlIGRhdGFzZXQgYWZ0ZXIgc2F2aW5nIHRoZSBjbGFzc2VzLiIpCgogICAgbW9kZWw9UlREZXRyRm9yT2JqZWN0RGV0ZWN0aW9uLmZyb21fcHJldHJhaW5lZCgKICAgICAgICBCQVNFX01PREVMLG51bV9sYWJlbHM9bGVuKGNsYXNzZXMpLGlkMmxhYmVsPWlkMmxhYmVsLGxhYmVsMmlkPWxhYmVsMmlkLAogICAgICAgIGlnbm9yZV9taXNtYXRjaGVkX3NpemVzPVRydWUKICAgICkKICAgIGRldmljZT10b3JjaC5kZXZpY2UoImN1ZGEiIGlmIHRvcmNoLmN1ZGEuaXNfYXZhaWxhYmxlKCkgZWxzZSAiY3B1IikKICAgIG1vZGVsLnRvKGRldmljZSkKCiAgICB0cj1EYXRhTG9hZGVyKHRyYWluLGJhdGNoX3NpemU9YS5iYXRjaF9zaXplLHNodWZmbGU9VHJ1ZSxudW1fd29ya2Vycz0wLGNvbGxhdGVfZm49Y29sbGF0ZV9mbikKICAgIHZhPURhdGFMb2FkZXIodmFsLGJhdGNoX3NpemU9YS5iYXRjaF9zaXplLHNodWZmbGU9RmFsc2UsbnVtX3dvcmtlcnM9MCxjb2xsYXRlX2ZuPWNvbGxhdGVfZm4pCiAgICBvcHQ9dG9yY2gub3B0aW0uQWRhbVcobW9kZWwucGFyYW1ldGVycygpLGxyPWEubGVhcm5pbmdfcmF0ZSx3ZWlnaHRfZGVjYXk9YS53ZWlnaHRfZGVjYXkpCgogICAgb3V0ZGlyPVBhdGgoYS5vdXRwdXRfZGlyKTsgb3V0ZGlyLm1rZGlyKHBhcmVudHM9VHJ1ZSxleGlzdF9vaz1UcnVlKQogICAgYmVzdD1mbG9hdCgiaW5mIikKCiAgICBmb3IgZXBvY2ggaW4gcmFuZ2UoYS5lcG9jaHMpOgogICAgICAgIG1vZGVsLnRyYWluKCk7IHJ1bm5pbmc9MAogICAgICAgIGJhcj10cWRtKHRyLGRlc2M9ZiJlcG9jaCB7ZXBvY2grMX0ve2EuZXBvY2hzfSIpCiAgICAgICAgZm9yIHN0ZXAsYmF0Y2ggaW4gZW51bWVyYXRlKGJhcik6CiAgICAgICAgICAgIGJhdGNoPXtrOih2LnRvKGRldmljZSkgaWYgdG9yY2guaXNfdGVuc29yKHYpIGVsc2UgdikgZm9yIGssdiBpbiBiYXRjaC5pdGVtcygpfQogICAgICAgICAgICBsb3NzPW1vZGVsKCoqYmF0Y2gpLmxvc3MKICAgICAgICAgICAgbG9zcy5iYWNrd2FyZCgpOyBvcHQuc3RlcCgpOyBvcHQuemVyb19ncmFkKHNldF90b19ub25lPVRydWUpCiAgICAgICAgICAgIHJ1bm5pbmcgKz0gZmxvYXQobG9zcy5pdGVtKCkpCiAgICAgICAgICAgIGJhci5zZXRfcG9zdGZpeChsb3NzPWYie3J1bm5pbmcvKHN0ZXArMSk6LjRmfSIpCiAgICAgICAgdmw9ZXZhbHVhdGUobW9kZWwsdmEsZGV2aWNlKQogICAgICAgIHByaW50KGYidmFsaWRhdGlvbl9sb3NzPXt2bDouNGZ9IikKICAgICAgICBpZiB2bDxiZXN0OgogICAgICAgICAgICBiZXN0PXZsCiAgICAgICAgICAgIG1vZGVsLnNhdmVfcHJldHJhaW5lZChvdXRkaXIpCiAgICAgICAgICAgIHByb2Muc2F2ZV9wcmV0cmFpbmVkKG91dGRpcikKICAgICAgICAgICAgKG91dGRpci8iY2xhc3Nlcy5qc29uIikud3JpdGVfdGV4dChqc29uLmR1bXBzKHsiaWQybGFiZWwiOmlkMmxhYmVsLCJsYWJlbDJpZCI6bGFiZWwyaWR9LGluZGVudD0yKSkKICAgIG1vZGVsLnNhdmVfcHJldHJhaW5lZChvdXRkaXIpOyBwcm9jLnNhdmVfcHJldHJhaW5lZChvdXRkaXIpCgppZiBfX25hbWVfXz09Il9fbWFpbl9fIjogbWFpbigpCg=="
30
  TRAINING_DIR = ROOT / "training"
31
  TRAIN_SCRIPT = TRAINING_DIR / "train.py"
32
  if not TRAIN_SCRIPT.exists():
training/train.py CHANGED
@@ -43,14 +43,14 @@ class COCODetectionDataset(Dataset):
43
  x,y,w,h = a["bbox"]
44
  if w <= 0 or h <= 0: continue
45
  anns.append({
46
- "id": a["id"], "image_id": r["image_id"],
47
  "category_id": self.category_id_to_label[a["category_id"]],
48
  "bbox": [x,y,w,h], "area": float(a.get("area",w*h)),
49
  "iscrowd": 0
50
  })
51
  encoded = self.processor(
52
  images=image,
53
- annotations={"image_id": r["image_id"], "annotations": anns},
54
  return_tensors="pt"
55
  )
56
  encoded["pixel_values"] = encoded["pixel_values"].squeeze(0)
@@ -104,8 +104,8 @@ def main():
104
  device=torch.device("cuda" if torch.cuda.is_available() else "cpu")
105
  model.to(device)
106
 
107
- tr=DataLoader(train,batch_size=a.batch_size,shuffle=True,num_workers=a.num_workers,collate_fn=collate_fn)
108
- va=DataLoader(val,batch_size=a.batch_size,shuffle=False,num_workers=a.num_workers,collate_fn=collate_fn)
109
  opt=torch.optim.AdamW(model.parameters(),lr=a.learning_rate,weight_decay=a.weight_decay)
110
 
111
  outdir=Path(a.output_dir); outdir.mkdir(parents=True,exist_ok=True)
 
43
  x,y,w,h = a["bbox"]
44
  if w <= 0 or h <= 0: continue
45
  anns.append({
46
+ "id": a["id"], "image_id": int(idx),
47
  "category_id": self.category_id_to_label[a["category_id"]],
48
  "bbox": [x,y,w,h], "area": float(a.get("area",w*h)),
49
  "iscrowd": 0
50
  })
51
  encoded = self.processor(
52
  images=image,
53
+ annotations={"image_id": int(idx), "annotations": anns},
54
  return_tensors="pt"
55
  )
56
  encoded["pixel_values"] = encoded["pixel_values"].squeeze(0)
 
104
  device=torch.device("cuda" if torch.cuda.is_available() else "cpu")
105
  model.to(device)
106
 
107
+ tr=DataLoader(train,batch_size=a.batch_size,shuffle=True,num_workers=0,collate_fn=collate_fn)
108
+ va=DataLoader(val,batch_size=a.batch_size,shuffle=False,num_workers=0,collate_fn=collate_fn)
109
  opt=torch.optim.AdamW(model.parameters(),lr=a.learning_rate,weight_decay=a.weight_decay)
110
 
111
  outdir=Path(a.output_dir); outdir.mkdir(parents=True,exist_ok=True)