cli to control zed camera start and stop. 2. measure now use every svo2 file for 1 fish, give intermideate result and final result with confidecne level(*).
@@ -10,6 +10,24 @@ import json
|
||||
import numpy as np
|
||||
import torch
|
||||
from pathlib import Path
|
||||
|
||||
if not hasattr(argparse, "BooleanOptionalAction"):
|
||||
class _BooleanOptionalAction(argparse.Action):
|
||||
def __init__(self, option_strings, dest, default=None, type=None,
|
||||
choices=None, required=False, help=None, metavar=None):
|
||||
_option_strings = []
|
||||
for opt in option_strings:
|
||||
_option_strings.append(opt)
|
||||
if opt.startswith("--"):
|
||||
_option_strings.append("--no-" + opt[2:])
|
||||
super().__init__(option_strings=_option_strings, dest=dest, nargs=0,
|
||||
default=default, type=type, choices=choices,
|
||||
required=required, help=help, metavar=metavar)
|
||||
|
||||
def __call__(self, parser, namespace, values, option_string=None):
|
||||
setattr(namespace, self.dest, not option_string.startswith("--no-"))
|
||||
|
||||
argparse.BooleanOptionalAction = _BooleanOptionalAction
|
||||
from typing import List, Dict, Any, Optional, Tuple
|
||||
from ultralytics import YOLO
|
||||
from seg import init_models
|
||||
@@ -20,6 +38,8 @@ import importlib
|
||||
import tempfile
|
||||
import subprocess
|
||||
|
||||
_REPO_ROOT = Path(__file__).resolve().parent
|
||||
|
||||
try:
|
||||
import pyzed.sl as sl
|
||||
ZED_AVAILABLE = True
|
||||
@@ -936,7 +956,7 @@ def classify_pointcloud_array(classifier: torch.nn.Module, points: np.ndarray, c
|
||||
possible_paths = [
|
||||
Path(__file__).parent / "pointcloud_classifier" / "Pointnet_Pointnet2_pytorch" / "test_classification.py",
|
||||
Path(__file__).parent.parent / "pointcloud_classifier" / "Pointnet_Pointnet2_pytorch" / "test_classification.py",
|
||||
Path("/home/ubuntu/projects/FishMeasure/pointcloud_classifier/Pointnet_Pointnet2_pytorch/test_classification.py"),
|
||||
_REPO_ROOT / "pointcloud_classifier" / "Pointnet_Pointnet2_pytorch" / "test_classification.py",
|
||||
]
|
||||
|
||||
test_classification_path = None
|
||||
@@ -2132,7 +2152,7 @@ def main():
|
||||
help="With --batch-svo-folder: find *.svo2 in all subfolders (output dirs use path like parent__child__file)",
|
||||
)
|
||||
parser.add_argument("--yolo-model",
|
||||
default="/home/ubuntu/projects/FishMeasure/runs/train/fish_detection_20251127_104658/weights/best.pt",
|
||||
default=str(_REPO_ROOT / "runs/train/fish_detection_20251127_104658/weights/best.pt"),
|
||||
help="YOLO model path")
|
||||
parser.add_argument("--conf", type=float, default=0.25, help="Confidence threshold")
|
||||
parser.add_argument("--imgsz", type=int, default=640, help="Image size")
|
||||
@@ -2176,7 +2196,7 @@ def main():
|
||||
parser.add_argument("--run-weight-estimation", action="store_true",
|
||||
help="After processing, run DGCNN weight estimation on saved point clouds (test_dgcnn_weight_estimator)")
|
||||
parser.add_argument("--weight-estimator-checkpoint", type=str,
|
||||
default="/home/ubuntu/projects/FishMeasure/weight_estimator/runs/dgcnn_20260312_171043/best.pt",
|
||||
default=str(_REPO_ROOT / "weight_estimator/runs/dgcnn_20260312_171043/best.pt"),
|
||||
help="Path to DGCNN weight estimator checkpoint (.pt)")
|
||||
parser.add_argument("--weight-topk-length", type=int, default=3,
|
||||
help="Optional: length-weighted top-K for predict_cloud_folder (default: 3; set 0 to disable)")
|
||||
|
||||
@@ -167,22 +167,41 @@ def generate_video(
|
||||
imgsz: int = 640,
|
||||
frame_stride: int = 1,
|
||||
show_large: bool = False,
|
||||
summary_weight_g: Optional[float] = None,
|
||||
summary_length_mm: Optional[float] = None,
|
||||
summary_star: bool = False,
|
||||
output_video_name: Optional[str] = None,
|
||||
sam_device: str = "cuda",
|
||||
) -> Optional[Path]:
|
||||
if not ZED_AVAILABLE:
|
||||
print("ERROR: pyzed not available, cannot generate labeled video")
|
||||
return None
|
||||
|
||||
per_frame, summary_wg, summary_lmm, is_confident = _parse_weight_json(weight_json)
|
||||
star_s = " *" if is_confident else ""
|
||||
per_frame, parsed_summary_wg, parsed_summary_lmm, raw_confident = _parse_weight_json(weight_json)
|
||||
if summary_weight_g is None:
|
||||
summary_weight_g = parsed_summary_wg
|
||||
if summary_length_mm is None:
|
||||
summary_length_mm = parsed_summary_lmm
|
||||
star_s = " *" if summary_star else ""
|
||||
print(f" Per-frame predictions: {len(per_frame)} PLYs mapped")
|
||||
print(f" Summary: weight={summary_wg}g, length={summary_lmm}mm{star_s}")
|
||||
print(
|
||||
f" Summary: weight={summary_weight_g}g, length={summary_length_mm}mm{star_s} "
|
||||
f"(raw_confident={raw_confident})"
|
||||
)
|
||||
|
||||
if not per_frame and summary_wg is None:
|
||||
if not per_frame and summary_weight_g is None:
|
||||
print(" WARNING: No weight data in JSON, video will show '--'")
|
||||
|
||||
from ultralytics import YOLO
|
||||
yolo = YOLO(yolo_model_path)
|
||||
class_names = yolo.names if hasattr(yolo, "names") else {}
|
||||
from fish_video_weight_evaluation import (
|
||||
create_segmentation_overlay,
|
||||
load_sam_predictor_with_fallback,
|
||||
segment_with_sam,
|
||||
)
|
||||
sam_predictor, eff_sam_device = load_sam_predictor_with_fallback(sam_device)
|
||||
sam_torch_device = eff_sam_device
|
||||
|
||||
from dataset.zed_reader import ZEDReader
|
||||
zed_reader = ZEDReader(svo_path=str(svo_path), camera_mode=False, use_yolo_detector=False)
|
||||
@@ -218,6 +237,7 @@ def generate_video(
|
||||
continue
|
||||
|
||||
frame_number = idx + 1
|
||||
frame_name = f"frame_{frame_number:06d}"
|
||||
if frame_number in per_frame:
|
||||
cur_wg, cur_lmm = per_frame[frame_number]
|
||||
last_wg = cur_wg
|
||||
@@ -230,6 +250,7 @@ def generate_video(
|
||||
num_dets = len(results.boxes) if results.boxes is not None else 0
|
||||
|
||||
left_disp = img.copy()
|
||||
right_disp = img.copy()
|
||||
if num_dets > 0:
|
||||
boxes = results.boxes.xyxy.cpu().numpy()
|
||||
tids = (results.boxes.id.cpu().numpy().astype(int)
|
||||
@@ -245,19 +266,31 @@ def generate_video(
|
||||
cname = class_names.get(cid, "fish")
|
||||
_draw_label_on_box(left_disp, box, tid, cname, cur_wg, cur_lmm)
|
||||
|
||||
if show_large or summary_wg is not None:
|
||||
_draw_large_summary(left_disp, summary_wg, summary_lmm, is_confident)
|
||||
try:
|
||||
masks = segment_with_sam(sam_predictor, img, boxes, sam_torch_device)
|
||||
except Exception as e:
|
||||
print(f" WARNING: SAM segmentation failed on {frame_name}: {e}")
|
||||
masks = []
|
||||
|
||||
if masks:
|
||||
right_disp = create_segmentation_overlay(img.copy(), masks)
|
||||
cv2.putText(right_disp, "Segmentation", (10, right_disp.shape[0] - 20),
|
||||
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 255, 255), 2, cv2.LINE_AA)
|
||||
else:
|
||||
cv2.putText(right_disp, "Segmentation (failed)", (10, right_disp.shape[0] - 20),
|
||||
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2, cv2.LINE_AA)
|
||||
else:
|
||||
cv2.putText(right_disp, "No detections", (10, right_disp.shape[0] - 20),
|
||||
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (128, 128, 128), 2, cv2.LINE_AA)
|
||||
|
||||
if show_large or summary_weight_g is not None:
|
||||
_draw_large_summary(left_disp, summary_weight_g, summary_length_mm, summary_star)
|
||||
|
||||
frame_name = f"frame_{frame_number:06d}"
|
||||
info = f"[{frame_number}] {frame_name} | Detections: {num_dets}"
|
||||
cv2.putText(left_disp, info, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2, cv2.LINE_AA)
|
||||
cv2.putText(left_disp, "Detection", (10, left_disp.shape[0] - 20),
|
||||
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 255, 255), 2, cv2.LINE_AA)
|
||||
|
||||
right_disp = img.copy()
|
||||
cv2.putText(right_disp, "Original", (10, right_disp.shape[0] - 20),
|
||||
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 255, 255), 2, cv2.LINE_AA)
|
||||
|
||||
combined = np.hstack([left_disp, right_disp])
|
||||
if num_dets > 0:
|
||||
frames.append(combined)
|
||||
@@ -275,7 +308,7 @@ def generate_video(
|
||||
print(f" WARNING: No detection frames collected from {svo_name}")
|
||||
return None
|
||||
|
||||
video_path = images_dir / f"{svo_name}_preview.mp4"
|
||||
video_path = images_dir / (output_video_name or f"{svo_name}_preview.mp4")
|
||||
h, w = frames[0].shape[:2]
|
||||
writer = cv2.VideoWriter(str(video_path), cv2.VideoWriter_fourcc(*"mp4v"), 10.0, (w, h))
|
||||
for f in frames:
|
||||
@@ -295,7 +328,17 @@ def main():
|
||||
parser.add_argument("--conf", type=float, default=0.25)
|
||||
parser.add_argument("--imgsz", type=int, default=640)
|
||||
parser.add_argument("--frame-stride", type=int, default=1)
|
||||
parser.add_argument("--sam-device", type=str, default="cuda")
|
||||
parser.add_argument("--show-large-labels-at-top-right", action="store_true")
|
||||
parser.add_argument(
|
||||
"--summary-star",
|
||||
action=argparse.BooleanOptionalAction,
|
||||
default=False,
|
||||
help="Whether to draw * on the Final summary line; caller/DB is the source of truth.",
|
||||
)
|
||||
parser.add_argument("--summary-weight-g", type=float, default=None)
|
||||
parser.add_argument("--summary-length-mm", type=float, default=None)
|
||||
parser.add_argument("--output-video-name", type=str, default=None)
|
||||
args = parser.parse_args()
|
||||
|
||||
svo = Path(args.svo).expanduser().resolve()
|
||||
@@ -315,7 +358,12 @@ def main():
|
||||
conf=args.conf,
|
||||
imgsz=args.imgsz,
|
||||
frame_stride=args.frame_stride,
|
||||
sam_device=args.sam_device,
|
||||
show_large=args.show_large_labels_at_top_right,
|
||||
summary_weight_g=args.summary_weight_g,
|
||||
summary_length_mm=args.summary_length_mm,
|
||||
summary_star=bool(args.summary_star),
|
||||
output_video_name=args.output_video_name,
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -25,6 +25,24 @@ import subprocess
|
||||
import sys
|
||||
import math
|
||||
from pathlib import Path
|
||||
|
||||
if not hasattr(argparse, "BooleanOptionalAction"):
|
||||
class _BooleanOptionalAction(argparse.Action):
|
||||
def __init__(self, option_strings, dest, default=None, type=None,
|
||||
choices=None, required=False, help=None, metavar=None):
|
||||
_option_strings = []
|
||||
for opt in option_strings:
|
||||
_option_strings.append(opt)
|
||||
if opt.startswith("--"):
|
||||
_option_strings.append("--no-" + opt[2:])
|
||||
super().__init__(option_strings=_option_strings, dest=dest, nargs=0,
|
||||
default=default, type=type, choices=choices,
|
||||
required=required, help=help, metavar=metavar)
|
||||
|
||||
def __call__(self, parser, namespace, values, option_string=None):
|
||||
setattr(namespace, self.dest, not option_string.startswith("--no-"))
|
||||
|
||||
argparse.BooleanOptionalAction = _BooleanOptionalAction
|
||||
from typing import Any, Dict, List, Optional, Tuple
|
||||
|
||||
import torch
|
||||
@@ -136,11 +154,14 @@ def _run_generate_video_with_labels_subprocess(
|
||||
"--conf", str(args.conf),
|
||||
"--imgsz", str(args.imgsz),
|
||||
"--frame-stride", str(args.frame_stride),
|
||||
"--sam-device", str(args.sam_device),
|
||||
"--weight-json", str(weight_json.expanduser().resolve()),
|
||||
]
|
||||
|
||||
if getattr(args, "show_large_labels_at_top_right", False):
|
||||
cmd.append("--show-large-labels-at-top-right")
|
||||
if getattr(args, "summary_star", False):
|
||||
cmd.append("--summary-star")
|
||||
|
||||
print(f"Invoking generate_video_with_labels.py:\n {' '.join(cmd)}")
|
||||
proc = subprocess.run(cmd, cwd=str(REPO_ROOT))
|
||||
@@ -505,7 +526,7 @@ def main() -> None:
|
||||
parser.add_argument(
|
||||
"--yolo-model",
|
||||
type=str,
|
||||
default="/home/ubuntu/projects/FishMeasure/runs/train/fish_detection_20251127_104658/weights/best.pt",
|
||||
default=str(REPO_ROOT / "runs/train/fish_detection_20251127_104658/weights/best.pt"),
|
||||
)
|
||||
parser.add_argument(
|
||||
"--conf",
|
||||
@@ -622,6 +643,12 @@ def main() -> None:
|
||||
action="store_true",
|
||||
help="Show large weight/length labels (10x font) at top right corner for real/camera generated videos.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--summary-star",
|
||||
action=argparse.BooleanOptionalAction,
|
||||
default=False,
|
||||
help="Pass to generate_video_with_labels: whether the summary line should draw *.",
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
if args.frame_stride < 1:
|
||||
|
||||
|
Before Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 90 KiB |
|
Before Width: | Height: | Size: 86 KiB |
@@ -1,106 +0,0 @@
|
||||
task: detect
|
||||
mode: train
|
||||
model: yolov8n.pt
|
||||
data: ./yolo_dataset/dataset.yaml
|
||||
epochs: 100
|
||||
time: null
|
||||
patience: 50
|
||||
batch: 96
|
||||
imgsz: 640
|
||||
save: true
|
||||
save_period: -1
|
||||
cache: false
|
||||
device: null
|
||||
workers: 8
|
||||
project: runs/train
|
||||
name: fish_detection_20251127_104658
|
||||
exist_ok: false
|
||||
pretrained: false
|
||||
optimizer: auto
|
||||
verbose: true
|
||||
seed: 0
|
||||
deterministic: true
|
||||
single_cls: false
|
||||
rect: false
|
||||
cos_lr: false
|
||||
close_mosaic: 10
|
||||
resume: false
|
||||
amp: true
|
||||
fraction: 1.0
|
||||
profile: false
|
||||
freeze: null
|
||||
multi_scale: false
|
||||
overlap_mask: true
|
||||
mask_ratio: 4
|
||||
dropout: 0.0
|
||||
val: true
|
||||
split: val
|
||||
save_json: false
|
||||
save_hybrid: false
|
||||
conf: null
|
||||
iou: 0.7
|
||||
max_det: 300
|
||||
half: false
|
||||
dnn: false
|
||||
plots: true
|
||||
source: null
|
||||
vid_stride: 1
|
||||
stream_buffer: false
|
||||
visualize: false
|
||||
augment: false
|
||||
agnostic_nms: false
|
||||
classes: null
|
||||
retina_masks: false
|
||||
embed: null
|
||||
show: false
|
||||
save_frames: false
|
||||
save_txt: false
|
||||
save_conf: false
|
||||
save_crop: false
|
||||
show_labels: true
|
||||
show_conf: true
|
||||
show_boxes: true
|
||||
line_width: null
|
||||
format: torchscript
|
||||
keras: false
|
||||
optimize: false
|
||||
int8: false
|
||||
dynamic: false
|
||||
simplify: true
|
||||
opset: null
|
||||
workspace: null
|
||||
nms: false
|
||||
lr0: 0.01
|
||||
lrf: 0.01
|
||||
momentum: 0.937
|
||||
weight_decay: 0.0005
|
||||
warmup_epochs: 3.0
|
||||
warmup_momentum: 0.8
|
||||
warmup_bias_lr: 0.1
|
||||
box: 1.75
|
||||
cls: 0.5
|
||||
dfl: 1.5
|
||||
pose: 12.0
|
||||
kobj: 1.0
|
||||
nbs: 64
|
||||
hsv_h: 0.015
|
||||
hsv_s: 0.7
|
||||
hsv_v: 0.4
|
||||
degrees: 10.0
|
||||
translate: 0.2
|
||||
scale: 0.5
|
||||
shear: 2.0
|
||||
perspective: 0.0
|
||||
flipud: 0.1
|
||||
fliplr: 0.5
|
||||
bgr: 0.0
|
||||
mosaic: 1.0
|
||||
mixup: 0.2
|
||||
copy_paste: 0.3
|
||||
copy_paste_mode: flip
|
||||
auto_augment: randaugment
|
||||
erasing: 0.4
|
||||
crop_fraction: 1.0
|
||||
cfg: null
|
||||
tracker: botsort.yaml
|
||||
save_dir: runs/train/fish_detection_20251127_104658
|
||||
|
Before Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 187 KiB |
|
Before Width: | Height: | Size: 203 KiB |
@@ -1,101 +0,0 @@
|
||||
epoch,time,train/box_loss,train/cls_loss,train/dfl_loss,metrics/precision(B),metrics/recall(B),metrics/mAP50(B),metrics/mAP50-95(B),val/box_loss,val/cls_loss,val/dfl_loss,lr/pg0,lr/pg1,lr/pg2
|
||||
1,10.3904,0.39855,2.68593,1.4848,1,0.29733,0.96537,0.56943,0.33362,2.56495,1.02233,0.00038,0.00038,0.00038
|
||||
2,17.5483,0.30028,1.35659,1.12817,1,0.49396,0.95678,0.49421,0.35142,2.66289,1.12329,0.000772278,0.000772278,0.000772278
|
||||
3,25.1797,0.29352,1.17269,1.13078,0.63354,0.70588,0.71908,0.35996,0.3706,1.94815,1.15705,0.00115664,0.00115664,0.00115664
|
||||
4,31.2751,0.29379,1.05877,1.14652,0.92901,0.76994,0.8997,0.51519,0.34598,1.68774,1.25469,0.00153307,0.00153307,0.00153307
|
||||
5,38.2345,0.30129,1.01013,1.16273,1,0.05809,0.11957,0.0573,0.56052,3.3705,2.25768,0.00190159,0.00190159,0.00190159
|
||||
6,44.1377,0.29631,0.9286,1.17263,0.77814,0.72549,0.77275,0.49905,0.30463,2.21664,1.22409,0.001901,0.001901,0.001901
|
||||
7,51.7031,0.28969,0.82499,1.16157,0.81899,0.82353,0.86643,0.50327,0.30846,1.06156,1.23743,0.0018812,0.0018812,0.0018812
|
||||
8,57.6974,0.28756,0.79748,1.16646,0.97759,0.85543,0.93703,0.54512,0.30945,1.3021,1.15419,0.0018614,0.0018614,0.0018614
|
||||
9,64.6096,0.28988,0.78404,1.16845,0.87355,0.54195,0.61651,0.44007,0.28541,1.8088,1.19646,0.0018416,0.0018416,0.0018416
|
||||
10,70.8722,0.28509,0.74823,1.17001,1,0.97714,0.9879,0.66339,0.27556,0.67389,1.10534,0.0018218,0.0018218,0.0018218
|
||||
11,77.6729,0.2811,0.71605,1.16472,0.97131,1,0.99327,0.68686,0.26039,0.53918,1.12841,0.001802,0.001802,0.001802
|
||||
12,83.6789,0.27956,0.71366,1.17215,0.94349,0.7451,0.81617,0.36975,0.44564,1.10381,1.5902,0.0017822,0.0017822,0.0017822
|
||||
13,90.5196,0.27954,0.70341,1.16105,0.98977,0.98039,0.99395,0.70985,0.26287,0.71862,1.08777,0.0017624,0.0017624,0.0017624
|
||||
14,96.2279,0.27389,0.69109,1.16035,0.99776,0.98039,0.99481,0.68656,0.27765,0.65545,1.09127,0.0017426,0.0017426,0.0017426
|
||||
15,103.274,0.27484,0.69505,1.16409,0.94274,0.96857,0.98537,0.6647,0.2812,0.56622,1.11215,0.0017228,0.0017228,0.0017228
|
||||
16,109.28,0.27709,0.68435,1.17154,0.99813,0.98039,0.99462,0.71965,0.24753,0.50567,1.06086,0.001703,0.001703,0.001703
|
||||
17,116.354,0.27127,0.65515,1.15472,0.99011,0.96078,0.99405,0.68376,0.27062,0.59393,1.10243,0.0016832,0.0016832,0.0016832
|
||||
18,121.994,0.27291,0.65216,1.1543,0.97318,0.98039,0.99153,0.72137,0.24675,0.73777,1.04403,0.0016634,0.0016634,0.0016634
|
||||
19,128.471,0.27609,0.64481,1.1633,0.99856,1,0.995,0.71822,0.2506,0.44838,1.04764,0.0016436,0.0016436,0.0016436
|
||||
20,134.908,0.26641,0.63605,1.13566,0.97925,0.98039,0.99423,0.73946,0.22498,0.4882,1.01436,0.0016238,0.0016238,0.0016238
|
||||
21,141.659,0.27002,0.63276,1.15338,0.99622,1,0.995,0.73392,0.24781,0.6929,1.06027,0.001604,0.001604,0.001604
|
||||
22,147.596,0.27016,0.62133,1.15598,1,0.71878,0.7985,0.38994,0.43809,1.15961,1.45966,0.0015842,0.0015842,0.0015842
|
||||
23,154.606,0.26856,0.63903,1.14822,0.99006,0.96078,0.98976,0.73202,0.23704,0.89525,1.02748,0.0015644,0.0015644,0.0015644
|
||||
24,160.874,0.26556,0.61805,1.14759,0.52381,0.21569,0.37119,0.23923,0.48324,4.161,1.79371,0.0015446,0.0015446,0.0015446
|
||||
25,167.63,0.26283,0.62175,1.14417,0.99771,0.98039,0.99481,0.54043,0.36833,0.62126,1.2961,0.0015248,0.0015248,0.0015248
|
||||
26,172.972,0.26277,0.62184,1.14693,0.97588,0.79352,0.838,0.60246,0.26723,1.16324,1.14688,0.001505,0.001505,0.001505
|
||||
27,180.886,0.25845,0.58391,1.1274,1,0.97466,0.99444,0.7358,0.23001,0.43927,1.03289,0.0014852,0.0014852,0.0014852
|
||||
28,186.475,0.25736,0.59062,1.13027,0.99938,1,0.995,0.77511,0.22035,0.41332,1.01175,0.0014654,0.0014654,0.0014654
|
||||
29,193.178,0.25997,0.59153,1.13884,0.99623,1,0.995,0.72041,0.2431,0.43747,1.04154,0.0014456,0.0014456,0.0014456
|
||||
30,198.402,0.26318,0.59378,1.14352,0.99588,0.98039,0.99086,0.71822,0.23253,0.59404,1.04641,0.0014258,0.0014258,0.0014258
|
||||
31,204.755,0.25794,0.57997,1.12954,0.99758,1,0.995,0.65546,0.2929,0.53569,1.17732,0.001406,0.001406,0.001406
|
||||
32,210.705,0.25981,0.59023,1.14197,0.99123,0.96078,0.97752,0.7113,0.24951,0.53056,1.04465,0.0013862,0.0013862,0.0013862
|
||||
33,217.738,0.25927,0.58286,1.1443,0.99828,1,0.995,0.76497,0.21878,0.37529,1.00619,0.0013664,0.0013664,0.0013664
|
||||
34,223.275,0.25433,0.55825,1.11915,0.98879,0.84314,0.93602,0.58228,0.34063,0.70089,1.23218,0.0013466,0.0013466,0.0013466
|
||||
35,230.18,0.25841,0.5804,1.13861,0.99727,0.98039,0.9925,0.75134,0.21602,0.45677,1.00342,0.0013268,0.0013268,0.0013268
|
||||
36,236.28,0.2532,0.57095,1.13238,0.9975,0.98039,0.99093,0.74316,0.24353,0.43215,1.05353,0.001307,0.001307,0.001307
|
||||
37,243.19,0.25301,0.57535,1.13453,1,0.99155,0.995,0.72838,0.24188,0.67456,1.0605,0.0012872,0.0012872,0.0012872
|
||||
38,249.356,0.25509,0.56332,1.13272,1,0.95882,0.99102,0.74599,0.21894,0.44255,1.00044,0.0012674,0.0012674,0.0012674
|
||||
39,256.308,0.25554,0.5739,1.13027,0.99595,1,0.995,0.75996,0.22547,0.50187,1.01792,0.0012476,0.0012476,0.0012476
|
||||
40,262.306,0.25143,0.55879,1.12012,0.99711,1,0.995,0.76673,0.21535,0.46243,1.00072,0.0012278,0.0012278,0.0012278
|
||||
41,268.917,0.2534,0.56009,1.12077,0.99082,1,0.995,0.73951,0.23347,0.66055,1.02986,0.001208,0.001208,0.001208
|
||||
42,274.828,0.2489,0.5661,1.11458,1,0.91885,0.98684,0.72466,0.22931,0.53634,1.02747,0.0011882,0.0011882,0.0011882
|
||||
43,281.555,0.25301,0.55236,1.13143,0.99738,1,0.995,0.74646,0.2298,0.49582,1.02689,0.0011684,0.0011684,0.0011684
|
||||
44,287.74,0.2486,0.53306,1.11907,1,0.97736,0.99364,0.73858,0.23603,0.49003,1.03041,0.0011486,0.0011486,0.0011486
|
||||
45,294.836,0.24944,0.54158,1.1268,0.99062,1,0.995,0.75756,0.23048,0.60132,1.04024,0.0011288,0.0011288,0.0011288
|
||||
46,301.451,0.24913,0.53379,1.1269,0.99596,0.98039,0.99048,0.77386,0.20906,0.54314,0.99925,0.001109,0.001109,0.001109
|
||||
47,308.242,0.24957,0.53985,1.12517,0.99593,1,0.995,0.73996,0.23001,0.52276,1.02912,0.0010892,0.0010892,0.0010892
|
||||
48,314.344,0.24351,0.53626,1.10608,1,0.99956,0.995,0.74934,0.23199,0.39499,1.03412,0.0010694,0.0010694,0.0010694
|
||||
49,321.241,0.24759,0.53893,1.11816,1,0.99844,0.995,0.74604,0.22845,0.39064,1.02153,0.0010496,0.0010496,0.0010496
|
||||
50,327.139,0.2464,0.53694,1.1138,0.99835,0.98039,0.99048,0.71125,0.24541,0.42938,1.07937,0.0010298,0.0010298,0.0010298
|
||||
51,333.821,0.24154,0.51898,1.10733,0.99567,0.90196,0.97517,0.62595,0.29596,0.61014,1.14221,0.00101,0.00101,0.00101
|
||||
52,339.882,0.24658,0.53043,1.11979,0.99546,0.98039,0.99323,0.65978,0.27159,0.52309,1.13272,0.0009902,0.0009902,0.0009902
|
||||
53,346.689,0.24636,0.52582,1.11253,0.99778,0.98039,0.99481,0.69862,0.26351,0.45512,1.08185,0.0009704,0.0009704,0.0009704
|
||||
54,352.945,0.24152,0.51738,1.10331,0.99739,1,0.995,0.72452,0.24969,0.40628,1.06735,0.0009506,0.0009506,0.0009506
|
||||
55,359.178,0.24263,0.50863,1.10604,0.99683,1,0.995,0.77739,0.21597,0.42763,1.01173,0.0009308,0.0009308,0.0009308
|
||||
56,365.965,0.24373,0.51169,1.10391,0.95858,0.90771,0.97651,0.63893,0.29309,0.63256,1.16514,0.000911,0.000911,0.000911
|
||||
57,372.475,0.24282,0.51188,1.10565,0.9915,0.98039,0.99054,0.75734,0.21952,0.56379,1.01633,0.0008912,0.0008912,0.0008912
|
||||
58,379.602,0.23912,0.50781,1.09877,1,0.95988,0.98778,0.72449,0.24914,0.46787,1.05661,0.0008714,0.0008714,0.0008714
|
||||
59,385.13,0.24179,0.51076,1.10568,1,0.95731,0.98289,0.71162,0.23833,0.6395,1.04927,0.0008516,0.0008516,0.0008516
|
||||
60,392.571,0.23757,0.50074,1.09636,0.99702,0.98039,0.99261,0.76777,0.20872,0.47718,0.99627,0.0008318,0.0008318,0.0008318
|
||||
61,397.864,0.23342,0.49493,1.09485,0.99568,0.98039,0.9931,0.76937,0.20784,0.45567,1.01043,0.000812,0.000812,0.000812
|
||||
62,405.506,0.23929,0.49675,1.10508,0.9953,0.96078,0.9827,0.72038,0.24622,0.5664,1.07435,0.0007922,0.0007922,0.0007922
|
||||
63,411.243,0.2385,0.49568,1.09486,0.99783,0.98039,0.99086,0.76087,0.22259,0.49003,1.01614,0.0007724,0.0007724,0.0007724
|
||||
64,418.044,0.23775,0.49129,1.08891,0.99544,0.98039,0.99054,0.77224,0.21441,0.51803,1.00319,0.0007526,0.0007526,0.0007526
|
||||
65,423.941,0.23656,0.49423,1.09174,0.97965,0.94412,0.98937,0.76534,0.21473,0.53841,0.99562,0.0007328,0.0007328,0.0007328
|
||||
66,430.931,0.23491,0.49057,1.08267,0.99223,0.98039,0.98955,0.76326,0.21453,0.64708,0.99581,0.000713,0.000713,0.000713
|
||||
67,436.831,0.23603,0.4875,1.08431,0.99649,0.98039,0.99427,0.76543,0.21578,0.47111,0.99195,0.0006932,0.0006932,0.0006932
|
||||
68,443.698,0.23371,0.48684,1.08189,1,0.97435,0.99379,0.77164,0.215,0.53772,0.99543,0.0006734,0.0006734,0.0006734
|
||||
69,449.871,0.23341,0.48312,1.0883,0.99289,0.98039,0.99379,0.78205,0.20299,0.46992,0.97694,0.0006536,0.0006536,0.0006536
|
||||
70,456.649,0.2335,0.48756,1.08284,0.99768,0.98039,0.9931,0.76909,0.21567,0.3792,0.99144,0.0006338,0.0006338,0.0006338
|
||||
71,462.607,0.22882,0.47871,1.07799,0.99471,0.98039,0.991,0.76463,0.22008,0.44229,1.00736,0.000614,0.000614,0.000614
|
||||
72,469.768,0.23333,0.48255,1.08936,0.99842,0.92157,0.95471,0.6835,0.25689,0.5887,1.10088,0.0005942,0.0005942,0.0005942
|
||||
73,476.152,0.22814,0.47147,1.07796,0.99695,0.96078,0.99179,0.75486,0.22212,0.48941,1.01634,0.0005744,0.0005744,0.0005744
|
||||
74,483.377,0.22914,0.47235,1.08384,1,0.97669,0.9901,0.77219,0.2153,0.39275,0.99558,0.0005546,0.0005546,0.0005546
|
||||
75,488.716,0.22821,0.47539,1.08204,0.99868,1,0.995,0.74383,0.23322,0.39742,1.03818,0.0005348,0.0005348,0.0005348
|
||||
76,496.052,0.22693,0.47841,1.0774,0.9966,0.98039,0.99427,0.77597,0.22186,0.42881,1.00906,0.000515,0.000515,0.000515
|
||||
77,501.774,0.2272,0.46429,1.07859,0.99656,0.98039,0.9925,0.7684,0.21909,0.4223,1.00152,0.0004952,0.0004952,0.0004952
|
||||
78,508.605,0.22715,0.46817,1.08007,1,0.99833,0.995,0.77597,0.20663,0.39658,0.98381,0.0004754,0.0004754,0.0004754
|
||||
79,514.483,0.22845,0.46984,1.08602,0.99476,0.98039,0.99297,0.76487,0.22367,0.53976,1.01338,0.0004556,0.0004556,0.0004556
|
||||
80,521.104,0.22489,0.45308,1.07029,0.99378,0.98039,0.99364,0.76591,0.22644,0.44335,1.01611,0.0004358,0.0004358,0.0004358
|
||||
81,526.831,0.22808,0.46696,1.08249,0.9984,0.98039,0.99043,0.76392,0.22464,0.40558,1.00919,0.000416,0.000416,0.000416
|
||||
82,534.261,0.22461,0.45758,1.07345,0.99706,0.98039,0.9918,0.76203,0.22683,0.37658,1.02904,0.0003962,0.0003962,0.0003962
|
||||
83,539.83,0.2224,0.45574,1.06465,0.9966,0.96078,0.98809,0.77183,0.22791,0.58994,1.00929,0.0003764,0.0003764,0.0003764
|
||||
84,547.068,0.22321,0.45489,1.07012,0.99534,0.98039,0.99218,0.77586,0.21211,0.4875,0.99631,0.0003566,0.0003566,0.0003566
|
||||
85,553.422,0.22324,0.44994,1.07037,0.99705,0.98039,0.99122,0.77203,0.21439,0.42988,1.00439,0.0003368,0.0003368,0.0003368
|
||||
86,560.244,0.22593,0.46254,1.07436,0.99551,0.98039,0.99323,0.7568,0.21436,0.39946,1.00288,0.000317,0.000317,0.000317
|
||||
87,566.207,0.22535,0.45462,1.07467,0.99768,0.98039,0.99427,0.77229,0.20736,0.36008,0.99378,0.0002972,0.0002972,0.0002972
|
||||
88,573.201,0.22031,0.44716,1.0635,0.99697,0.98039,0.99481,0.76489,0.21791,0.38311,1.01245,0.0002774,0.0002774,0.0002774
|
||||
89,579.084,0.22289,0.44359,1.06804,0.99621,0.98039,0.99162,0.77105,0.21459,0.41661,0.99051,0.0002576,0.0002576,0.0002576
|
||||
90,585.517,0.2213,0.4519,1.07424,0.99675,0.98039,0.99122,0.76516,0.21041,0.42833,0.99584,0.0002378,0.0002378,0.0002378
|
||||
91,597.175,0.19679,0.38958,1.03361,0.99618,0.98039,0.9925,0.76415,0.21165,0.41842,0.98503,0.000218,0.000218,0.000218
|
||||
92,603.128,0.19341,0.33723,1.01494,0.99613,0.98039,0.99285,0.76376,0.21456,0.42319,0.99363,0.0001982,0.0001982,0.0001982
|
||||
93,609.58,0.19245,0.34007,1.02201,0.99697,0.98039,0.99229,0.76732,0.21373,0.38196,0.99964,0.0001784,0.0001784,0.0001784
|
||||
94,614.558,0.18975,0.33377,1.01562,0.99702,0.98039,0.99285,0.76477,0.21757,0.39742,0.9974,0.0001586,0.0001586,0.0001586
|
||||
95,620.215,0.18952,0.32777,1.01532,0.9962,0.98039,0.99107,0.7668,0.21387,0.44539,1.0045,0.0001388,0.0001388,0.0001388
|
||||
96,625.105,0.1894,0.32969,1.01349,0.99492,0.98039,0.9913,0.76397,0.21124,0.43134,0.99738,0.000119,0.000119,0.000119
|
||||
97,630.785,0.18892,0.32829,1.00956,0.99236,0.98039,0.9908,0.7635,0.21104,0.4798,0.99472,9.92e-05,9.92e-05,9.92e-05
|
||||
98,636.519,0.18811,0.32653,1.00609,0.99603,0.98039,0.99261,0.77306,0.21321,0.40139,0.99426,7.94e-05,7.94e-05,7.94e-05
|
||||
99,642.554,0.1863,0.32067,1.00634,0.99516,0.98039,0.9935,0.75723,0.21665,0.41315,1.00323,5.96e-05,5.96e-05,5.96e-05
|
||||
100,647.259,0.18644,0.31964,1.00625,0.99453,0.98039,0.99297,0.76087,0.21668,0.43148,1.00482,3.98e-05,3.98e-05,3.98e-05
|
||||
|
|
Before Width: | Height: | Size: 273 KiB |
|
Before Width: | Height: | Size: 332 KiB |
|
Before Width: | Height: | Size: 334 KiB |
|
Before Width: | Height: | Size: 288 KiB |
|
Before Width: | Height: | Size: 282 KiB |
|
Before Width: | Height: | Size: 292 KiB |
|
Before Width: | Height: | Size: 363 KiB |
|
Before Width: | Height: | Size: 252 KiB |
|
Before Width: | Height: | Size: 273 KiB |
@@ -30,6 +30,24 @@ import re
|
||||
import sys
|
||||
import zlib
|
||||
from pathlib import Path
|
||||
|
||||
if not hasattr(argparse, "BooleanOptionalAction"):
|
||||
class _BooleanOptionalAction(argparse.Action):
|
||||
def __init__(self, option_strings, dest, default=None, type=None,
|
||||
choices=None, required=False, help=None, metavar=None):
|
||||
_option_strings = []
|
||||
for opt in option_strings:
|
||||
_option_strings.append(opt)
|
||||
if opt.startswith("--"):
|
||||
_option_strings.append("--no-" + opt[2:])
|
||||
super().__init__(option_strings=_option_strings, dest=dest, nargs=0,
|
||||
default=default, type=type, choices=choices,
|
||||
required=required, help=help, metavar=metavar)
|
||||
|
||||
def __call__(self, parser, namespace, values, option_string=None):
|
||||
setattr(namespace, self.dest, not option_string.startswith("--no-"))
|
||||
|
||||
argparse.BooleanOptionalAction = _BooleanOptionalAction
|
||||
from typing import Any, Dict, List, Optional, Tuple
|
||||
|
||||
import numpy as np
|
||||
|
||||