diff --git a/.gitignore b/.gitignore index c9bf6cf..c280524 100644 --- a/.gitignore +++ b/.gitignore @@ -185,3 +185,5 @@ cython_debug/ *.png /logs/*.log runtime/ + +/.venv-*/* \ No newline at end of file diff --git a/README.md b/README.md index f6fb415..61f3937 100644 --- a/README.md +++ b/README.md @@ -158,6 +158,7 @@ sudo systemctl status dronedetector-sdr-4500.service sudo systemctl status dronedetector-sdr-5200.service sudo systemctl status dronedetector-sdr-5800.service sudo systemctl status dronedetector-sdr-915.service +sudo systemctl status dronedetector-sdr-1500.service sudo systemctl status dronedetector-sdr-1200.service sudo systemctl status dronedetector-sdr-2400.service ``` @@ -207,4 +208,6 @@ docker compose -f deploy/docker/docker-compose.yml logs --timestamps dronedetect ### Прошивка хаков ``` bash sudo hackrf_spiflash -w hackrf_one_usb.bin -``` \ No newline at end of file +``` + +./.venv-sdr/bin/python scripts_nn/data_saver_headless.py --serial 000 --freq 4500000000 --save-dir /home/sibscience-4/Dataset/3300 --file-tag DJI_3_ --samp-rate 20000000 --split-size 400000 --delay 0.1 --rf-gain 12 --if-gain 30 --bb-gain 36 \ No newline at end of file diff --git a/capture_hourly.sh b/capture_hourly.sh new file mode 100755 index 0000000..975748b --- /dev/null +++ b/capture_hourly.sh @@ -0,0 +1,226 @@ +#!/usr/bin/env bash +set -Eeuo pipefail + +############################ +# НАСТРОЙКИ +############################ + +# ЗАМЕНИ на реальную точку монтирования nvme1n1 +BASE_DIR="/mnt/nvme1/dataset" + +# Путь к python из venv +PYTHON_BIN="${PYTHON_BIN:-$PWD/.venv-sdr/bin/python}" + +# Путь к headless скрипту +SCRIPT_PATH="${SCRIPT_PATH:-$PWD/scripts_nn/data_saver_headless.py}" + +# Проверка, что каталог реально на nvme1n1 +EXPECTED_DEVICE_PREFIX="/dev/nvme1n1" + +# Лимиты +PER_FREQ_LIMIT_BYTES=$((3 * 1024 * 1024 * 1024)) # 3 GiB на частоту за запуск +TOTAL_LIMIT_BYTES=$((128 * 1024 * 1024 * 1024)) # общий лимит 512 GiB +CYCLE_SECONDS=36 # один цикл в час + +# Параметры SDR +SAMP_RATE="20e6" +SPLIT_SIZE="400000" +DELAY="0.1" +RF_GAIN="12" +IF_GAIN="30" +BB_GAIN="36" + +############################ +# ЧАСТОТЫ И SERIAL ИЗ ENV +############################ + +ORDER=(433 750 915 1200 2400 3300 4500 5200 5800) + +declare -A SERIAL +declare -A FREQ_HZ + +SERIAL[433]="0000000000000000114864dc382a8e1b" +FREQ_HZ[433]="433000000" + +SERIAL[750]="0000000000000000114864dc383d0d1b" +FREQ_HZ[750]="750000000" + +SERIAL[868]="000000000000000026a468dc36066b63" +FREQ_HZ[868]="868000000" + +SERIAL[915]="000000000000000026a468dc36066b63" +FREQ_HZ[915]="915000000" + +SERIAL[1200]="0000000000000000518864dc32660d83" +FREQ_HZ[1200]="1200000000" + +SERIAL[2400]="0000000000000000919068dc3437b31f" +FREQ_HZ[2400]="2400000000" + +SERIAL[3300]="0000000000000000114864dc325069a3" +FREQ_HZ[3300]="3300000000" + +SERIAL[4500]="0000000000000000518864dc33833183" +FREQ_HZ[4500]="4500000000" + +SERIAL[5200]="0000000000000000874461dc241c7857" +FREQ_HZ[5200]="5200000000" + +SERIAL[5800]="0000000000000000919068dc35781c1f" +FREQ_HZ[5800]="5800000000" + +############################ +# ВСПОМОГАТЕЛЬНОЕ +############################ + +log() { + printf '[%s] %s\n' "$(date '+%F %T')" "$*" +} + +dir_size_bytes() { + local path="$1" + if [[ -e "$path" ]]; then + du -sb "$path" 2>/dev/null | awk '{print $1}' + else + echo 0 + fi +} + +total_size_bytes() { + dir_size_bytes "$BASE_DIR" +} + +ensure_requirements() { + if [[ ! -x "$PYTHON_BIN" ]]; then + echo "Не найден python: $PYTHON_BIN" >&2 + exit 1 + fi + + if [[ ! -f "$SCRIPT_PATH" ]]; then + echo "Не найден script: $SCRIPT_PATH" >&2 + exit 1 + fi + + mkdir -p "$BASE_DIR" + + local dev + dev="$(df -P "$BASE_DIR" | awk 'NR==2 {print $1}')" + + if [[ "$dev" != ${EXPECTED_DEVICE_PREFIX}* ]]; then + echo "BASE_DIR=$BASE_DIR сейчас находится на $dev, а ожидался ${EXPECTED_DEVICE_PREFIX}*" >&2 + echo "Исправь BASE_DIR на точку монтирования nvme1n1" >&2 + exit 1 + fi +} + +run_one_freq() { + local band="$1" + local serial="${SERIAL[$band]}" + local freq="${FREQ_HZ[$band]}" + + local ts out_dir log_file + ts="$(date '+%F_%H-%M-%S')" + out_dir="$BASE_DIR/$band/$ts" + log_file="$out_dir/run.log" + + mkdir -p "$out_dir" + + log "Старт band=$band serial=$serial freq=$freq dir=$out_dir" + + "$PYTHON_BIN" "$SCRIPT_PATH" \ + --serial "$serial" \ + --freq "$freq" \ + --save-dir "$out_dir" \ + --file-tag "${band}_" \ + --samp-rate "$SAMP_RATE" \ + --split-size "$SPLIT_SIZE" \ + --delay "$DELAY" \ + --rf-gain "$RF_GAIN" \ + --if-gain "$IF_GAIN" \ + --bb-gain "$BB_GAIN" \ + >"$log_file" 2>&1 & + + local pid=$! + log "PID=$pid" + + while kill -0 "$pid" 2>/dev/null; do + local cur_dir_size cur_total_size + cur_dir_size="$(dir_size_bytes "$out_dir")" + cur_total_size="$(total_size_bytes)" + + if (( cur_total_size >= TOTAL_LIMIT_BYTES )); then + log "Достигнут общий лимит 512 GiB. Останавливаю PID=$pid" + kill -TERM "$pid" 2>/dev/null || true + wait "$pid" 2>/dev/null || true + return 2 + fi + + if (( cur_dir_size >= PER_FREQ_LIMIT_BYTES )); then + log "Для band=$band достигнут лимит 3 GiB. Останавливаю PID=$pid" + kill -TERM "$pid" 2>/dev/null || true + + for _ in {1..10}; do + if ! kill -0 "$pid" 2>/dev/null; then + break + fi + sleep 1 + done + + if kill -0 "$pid" 2>/dev/null; then + log "PID=$pid не завершился по TERM, отправляю KILL" + kill -KILL "$pid" 2>/dev/null || true + fi + + wait "$pid" 2>/dev/null || true + break + fi + + sleep 1 + done + + log "Завершен band=$band, размер=$(du -sh "$out_dir" | awk '{print $1}')" + return 0 +} + +main_loop() { + while true; do + local total_before cycle_start elapsed sleep_left + total_before="$(total_size_bytes)" + + if (( total_before >= TOTAL_LIMIT_BYTES )); then + log "Общий размер уже >= 512 GiB, выхожу" + break + fi + + cycle_start="$(date +%s)" + log "Новый цикл" + + for band in "${ORDER[@]}"; do + if (( $(total_size_bytes) >= TOTAL_LIMIT_BYTES )); then + log "Общий лимит достигнут внутри цикла, выхожу" + return 0 + fi + + run_one_freq "$band" || { + rc=$? + if [[ $rc -eq 2 ]]; then + log "Остановка по общему лимиту" + return 0 + fi + } + done + + elapsed=$(( $(date +%s) - cycle_start )) + sleep_left=$(( CYCLE_SECONDS - elapsed )) + + if (( sleep_left > 0 )); then + log "Цикл занял ${elapsed} сек, жду ${sleep_left} сек до следующего часа" + sleep "$sleep_left" + else + log "Цикл занял ${elapsed} сек, паузы нет" + fi + done +} + +ensure_requirements +main_loop \ No newline at end of file diff --git a/install_all_train.sh b/install_all_train.sh new file mode 100755 index 0000000..75b883c --- /dev/null +++ b/install_all_train.sh @@ -0,0 +1,122 @@ +#!/usr/bin/env bash +set -Eeuo pipefail + +PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +VENV_PATH="${PROJECT_ROOT}/.venv-train" +PYTHON_BIN="${PYTHON_BIN:-python3}" +KERNEL_NAME="${KERNEL_NAME:-dronedetector-train}" +KERNEL_DISPLAY="${KERNEL_DISPLAY:-DroneDetector Train}" + +log() { + printf '[install_all_train] %s\n' "$*" +} + +die() { + printf '[install_all_train] ERROR: %s\n' "$*" >&2 + exit 1 +} + +run_as_root() { + if [[ "${EUID}" -eq 0 ]]; then + "$@" + elif command -v sudo >/dev/null 2>&1; then + sudo "$@" + else + die "Root privileges are required to install host packages." + fi +} + +preflight() { + [[ -f "${PROJECT_ROOT}/deploy/requirements/nn_gpu_pinned.txt" ]] || die "Missing deploy/requirements/nn_gpu_pinned.txt" + [[ -f "${PROJECT_ROOT}/train_scripts/requirements-train.txt" ]] || die "Missing train_scripts/requirements-train.txt" + [[ -f "${PROJECT_ROOT}/torchsig/pyproject.toml" ]] || die "Missing local torchsig package" + command -v "${PYTHON_BIN}" >/dev/null 2>&1 || die "${PYTHON_BIN} not found" +} + +install_host_deps() { + if ! command -v apt-get >/dev/null 2>&1; then + log "apt-get not found; skipping host package installation" + return + fi + + log "Installing host packages" + run_as_root apt-get update + run_as_root env DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + python3 \ + python3-pip \ + python3-venv \ + python3-dev \ + build-essential \ + pkg-config \ + libgl1 \ + libglib2.0-0 \ + libsm6 \ + libxext6 \ + libxrender-dev +} + +setup_venv() { + log "Creating/updating ${VENV_PATH}" + if [[ ! -d "${VENV_PATH}" ]]; then + "${PYTHON_BIN}" -m venv "${VENV_PATH}" + fi + + # shellcheck disable=SC1090 + source "${VENV_PATH}/bin/activate" + python -m pip install --upgrade pip setuptools wheel +} + +install_python_deps() { + log "Installing CUDA-enabled torch stack" + python -m pip install -r "${PROJECT_ROOT}/deploy/requirements/nn_gpu_pinned.txt" + + log "Installing train notebook dependencies" + python -m pip install -r "${PROJECT_ROOT}/train_scripts/requirements-train.txt" + + log "Installing local torchsig from repo" + python -m pip install -e "${PROJECT_ROOT}/torchsig" --no-deps + + log "Registering Jupyter kernel ${KERNEL_NAME}" + python -m ipykernel install --user --name "${KERNEL_NAME}" --display-name "${KERNEL_DISPLAY}" +} + +verify_install() { + log "Verifying imports" + python - <<'PY' +import cv2 +import ipykernel +import matplotlib +import mlconfig +import numpy +import pandas +import scipy +import sklearn +import torch +import torchvision +import torchsig + +print('python_ok', True) +print('torch', torch.__version__) +print('torchvision', torchvision.__version__) +print('cuda_available', torch.cuda.is_available()) +print('torch_cuda', torch.version.cuda) +print('torchsig', getattr(torchsig, '__version__', 'unknown')) +PY +} + +main() { + preflight + + if [[ "${1:-}" != "--skip-apt" ]]; then + install_host_deps + else + log "Skipping host package installation (--skip-apt)" + fi + + setup_venv + install_python_deps + verify_install + log "SUCCESS: .venv-train is ready" +} + +main "$@" diff --git a/restart_all.sh b/restart_all.sh index 49a9da3..bbb517a 100755 --- a/restart_all.sh +++ b/restart_all.sh @@ -7,8 +7,8 @@ COMPOSE_FILE="${PROJECT_ROOT}/deploy/docker/docker-compose.yml" SDR_UNITS=( dronedetector-sdr-433.service dronedetector-sdr-750.service - dronedetector-sdr-868-915.service - dronedetector-sdr-868.service + #dronedetector-sdr-868-915.service + #dronedetector-sdr-868.service dronedetector-sdr-1500.service dronedetector-sdr-3300.service dronedetector-sdr-4500.service diff --git a/scripts_nn/data_saver.py b/scripts_nn/data_saver.py new file mode 100755 index 0000000..666836f --- /dev/null +++ b/scripts_nn/data_saver.py @@ -0,0 +1,241 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# +# SPDX-License-Identifier: GPL-3.0 +# +# GNU Radio Python Flow Graph +# Title: data_saver +# GNU Radio version: 3.10.12.0 + +from PyQt5 import Qt +from gnuradio import qtgui +import data_saver_epy_block_0 as epy_block_0 # embedded python block +import osmosdr +import time +import sip +import threading +from gnuradio import gr +from gnuradio.filter import firdes +from gnuradio.fft import window +import sys +import signal +from argparse import ArgumentParser +from gnuradio.eng_arg import eng_float, intx +from gnuradio import eng_notation + + + + +class data_saver(gr.top_block, Qt.QWidget): + + def __init__(self): + gr.top_block.__init__(self, "data_saver", catch_exceptions=True) + Qt.QWidget.__init__(self) + self.setWindowTitle("data_saver") + qtgui.util.check_set_qss() + try: + self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc')) + except BaseException as exc: + print(f"Qt GUI: Could not set Icon: {str(exc)}", file=sys.stderr) + self.top_scroll_layout = Qt.QVBoxLayout() + self.setLayout(self.top_scroll_layout) + self.top_scroll = Qt.QScrollArea() + self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame) + self.top_scroll_layout.addWidget(self.top_scroll) + self.top_scroll.setWidgetResizable(True) + self.top_widget = Qt.QWidget() + self.top_scroll.setWidget(self.top_widget) + self.top_layout = Qt.QVBoxLayout(self.top_widget) + self.top_grid_layout = Qt.QGridLayout() + self.top_layout.addLayout(self.top_grid_layout) + + self.settings = Qt.QSettings("gnuradio/flowgraphs", "data_saver") + + try: + geometry = self.settings.value("geometry") + if geometry: + self.restoreGeometry(geometry) + except BaseException as exc: + print(f"Qt GUI: Could not restore geometry: {str(exc)}", file=sys.stderr) + self.flowgraph_started = threading.Event() + + ################################################## + # Variables + ################################################## + self.samp_rate = samp_rate = 20e6 + self.freq = freq = 1.160e9 + + ################################################## + # Blocks + ################################################## + + self.qtgui_waterfall_sink_x_0 = qtgui.waterfall_sink_c( + 32768, #size + window.WIN_HAMMING, #wintype + freq, #fc + samp_rate, #bw + "", #name + 1, #number of inputs + None # parent + ) + self.qtgui_waterfall_sink_x_0.set_update_time(0.10) + self.qtgui_waterfall_sink_x_0.enable_grid(False) + self.qtgui_waterfall_sink_x_0.enable_axis_labels(True) + + + + labels = ['', '', '', '', '', + '', '', '', '', ''] + colors = [0, 0, 0, 0, 0, + 0, 0, 0, 0, 0] + alphas = [1.0, 1.0, 1.0, 1.0, 1.0, + 1.0, 1.0, 1.0, 1.0, 1.0] + + for i in range(1): + if len(labels[i]) == 0: + self.qtgui_waterfall_sink_x_0.set_line_label(i, "Data {0}".format(i)) + else: + self.qtgui_waterfall_sink_x_0.set_line_label(i, labels[i]) + self.qtgui_waterfall_sink_x_0.set_color_map(i, colors[i]) + self.qtgui_waterfall_sink_x_0.set_line_alpha(i, alphas[i]) + + self.qtgui_waterfall_sink_x_0.set_intensity_range(-140, 10) + + self._qtgui_waterfall_sink_x_0_win = sip.wrapinstance(self.qtgui_waterfall_sink_x_0.qwidget(), Qt.QWidget) + + self.top_layout.addWidget(self._qtgui_waterfall_sink_x_0_win) + self.qtgui_time_sink_x_0_1 = qtgui.time_sink_c( + 1000000, #size + samp_rate, #samp_rate + "", #name + 1, #number of inputs + None # parent + ) + self.qtgui_time_sink_x_0_1.set_update_time(0.01) + self.qtgui_time_sink_x_0_1.set_y_axis(-2, 2) + + self.qtgui_time_sink_x_0_1.set_y_label('Amplitude', "") + + self.qtgui_time_sink_x_0_1.enable_tags(True) + self.qtgui_time_sink_x_0_1.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, 0, "") + self.qtgui_time_sink_x_0_1.enable_autoscale(False) + self.qtgui_time_sink_x_0_1.enable_grid(False) + self.qtgui_time_sink_x_0_1.enable_axis_labels(True) + self.qtgui_time_sink_x_0_1.enable_control_panel(False) + self.qtgui_time_sink_x_0_1.enable_stem_plot(False) + + + labels = ['', '', '', '', '', + '', '', '', '', ''] + widths = [1, 1, 1, 1, 1, + 1, 1, 1, 1, 1] + colors = ['blue', 'red', 'green', 'black', 'cyan', + 'magenta', 'yellow', 'dark red', 'dark green', 'dark blue'] + alphas = [1.0, 1.0, 1.0, 1.0, 1.0, + 1.0, 1.0, 1.0, 1.0, 1.0] + styles = [1, 1, 1, 1, 1, + 1, 1, 1, 1, 1] + markers = [-1, -1, -1, -1, -1, + -1, -1, -1, -1, -1] + + + for i in range(2): + if len(labels[i]) == 0: + if (i % 2 == 0): + self.qtgui_time_sink_x_0_1.set_line_label(i, "Re{{Data {0}}}".format(i/2)) + else: + self.qtgui_time_sink_x_0_1.set_line_label(i, "Im{{Data {0}}}".format(i/2)) + else: + self.qtgui_time_sink_x_0_1.set_line_label(i, labels[i]) + self.qtgui_time_sink_x_0_1.set_line_width(i, widths[i]) + self.qtgui_time_sink_x_0_1.set_line_color(i, colors[i]) + self.qtgui_time_sink_x_0_1.set_line_style(i, styles[i]) + self.qtgui_time_sink_x_0_1.set_line_marker(i, markers[i]) + self.qtgui_time_sink_x_0_1.set_line_alpha(i, alphas[i]) + + self._qtgui_time_sink_x_0_1_win = sip.wrapinstance(self.qtgui_time_sink_x_0_1.qwidget(), Qt.QWidget) + self.top_layout.addWidget(self._qtgui_time_sink_x_0_1_win) + self.hack_serial=input() + self.osmosdr_source_1 = osmosdr.source( + args="numchan=" + str(1) + " " + 'hackrf='+self.hack_serial + ) + self.osmosdr_source_1.set_time_unknown_pps(osmosdr.time_spec_t()) + self.osmosdr_source_1.set_sample_rate(samp_rate) + self.osmosdr_source_1.set_center_freq(freq, 0) + self.osmosdr_source_1.set_freq_corr(0, 0) + self.osmosdr_source_1.set_dc_offset_mode(0, 0) + self.osmosdr_source_1.set_iq_balance_mode(0, 0) + self.osmosdr_source_1.set_gain_mode(False, 0) + self.osmosdr_source_1.set_gain(12, 0) + self.osmosdr_source_1.set_if_gain(30, 0) + self.osmosdr_source_1.set_bb_gain(36, 0) + self.osmosdr_source_1.set_antenna('', 0) + self.osmosdr_source_1.set_bandwidth(0, 0) + self.epy_block_0 = epy_block_0.Simsi_Sink(SaveDir='home/sibscience-4/Dataset/1160', FileTag='DJI_3', SplitSize=400000, Delay=0.1) + + + ################################################## + # Connections + ################################################## + self.connect((self.osmosdr_source_1, 0), (self.epy_block_0, 0)) + self.connect((self.osmosdr_source_1, 0), (self.qtgui_time_sink_x_0_1, 0)) + self.connect((self.osmosdr_source_1, 0), (self.qtgui_waterfall_sink_x_0, 0)) + + + def closeEvent(self, event): + self.settings = Qt.QSettings("gnuradio/flowgraphs", "data_saver") + self.settings.setValue("geometry", self.saveGeometry()) + self.stop() + self.wait() + + event.accept() + + def get_samp_rate(self): + return self.samp_rate + + def set_samp_rate(self, samp_rate): + self.samp_rate = samp_rate + self.osmosdr_source_1.set_sample_rate(self.samp_rate) + self.qtgui_time_sink_x_0_1.set_samp_rate(self.samp_rate) + self.qtgui_waterfall_sink_x_0.set_frequency_range(self.freq, self.samp_rate) + + def get_freq(self): + return self.freq + + def set_freq(self, freq): + self.freq = freq + self.osmosdr_source_1.set_center_freq(self.freq, 0) + self.qtgui_waterfall_sink_x_0.set_frequency_range(self.freq, self.samp_rate) + + + + +def main(top_block_cls=data_saver, options=None): + + qapp = Qt.QApplication(sys.argv) + + tb = top_block_cls() + + tb.start() + tb.flowgraph_started.set() + + tb.show() + + def sig_handler(sig=None, frame=None): + tb.stop() + tb.wait() + + Qt.QApplication.quit() + + signal.signal(signal.SIGINT, sig_handler) + signal.signal(signal.SIGTERM, sig_handler) + + timer = Qt.QTimer() + timer.start(500) + timer.timeout.connect(lambda: None) + + qapp.exec_() + +if __name__ == '__main__': + main() diff --git a/scripts_nn/data_saver_epy_block_0.py b/scripts_nn/data_saver_epy_block_0.py new file mode 100644 index 0000000..264c8c9 --- /dev/null +++ b/scripts_nn/data_saver_epy_block_0.py @@ -0,0 +1,76 @@ +""" +Embedded Python Blocks: + +Each time this file is saved, GRC will instantiate the first class it finds +to get ports and parameters of your block. The arguments to __init__ will +be the parameters. All of them are required to have default values! +""" + +import numpy as np +from gnuradio import gr +import os +import time +import matplotlib.pyplot as plt +import sys +import gc + +class Simsi_Sink(gr.sync_block): # other base classes are basic_block, decim_block, interp_block + """Embedded Python Block example - a simple multiply const""" + + def __init__(self, SaveDir="./signal", FileTag="fragment_", SplitSize=1000000, Delay=2): # only default arguments here + """arguments to this function show up as parameters in GRC""" + gr.sync_block.__init__( + self, + name='Simsi_Sink', # will show up in GRC + in_sig=[np.complex64], + out_sig=None#[np.complex64] + ) + self.Delay = Delay + self.FileTag = FileTag + self.SplitSize = SplitSize + + self.SaveDir = SaveDir + if not os.path.exists(self.SaveDir) and self.SaveDir == "./signal": + os.mkdir("signal") + + self.it = 0 + self.Signal = np.array([], dtype=np.float32) + self.data_dir = SaveDir + + self.last_file_path = self.data_dir + "/" + self.FileTag + str(self.it) + self.last_fd = open(self.last_file_path, "wb") + self.last_file_len = 0 + + + self.reading_in_progress_file_path = self.data_dir + "/reading_in_progress" + self.reading_in_progress_file_fd = open(self.reading_in_progress_file_path, "wb") + + print(self.Signal) + print(self.data_dir) + # if an attribute with the same name as a parameter is found, + # a callback is registered (properties work, too). + + def work(self, input_items, output_items): + """example: multiply with constant""" + length = len(input_items[0]) + self.last_file_len += length + + if self.last_file_len > self.SplitSize: + print("Saving file: " + str(self.last_file_path)) + length = length - (self.last_file_len - self.SplitSize) + self.last_fd.write(input_items[0][0:length].copy()) + self.it += 1 + self.last_file_len = 0 + self.last_file_path = self.data_dir + '/' + self.FileTag + str(self.it) + self.last_fd.close() + self.reading_in_progress_file_fd.close() + os.remove(self.reading_in_progress_file_path) + time.sleep(self.Delay) + self.reading_in_progress_file_fd = open(self.reading_in_progress_file_path, "wb") + self.last_fd = open(self.last_file_path, "wb") + + else: + self.last_fd.write(input_items[0].copy()) + + + return len(input_items[0]) diff --git a/scripts_nn/data_saver_headless.py b/scripts_nn/data_saver_headless.py new file mode 100644 index 0000000..c002959 --- /dev/null +++ b/scripts_nn/data_saver_headless.py @@ -0,0 +1,237 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import os +import sys +import time +import signal +import argparse +import threading + +import numpy as np +from gnuradio import gr +import osmosdr + + +class SimsiSink(gr.sync_block): + def __init__(self, save_dir="./signal", file_tag="fragment_", split_size=1000000, delay=0.0): + gr.sync_block.__init__( + self, + name="Simsi_Sink", + in_sig=[np.complex64], + out_sig=None, + ) + + self.save_dir = str(save_dir) + self.file_tag = str(file_tag) + self.split_size = int(split_size) + self.delay = float(delay) + + os.makedirs(self.save_dir, exist_ok=True) + + self.file_index = 0 + self.current_len = 0 + self.current_fd = None + + self.in_progress_path = os.path.join(self.save_dir, "reading_in_progress") + self.in_progress_fd = None + + self._open_next_file() + + def _touch_in_progress(self): + if self.in_progress_fd is not None: + try: + self.in_progress_fd.close() + except Exception: + pass + self.in_progress_fd = open(self.in_progress_path, "wb") + + def _remove_in_progress(self): + if self.in_progress_fd is not None: + try: + self.in_progress_fd.close() + except Exception: + pass + self.in_progress_fd = None + + if os.path.exists(self.in_progress_path): + try: + os.remove(self.in_progress_path) + except Exception: + pass + + def _current_file_path(self): + return os.path.join(self.save_dir, f"{self.file_tag}{self.file_index}") + + def _open_next_file(self): + self._touch_in_progress() + path = self._current_file_path() + self.current_fd = open(path, "wb") + self.current_len = 0 + print(f"Opened file: {path}", flush=True) + + def _rotate_file(self): + path = self._current_file_path() + print(f"Saving file: {path}", flush=True) + + if self.current_fd is not None: + self.current_fd.close() + self.current_fd = None + + self._remove_in_progress() + + if self.delay > 0: + time.sleep(self.delay) + + self.file_index += 1 + self._open_next_file() + + def work(self, input_items, output_items): + data = input_items[0] + offset = 0 + total = len(data) + + while offset < total: + remaining = self.split_size - self.current_len + chunk = min(remaining, total - offset) + + self.current_fd.write(data[offset:offset + chunk].copy()) + self.current_len += chunk + offset += chunk + + if self.current_len >= self.split_size: + self._rotate_file() + + return len(data) + + def stop(self): + try: + if self.current_fd is not None: + self.current_fd.close() + self.current_fd = None + finally: + self._remove_in_progress() + return True + + +class DataSaver(gr.top_block): + def __init__( + self, + serial: str, + freq: float, + save_dir: str, + file_tag: str, + samp_rate: float, + split_size: int, + delay: float, + rf_gain: float, + if_gain: float, + bb_gain: float, + ): + super().__init__("data_saver_headless", catch_exceptions=True) + + self.serial = serial + self.freq = float(freq) + self.save_dir = save_dir + self.file_tag = file_tag + self.samp_rate = float(samp_rate) + self.split_size = int(split_size) + self.delay = float(delay) + self.rf_gain = float(rf_gain) + self.if_gain = float(if_gain) + self.bb_gain = float(bb_gain) + + dev_args = f"numchan=1 hackrf={self.serial}" + + self.source = osmosdr.source(args=dev_args) + self.source.set_time_unknown_pps(osmosdr.time_spec_t()) + self.source.set_sample_rate(self.samp_rate) + self.source.set_center_freq(self.freq, 0) + self.source.set_freq_corr(0, 0) + self.source.set_dc_offset_mode(0, 0) + self.source.set_iq_balance_mode(0, 0) + self.source.set_gain_mode(False, 0) + self.source.set_gain(self.rf_gain, 0) + self.source.set_if_gain(self.if_gain, 0) + self.source.set_bb_gain(self.bb_gain, 0) + self.source.set_antenna("", 0) + self.source.set_bandwidth(0, 0) + + self.sink = SimsiSink( + save_dir=self.save_dir, + file_tag=self.file_tag, + split_size=self.split_size, + delay=self.delay, + ) + + self.connect((self.source, 0), (self.sink, 0)) + + +def parse_args(): + parser = argparse.ArgumentParser(description="Headless GNU Radio IQ saver for HackRF") + + parser.add_argument("--serial", required=True, help="HackRF serial number") + parser.add_argument("--freq", type=float, required=True, help="Center frequency in Hz") + parser.add_argument("--save-dir", required=True, help="Directory for output IQ files") + parser.add_argument("--file-tag", default="fragment_", help="Prefix for output files") + + parser.add_argument("--samp-rate", type=float, default=20e6, help="Sample rate in S/s") + parser.add_argument("--split-size", type=int, default=400000, help="Max complex samples per file") + parser.add_argument("--delay", type=float, default=0.1, help="Delay between files in seconds") + + parser.add_argument("--rf-gain", type=float, default=12, help="HackRF RF gain") + parser.add_argument("--if-gain", type=float, default=30, help="HackRF IF gain") + parser.add_argument("--bb-gain", type=float, default=36, help="HackRF BB gain") + + return parser.parse_args() + + +def main(): + args = parse_args() + + tb = DataSaver( + serial=args.serial, + freq=args.freq, + save_dir=args.save_dir, + file_tag=args.file_tag, + samp_rate=args.samp_rate, + split_size=args.split_size, + delay=args.delay, + rf_gain=args.rf_gain, + if_gain=args.if_gain, + bb_gain=args.bb_gain, + ) + + stop_event = threading.Event() + + def handle_signal(sig, frame): + print(f"Received signal {sig}, stopping...", flush=True) + stop_event.set() + tb.stop() + tb.wait() + + signal.signal(signal.SIGINT, handle_signal) + signal.signal(signal.SIGTERM, handle_signal) + + print("Starting flowgraph...", flush=True) + print(f" serial: {args.serial}", flush=True) + print(f" freq: {args.freq}", flush=True) + print(f" save_dir: {args.save_dir}", flush=True) + print(f" file_tag: {args.file_tag}", flush=True) + print(f" samp_rate: {args.samp_rate}", flush=True) + print(f" split_size: {args.split_size}", flush=True) + print(f" gains: rf={args.rf_gain} if={args.if_gain} bb={args.bb_gain}", flush=True) + + tb.start() + + try: + while not stop_event.is_set(): + time.sleep(0.5) + except KeyboardInterrupt: + handle_signal(signal.SIGINT, None) + + print("Stopped.", flush=True) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/scripts_nn/data_saver_new.grc b/scripts_nn/data_saver_new.grc new file mode 100644 index 0000000..f64c61e --- /dev/null +++ b/scripts_nn/data_saver_new.grc @@ -0,0 +1,575 @@ +options: + parameters: + author: '' + catch_exceptions: 'True' + category: '[GRC Hier Blocks]' + cmake_opt: '' + comment: '' + copyright: '' + description: 'Headless IQ saver for HackRF over SSH' + gen_cmake: 'On' + gen_linking: dynamic + generate_options: no_gui + hier_block_src_path: '.:' + id: data_saver + max_nouts: '0' + output_language: python + placement: (0,0) + qt_qss_theme: '' + realtime_scheduling: '' + run: 'True' + run_command: '{python} -u {filename}' + run_options: prompt + sizing_mode: fixed + thread_safe_setters: '' + title: data_saver + window_size: '' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [8, 8] + rotation: 0 + state: enabled + +blocks: +- name: serial + id: parameter + parameters: + category: Parameters + comment: 'HackRF serial' + hide: none + label: serial + short_id: s + type: string + value: '00000000000000000000000000000000' + states: + coordinate: [48, 48] + rotation: 0 + state: enabled + +- name: freq + id: parameter + parameters: + category: Parameters + comment: 'Center frequency in Hz' + hide: none + label: freq + short_id: f + type: real + value: '1.160e9' + states: + coordinate: [48, 96] + rotation: 0 + state: enabled + +- name: save_dir + id: parameter + parameters: + category: Parameters + comment: 'Directory for IQ files' + hide: none + label: save_dir + short_id: o + type: string + value: '/tmp/data_saver' + states: + coordinate: [48, 144] + rotation: 0 + state: enabled + +- name: file_tag + id: parameter + parameters: + category: Parameters + comment: 'File prefix' + hide: none + label: file_tag + short_id: t + type: string + value: 'fragment_' + states: + coordinate: [48, 192] + rotation: 0 + state: enabled + +- name: samp_rate + id: parameter + parameters: + category: Parameters + comment: 'Sample rate in S/s' + hide: none + label: samp_rate + short_id: r + type: real + value: '20e6' + states: + coordinate: [48, 240] + rotation: 0 + state: enabled + +- name: split_size + id: parameter + parameters: + category: Parameters + comment: 'Max complex samples per file' + hide: none + label: split_size + short_id: n + type: intx + value: '400000' + states: + coordinate: [48, 288] + rotation: 0 + state: enabled + +- name: delay + id: parameter + parameters: + category: Parameters + comment: 'Delay between files in seconds' + hide: none + label: delay + short_id: d + type: real + value: '0.1' + states: + coordinate: [48, 336] + rotation: 0 + state: enabled + +- name: rf_gain + id: parameter + parameters: + category: Parameters + comment: 'HackRF RF gain' + hide: none + label: rf_gain + short_id: g + type: real + value: '12' + states: + coordinate: [48, 384] + rotation: 0 + state: enabled + +- name: if_gain + id: parameter + parameters: + category: Parameters + comment: 'HackRF IF gain' + hide: none + label: if_gain + short_id: i + type: real + value: '30' + states: + coordinate: [48, 432] + rotation: 0 + state: enabled + +- name: bb_gain + id: parameter + parameters: + category: Parameters + comment: 'HackRF baseband gain' + hide: none + label: bb_gain + short_id: b + type: real + value: '36' + states: + coordinate: [48, 480] + rotation: 0 + state: enabled + +- name: dev_args + id: variable + parameters: + comment: '' + value: '"hackrf=" + str(serial)' + states: + coordinate: [48, 540] + rotation: 0 + state: enabled + +- name: epy_block_0 + id: epy_block + parameters: + Delay: delay + FileTag: file_tag + SaveDir: save_dir + SplitSize: split_size + _source_code: "\"\"\"\nEmbedded Python Blocks:\n\nHeadless IQ writer with file splitting.\n\"\"\"\n\nimport numpy as np\nfrom gnuradio import gr\nimport os\nimport time\n\n\nclass Simsi_Sink(gr.sync_block):\n def __init__(self, SaveDir=\"./signal\", FileTag=\"fragment_\", SplitSize=1000000, Delay=0.0):\n gr.sync_block.__init__(\n self,\n name='Simsi_Sink',\n in_sig=[np.complex64],\n out_sig=None\n )\n\n self.Delay = float(Delay)\n self.FileTag = str(FileTag)\n self.SplitSize = int(SplitSize)\n self.SaveDir = str(SaveDir)\n\n os.makedirs(self.SaveDir, exist_ok=True)\n\n self.it = 0\n self.last_file_len = 0\n self.last_fd = None\n\n self.reading_in_progress_file_path = os.path.join(self.SaveDir, 'reading_in_progress')\n self.reading_in_progress_file_fd = None\n\n self._open_next_file()\n\n def _touch_in_progress(self):\n if self.reading_in_progress_file_fd is not None:\n try:\n self.reading_in_progress_file_fd.close()\n except Exception:\n pass\n self.reading_in_progress_file_fd = open(self.reading_in_progress_file_path, 'wb')\n\n def _remove_in_progress(self):\n if self.reading_in_progress_file_fd is not None:\n try:\n self.reading_in_progress_file_fd.close()\n except Exception:\n pass\n self.reading_in_progress_file_fd = None\n if os.path.exists(self.reading_in_progress_file_path):\n try:\n os.remove(self.reading_in_progress_file_path)\n except Exception:\n pass\n\n def _open_next_file(self):\n self._touch_in_progress()\n self.last_file_path = os.path.join(self.SaveDir, f\"{self.FileTag}{self.it}\")\n self.last_fd = open(self.last_file_path, 'wb')\n self.last_file_len = 0\n print(f\"Opened file: {self.last_file_path}\", flush=True)\n\n def _rotate_file(self):\n if self.last_fd is not None:\n self.last_fd.close()\n self.last_fd = None\n self._remove_in_progress()\n if self.Delay > 0:\n time.sleep(self.Delay)\n self.it += 1\n self._open_next_file()\n\n def stop(self):\n try:\n if self.last_fd is not None:\n self.last_fd.close()\n self.last_fd = None\n finally:\n self._remove_in_progress()\n return True\n\n def work(self, input_items, output_items):\n data = input_items[0]\n offset = 0\n total = len(data)\n\n while offset < total:\n remaining = self.SplitSize - self.last_file_len\n chunk = min(remaining, total - offset)\n\n self.last_fd.write(data[offset:offset + chunk].copy())\n self.last_file_len += chunk\n offset += chunk\n\n if self.last_file_len >= self.SplitSize:\n print(f\"Saving file: {self.last_file_path}\", flush=True)\n self._rotate_file()\n\n return len(data)\n" + affinity: '' + alias: '' + comment: '' + maxoutbuf: '0' + minoutbuf: '0' + states: + _io_cache: ('Simsi_Sink', 'Simsi_Sink', [('SaveDir', "'./signal'"), ('FileTag', "'fragment_'"), ('SplitSize', '1000000'), ('Delay', '0.0')], [('0', 'complex', 1)], [], 'Headless IQ writer with file splitting.', ['Delay', 'FileTag', 'SaveDir', 'SplitSize']) + coordinate: [688, 208] + rotation: 0 + state: enabled + +- name: osmosdr_source_0 + id: osmosdr_source + parameters: + affinity: '' + alias: '' + ant0: '' + ant1: '' + ant10: '' + ant11: '' + ant12: '' + ant13: '' + ant14: '' + ant15: '' + ant16: '' + ant17: '' + ant18: '' + ant19: '' + ant2: '' + ant20: '' + ant21: '' + ant22: '' + ant23: '' + ant24: '' + ant25: '' + ant26: '' + ant27: '' + ant28: '' + ant29: '' + ant3: '' + ant30: '' + ant31: '' + ant4: '' + ant5: '' + ant6: '' + ant7: '' + ant8: '' + ant9: '' + args: dev_args + bb_gain0: bb_gain + bb_gain1: '20' + bb_gain10: '20' + bb_gain11: '20' + bb_gain12: '20' + bb_gain13: '20' + bb_gain14: '20' + bb_gain15: '20' + bb_gain16: '20' + bb_gain17: '20' + bb_gain18: '20' + bb_gain19: '20' + bb_gain2: '20' + bb_gain20: '20' + bb_gain21: '20' + bb_gain22: '20' + bb_gain23: '20' + bb_gain24: '20' + bb_gain25: '20' + bb_gain26: '20' + bb_gain27: '20' + bb_gain28: '20' + bb_gain29: '20' + bb_gain3: '20' + bb_gain30: '20' + bb_gain31: '20' + bb_gain4: '20' + bb_gain5: '20' + bb_gain6: '20' + bb_gain7: '20' + bb_gain8: '20' + bb_gain9: '20' + bw0: '0' + bw1: '0' + bw10: '0' + bw11: '0' + bw12: '0' + bw13: '0' + bw14: '0' + bw15: '0' + bw16: '0' + bw17: '0' + bw18: '0' + bw19: '0' + bw2: '0' + bw20: '0' + bw21: '0' + bw22: '0' + bw23: '0' + bw24: '0' + bw25: '0' + bw26: '0' + bw27: '0' + bw28: '0' + bw29: '0' + bw3: '0' + bw30: '0' + bw31: '0' + bw4: '0' + bw5: '0' + bw6: '0' + bw7: '0' + bw8: '0' + bw9: '0' + clock_source0: '' + clock_source1: '' + clock_source2: '' + clock_source3: '' + clock_source4: '' + clock_source5: '' + clock_source6: '' + clock_source7: '' + comment: '' + corr0: '0' + corr1: '0' + corr10: '0' + corr11: '0' + corr12: '0' + corr13: '0' + corr14: '0' + corr15: '0' + corr16: '0' + corr17: '0' + corr18: '0' + corr19: '0' + corr2: '0' + corr20: '0' + corr21: '0' + corr22: '0' + corr23: '0' + corr24: '0' + corr25: '0' + corr26: '0' + corr27: '0' + corr28: '0' + corr29: '0' + corr3: '0' + corr30: '0' + corr31: '0' + corr4: '0' + corr5: '0' + corr6: '0' + corr7: '0' + corr8: '0' + corr9: '0' + dc_offset_mode0: '0' + dc_offset_mode1: '0' + dc_offset_mode10: '0' + dc_offset_mode11: '0' + dc_offset_mode12: '0' + dc_offset_mode13: '0' + dc_offset_mode14: '0' + dc_offset_mode15: '0' + dc_offset_mode16: '0' + dc_offset_mode17: '0' + dc_offset_mode18: '0' + dc_offset_mode19: '0' + dc_offset_mode2: '0' + dc_offset_mode20: '0' + dc_offset_mode21: '0' + dc_offset_mode22: '0' + dc_offset_mode23: '0' + dc_offset_mode24: '0' + dc_offset_mode25: '0' + dc_offset_mode26: '0' + dc_offset_mode27: '0' + dc_offset_mode28: '0' + dc_offset_mode29: '0' + dc_offset_mode3: '0' + dc_offset_mode30: '0' + dc_offset_mode31: '0' + dc_offset_mode4: '0' + dc_offset_mode5: '0' + dc_offset_mode6: '0' + dc_offset_mode7: '0' + dc_offset_mode8: '0' + dc_offset_mode9: '0' + freq0: freq + freq1: 100e6 + freq10: 100e6 + freq11: 100e6 + freq12: 100e6 + freq13: 100e6 + freq14: 100e6 + freq15: 100e6 + freq16: 100e6 + freq17: 100e6 + freq18: 100e6 + freq19: 100e6 + freq2: 100e6 + freq20: 100e6 + freq21: 100e6 + freq22: 100e6 + freq23: 100e6 + freq24: 100e6 + freq25: 100e6 + freq26: 100e6 + freq27: 100e6 + freq28: 100e6 + freq29: 100e6 + freq3: 100e6 + freq30: 100e6 + freq31: 100e6 + freq4: 100e6 + freq5: 100e6 + freq6: 100e6 + freq7: 100e6 + freq8: 100e6 + freq9: 100e6 + gain0: rf_gain + gain1: '10' + gain10: '10' + gain11: '10' + gain12: '10' + gain13: '10' + gain14: '10' + gain15: '10' + gain16: '10' + gain17: '10' + gain18: '10' + gain19: '10' + gain2: '10' + gain20: '10' + gain21: '10' + gain22: '10' + gain23: '10' + gain24: '10' + gain25: '10' + gain26: '10' + gain27: '10' + gain28: '10' + gain29: '10' + gain3: '10' + gain30: '10' + gain31: '10' + gain4: '10' + gain5: '10' + gain6: '10' + gain7: '10' + gain8: '10' + gain9: '10' + gain_mode0: 'False' + gain_mode1: 'False' + gain_mode10: 'False' + gain_mode11: 'False' + gain_mode12: 'False' + gain_mode13: 'False' + gain_mode14: 'False' + gain_mode15: 'False' + gain_mode16: 'False' + gain_mode17: 'False' + gain_mode18: 'False' + gain_mode19: 'False' + gain_mode2: 'False' + gain_mode20: 'False' + gain_mode21: 'False' + gain_mode22: 'False' + gain_mode23: 'False' + gain_mode24: 'False' + gain_mode25: 'False' + gain_mode26: 'False' + gain_mode27: 'False' + gain_mode28: 'False' + gain_mode29: 'False' + gain_mode3: 'False' + gain_mode30: 'False' + gain_mode31: 'False' + gain_mode4: 'False' + gain_mode5: 'False' + gain_mode6: 'False' + gain_mode7: 'False' + gain_mode8: 'False' + gain_mode9: 'False' + if_gain0: if_gain + if_gain1: '20' + if_gain10: '20' + if_gain11: '20' + if_gain12: '20' + if_gain13: '20' + if_gain14: '20' + if_gain15: '20' + if_gain16: '20' + if_gain17: '20' + if_gain18: '20' + if_gain19: '20' + if_gain2: '20' + if_gain20: '20' + if_gain21: '20' + if_gain22: '20' + if_gain23: '20' + if_gain24: '20' + if_gain25: '20' + if_gain26: '20' + if_gain27: '20' + if_gain28: '20' + if_gain29: '20' + if_gain3: '20' + if_gain30: '20' + if_gain31: '20' + if_gain4: '20' + if_gain5: '20' + if_gain6: '20' + if_gain7: '20' + if_gain8: '20' + if_gain9: '20' + iq_balance_mode0: '0' + iq_balance_mode1: '0' + iq_balance_mode10: '0' + iq_balance_mode11: '0' + iq_balance_mode12: '0' + iq_balance_mode13: '0' + iq_balance_mode14: '0' + iq_balance_mode15: '0' + iq_balance_mode16: '0' + iq_balance_mode17: '0' + iq_balance_mode18: '0' + iq_balance_mode19: '0' + iq_balance_mode2: '0' + iq_balance_mode20: '0' + iq_balance_mode21: '0' + iq_balance_mode22: '0' + iq_balance_mode23: '0' + iq_balance_mode24: '0' + iq_balance_mode25: '0' + iq_balance_mode26: '0' + iq_balance_mode27: '0' + iq_balance_mode28: '0' + iq_balance_mode29: '0' + iq_balance_mode3: '0' + iq_balance_mode30: '0' + iq_balance_mode31: '0' + iq_balance_mode4: '0' + iq_balance_mode5: '0' + iq_balance_mode6: '0' + iq_balance_mode7: '0' + iq_balance_mode8: '0' + iq_balance_mode9: '0' + maxoutbuf: '0' + minoutbuf: '0' + nchan: '1' + num_mboards: '1' + sample_rate: samp_rate + sync: sync + time_source0: '' + time_source1: '' + time_source2: '' + time_source3: '' + time_source4: '' + time_source5: '' + time_source6: '' + time_source7: '' + type: fc32 + states: + coordinate: [288, 208] + rotation: 0 + state: enabled + +connections: +- [osmosdr_source_0, '0', epy_block_0, '0'] + +metadata: + file_format: 1 + grc_version: 3.10.9.2 \ No newline at end of file diff --git a/scripts_nn/signal/fragment_0 b/scripts_nn/signal/fragment_0 new file mode 100644 index 0000000..e69de29 diff --git a/scripts_nn/signal/reading_in_progress b/scripts_nn/signal/reading_in_progress new file mode 100644 index 0000000..e69de29 diff --git a/signal/fragment_0 b/signal/fragment_0 new file mode 100644 index 0000000..e69de29 diff --git a/signal/reading_in_progress b/signal/reading_in_progress new file mode 100644 index 0000000..e69de29 diff --git a/src/embedded_1200.py b/src/embedded_1200.py new file mode 100644 index 0000000..610cb04 --- /dev/null +++ b/src/embedded_1200.py @@ -0,0 +1,150 @@ +import os +import datetime +import time +from common.runtime import load_root_env, as_bool +from smb.SMBConnection import SMBConnection +from utils.datas_processing import pack_elems, agregator, send_data, send_telemetry, save_data, remote_save_data +from utils.jammer_state_flag import is_jammer_active +from core.sig_n_medi_collect import Signal, SignalsArray +from core.multichannelswitcher import MultiChannel + +load_root_env(__file__) + +debug_flag = as_bool(os.getenv('debug_flag', '0')) +send_to_module_flag = as_bool(os.getenv('send_to_module_flag', '0')) +save_data_flag = as_bool(os.getenv('save_data_flag', '0')) +module_name = os.getenv('module_name') +elems_to_save = os.getenv('elems_to_save') +file_types_to_save = os.getenv('file_types_to_save') +localhost = os.getenv('lochost') +localport = os.getenv('locport') +f_step = [*map(float, os.getenv('f_step_1200').split())] +f_bases = [*map(float, os.getenv('f_bases_1200').split())] +f_roofs = [*map(float, os.getenv('f_roofs_1200').split())] +signal_length = int(os.getenv('signal_length_1200')) +buffer_columns_size = int(os.getenv('buffer_columns_size_1200')) +num_of_thinning_iter = int(os.getenv('num_of_thinning_iter_1200')) +multiply_factor = float(os.getenv('multiply_factor_1200')) +num_for_alarm = int(os.getenv('num_for_alarm_1200')) +c_freq = os.getenv('c_freq_1200', '1200') +path_to_save_medians = os.getenv('path_to_save_medians') +path_to_save_alarms = os.getenv('path_to_save_alarms') +smb_host = os.getenv('smb_host') +smb_port = os.getenv('smb_port') +smb_user = os.getenv('smb_user') +smb_pass = os.getenv('smb_pass') +shared_folder = os.getenv('shared_folder') +the_pc_name = os.getenv('the_pc_name') +remote_pc_name = os.getenv('remote_pc_name') +smb_domain = os.getenv('smb_domain') +freq_endpoint = os.getenv('freq_endpoint') +telemetry_enabled = as_bool(os.getenv('telemetry_enabled', '1')) +telemetry_host = os.getenv('telemetry_host', '127.0.0.1') +telemetry_port = os.getenv('telemetry_port', '5020') +telemetry_endpoint = os.getenv('telemetry_endpoint', 'telemetry') +telemetry_timeout_sec = float(os.getenv('telemetry_timeout_sec', '0.30')) + +elems_to_save = elems_to_save.split(',') +file_types_to_save = file_types_to_save.split(',') + +tmp_signal = Signal() +tmp_sigs_array = SignalsArray() +multi_channel = MultiChannel(f_step, f_bases, f_roofs) +f = multi_channel.init_f() +multi_channel.fill_DB( + buffer_columns_size, + num_of_thinning_iter, + multiply_factor, + num_for_alarm, + c_freq, +) + +if debug_flag: + conn = SMBConnection(smb_user, smb_pass, the_pc_name, remote_pc_name, use_ntlm_v2=True) + conn.connect(smb_host, 139) + filelist = conn.listPath(shared_folder, '/') + print(filelist) + + +def work(lvl): + f = multi_channel.get_cur_channel() + freq = c_freq + median = tmp_signal.fill_signal(lvl, signal_length) + packet_ts = tmp_signal.get_last_packet_ts() + + if median: + try: + num_chs, circle_buffer = multi_channel.check_f(f) + cur_channel, sigs_array, sigs_ts_array = tmp_sigs_array.fill_sig_arr(median, packet_ts=packet_ts, num_chs=num_chs) + + if sigs_array: + print('Значения на {0}: {1}'.format(freq, sigs_array)) + print('Пороги: ', circle_buffer.get_medians()) + alarm = circle_buffer.check_alarm(sigs_array) + + if alarm: + print('----ALARM---- ', freq) + multi_channel.db_alarms_zeros(circle_buffer) + elif not is_jammer_active(): + circle_buffer.update(sigs_array, packet_timestamps=sigs_ts_array) + + if telemetry_enabled: + try: + max_idx = max(range(len(sigs_array)), key=lambda idx: sigs_array[idx]) + dbfs_current = float(sigs_array[max_idx]) + dbfs_threshold = circle_buffer.get_threshold(max_idx) + channel_thresholds = circle_buffer.get_thresholds() + alarm_channels = circle_buffer.get_last_alarm_channels() if alarm else [] + + send_telemetry( + data={ + 'freq': str(freq), + 'ts': time.time(), + 'dbfs_current': dbfs_current, + 'dbfs_threshold': dbfs_threshold, + 'alarm': bool(alarm), + 'channel_idx': int(max_idx), + 'channels_total': int(len(sigs_array)), + 'channel_values': [float(v) for v in sigs_array], + 'channel_thresholds': channel_thresholds, + 'alarm_channels': alarm_channels, + }, + host=telemetry_host, + port=telemetry_port, + endpoint=telemetry_endpoint, + timeout_sec=telemetry_timeout_sec, + ) + except Exception as exc: + if debug_flag: + print(f'telemetry send failed: {exc}') + + if send_to_module_flag: + send_data(agregator(freq, alarm), localhost, localport, freq_endpoint) + + if save_data_flag: + if not circle_buffer.check_init() and circle_buffer.current_column - 1 == 0: + save_data(path_to_save_medians, freq, 'DateTime', 'ALARM', 'max signal', list(range(num_chs)), list(range(num_chs))) + if circle_buffer.check_init(): + save_data(path_to_save_medians, freq, datetime.datetime.now(), alarm, max(sigs_array), sigs_array, circle_buffer.get_medians()) + + if debug_flag: + single_alarm = circle_buffer.check_single_alarm(median, cur_channel) + print(cur_channel, single_alarm) + if single_alarm: + data = pack_elems(elems_to_save, file_types_to_save, tmp_signal.get_signal()) + print('SAVE CURRENT SIGNAL SROCHNO TI MENYA SLISHISH?!?!?!?') + try: + remote_save_data(conn, data, module_name, freq, shared_folder, path_to_save_alarms) + except Exception as e: + print(f'Ошибка: {e}') + else: + print('VSE OKI DOKI SIGNAL SOKHRANYAT NE NUZHNO!!!') + + f = multi_channel.change_channel() + except Exception as e: + print(str(e)) + print('.', end='') + + tmp_signal.clear() + + return f diff --git a/src/embedded_2400.py b/src/embedded_2400.py new file mode 100644 index 0000000..c2ef49f --- /dev/null +++ b/src/embedded_2400.py @@ -0,0 +1,150 @@ +import os +import datetime +import time +from common.runtime import load_root_env, as_bool +from smb.SMBConnection import SMBConnection +from utils.datas_processing import pack_elems, agregator, send_data, send_telemetry, save_data, remote_save_data +from utils.jammer_state_flag import is_jammer_active +from core.sig_n_medi_collect import Signal, SignalsArray +from core.multichannelswitcher import MultiChannel + +load_root_env(__file__) + +debug_flag = as_bool(os.getenv('debug_flag', '0')) +send_to_module_flag = as_bool(os.getenv('send_to_module_flag', '0')) +save_data_flag = as_bool(os.getenv('save_data_flag', '0')) +module_name = os.getenv('module_name') +elems_to_save = os.getenv('elems_to_save') +file_types_to_save = os.getenv('file_types_to_save') +localhost = os.getenv('lochost') +localport = os.getenv('locport') +f_step = [*map(float, os.getenv('f_step_2400').split())] +f_bases = [*map(float, os.getenv('f_bases_2400').split())] +f_roofs = [*map(float, os.getenv('f_roofs_2400').split())] +signal_length = int(os.getenv('signal_length_2400')) +buffer_columns_size = int(os.getenv('buffer_columns_size_2400')) +num_of_thinning_iter = int(os.getenv('num_of_thinning_iter_2400')) +multiply_factor = float(os.getenv('multiply_factor_2400')) +num_for_alarm = int(os.getenv('num_for_alarm_2400')) +c_freq = os.getenv('c_freq_2400', '2400') +path_to_save_medians = os.getenv('path_to_save_medians') +path_to_save_alarms = os.getenv('path_to_save_alarms') +smb_host = os.getenv('smb_host') +smb_port = os.getenv('smb_port') +smb_user = os.getenv('smb_user') +smb_pass = os.getenv('smb_pass') +shared_folder = os.getenv('shared_folder') +the_pc_name = os.getenv('the_pc_name') +remote_pc_name = os.getenv('remote_pc_name') +smb_domain = os.getenv('smb_domain') +freq_endpoint = os.getenv('freq_endpoint') +telemetry_enabled = as_bool(os.getenv('telemetry_enabled', '1')) +telemetry_host = os.getenv('telemetry_host', '127.0.0.1') +telemetry_port = os.getenv('telemetry_port', '5020') +telemetry_endpoint = os.getenv('telemetry_endpoint', 'telemetry') +telemetry_timeout_sec = float(os.getenv('telemetry_timeout_sec', '0.30')) + +elems_to_save = elems_to_save.split(',') +file_types_to_save = file_types_to_save.split(',') + +tmp_signal = Signal() +tmp_sigs_array = SignalsArray() +multi_channel = MultiChannel(f_step, f_bases, f_roofs) +f = multi_channel.init_f() +multi_channel.fill_DB( + buffer_columns_size, + num_of_thinning_iter, + multiply_factor, + num_for_alarm, + c_freq, +) + +if debug_flag: + conn = SMBConnection(smb_user, smb_pass, the_pc_name, remote_pc_name, use_ntlm_v2=True) + conn.connect(smb_host, 139) + filelist = conn.listPath(shared_folder, '/') + print(filelist) + + +def work(lvl): + f = multi_channel.get_cur_channel() + freq = c_freq + median = tmp_signal.fill_signal(lvl, signal_length) + packet_ts = tmp_signal.get_last_packet_ts() + + if median: + try: + num_chs, circle_buffer = multi_channel.check_f(f) + cur_channel, sigs_array, sigs_ts_array = tmp_sigs_array.fill_sig_arr(median, packet_ts=packet_ts, num_chs=num_chs) + + if sigs_array: + print('Значения на {0}: {1}'.format(freq, sigs_array)) + print('Пороги: ', circle_buffer.get_medians()) + alarm = circle_buffer.check_alarm(sigs_array) + + if alarm: + print('----ALARM---- ', freq) + multi_channel.db_alarms_zeros(circle_buffer) + elif not is_jammer_active(): + circle_buffer.update(sigs_array, packet_timestamps=sigs_ts_array) + + if telemetry_enabled: + try: + max_idx = max(range(len(sigs_array)), key=lambda idx: sigs_array[idx]) + dbfs_current = float(sigs_array[max_idx]) + dbfs_threshold = circle_buffer.get_threshold(max_idx) + channel_thresholds = circle_buffer.get_thresholds() + alarm_channels = circle_buffer.get_last_alarm_channels() if alarm else [] + + send_telemetry( + data={ + 'freq': str(freq), + 'ts': time.time(), + 'dbfs_current': dbfs_current, + 'dbfs_threshold': dbfs_threshold, + 'alarm': bool(alarm), + 'channel_idx': int(max_idx), + 'channels_total': int(len(sigs_array)), + 'channel_values': [float(v) for v in sigs_array], + 'channel_thresholds': channel_thresholds, + 'alarm_channels': alarm_channels, + }, + host=telemetry_host, + port=telemetry_port, + endpoint=telemetry_endpoint, + timeout_sec=telemetry_timeout_sec, + ) + except Exception as exc: + if debug_flag: + print(f'telemetry send failed: {exc}') + + if send_to_module_flag: + send_data(agregator(freq, alarm), localhost, localport, freq_endpoint) + + if save_data_flag: + if not circle_buffer.check_init() and circle_buffer.current_column - 1 == 0: + save_data(path_to_save_medians, freq, 'DateTime', 'ALARM', 'max signal', list(range(num_chs)), list(range(num_chs))) + if circle_buffer.check_init(): + save_data(path_to_save_medians, freq, datetime.datetime.now(), alarm, max(sigs_array), sigs_array, circle_buffer.get_medians()) + + if debug_flag: + single_alarm = circle_buffer.check_single_alarm(median, cur_channel) + print(cur_channel, single_alarm) + if single_alarm: + data = pack_elems(elems_to_save, file_types_to_save, tmp_signal.get_signal()) + print('SAVE CURRENT SIGNAL SROCHNO TI MENYA SLISHISH?!?!?!?') + try: + remote_save_data(conn, data, module_name, freq, shared_folder, path_to_save_alarms) + except Exception as e: + print(f'Ошибка: {e}') + else: + print('VSE OKI DOKI SIGNAL SOKHRANYAT NE NUZHNO!!!') + + f = multi_channel.change_channel() + except Exception as e: + print(str(e)) + print('.', end='') + + tmp_signal.clear() + + return f diff --git a/src/embedded_915.py b/src/embedded_915.py new file mode 100644 index 0000000..bf6b341 --- /dev/null +++ b/src/embedded_915.py @@ -0,0 +1,153 @@ +import os +import datetime +import time +from common.runtime import load_root_env, as_bool +from smb.SMBConnection import SMBConnection +from utils.datas_processing import pack_elems, agregator, send_data, send_telemetry, save_data, remote_save_data +from utils.jammer_state_flag import is_jammer_active +from core.sig_n_medi_collect import Signal, SignalsArray +from core.multichannelswitcher import MultiChannel +import logging + +logging.basicConfig(level=logging.NOTSET) + +load_root_env(__file__) + +debug_flag = as_bool(os.getenv('debug_flag', '0')) +send_to_module_flag = as_bool(os.getenv('send_to_module_flag', '0')) +save_data_flag = as_bool(os.getenv('save_data_flag', '0')) +module_name = os.getenv('module_name') +elems_to_save = os.getenv('elems_to_save') +file_types_to_save = os.getenv('file_types_to_save') +localhost = os.getenv('lochost') +localport = os.getenv('locport') +f_step = [*map(float, os.getenv('f_step_915').split())] +f_bases = [*map(float, os.getenv('f_bases_915').split())] +f_roofs = [*map(float, os.getenv('f_roofs_915').split())] +signal_length = int(os.getenv('signal_length_915')) +buffer_columns_size = int(os.getenv('buffer_columns_size_915')) +num_of_thinning_iter = int(os.getenv('num_of_thinning_iter_915')) +multiply_factor = float(os.getenv('multiply_factor_915')) +num_for_alarm = int(os.getenv('num_for_alarm_915')) +c_freq = os.getenv('c_freq_915', '915') +path_to_save_medians = os.getenv('path_to_save_medians') +path_to_save_alarms = os.getenv('path_to_save_alarms') +smb_host = os.getenv('smb_host') +smb_port = os.getenv('smb_port') +smb_user = os.getenv('smb_user') +smb_pass = os.getenv('smb_pass') +shared_folder = os.getenv('shared_folder') +the_pc_name = os.getenv('the_pc_name') +remote_pc_name = os.getenv('remote_pc_name') +smb_domain = os.getenv('smb_domain') +freq_endpoint = os.getenv('freq_endpoint') +telemetry_enabled = as_bool(os.getenv('telemetry_enabled', '1')) +telemetry_host = os.getenv('telemetry_host', '127.0.0.1') +telemetry_port = os.getenv('telemetry_port', '5020') +telemetry_endpoint = os.getenv('telemetry_endpoint', 'telemetry') +telemetry_timeout_sec = float(os.getenv('telemetry_timeout_sec', '0.30')) + +elems_to_save = elems_to_save.split(',') +file_types_to_save = file_types_to_save.split(',') + +tmp_signal = Signal() +tmp_sigs_array = SignalsArray() +multi_channel = MultiChannel(f_step, f_bases, f_roofs) +f = multi_channel.init_f() +multi_channel.fill_DB( + buffer_columns_size, + num_of_thinning_iter, + multiply_factor, + num_for_alarm, + c_freq, +) + +if debug_flag: + conn = SMBConnection(smb_user, smb_pass, the_pc_name, remote_pc_name, use_ntlm_v2=True) + conn.connect(smb_host, 139) + filelist = conn.listPath(shared_folder, '/') + print(filelist) + + +def work(lvl): + f = multi_channel.get_cur_channel() + freq = c_freq + median = tmp_signal.fill_signal(lvl, signal_length) + packet_ts = tmp_signal.get_last_packet_ts() + + if median: + try: + num_chs, circle_buffer = multi_channel.check_f(f) + cur_channel, sigs_array, sigs_ts_array = tmp_sigs_array.fill_sig_arr(median, packet_ts=packet_ts, num_chs=num_chs) + + if sigs_array: + print('Значения на {0}: {1}'.format(freq, sigs_array)) + print('Пороги: ', circle_buffer.get_medians()) + alarm = circle_buffer.check_alarm(sigs_array) + + if alarm: + print('----ALARM---- ', freq) + multi_channel.db_alarms_zeros(circle_buffer) + elif not is_jammer_active(): + circle_buffer.update(sigs_array, packet_timestamps=sigs_ts_array) + + if True: + try: + max_idx = max(range(len(sigs_array)), key=lambda idx: sigs_array[idx]) + dbfs_current = float(sigs_array[max_idx]) + dbfs_threshold = circle_buffer.get_threshold(max_idx) + channel_thresholds = circle_buffer.get_thresholds() + alarm_channels = circle_buffer.get_last_alarm_channels() if alarm else [] + + send_telemetry( + data={ + 'freq': str(freq), + 'ts': time.time(), + 'dbfs_current': dbfs_current, + 'dbfs_threshold': dbfs_threshold, + 'alarm': bool(alarm), + 'channel_idx': int(max_idx), + 'channels_total': int(len(sigs_array)), + 'channel_values': [float(v) for v in sigs_array], + 'channel_thresholds': channel_thresholds, + 'alarm_channels': alarm_channels, + }, + host=telemetry_host, + port=telemetry_port, + endpoint=telemetry_endpoint, + timeout_sec=telemetry_timeout_sec, + ) + except Exception as exc: + if debug_flag: + print(f'telemetry send failed: {exc}') + + if send_to_module_flag: + send_data(agregator(freq, alarm), localhost, localport, freq_endpoint) + + if save_data_flag: + if not circle_buffer.check_init() and circle_buffer.current_column - 1 == 0: + save_data(path_to_save_medians, freq, 'DateTime', 'ALARM', 'max signal', list(range(num_chs)), list(range(num_chs))) + if circle_buffer.check_init(): + save_data(path_to_save_medians, freq, datetime.datetime.now(), alarm, max(sigs_array), sigs_array, circle_buffer.get_medians()) + + if debug_flag: + single_alarm = circle_buffer.check_single_alarm(median, cur_channel) + print(cur_channel, single_alarm) + if single_alarm: + data = pack_elems(elems_to_save, file_types_to_save, tmp_signal.get_signal()) + print('SAVE CURRENT SIGNAL SROCHNO TI MENYA SLISHISH?!?!?!?') + try: + remote_save_data(conn, data, module_name, freq, shared_folder, path_to_save_alarms) + except Exception as e: + print(f'Ошибка: {e}') + else: + print('VSE OKI DOKI SIGNAL SOKHRANYAT NE NUZHNO!!!') + + f = multi_channel.change_channel() + except Exception as e: + print(str(e)) + print('.', end='') + + tmp_signal.clear() + + return f diff --git a/src/main_1200.py b/src/main_1200.py new file mode 100644 index 0000000..f665fe2 --- /dev/null +++ b/src/main_1200.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from gnuradio import blocks +from gnuradio import gr +import signal +import sys +import threading +import time + +import osmosdr +import embedded_1200 as my_freq + +from common.runtime import load_root_env, resolve_hackrf_index + + +load_root_env(__file__) + + +def get_hack_id(): + return resolve_hackrf_index('hack_1200', 'src/main_1200.py') + + +class get_center_freq(gr.top_block): + def __init__(self): + gr.top_block.__init__(self, 'get_center_freq') + + self.prob_freq = 0 + self.samp_rate = 20e6 + self.poll_rate = 10000 + self.vector_len = 4096 + self.center_freq = my_freq.work(self.prob_freq) + self._prob_freq_thread = None + + self.probSigVec = blocks.probe_signal_vc(self.vector_len) + self.rtlsdr_source_0 = osmosdr.source( + args='numchan=' + str(1) + ' ' + 'hackrf=' + get_hack_id() + ) + self.rtlsdr_source_0.set_time_unknown_pps(osmosdr.time_spec_t()) + self.rtlsdr_source_0.set_sample_rate(self.samp_rate) + self.rtlsdr_source_0.set_center_freq(self.center_freq, 0) + self.rtlsdr_source_0.set_freq_corr(0, 0) + self.rtlsdr_source_0.set_gain(24, 0) + self.rtlsdr_source_0.set_if_gain(24, 0) + self.rtlsdr_source_0.set_bb_gain(100, 0) + self.rtlsdr_source_0.set_antenna('', 0) + self.rtlsdr_source_0.set_bandwidth(0, 0) + self.rtlsdr_source_0.set_min_output_buffer(self.vector_len) + + self.blocks_stream_to_vector_1 = blocks.stream_to_vector(gr.sizeof_gr_complex * 1, self.vector_len) + self.connect((self.blocks_stream_to_vector_1, 0), (self.probSigVec, 0)) + self.connect((self.rtlsdr_source_0, 0), (self.blocks_stream_to_vector_1, 0)) + + def _prob_freq_probe(): + while True: + val = self.probSigVec.level() + try: + self.set_prob_freq(val) + except AttributeError: + pass + time.sleep(1.0 / self.poll_rate) + + self._prob_freq_thread = threading.Thread(target=_prob_freq_probe, daemon=True) + self._prob_freq_thread.start() + + def get_prob_freq(self): + return self.prob_freq + + def set_prob_freq(self, prob_freq): + self.prob_freq = prob_freq + self.set_center_freq(my_freq.work(self.prob_freq)) + + def get_center_freq(self): + return self.center_freq + + def set_center_freq(self, center_freq): + self.center_freq = center_freq + self.rtlsdr_source_0.set_center_freq(self.center_freq, 0) + + +def main(top_block_cls=get_center_freq, options=None): + tb = top_block_cls() + + def sig_handler(sig=None, frame=None): + tb.stop() + tb.wait() + sys.exit(0) + + signal.signal(signal.SIGINT, sig_handler) + signal.signal(signal.SIGTERM, sig_handler) + + tb.start() + try: + print('СЕРВИСНАЯ ИНФОРМАЦИЯ: ') + print('debug_flag: ', my_freq.debug_flag) + print('save_data_flag: ', my_freq.save_data_flag) + print('send_to_module_flag: ', my_freq.send_to_module_flag) + except EOFError: + pass + tb.wait() + + +if __name__ == '__main__': + main() diff --git a/src/main_2400.py b/src/main_2400.py new file mode 100644 index 0000000..8790050 --- /dev/null +++ b/src/main_2400.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from gnuradio import blocks +from gnuradio import gr +import signal +import sys +import threading +import time + +import osmosdr +import embedded_2400 as my_freq + +from common.runtime import load_root_env, resolve_hackrf_index + + +load_root_env(__file__) + + +def get_hack_id(): + return resolve_hackrf_index('hack_2400', 'src/main_2400.py') + + +class get_center_freq(gr.top_block): + def __init__(self): + gr.top_block.__init__(self, 'get_center_freq') + + self.prob_freq = 0 + self.samp_rate = 20e6 + self.poll_rate = 10000 + self.vector_len = 4096 + self.center_freq = my_freq.work(self.prob_freq) + self._prob_freq_thread = None + + self.probSigVec = blocks.probe_signal_vc(self.vector_len) + self.rtlsdr_source_0 = osmosdr.source( + args='numchan=' + str(1) + ' ' + 'hackrf=' + get_hack_id() + ) + self.rtlsdr_source_0.set_time_unknown_pps(osmosdr.time_spec_t()) + self.rtlsdr_source_0.set_sample_rate(self.samp_rate) + self.rtlsdr_source_0.set_center_freq(self.center_freq, 0) + self.rtlsdr_source_0.set_freq_corr(0, 0) + self.rtlsdr_source_0.set_gain(24, 0) + self.rtlsdr_source_0.set_if_gain(24, 0) + self.rtlsdr_source_0.set_bb_gain(100, 0) + self.rtlsdr_source_0.set_antenna('', 0) + self.rtlsdr_source_0.set_bandwidth(0, 0) + self.rtlsdr_source_0.set_min_output_buffer(self.vector_len) + + self.blocks_stream_to_vector_1 = blocks.stream_to_vector(gr.sizeof_gr_complex * 1, self.vector_len) + self.connect((self.blocks_stream_to_vector_1, 0), (self.probSigVec, 0)) + self.connect((self.rtlsdr_source_0, 0), (self.blocks_stream_to_vector_1, 0)) + + def _prob_freq_probe(): + while True: + val = self.probSigVec.level() + try: + self.set_prob_freq(val) + except AttributeError: + pass + time.sleep(1.0 / self.poll_rate) + + self._prob_freq_thread = threading.Thread(target=_prob_freq_probe, daemon=True) + self._prob_freq_thread.start() + + def get_prob_freq(self): + return self.prob_freq + + def set_prob_freq(self, prob_freq): + self.prob_freq = prob_freq + self.set_center_freq(my_freq.work(self.prob_freq)) + + def get_center_freq(self): + return self.center_freq + + def set_center_freq(self, center_freq): + self.center_freq = center_freq + self.rtlsdr_source_0.set_center_freq(self.center_freq, 0) + + +def main(top_block_cls=get_center_freq, options=None): + tb = top_block_cls() + + def sig_handler(sig=None, frame=None): + tb.stop() + tb.wait() + sys.exit(0) + + signal.signal(signal.SIGINT, sig_handler) + signal.signal(signal.SIGTERM, sig_handler) + + tb.start() + try: + print('СЕРВИСНАЯ ИНФОРМАЦИЯ: ') + print('debug_flag: ', my_freq.debug_flag) + print('save_data_flag: ', my_freq.save_data_flag) + print('send_to_module_flag: ', my_freq.send_to_module_flag) + except EOFError: + pass + tb.wait() + + +if __name__ == '__main__': + main() diff --git a/src/main_915.py b/src/main_915.py new file mode 100644 index 0000000..03918a8 --- /dev/null +++ b/src/main_915.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from gnuradio import blocks +from gnuradio import gr +import signal +import sys +import threading +import time + +import osmosdr +import embedded_915 as my_freq + +from common.runtime import load_root_env, resolve_hackrf_index + + +load_root_env(__file__) + + +def get_hack_id(): + return resolve_hackrf_index('hack_915', 'src/main_915.py') + + +class get_center_freq(gr.top_block): + def __init__(self): + gr.top_block.__init__(self, 'get_center_freq') + + self.prob_freq = 0 + self.samp_rate = 20e6 + self.poll_rate = 10000 + self.vector_len = 4096 + self.center_freq = my_freq.work(self.prob_freq) + self._prob_freq_thread = None + + self.probSigVec = blocks.probe_signal_vc(self.vector_len) + self.rtlsdr_source_0 = osmosdr.source( + args='numchan=' + str(1) + ' ' + 'hackrf=' + get_hack_id() + ) + self.rtlsdr_source_0.set_time_unknown_pps(osmosdr.time_spec_t()) + self.rtlsdr_source_0.set_sample_rate(self.samp_rate) + self.rtlsdr_source_0.set_center_freq(self.center_freq, 0) + self.rtlsdr_source_0.set_freq_corr(0, 0) + self.rtlsdr_source_0.set_gain(24, 0) + self.rtlsdr_source_0.set_if_gain(24, 0) + self.rtlsdr_source_0.set_bb_gain(100, 0) + self.rtlsdr_source_0.set_antenna('', 0) + self.rtlsdr_source_0.set_bandwidth(0, 0) + self.rtlsdr_source_0.set_min_output_buffer(self.vector_len) + + self.blocks_stream_to_vector_1 = blocks.stream_to_vector(gr.sizeof_gr_complex * 1, self.vector_len) + self.connect((self.blocks_stream_to_vector_1, 0), (self.probSigVec, 0)) + self.connect((self.rtlsdr_source_0, 0), (self.blocks_stream_to_vector_1, 0)) + + def _prob_freq_probe(): + while True: + val = self.probSigVec.level() + try: + self.set_prob_freq(val) + except AttributeError: + pass + time.sleep(1.0 / self.poll_rate) + + self._prob_freq_thread = threading.Thread(target=_prob_freq_probe, daemon=True) + self._prob_freq_thread.start() + + def get_prob_freq(self): + return self.prob_freq + + def set_prob_freq(self, prob_freq): + self.prob_freq = prob_freq + self.set_center_freq(my_freq.work(self.prob_freq)) + + def get_center_freq(self): + return self.center_freq + + def set_center_freq(self, center_freq): + self.center_freq = center_freq + self.rtlsdr_source_0.set_center_freq(self.center_freq, 0) + + +def main(top_block_cls=get_center_freq, options=None): + tb = top_block_cls() + + def sig_handler(sig=None, frame=None): + tb.stop() + tb.wait() + sys.exit(0) + + signal.signal(signal.SIGINT, sig_handler) + signal.signal(signal.SIGTERM, sig_handler) + + tb.start() + try: + print('СЕРВИСНАЯ ИНФОРМАЦИЯ: ') + print('debug_flag: ', my_freq.debug_flag) + print('save_data_flag: ', my_freq.save_data_flag) + print('send_to_module_flag: ', my_freq.send_to_module_flag) + except EOFError: + pass + tb.wait() + + +if __name__ == '__main__': + main() diff --git a/train_scripts/ImageDatasetCreate_spec_imag_real_1200.ipynb b/train_scripts/ImageDatasetCreate_spec_imag_real_1200.ipynb new file mode 100644 index 0000000..ad16d96 --- /dev/null +++ b/train_scripts/ImageDatasetCreate_spec_imag_real_1200.ipynb @@ -0,0 +1,284 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "4fdb98fc-65bb-467e-be0c-168fee9b0fca", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cuda:0\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import time\n", + "import io\n", + "import cv2\n", + "import copy\n", + "import os\n", + "from tqdm import tqdm\n", + "import torch.nn as nn\n", + "import torch\n", + "import torchvision\n", + "from torch.utils.data import Dataset\n", + "from torch import default_generator, randperm\n", + "from PIL import Image\n", + "#from torch._utils import _accumulate\n", + "import csv\n", + "from torch.utils.data.dataset import Subset\n", + "from scipy import ndimage\n", + "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n", + "print(device)\n", + "batch_size = 16\n", + "momentum=0.9\n", + "lr = 1e-3\n", + "import random\n", + "sub_sample = 0.5\n", + "import matplotlib\n", + "import gc\n", + "import torchsig.utils as u\n", + "import torchsig.transforms.transforms as T\n", + "matplotlib.use('Agg')\n", + "import matplotlib as mpl\n", + "mpl.rcParams['agg.path.chunksize'] = 256*256\n", + "plt.ioff()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "4848b066-2e09-4c1c-b8fa-8e3fa84d907a", + "metadata": {}, + "outputs": [], + "source": [ + "s = T.Spectrogram(nperseg=1024)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "9267fbe1", + "metadata": {}, + "outputs": [], + "source": [ + "def sig2pic_with_spec(path_to_data, filename, specT=None,figsize=(16,16), dpi=16, resize = None):\n", + " try:\n", + " if specT is None:\n", + " specT = T.Spectrogram(nperseg=1024)\n", + " with open(path_to_data + filename, 'rb') as file:\n", + " tmp = np.frombuffer(file.read(), dtype=np.complex64)\n", + " signal = tmp\n", + " spectr = np.array(specT(signal)['data']['samples'][:,:figsize[0] * dpi])\n", + " mag = np.abs(signal)\n", + " real = signal.real\n", + "\n", + " fig2 = plt.figure(figsize = figsize)\n", + " plt.axes(ylim=(-1, 1))\n", + "\n", + " plt.plot(real, color='black')\n", + " plt.gca().set_axis_off()\n", + " plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, hspace = 0, wspace = 0)\n", + " plt.margins(0,0)\n", + " buf2 = io.BytesIO()\n", + " fig2.savefig(buf2, format=\"png\", dpi=dpi)\n", + " buf2.seek(0)\n", + " img_arr2 = np.frombuffer(buf2.getvalue(), dtype=np.uint8)\n", + " buf2.close()\n", + " img2 = cv2.imdecode(img_arr2, 1)\n", + " img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " plt.close(fig2)\n", + "\n", + " fig3 = plt.figure(figsize = figsize)\n", + " plt.axes(ylim=(-1, 1))\n", + "\n", + " plt.plot(mag, color='black')\n", + " plt.gca().set_axis_off()\n", + " plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, hspace = 0, wspace = 0)\n", + " plt.margins(0,0)\n", + " buf3 = io.BytesIO()\n", + " fig3.savefig(buf3, format=\"png\", dpi=dpi)\n", + " buf3.seek(0)\n", + " img_arr3 = np.frombuffer(buf3.getvalue(), dtype=np.uint8)\n", + " buf3.close()\n", + " img3 = cv2.imdecode(img_arr3, 1)\n", + " img3 = cv2.cvtColor(img3, cv2.COLOR_BGR2GRAY)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " plt.close(fig3)\n", + "\n", + " if resize != None:\n", + " resized_real = cv2.resize(img2, resize)\n", + " resized_mag = cv2.resize(img3, resize)\n", + " resized_spectr = cv2.resize(spectr, resize)\n", + " img = np.asarray([resized_real, resized_mag, resized_spectr], dtype=np.float32)\n", + " return img\n", + " img = np.asarray([img2, img3, spectr], dtype=np.float32)\n", + " return img\n", + " except Exception as e:\n", + " print(str(e))\n", + " return None" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "448da74a-e0ae-44d8-9877-8dd1f257a24f", + "metadata": {}, + "outputs": [], + "source": [ + "path_to_binaries = '//192.168.11.63/data/DATASETS/Energomash/1200'\n", + "path_to_pictures = '//192.168.11.63/data/DATASETS/Energomash/1200_jpg'" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "ac4945a8-29c4-4da4-945f-08658953e3e5", + "metadata": {}, + "outputs": [], + "source": [ + "from tqdm import tqdm" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "6f226f86-5d72-4573-8af6-750128b70263", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 0/963 [00:00" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import time\n", + "import io\n", + "import cv2\n", + "import copy\n", + "import os\n", + "from tqdm import tqdm\n", + "import torch.nn as nn\n", + "import torch\n", + "import torchvision\n", + "from torch.utils.data import Dataset\n", + "from torch import default_generator, randperm\n", + "from PIL import Image\n", + "#from torch._utils import _accumulate\n", + "import csv\n", + "from torch.utils.data.dataset import Subset\n", + "from scipy import ndimage\n", + "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n", + "print(device)\n", + "batch_size = 16\n", + "momentum=0.9\n", + "lr = 1e-3\n", + "import random\n", + "sub_sample = 0.5\n", + "import matplotlib\n", + "import gc\n", + "import torchsig.utils as u\n", + "import torchsig.transforms.transforms as T\n", + "matplotlib.use('Agg')\n", + "import matplotlib as mpl\n", + "mpl.rcParams['agg.path.chunksize'] = 256*256\n", + "plt.ioff()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "4848b066-2e09-4c1c-b8fa-8e3fa84d907a", + "metadata": {}, + "outputs": [], + "source": [ + "s = T.Spectrogram(nperseg=256)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "9267fbe1", + "metadata": {}, + "outputs": [], + "source": [ + "def sig2pic_with_spec(path_to_data, filename, specT=None,figsize=(16,16), dpi=16, resize = None):\n", + " try:\n", + " if specT is None:\n", + " specT = T.Spectrogram(nperseg=256)\n", + " with open(path_to_data + filename, 'rb') as file:\n", + " tmp = np.frombuffer(file.read(), dtype=np.complex64)\n", + " signal = tmp\n", + " spectr = np.array(specT(signal)['data']['samples'][:,:figsize[0] * dpi])\n", + " mag = np.abs(signal)\n", + " real = signal.real\n", + "\n", + " fig2 = plt.figure(figsize = figsize)\n", + " plt.axes(ylim=(-1, 1))\n", + "\n", + " plt.plot(real, color='black')\n", + " plt.gca().set_axis_off()\n", + " plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, hspace = 0, wspace = 0)\n", + " plt.margins(0,0)\n", + " buf2 = io.BytesIO()\n", + " fig2.savefig(buf2, format=\"png\", dpi=dpi)\n", + " buf2.seek(0)\n", + " img_arr2 = np.frombuffer(buf2.getvalue(), dtype=np.uint8)\n", + " buf2.close()\n", + " img2 = cv2.imdecode(img_arr2, 1)\n", + " img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " plt.close(fig2)\n", + "\n", + " fig3 = plt.figure(figsize = figsize)\n", + " plt.axes(ylim=(-1, 1))\n", + "\n", + " plt.plot(mag, color='black')\n", + " plt.gca().set_axis_off()\n", + " plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, hspace = 0, wspace = 0)\n", + " plt.margins(0,0)\n", + " buf3 = io.BytesIO()\n", + " fig3.savefig(buf3, format=\"png\", dpi=dpi)\n", + " buf3.seek(0)\n", + " img_arr3 = np.frombuffer(buf3.getvalue(), dtype=np.uint8)\n", + " buf3.close()\n", + " img3 = cv2.imdecode(img_arr3, 1)\n", + " img3 = cv2.cvtColor(img3, cv2.COLOR_BGR2GRAY)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " plt.close(fig3)\n", + "\n", + " if resize != None:\n", + " resized_real = cv2.resize(img2, resize)\n", + " resized_mag = cv2.resize(img3, resize)\n", + " resized_spectr = cv2.resize(spectr, resize)\n", + " img = np.asarray([resized_real, resized_mag, resized_spectr], dtype=np.float32)\n", + " return img\n", + " img = np.asarray([img2, img3, spectr], dtype=np.float32)\n", + " return img\n", + " except Exception as e:\n", + " print(str(e))\n", + " return None" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "448da74a-e0ae-44d8-9877-8dd1f257a24f", + "metadata": {}, + "outputs": [], + "source": [ + "path_to_binaries = '//192.168.11.63/data/DATASETS/Energomash/2400'\n", + "path_to_pictures = '//192.168.11.63/data/DATASETS/Energomash/2400_jpg'" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "ac4945a8-29c4-4da4-945f-08658953e3e5", + "metadata": {}, + "outputs": [], + "source": [ + "from tqdm import tqdm" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "6f226f86-5d72-4573-8af6-750128b70263", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 0/965 [00:00" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import time\n", + "import io\n", + "import cv2\n", + "import copy\n", + "import os\n", + "from tqdm import tqdm\n", + "import torch.nn as nn\n", + "import torch\n", + "import torchvision\n", + "from torch.utils.data import Dataset\n", + "from torch import default_generator, randperm\n", + "from PIL import Image\n", + "#from torch._utils import _accumulate\n", + "import csv\n", + "from torch.utils.data.dataset import Subset\n", + "from scipy import ndimage\n", + "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n", + "print(device)\n", + "batch_size = 16\n", + "momentum=0.9\n", + "lr = 1e-3\n", + "import random\n", + "sub_sample = 0.5\n", + "import matplotlib\n", + "import gc\n", + "import torchsig.utils as u\n", + "import torchsig.transforms.transforms as T\n", + "matplotlib.use('Agg')\n", + "import matplotlib as mpl\n", + "mpl.rcParams['agg.path.chunksize'] = 256*256\n", + "plt.ioff()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "4848b066-2e09-4c1c-b8fa-8e3fa84d907a", + "metadata": {}, + "outputs": [], + "source": [ + "s = T.Spectrogram(nperseg=256)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "9267fbe1", + "metadata": {}, + "outputs": [], + "source": [ + "def sig2pic_with_spec(path_to_data, filename, specT=None,figsize=(16,16), dpi=16, resize = None):\n", + " try:\n", + " if specT is None:\n", + " specT = T.Spectrogram(nperseg=256)\n", + " with open(path_to_data + filename, 'rb') as file:\n", + " tmp = np.frombuffer(file.read(), dtype=np.complex64)\n", + " signal = tmp\n", + " spectr = np.array(specT(signal)['data']['samples'][:,:figsize[0] * dpi])\n", + " mag = np.abs(signal)\n", + " real = signal.real\n", + "\n", + " fig2 = plt.figure(figsize = figsize)\n", + " plt.axes(ylim=(-1, 1))\n", + "\n", + " plt.plot(real, color='black')\n", + " plt.gca().set_axis_off()\n", + " plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, hspace = 0, wspace = 0)\n", + " plt.margins(0,0)\n", + " buf2 = io.BytesIO()\n", + " fig2.savefig(buf2, format=\"png\", dpi=dpi)\n", + " buf2.seek(0)\n", + " img_arr2 = np.frombuffer(buf2.getvalue(), dtype=np.uint8)\n", + " buf2.close()\n", + " img2 = cv2.imdecode(img_arr2, 1)\n", + " img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " plt.close(fig2)\n", + "\n", + " fig3 = plt.figure(figsize = figsize)\n", + " plt.axes(ylim=(-1, 1))\n", + "\n", + " plt.plot(mag, color='black')\n", + " plt.gca().set_axis_off()\n", + " plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, hspace = 0, wspace = 0)\n", + " plt.margins(0,0)\n", + " buf3 = io.BytesIO()\n", + " fig3.savefig(buf3, format=\"png\", dpi=dpi)\n", + " buf3.seek(0)\n", + " img_arr3 = np.frombuffer(buf3.getvalue(), dtype=np.uint8)\n", + " buf3.close()\n", + " img3 = cv2.imdecode(img_arr3, 1)\n", + " img3 = cv2.cvtColor(img3, cv2.COLOR_BGR2GRAY)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " plt.close(fig3)\n", + "\n", + " if resize != None:\n", + " resized_real = cv2.resize(img2, resize)\n", + " resized_mag = cv2.resize(img3, resize)\n", + " resized_spectr = cv2.resize(spectr, resize)\n", + " img = np.asarray([resized_real, resized_mag, resized_spectr], dtype=np.float32)\n", + " return img\n", + " img = np.asarray([img2, img3, spectr], dtype=np.float32)\n", + " return img\n", + " except Exception as e:\n", + " print(str(e))\n", + " return None" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "448da74a-e0ae-44d8-9877-8dd1f257a24f", + "metadata": {}, + "outputs": [], + "source": [ + "path_to_binaries = '//192.168.11.63/data/DATASETS/Energomash/2400'\n", + "path_to_pictures = '//192.168.11.63/data/DATASETS/Energomash/2400_jpg'" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "ac4945a8-29c4-4da4-945f-08658953e3e5", + "metadata": {}, + "outputs": [], + "source": [ + "from tqdm import tqdm" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "6f226f86-5d72-4573-8af6-750128b70263", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 0/965 [00:00" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import time\n", + "import io\n", + "import cv2\n", + "import copy\n", + "import os\n", + "from tqdm import tqdm\n", + "import torch.nn as nn\n", + "import torch\n", + "import torchvision\n", + "from torch.utils.data import Dataset\n", + "from torch import default_generator, randperm\n", + "from PIL import Image\n", + "#from torch._utils import _accumulate\n", + "import csv\n", + "from torch.utils.data.dataset import Subset\n", + "from scipy import ndimage\n", + "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n", + "print(device)\n", + "batch_size = 16\n", + "momentum=0.9\n", + "lr = 1e-3\n", + "import random\n", + "sub_sample = 0.5\n", + "import matplotlib\n", + "import gc\n", + "import torchsig.utils as u\n", + "import torchsig.transforms.transforms as T\n", + "matplotlib.use('Agg')\n", + "import matplotlib as mpl\n", + "mpl.rcParams['agg.path.chunksize'] = 256*256\n", + "plt.ioff()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "4848b066-2e09-4c1c-b8fa-8e3fa84d907a", + "metadata": {}, + "outputs": [], + "source": [ + "s = T.Spectrogram(nperseg=256)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "9267fbe1", + "metadata": {}, + "outputs": [], + "source": [ + "def sig2pic_with_spec(path_to_data, filename, specT=None, figsize=(16,16), dpi=16, resize = None):\n", + " def standartize_signal(signal):\n", + " mean = np.mean(signal)\n", + " std = np.std(signal)\n", + " standardized_signal = (signal - mean) / std\n", + " return standardized_signal\n", + " \n", + " try:\n", + " if specT is None:\n", + " specT = T.Spectrogram(nperseg=256)\n", + " with open(path_to_data + filename, 'rb') as file:\n", + " tmp = np.frombuffer(file.read(), dtype=np.complex64)\n", + " signal = tmp\n", + " print(len(signal))\n", + " spectr = np.array(specT(signal)['data']['samples'][:,:figsize[0] * dpi])\n", + " mag = np.abs(signal)\n", + " mag = standartize_signal(mag)\n", + " real = signal.real\n", + " real = standartize_signal(real)\n", + "\n", + " fig2 = plt.figure(figsize = figsize)\n", + " plt.axes(ylim=(-1, 1))\n", + "\n", + " plt.plot(real, color='black')\n", + " plt.gca().set_axis_off()\n", + " plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, hspace = 0, wspace = 0)\n", + " plt.margins(0,0)\n", + " buf2 = io.BytesIO()\n", + " fig2.savefig(buf2, format=\"png\", dpi=dpi)\n", + " buf2.seek(0)\n", + " img_arr2 = np.frombuffer(buf2.getvalue(), dtype=np.uint8)\n", + " buf2.close()\n", + " img2 = cv2.imdecode(img_arr2, 1)\n", + " img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " plt.close(fig2)\n", + "\n", + " fig3 = plt.figure(figsize = figsize)\n", + " plt.axes(ylim=(-1, 1))\n", + "\n", + " plt.plot(mag, color='black')\n", + " plt.gca().set_axis_off()\n", + " plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, hspace = 0, wspace = 0)\n", + " plt.margins(0,0)\n", + " buf3 = io.BytesIO()\n", + " fig3.savefig(buf3, format=\"png\", dpi=dpi)\n", + " buf3.seek(0)\n", + " img_arr3 = np.frombuffer(buf3.getvalue(), dtype=np.uint8)\n", + " buf3.close()\n", + " img3 = cv2.imdecode(img_arr3, 1)\n", + " img3 = cv2.cvtColor(img3, cv2.COLOR_BGR2GRAY)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " plt.close(fig3)\n", + "\n", + " if resize != None:\n", + " resized_real = cv2.resize(img2, resize)\n", + " resized_mag = cv2.resize(img3, resize)\n", + " resized_spectr = cv2.resize(spectr, resize)\n", + " img = np.asarray([resized_real, resized_mag, resized_spectr], dtype=np.float32)\n", + " return img\n", + " img = np.asarray([img2, img3, spectr], dtype=np.float32)\n", + " return img\n", + " except Exception as e:\n", + " print(str(e))\n", + " return None\n", + "\n", + "def plot_signal_and_magnitude(path_to_data, filename, filename_signal):\n", + " def remove_outliers(signal, threshold):\n", + " filtered_signal = np.where(np.abs(signal) <= threshold, signal, np.nan)\n", + " return np.nan_to_num(filtered_signal)\n", + " \n", + " def standartize_signal(signal):\n", + " mean = np.mean(signal)\n", + " std = np.std(signal)\n", + " standardized_signal = (signal - mean) / std\n", + " return standardized_signal\n", + " \n", + " with open(path_to_data + filename, 'rb') as file:\n", + " signal = np.frombuffer(file.read(), dtype=np.complex64)\n", + " print(max(np.real(signal)))\n", + " print(signal[:100])\n", + " plt.figure(figsize=(12, 6))\n", + " plt.subplot(2, 1, 1)\n", + " plt.plot(remove_outliers(standartize_signal(np.real(signal)),1)[10000:], label='Real Part')\n", + " plt.plot(remove_outliers(standartize_signal(np.imag(signal)),1)[10000:], label='Imaginary Part')\n", + " plt.title('QAM Signal')\n", + " plt.legend()\n", + " plt.subplot(2, 1, 2)\n", + " plt.plot(np.abs(signal), label='Magnitude')\n", + " plt.title('Magnitude of QAM Signal')\n", + " plt.legend()\n", + " plt.tight_layout()\n", + " plt.savefig(filename_signal)\n", + " plt.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "448da74a-e0ae-44d8-9877-8dd1f257a24f", + "metadata": {}, + "outputs": [], + "source": [ + "path_to_binaries = '/home/sibscience/Datasets/915_9K'\n", + "path_to_pictures = '/home/sibscience/Datasets/915_9K_jpg'" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "ac4945a8-29c4-4da4-945f-08658953e3e5", + "metadata": {}, + "outputs": [], + "source": [ + "from tqdm import tqdm" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "6a5f4c51", + "metadata": {}, + "outputs": [ + { + "ename": "FileNotFoundError", + "evalue": "[Errno 2] No such file or directory: '/home/sibscience/Datasets/915_9K_jpg'", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mFileNotFoundError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[7]\u001b[39m\u001b[32m, line 3\u001b[39m\n\u001b[32m 1\u001b[39m size = (\u001b[32m256\u001b[39m,\u001b[32m256\u001b[39m)\n\u001b[32m 2\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m os.path.exists(path_to_pictures):\n\u001b[32m----> \u001b[39m\u001b[32m3\u001b[39m \u001b[43mos\u001b[49m\u001b[43m.\u001b[49m\u001b[43mmkdir\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath_to_pictures\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 4\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m subdir \u001b[38;5;129;01min\u001b[39;00m os.listdir(path_to_binaries):\n\u001b[32m 5\u001b[39m filepath = path_to_binaries + \u001b[33m'\u001b[39m\u001b[33m/\u001b[39m\u001b[33m'\u001b[39m + subdir + \u001b[33m'\u001b[39m\u001b[33m/\u001b[39m\u001b[33m'\u001b[39m\n", + "\u001b[31mFileNotFoundError\u001b[39m: [Errno 2] No such file or directory: '/home/sibscience/Datasets/915_9K_jpg'" + ] + } + ], + "source": [ + "size = (256,256)\n", + "if not os.path.exists(path_to_pictures):\n", + " os.mkdir(path_to_pictures)\n", + "for subdir in os.listdir(path_to_binaries):\n", + " filepath = path_to_binaries + '/' + subdir + '/'\n", + " if not os.path.exists(path_to_pictures +'/' + subdir):\n", + " os.mkdir(path_to_pictures + '/' + subdir)\n", + " files = os.listdir(filepath)\n", + " for file in tqdm(files):\n", + " savepath = path_to_pictures +'/' + subdir + '/' + file + '.npy'\n", + " savepath_real_png = path_to_pictures +'/' + subdir + '/' + file + '.png' \n", + " if not os.path.exists(savepath):\n", + " img = plot_signal_and_magnitude(path_to_data=filepath, filename=file, filename_signal= savepath_real_png)\n", + " gc.collect()\n", + " print('Dir: ', subdir , ' finished!')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6f226f86-5d72-4573-8af6-750128b70263", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r\n", + " 0%| | 0/565 [00:00 15\u001b[0m img \u001b[38;5;241m=\u001b[39m \u001b[43msig2pic_with_spec\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath_to_data\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfilepath\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfilename\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfile\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mspecT\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43ms\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mresize\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43msize\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 16\u001b[0m gc\u001b[38;5;241m.\u001b[39mcollect()\n\u001b[0;32m 17\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n", + "Cell \u001b[1;32mIn[7], line 29\u001b[0m, in \u001b[0;36msig2pic_with_spec\u001b[1;34m(path_to_data, filename, specT, figsize, dpi, resize)\u001b[0m\n\u001b[0;32m 27\u001b[0m plt\u001b[38;5;241m.\u001b[39mmargins(\u001b[38;5;241m0\u001b[39m,\u001b[38;5;241m0\u001b[39m)\n\u001b[0;32m 28\u001b[0m buf2 \u001b[38;5;241m=\u001b[39m io\u001b[38;5;241m.\u001b[39mBytesIO()\n\u001b[1;32m---> 29\u001b[0m \u001b[43mfig2\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msavefig\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbuf2\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mpng\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdpi\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdpi\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 30\u001b[0m buf2\u001b[38;5;241m.\u001b[39mseek(\u001b[38;5;241m0\u001b[39m)\n\u001b[0;32m 31\u001b[0m img_arr2 \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mfrombuffer(buf2\u001b[38;5;241m.\u001b[39mgetvalue(), dtype\u001b[38;5;241m=\u001b[39mnp\u001b[38;5;241m.\u001b[39muint8)\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\figure.py:3390\u001b[0m, in \u001b[0;36mFigure.savefig\u001b[1;34m(self, fname, transparent, **kwargs)\u001b[0m\n\u001b[0;32m 3388\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m ax \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39maxes:\n\u001b[0;32m 3389\u001b[0m _recursively_make_axes_transparent(stack, ax)\n\u001b[1;32m-> 3390\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcanvas\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mprint_figure\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfname\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\backend_bases.py:2193\u001b[0m, in \u001b[0;36mFigureCanvasBase.print_figure\u001b[1;34m(self, filename, dpi, facecolor, edgecolor, orientation, format, bbox_inches, pad_inches, bbox_extra_artists, backend, **kwargs)\u001b[0m\n\u001b[0;32m 2189\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 2190\u001b[0m \u001b[38;5;66;03m# _get_renderer may change the figure dpi (as vector formats\u001b[39;00m\n\u001b[0;32m 2191\u001b[0m \u001b[38;5;66;03m# force the figure dpi to 72), so we need to set it again here.\u001b[39;00m\n\u001b[0;32m 2192\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m cbook\u001b[38;5;241m.\u001b[39m_setattr_cm(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfigure, dpi\u001b[38;5;241m=\u001b[39mdpi):\n\u001b[1;32m-> 2193\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43mprint_method\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 2194\u001b[0m \u001b[43m \u001b[49m\u001b[43mfilename\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 2195\u001b[0m \u001b[43m \u001b[49m\u001b[43mfacecolor\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfacecolor\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 2196\u001b[0m \u001b[43m \u001b[49m\u001b[43medgecolor\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43medgecolor\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 2197\u001b[0m \u001b[43m \u001b[49m\u001b[43morientation\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43morientation\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 2198\u001b[0m \u001b[43m \u001b[49m\u001b[43mbbox_inches_restore\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m_bbox_inches_restore\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 2199\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 2200\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[0;32m 2201\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m bbox_inches \u001b[38;5;129;01mand\u001b[39;00m restore_bbox:\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\backend_bases.py:2043\u001b[0m, in \u001b[0;36mFigureCanvasBase._switch_canvas_and_return_print_method..\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 2039\u001b[0m optional_kws \u001b[38;5;241m=\u001b[39m { \u001b[38;5;66;03m# Passed by print_figure for other renderers.\u001b[39;00m\n\u001b[0;32m 2040\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdpi\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfacecolor\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124medgecolor\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124morientation\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[0;32m 2041\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mbbox_inches_restore\u001b[39m\u001b[38;5;124m\"\u001b[39m}\n\u001b[0;32m 2042\u001b[0m skip \u001b[38;5;241m=\u001b[39m optional_kws \u001b[38;5;241m-\u001b[39m {\u001b[38;5;241m*\u001b[39minspect\u001b[38;5;241m.\u001b[39msignature(meth)\u001b[38;5;241m.\u001b[39mparameters}\n\u001b[1;32m-> 2043\u001b[0m print_method \u001b[38;5;241m=\u001b[39m functools\u001b[38;5;241m.\u001b[39mwraps(meth)(\u001b[38;5;28;01mlambda\u001b[39;00m \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: \u001b[43mmeth\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 2044\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m{\u001b[49m\u001b[43mk\u001b[49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mv\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mk\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mv\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mkwargs\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mitems\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mk\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mskip\u001b[49m\u001b[43m}\u001b[49m\u001b[43m)\u001b[49m)\n\u001b[0;32m 2045\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m: \u001b[38;5;66;03m# Let third-parties do as they see fit.\u001b[39;00m\n\u001b[0;32m 2046\u001b[0m print_method \u001b[38;5;241m=\u001b[39m meth\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\backends\\backend_agg.py:497\u001b[0m, in \u001b[0;36mFigureCanvasAgg.print_png\u001b[1;34m(self, filename_or_obj, metadata, pil_kwargs)\u001b[0m\n\u001b[0;32m 450\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mprint_png\u001b[39m(\u001b[38;5;28mself\u001b[39m, filename_or_obj, \u001b[38;5;241m*\u001b[39m, metadata\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, pil_kwargs\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[0;32m 451\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 452\u001b[0m \u001b[38;5;124;03m Write the figure to a PNG file.\u001b[39;00m\n\u001b[0;32m 453\u001b[0m \n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 495\u001b[0m \u001b[38;5;124;03m *metadata*, including the default 'Software' key.\u001b[39;00m\n\u001b[0;32m 496\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 497\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_print_pil\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilename_or_obj\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mpng\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpil_kwargs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmetadata\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\backends\\backend_agg.py:445\u001b[0m, in \u001b[0;36mFigureCanvasAgg._print_pil\u001b[1;34m(self, filename_or_obj, fmt, pil_kwargs, metadata)\u001b[0m\n\u001b[0;32m 440\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_print_pil\u001b[39m(\u001b[38;5;28mself\u001b[39m, filename_or_obj, fmt, pil_kwargs, metadata\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[0;32m 441\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 442\u001b[0m \u001b[38;5;124;03m Draw the canvas, then save it using `.image.imsave` (to which\u001b[39;00m\n\u001b[0;32m 443\u001b[0m \u001b[38;5;124;03m *pil_kwargs* and *metadata* are forwarded).\u001b[39;00m\n\u001b[0;32m 444\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 445\u001b[0m \u001b[43mFigureCanvasAgg\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[0;32m 446\u001b[0m mpl\u001b[38;5;241m.\u001b[39mimage\u001b[38;5;241m.\u001b[39mimsave(\n\u001b[0;32m 447\u001b[0m filename_or_obj, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbuffer_rgba(), \u001b[38;5;28mformat\u001b[39m\u001b[38;5;241m=\u001b[39mfmt, origin\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mupper\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[0;32m 448\u001b[0m dpi\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfigure\u001b[38;5;241m.\u001b[39mdpi, metadata\u001b[38;5;241m=\u001b[39mmetadata, pil_kwargs\u001b[38;5;241m=\u001b[39mpil_kwargs)\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\backends\\backend_agg.py:388\u001b[0m, in \u001b[0;36mFigureCanvasAgg.draw\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 385\u001b[0m \u001b[38;5;66;03m# Acquire a lock on the shared font cache.\u001b[39;00m\n\u001b[0;32m 386\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtoolbar\u001b[38;5;241m.\u001b[39m_wait_cursor_for_draw_cm() \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtoolbar\n\u001b[0;32m 387\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m nullcontext()):\n\u001b[1;32m--> 388\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfigure\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 389\u001b[0m \u001b[38;5;66;03m# A GUI class may be need to update a window using this draw, so\u001b[39;00m\n\u001b[0;32m 390\u001b[0m \u001b[38;5;66;03m# don't forget to call the superclass.\u001b[39;00m\n\u001b[0;32m 391\u001b[0m \u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39mdraw()\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\artist.py:95\u001b[0m, in \u001b[0;36m_finalize_rasterization..draw_wrapper\u001b[1;34m(artist, renderer, *args, **kwargs)\u001b[0m\n\u001b[0;32m 93\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(draw)\n\u001b[0;32m 94\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdraw_wrapper\u001b[39m(artist, renderer, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m---> 95\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 96\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m renderer\u001b[38;5;241m.\u001b[39m_rasterizing:\n\u001b[0;32m 97\u001b[0m renderer\u001b[38;5;241m.\u001b[39mstop_rasterizing()\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\artist.py:72\u001b[0m, in \u001b[0;36mallow_rasterization..draw_wrapper\u001b[1;34m(artist, renderer)\u001b[0m\n\u001b[0;32m 69\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 70\u001b[0m renderer\u001b[38;5;241m.\u001b[39mstart_filter()\n\u001b[1;32m---> 72\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 73\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[0;32m 74\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\figure.py:3154\u001b[0m, in \u001b[0;36mFigure.draw\u001b[1;34m(self, renderer)\u001b[0m\n\u001b[0;32m 3151\u001b[0m \u001b[38;5;66;03m# ValueError can occur when resizing a window.\u001b[39;00m\n\u001b[0;32m 3153\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpatch\u001b[38;5;241m.\u001b[39mdraw(renderer)\n\u001b[1;32m-> 3154\u001b[0m \u001b[43mmimage\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_draw_list_compositing_images\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 3155\u001b[0m \u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43martists\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msuppressComposite\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 3157\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m sfig \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msubfigs:\n\u001b[0;32m 3158\u001b[0m sfig\u001b[38;5;241m.\u001b[39mdraw(renderer)\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\image.py:132\u001b[0m, in \u001b[0;36m_draw_list_compositing_images\u001b[1;34m(renderer, parent, artists, suppress_composite)\u001b[0m\n\u001b[0;32m 130\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m not_composite \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m has_images:\n\u001b[0;32m 131\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m a \u001b[38;5;129;01min\u001b[39;00m artists:\n\u001b[1;32m--> 132\u001b[0m \u001b[43ma\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 133\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 134\u001b[0m \u001b[38;5;66;03m# Composite any adjacent images together\u001b[39;00m\n\u001b[0;32m 135\u001b[0m image_group \u001b[38;5;241m=\u001b[39m []\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\artist.py:72\u001b[0m, in \u001b[0;36mallow_rasterization..draw_wrapper\u001b[1;34m(artist, renderer)\u001b[0m\n\u001b[0;32m 69\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 70\u001b[0m renderer\u001b[38;5;241m.\u001b[39mstart_filter()\n\u001b[1;32m---> 72\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 73\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[0;32m 74\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\axes\\_base.py:3070\u001b[0m, in \u001b[0;36m_AxesBase.draw\u001b[1;34m(self, renderer)\u001b[0m\n\u001b[0;32m 3067\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artists_rasterized:\n\u001b[0;32m 3068\u001b[0m _draw_rasterized(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfigure, artists_rasterized, renderer)\n\u001b[1;32m-> 3070\u001b[0m \u001b[43mmimage\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_draw_list_compositing_images\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 3071\u001b[0m \u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43martists\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfigure\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msuppressComposite\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 3073\u001b[0m renderer\u001b[38;5;241m.\u001b[39mclose_group(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124maxes\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 3074\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstale \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\image.py:132\u001b[0m, in \u001b[0;36m_draw_list_compositing_images\u001b[1;34m(renderer, parent, artists, suppress_composite)\u001b[0m\n\u001b[0;32m 130\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m not_composite \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m has_images:\n\u001b[0;32m 131\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m a \u001b[38;5;129;01min\u001b[39;00m artists:\n\u001b[1;32m--> 132\u001b[0m \u001b[43ma\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 133\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 134\u001b[0m \u001b[38;5;66;03m# Composite any adjacent images together\u001b[39;00m\n\u001b[0;32m 135\u001b[0m image_group \u001b[38;5;241m=\u001b[39m []\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\artist.py:72\u001b[0m, in \u001b[0;36mallow_rasterization..draw_wrapper\u001b[1;34m(artist, renderer)\u001b[0m\n\u001b[0;32m 69\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 70\u001b[0m renderer\u001b[38;5;241m.\u001b[39mstart_filter()\n\u001b[1;32m---> 72\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 73\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[0;32m 74\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\lines.py:801\u001b[0m, in \u001b[0;36mLine2D.draw\u001b[1;34m(self, renderer)\u001b[0m\n\u001b[0;32m 798\u001b[0m gc\u001b[38;5;241m.\u001b[39mset_foreground(lc_rgba, isRGBA\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[0;32m 800\u001b[0m gc\u001b[38;5;241m.\u001b[39mset_dashes(\u001b[38;5;241m*\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_dash_pattern)\n\u001b[1;32m--> 801\u001b[0m \u001b[43mrenderer\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw_path\u001b[49m\u001b[43m(\u001b[49m\u001b[43mgc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtpath\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maffine\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfrozen\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 802\u001b[0m gc\u001b[38;5;241m.\u001b[39mrestore()\n\u001b[0;32m 804\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_marker \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_markersize \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m0\u001b[39m:\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\backends\\backend_agg.py:117\u001b[0m, in \u001b[0;36mRendererAgg.draw_path\u001b[1;34m(self, gc, path, transform, rgbFace)\u001b[0m\n\u001b[0;32m 115\u001b[0m p\u001b[38;5;241m.\u001b[39msimplify_threshold \u001b[38;5;241m=\u001b[39m path\u001b[38;5;241m.\u001b[39msimplify_threshold\n\u001b[0;32m 116\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 117\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_renderer\u001b[38;5;241m.\u001b[39mdraw_path(gc, p, transform, rgbFace)\n\u001b[0;32m 118\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mOverflowError\u001b[39;00m:\n\u001b[0;32m 119\u001b[0m msg \u001b[38;5;241m=\u001b[39m (\n\u001b[0;32m 120\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mExceeded cell block limit in Agg.\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 121\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPlease reduce the value of \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 127\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mpath\u001b[38;5;241m.\u001b[39msimplify_threshold\u001b[38;5;132;01m:\u001b[39;00m\u001b[38;5;124m.2f\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m on the input).\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 128\u001b[0m )\n", + "\u001b[1;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "size = (256,256)\n", + "if not os.path.exists(path_to_pictures):\n", + " os.mkdir(path_to_pictures)\n", + "for subdir in os.listdir(path_to_binaries):\n", + " filepath = path_to_binaries + '/' + subdir + '/'\n", + " if not os.path.exists(path_to_pictures +'/' + subdir):\n", + " os.mkdir(path_to_pictures + '/' + subdir)\n", + " files = os.listdir(filepath)\n", + " for file in tqdm(files):\n", + " savepath = path_to_pictures +'/' + subdir + '/' + file + '.npy'\n", + " savepath_real_png = path_to_pictures +'/' + subdir + '/' + file + '_real' + '.png' \n", + " savepath_imag_png = path_to_pictures +'/' + subdir + '/' + file + '_imag' + '.png' \n", + " savepath_spec_png = path_to_pictures +'/' + subdir + '/' + file + '_spec' + '.png'\n", + " if not os.path.exists(savepath):\n", + " img = sig2pic_with_spec(path_to_data=filepath, filename=file, specT=s, resize = size)\n", + " gc.collect()\n", + " try:\n", + " \n", + " plt.imshow(img[0])\n", + " plt.savefig(savepath_real_png)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " \n", + " plt.imshow(img[1])\n", + " plt.savefig(savepath_imag_png)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + "\n", + " plt.imshow(img[2])\n", + " plt.savefig(savepath_spec_png)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " \n", + " np.save(savepath, img)\n", + " \n", + " except Exception:\n", + " continue\n", + " print('Dir: ', subdir , ' finished!')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "58ff5fbd", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9f9ad366", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv-train", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/train_scripts/ImageDatasetCreate_spec_imag_real_915-Copy2.ipynb b/train_scripts/ImageDatasetCreate_spec_imag_real_915-Copy2.ipynb new file mode 100644 index 0000000..f6ad37f --- /dev/null +++ b/train_scripts/ImageDatasetCreate_spec_imag_real_915-Copy2.ipynb @@ -0,0 +1,20562 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 11, + "id": "4fdb98fc-65bb-467e-be0c-168fee9b0fca", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cuda:0\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import time\n", + "import io\n", + "import cv2\n", + "import copy\n", + "import os\n", + "from tqdm import tqdm\n", + "import torch.nn as nn\n", + "import torch\n", + "import torchvision\n", + "from torch.utils.data import Dataset\n", + "from torch import default_generator, randperm\n", + "from PIL import Image\n", + "#from torch._utils import _accumulate\n", + "import csv\n", + "from torch.utils.data.dataset import Subset\n", + "from scipy import ndimage\n", + "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n", + "print(device)\n", + "batch_size = 16\n", + "momentum=0.9\n", + "lr = 1e-3\n", + "import random\n", + "sub_sample = 0.5\n", + "import matplotlib\n", + "import gc\n", + "import torchsig.utils as u\n", + "import torchsig.transforms.transforms as T\n", + "matplotlib.use('Agg')\n", + "import matplotlib as mpl\n", + "mpl.rcParams['agg.path.chunksize'] = 256*256\n", + "plt.ioff()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "4848b066-2e09-4c1c-b8fa-8e3fa84d907a", + "metadata": {}, + "outputs": [], + "source": [ + "s = T.Spectrogram(nperseg=256)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "9267fbe1", + "metadata": {}, + "outputs": [], + "source": [ + "def sig2pic_with_spec(path_to_data, filename, specT=None, figsize=(16,16), dpi=16, resize = None):\n", + " def standartize_signal(signal):\n", + " mean = np.mean(signal)\n", + " std = np.std(signal)\n", + " standardized_signal = (signal - mean) / std\n", + " return standardized_signal\n", + " \n", + " try:\n", + " if specT is None:\n", + " specT = T.Spectrogram(nperseg=256)\n", + " with open(path_to_data + filename, 'rb') as file:\n", + " tmp = np.frombuffer(file.read(), dtype=np.complex64)\n", + " signal = tmp\n", + " print(len(signal))\n", + " spectr = np.array(specT(signal)['data']['samples'][:,:figsize[0] * dpi])\n", + " mag = np.abs(signal)\n", + " mag = standartize_signal(mag)\n", + " real = signal.real\n", + " real = standartize_signal(real)\n", + "\n", + " fig2 = plt.figure(figsize = figsize)\n", + " plt.axes(ylim=(-1, 1))\n", + "\n", + " plt.plot(real, color='black')\n", + " plt.gca().set_axis_off()\n", + " plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, hspace = 0, wspace = 0)\n", + " plt.margins(0,0)\n", + " buf2 = io.BytesIO()\n", + " fig2.savefig(buf2, format=\"png\", dpi=dpi)\n", + " buf2.seek(0)\n", + " img_arr2 = np.frombuffer(buf2.getvalue(), dtype=np.uint8)\n", + " buf2.close()\n", + " img2 = cv2.imdecode(img_arr2, 1)\n", + " img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " plt.close(fig2)\n", + "\n", + " fig3 = plt.figure(figsize = figsize)\n", + " plt.axes(ylim=(-1, 1))\n", + "\n", + " plt.plot(mag, color='black')\n", + " plt.gca().set_axis_off()\n", + " plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, hspace = 0, wspace = 0)\n", + " plt.margins(0,0)\n", + " buf3 = io.BytesIO()\n", + " fig3.savefig(buf3, format=\"png\", dpi=dpi)\n", + " buf3.seek(0)\n", + " img_arr3 = np.frombuffer(buf3.getvalue(), dtype=np.uint8)\n", + " buf3.close()\n", + " img3 = cv2.imdecode(img_arr3, 1)\n", + " img3 = cv2.cvtColor(img3, cv2.COLOR_BGR2GRAY)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " plt.close(fig3)\n", + "\n", + " if resize != None:\n", + " resized_real = cv2.resize(img2, resize)\n", + " resized_mag = cv2.resize(img3, resize)\n", + " resized_spectr = cv2.resize(spectr, resize)\n", + " img = np.asarray([resized_real, resized_mag, resized_spectr], dtype=np.float32)\n", + " return img\n", + " img = np.asarray([img2, img3, spectr], dtype=np.float32)\n", + " return img\n", + " except Exception as e:\n", + " print(str(e))\n", + " return None\n", + "\n", + "def plot_signal_and_magnitude(path_to_data, filename, filename_signal):\n", + " def remove_outliers(signal, threshold):\n", + " filtered_signal = np.where(np.abs(signal) <= threshold, signal, np.nan)\n", + " return np.nan_to_num(filtered_signal)\n", + " \n", + " def standartize_signal(signal):\n", + " mean = np.mean(signal)\n", + " std = np.std(signal)\n", + " standardized_signal = (signal - mean) / std\n", + " return standardized_signal\n", + " \n", + " with open(path_to_data + filename, 'rb') as file:\n", + " signal = np.frombuffer(file.read(), dtype=np.complex64)\n", + " print(max(np.real(signal)))\n", + " print(signal[:100])\n", + " plt.figure(figsize=(12, 6))\n", + " plt.subplot(2, 1, 1)\n", + " plt.plot(remove_outliers(standartize_signal(np.real(signal)),1)[10000:], label='Real Part')\n", + " plt.plot(remove_outliers(standartize_signal(np.imag(signal)),1)[10000:], label='Imaginary Part')\n", + " plt.title('QAM Signal')\n", + " plt.legend()\n", + " plt.subplot(2, 1, 2)\n", + " plt.plot(np.abs(signal), label='Magnitude')\n", + " plt.title('Magnitude of QAM Signal')\n", + " plt.legend()\n", + " plt.tight_layout()\n", + " plt.savefig(filename_signal)\n", + " plt.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "448da74a-e0ae-44d8-9877-8dd1f257a24f", + "metadata": {}, + "outputs": [], + "source": [ + "path_to_binaries = 'C:/Users/snytk/Datasets/2400_9K'\n", + "path_to_pictures = 'C:/Users/snytk/Datasets/1200_9K_jpg'" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "ac4945a8-29c4-4da4-945f-08658953e3e5", + "metadata": {}, + "outputs": [], + "source": [ + "from tqdm import tqdm" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "6a5f4c51", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 0%| | 0/707 [00:00 13\u001b[0m img \u001b[38;5;241m=\u001b[39m \u001b[43mplot_signal_and_magnitude\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath_to_data\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfilepath\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfilename\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfile\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfilename_signal\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43msavepath_real_png\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 14\u001b[0m gc\u001b[38;5;241m.\u001b[39mcollect()\n\u001b[0;32m 15\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mDir: \u001b[39m\u001b[38;5;124m'\u001b[39m, subdir , \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m finished!\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", + "Cell \u001b[1;32mIn[13], line 97\u001b[0m, in \u001b[0;36mplot_signal_and_magnitude\u001b[1;34m(path_to_data, filename, filename_signal)\u001b[0m\n\u001b[0;32m 95\u001b[0m plt\u001b[38;5;241m.\u001b[39mlegend()\n\u001b[0;32m 96\u001b[0m plt\u001b[38;5;241m.\u001b[39mtight_layout()\n\u001b[1;32m---> 97\u001b[0m \u001b[43mplt\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msavefig\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilename_signal\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 98\u001b[0m plt\u001b[38;5;241m.\u001b[39mclose()\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\pyplot.py:1135\u001b[0m, in \u001b[0;36msavefig\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 1132\u001b[0m \u001b[38;5;66;03m# savefig default implementation has no return, so mypy is unhappy\u001b[39;00m\n\u001b[0;32m 1133\u001b[0m \u001b[38;5;66;03m# presumably this is here because subclasses can return?\u001b[39;00m\n\u001b[0;32m 1134\u001b[0m res \u001b[38;5;241m=\u001b[39m fig\u001b[38;5;241m.\u001b[39msavefig(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;66;03m# type: ignore[func-returns-value]\u001b[39;00m\n\u001b[1;32m-> 1135\u001b[0m \u001b[43mfig\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcanvas\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw_idle\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;66;03m# Need this if 'transparent=True', to reset colors.\u001b[39;00m\n\u001b[0;32m 1136\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m res\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\backend_bases.py:1893\u001b[0m, in \u001b[0;36mFigureCanvasBase.draw_idle\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1891\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_is_idle_drawing:\n\u001b[0;32m 1892\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_idle_draw_cntx():\n\u001b[1;32m-> 1893\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\backends\\backend_agg.py:388\u001b[0m, in \u001b[0;36mFigureCanvasAgg.draw\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 385\u001b[0m \u001b[38;5;66;03m# Acquire a lock on the shared font cache.\u001b[39;00m\n\u001b[0;32m 386\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtoolbar\u001b[38;5;241m.\u001b[39m_wait_cursor_for_draw_cm() \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtoolbar\n\u001b[0;32m 387\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m nullcontext()):\n\u001b[1;32m--> 388\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfigure\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 389\u001b[0m \u001b[38;5;66;03m# A GUI class may be need to update a window using this draw, so\u001b[39;00m\n\u001b[0;32m 390\u001b[0m \u001b[38;5;66;03m# don't forget to call the superclass.\u001b[39;00m\n\u001b[0;32m 391\u001b[0m \u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39mdraw()\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\artist.py:95\u001b[0m, in \u001b[0;36m_finalize_rasterization..draw_wrapper\u001b[1;34m(artist, renderer, *args, **kwargs)\u001b[0m\n\u001b[0;32m 93\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(draw)\n\u001b[0;32m 94\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdraw_wrapper\u001b[39m(artist, renderer, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m---> 95\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 96\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m renderer\u001b[38;5;241m.\u001b[39m_rasterizing:\n\u001b[0;32m 97\u001b[0m renderer\u001b[38;5;241m.\u001b[39mstop_rasterizing()\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\artist.py:72\u001b[0m, in \u001b[0;36mallow_rasterization..draw_wrapper\u001b[1;34m(artist, renderer)\u001b[0m\n\u001b[0;32m 69\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 70\u001b[0m renderer\u001b[38;5;241m.\u001b[39mstart_filter()\n\u001b[1;32m---> 72\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 73\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[0;32m 74\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\figure.py:3154\u001b[0m, in \u001b[0;36mFigure.draw\u001b[1;34m(self, renderer)\u001b[0m\n\u001b[0;32m 3151\u001b[0m \u001b[38;5;66;03m# ValueError can occur when resizing a window.\u001b[39;00m\n\u001b[0;32m 3153\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpatch\u001b[38;5;241m.\u001b[39mdraw(renderer)\n\u001b[1;32m-> 3154\u001b[0m \u001b[43mmimage\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_draw_list_compositing_images\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 3155\u001b[0m \u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43martists\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msuppressComposite\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 3157\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m sfig \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msubfigs:\n\u001b[0;32m 3158\u001b[0m sfig\u001b[38;5;241m.\u001b[39mdraw(renderer)\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\image.py:132\u001b[0m, in \u001b[0;36m_draw_list_compositing_images\u001b[1;34m(renderer, parent, artists, suppress_composite)\u001b[0m\n\u001b[0;32m 130\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m not_composite \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m has_images:\n\u001b[0;32m 131\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m a \u001b[38;5;129;01min\u001b[39;00m artists:\n\u001b[1;32m--> 132\u001b[0m \u001b[43ma\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 133\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 134\u001b[0m \u001b[38;5;66;03m# Composite any adjacent images together\u001b[39;00m\n\u001b[0;32m 135\u001b[0m image_group \u001b[38;5;241m=\u001b[39m []\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\artist.py:72\u001b[0m, in \u001b[0;36mallow_rasterization..draw_wrapper\u001b[1;34m(artist, renderer)\u001b[0m\n\u001b[0;32m 69\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 70\u001b[0m renderer\u001b[38;5;241m.\u001b[39mstart_filter()\n\u001b[1;32m---> 72\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 73\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[0;32m 74\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\axes\\_base.py:3070\u001b[0m, in \u001b[0;36m_AxesBase.draw\u001b[1;34m(self, renderer)\u001b[0m\n\u001b[0;32m 3067\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artists_rasterized:\n\u001b[0;32m 3068\u001b[0m _draw_rasterized(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfigure, artists_rasterized, renderer)\n\u001b[1;32m-> 3070\u001b[0m \u001b[43mmimage\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_draw_list_compositing_images\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 3071\u001b[0m \u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43martists\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfigure\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msuppressComposite\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 3073\u001b[0m renderer\u001b[38;5;241m.\u001b[39mclose_group(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124maxes\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 3074\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstale \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\image.py:132\u001b[0m, in \u001b[0;36m_draw_list_compositing_images\u001b[1;34m(renderer, parent, artists, suppress_composite)\u001b[0m\n\u001b[0;32m 130\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m not_composite \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m has_images:\n\u001b[0;32m 131\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m a \u001b[38;5;129;01min\u001b[39;00m artists:\n\u001b[1;32m--> 132\u001b[0m \u001b[43ma\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 133\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 134\u001b[0m \u001b[38;5;66;03m# Composite any adjacent images together\u001b[39;00m\n\u001b[0;32m 135\u001b[0m image_group \u001b[38;5;241m=\u001b[39m []\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\artist.py:72\u001b[0m, in \u001b[0;36mallow_rasterization..draw_wrapper\u001b[1;34m(artist, renderer)\u001b[0m\n\u001b[0;32m 69\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 70\u001b[0m renderer\u001b[38;5;241m.\u001b[39mstart_filter()\n\u001b[1;32m---> 72\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 73\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[0;32m 74\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\legend.py:780\u001b[0m, in \u001b[0;36mLegend.draw\u001b[1;34m(self, renderer)\u001b[0m\n\u001b[0;32m 777\u001b[0m Shadow(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlegendPatch, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_shadow_props)\u001b[38;5;241m.\u001b[39mdraw(renderer)\n\u001b[0;32m 779\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlegendPatch\u001b[38;5;241m.\u001b[39mdraw(renderer)\n\u001b[1;32m--> 780\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_legend_box\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 782\u001b[0m renderer\u001b[38;5;241m.\u001b[39mclose_group(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlegend\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 783\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstale \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\artist.py:39\u001b[0m, in \u001b[0;36m_prevent_rasterization..draw_wrapper\u001b[1;34m(artist, renderer, *args, **kwargs)\u001b[0m\n\u001b[0;32m 36\u001b[0m renderer\u001b[38;5;241m.\u001b[39mstop_rasterizing()\n\u001b[0;32m 37\u001b[0m renderer\u001b[38;5;241m.\u001b[39m_rasterizing \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[1;32m---> 39\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\offsetbox.py:412\u001b[0m, in \u001b[0;36mOffsetBox.draw\u001b[1;34m(self, renderer)\u001b[0m\n\u001b[0;32m 407\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 408\u001b[0m \u001b[38;5;124;03mUpdate the location of children if necessary and draw them\u001b[39;00m\n\u001b[0;32m 409\u001b[0m \u001b[38;5;124;03mto the given *renderer*.\u001b[39;00m\n\u001b[0;32m 410\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 411\u001b[0m bbox, offsets \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_bbox_and_child_offsets(renderer)\n\u001b[1;32m--> 412\u001b[0m px, py \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_offset\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbbox\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 413\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m c, (ox, oy) \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mzip\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_visible_children(), offsets):\n\u001b[0;32m 414\u001b[0m c\u001b[38;5;241m.\u001b[39mset_offset((px \u001b[38;5;241m+\u001b[39m ox, py \u001b[38;5;241m+\u001b[39m oy))\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\offsetbox.py:60\u001b[0m, in \u001b[0;36m_compat_get_offset..get_offset\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 56\u001b[0m params \u001b[38;5;241m=\u001b[39m _api\u001b[38;5;241m.\u001b[39mselect_matching_signature(sigs, \u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 57\u001b[0m bbox \u001b[38;5;241m=\u001b[39m (params[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mbbox\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mbbox\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01min\u001b[39;00m params \u001b[38;5;28;01melse\u001b[39;00m\n\u001b[0;32m 58\u001b[0m Bbox\u001b[38;5;241m.\u001b[39mfrom_bounds(\u001b[38;5;241m-\u001b[39mparams[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mxdescent\u001b[39m\u001b[38;5;124m\"\u001b[39m], \u001b[38;5;241m-\u001b[39mparams[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mydescent\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n\u001b[0;32m 59\u001b[0m params[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mwidth\u001b[39m\u001b[38;5;124m\"\u001b[39m], params[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mheight\u001b[39m\u001b[38;5;124m\"\u001b[39m]))\n\u001b[1;32m---> 60\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mmeth\u001b[49m\u001b[43m(\u001b[49m\u001b[43mparams\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mself\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbbox\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparams\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mrenderer\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\offsetbox.py:312\u001b[0m, in \u001b[0;36mOffsetBox.get_offset\u001b[1;34m(self, bbox, renderer)\u001b[0m\n\u001b[0;32m 297\u001b[0m \u001b[38;5;129m@_compat_get_offset\u001b[39m\n\u001b[0;32m 298\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mget_offset\u001b[39m(\u001b[38;5;28mself\u001b[39m, bbox, renderer):\n\u001b[0;32m 299\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 300\u001b[0m \u001b[38;5;124;03m Return the offset as a tuple (x, y).\u001b[39;00m\n\u001b[0;32m 301\u001b[0m \n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 309\u001b[0m \u001b[38;5;124;03m renderer : `.RendererBase` subclass\u001b[39;00m\n\u001b[0;32m 310\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m 311\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m (\n\u001b[1;32m--> 312\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_offset\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbbox\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mwidth\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbbox\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mheight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m-\u001b[39;49m\u001b[43mbbox\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mx0\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m-\u001b[39;49m\u001b[43mbbox\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43my0\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 313\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mcallable\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_offset)\n\u001b[0;32m 314\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_offset)\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\legend.py:738\u001b[0m, in \u001b[0;36mLegend._findoffset\u001b[1;34m(self, width, height, xdescent, ydescent, renderer)\u001b[0m\n\u001b[0;32m 735\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Helper function to locate the legend.\"\"\"\u001b[39;00m\n\u001b[0;32m 737\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_loc \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m: \u001b[38;5;66;03m# \"best\".\u001b[39;00m\n\u001b[1;32m--> 738\u001b[0m x, y \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_find_best_position\u001b[49m\u001b[43m(\u001b[49m\u001b[43mwidth\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mheight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 739\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_loc \u001b[38;5;129;01min\u001b[39;00m Legend\u001b[38;5;241m.\u001b[39mcodes\u001b[38;5;241m.\u001b[39mvalues(): \u001b[38;5;66;03m# Fixed location.\u001b[39;00m\n\u001b[0;32m 740\u001b[0m bbox \u001b[38;5;241m=\u001b[39m Bbox\u001b[38;5;241m.\u001b[39mfrom_bounds(\u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m0\u001b[39m, width, height)\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\legend.py:1186\u001b[0m, in \u001b[0;36mLegend._find_best_position\u001b[1;34m(self, width, height, renderer, consider)\u001b[0m\n\u001b[0;32m 1183\u001b[0m badness \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m\n\u001b[0;32m 1184\u001b[0m \u001b[38;5;66;03m# XXX TODO: If markers are present, it would be good to take them\u001b[39;00m\n\u001b[0;32m 1185\u001b[0m \u001b[38;5;66;03m# into account when checking vertex overlaps in the next line.\u001b[39;00m\n\u001b[1;32m-> 1186\u001b[0m badness \u001b[38;5;241m=\u001b[39m (\u001b[38;5;28msum\u001b[39m(legendBox\u001b[38;5;241m.\u001b[39mcount_contains(line\u001b[38;5;241m.\u001b[39mvertices)\n\u001b[0;32m 1187\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m line \u001b[38;5;129;01min\u001b[39;00m lines)\n\u001b[0;32m 1188\u001b[0m \u001b[38;5;241m+\u001b[39m legendBox\u001b[38;5;241m.\u001b[39mcount_contains(offsets)\n\u001b[0;32m 1189\u001b[0m \u001b[38;5;241m+\u001b[39m legendBox\u001b[38;5;241m.\u001b[39mcount_overlaps(bboxes)\n\u001b[0;32m 1190\u001b[0m \u001b[38;5;241m+\u001b[39m \u001b[38;5;28msum\u001b[39m(line\u001b[38;5;241m.\u001b[39mintersects_bbox(legendBox, filled\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[0;32m 1191\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m line \u001b[38;5;129;01min\u001b[39;00m lines))\n\u001b[0;32m 1192\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m badness \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[0;32m 1193\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m l, b\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\legend.py:1186\u001b[0m, in \u001b[0;36m\u001b[1;34m(.0)\u001b[0m\n\u001b[0;32m 1183\u001b[0m badness \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m\n\u001b[0;32m 1184\u001b[0m \u001b[38;5;66;03m# XXX TODO: If markers are present, it would be good to take them\u001b[39;00m\n\u001b[0;32m 1185\u001b[0m \u001b[38;5;66;03m# into account when checking vertex overlaps in the next line.\u001b[39;00m\n\u001b[1;32m-> 1186\u001b[0m badness \u001b[38;5;241m=\u001b[39m (\u001b[38;5;28msum\u001b[39m(\u001b[43mlegendBox\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcount_contains\u001b[49m\u001b[43m(\u001b[49m\u001b[43mline\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvertices\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1187\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m line \u001b[38;5;129;01min\u001b[39;00m lines)\n\u001b[0;32m 1188\u001b[0m \u001b[38;5;241m+\u001b[39m legendBox\u001b[38;5;241m.\u001b[39mcount_contains(offsets)\n\u001b[0;32m 1189\u001b[0m \u001b[38;5;241m+\u001b[39m legendBox\u001b[38;5;241m.\u001b[39mcount_overlaps(bboxes)\n\u001b[0;32m 1190\u001b[0m \u001b[38;5;241m+\u001b[39m \u001b[38;5;28msum\u001b[39m(line\u001b[38;5;241m.\u001b[39mintersects_bbox(legendBox, filled\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[0;32m 1191\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m line \u001b[38;5;129;01min\u001b[39;00m lines))\n\u001b[0;32m 1192\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m badness \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[0;32m 1193\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m l, b\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\transforms.py:583\u001b[0m, in \u001b[0;36mBboxBase.count_contains\u001b[1;34m(self, vertices)\u001b[0m\n\u001b[0;32m 580\u001b[0m vertices \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39masarray(vertices)\n\u001b[0;32m 581\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m np\u001b[38;5;241m.\u001b[39merrstate(invalid\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mignore\u001b[39m\u001b[38;5;124m'\u001b[39m):\n\u001b[0;32m 582\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m (\u001b[43m(\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmin\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m<\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mvertices\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m&\u001b[39;49m\n\u001b[1;32m--> 583\u001b[0m \u001b[43m \u001b[49m\u001b[43m(\u001b[49m\u001b[43mvertices\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m<\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmax\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mall\u001b[49m\u001b[43m(\u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39msum())\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\numpy\\core\\_methods.py:64\u001b[0m, in \u001b[0;36m_all\u001b[1;34m(a, axis, dtype, out, keepdims, where)\u001b[0m\n\u001b[0;32m 61\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_all\u001b[39m(a, axis\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, dtype\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, out\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, keepdims\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m, \u001b[38;5;241m*\u001b[39m, where\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m):\n\u001b[0;32m 62\u001b[0m \u001b[38;5;66;03m# Parsing keyword arguments is currently fairly slow, so avoid it for now\u001b[39;00m\n\u001b[0;32m 63\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m where \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[1;32m---> 64\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m umr_all(a, axis, dtype, out, keepdims)\n\u001b[0;32m 65\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m umr_all(a, axis, dtype, out, keepdims, where\u001b[38;5;241m=\u001b[39mwhere)\n", + "\u001b[1;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "size = (256,256)\n", + "if not os.path.exists(path_to_pictures):\n", + " os.mkdir(path_to_pictures)\n", + "for subdir in os.listdir(path_to_binaries):\n", + " filepath = path_to_binaries + '/' + subdir + '/'\n", + " if not os.path.exists(path_to_pictures +'/' + subdir):\n", + " os.mkdir(path_to_pictures + '/' + subdir)\n", + " files = os.listdir(filepath)\n", + " for file in tqdm(files):\n", + " savepath = path_to_pictures +'/' + subdir + '/' + file + '.npy'\n", + " savepath_real_png = path_to_pictures +'/' + subdir + '/' + file + '.png' \n", + " if not os.path.exists(savepath):\n", + " img = plot_signal_and_magnitude(path_to_data=filepath, filename=file, filename_signal= savepath_real_png)\n", + " gc.collect()\n", + " print('Dir: ', subdir , ' finished!')" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "6f226f86-5d72-4573-8af6-750128b70263", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 0/707 [00:00 19\u001b[0m \u001b[43mplt\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mimshow\u001b[49m\u001b[43m(\u001b[49m\u001b[43mimg\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 20\u001b[0m plt\u001b[38;5;241m.\u001b[39msavefig(savepath_real_png)\n\u001b[0;32m 21\u001b[0m plt\u001b[38;5;241m.\u001b[39mclf()\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\pyplot.py:3358\u001b[0m, in \u001b[0;36mimshow\u001b[1;34m(X, cmap, norm, aspect, interpolation, alpha, vmin, vmax, origin, extent, interpolation_stage, filternorm, filterrad, resample, url, data, **kwargs)\u001b[0m\n\u001b[0;32m 3337\u001b[0m \u001b[38;5;129m@_copy_docstring_and_deprecators\u001b[39m(Axes\u001b[38;5;241m.\u001b[39mimshow)\n\u001b[0;32m 3338\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mimshow\u001b[39m(\n\u001b[0;32m 3339\u001b[0m X: ArrayLike \u001b[38;5;241m|\u001b[39m PIL\u001b[38;5;241m.\u001b[39mImage\u001b[38;5;241m.\u001b[39mImage,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 3356\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs,\n\u001b[0;32m 3357\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m AxesImage:\n\u001b[1;32m-> 3358\u001b[0m __ret \u001b[38;5;241m=\u001b[39m \u001b[43mgca\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39mimshow(\n\u001b[0;32m 3359\u001b[0m X,\n\u001b[0;32m 3360\u001b[0m cmap\u001b[38;5;241m=\u001b[39mcmap,\n\u001b[0;32m 3361\u001b[0m norm\u001b[38;5;241m=\u001b[39mnorm,\n\u001b[0;32m 3362\u001b[0m aspect\u001b[38;5;241m=\u001b[39maspect,\n\u001b[0;32m 3363\u001b[0m interpolation\u001b[38;5;241m=\u001b[39minterpolation,\n\u001b[0;32m 3364\u001b[0m alpha\u001b[38;5;241m=\u001b[39malpha,\n\u001b[0;32m 3365\u001b[0m vmin\u001b[38;5;241m=\u001b[39mvmin,\n\u001b[0;32m 3366\u001b[0m vmax\u001b[38;5;241m=\u001b[39mvmax,\n\u001b[0;32m 3367\u001b[0m origin\u001b[38;5;241m=\u001b[39morigin,\n\u001b[0;32m 3368\u001b[0m extent\u001b[38;5;241m=\u001b[39mextent,\n\u001b[0;32m 3369\u001b[0m interpolation_stage\u001b[38;5;241m=\u001b[39minterpolation_stage,\n\u001b[0;32m 3370\u001b[0m filternorm\u001b[38;5;241m=\u001b[39mfilternorm,\n\u001b[0;32m 3371\u001b[0m filterrad\u001b[38;5;241m=\u001b[39mfilterrad,\n\u001b[0;32m 3372\u001b[0m resample\u001b[38;5;241m=\u001b[39mresample,\n\u001b[0;32m 3373\u001b[0m url\u001b[38;5;241m=\u001b[39murl,\n\u001b[0;32m 3374\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m({\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m\"\u001b[39m: data} \u001b[38;5;28;01mif\u001b[39;00m data \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m {}),\n\u001b[0;32m 3375\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs,\n\u001b[0;32m 3376\u001b[0m )\n\u001b[0;32m 3377\u001b[0m sci(__ret)\n\u001b[0;32m 3378\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m __ret\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\pyplot.py:2540\u001b[0m, in \u001b[0;36mgca\u001b[1;34m()\u001b[0m\n\u001b[0;32m 2538\u001b[0m \u001b[38;5;129m@_copy_docstring_and_deprecators\u001b[39m(Figure\u001b[38;5;241m.\u001b[39mgca)\n\u001b[0;32m 2539\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mgca\u001b[39m() \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Axes:\n\u001b[1;32m-> 2540\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mgcf\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgca\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\figure.py:1658\u001b[0m, in \u001b[0;36mFigureBase.gca\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 1648\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 1649\u001b[0m \u001b[38;5;124;03mGet the current Axes.\u001b[39;00m\n\u001b[0;32m 1650\u001b[0m \n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 1655\u001b[0m \u001b[38;5;124;03mwhether `.pyplot.get_fignums()` is empty.)\u001b[39;00m\n\u001b[0;32m 1656\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 1657\u001b[0m ax \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_axstack\u001b[38;5;241m.\u001b[39mcurrent()\n\u001b[1;32m-> 1658\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m ax \u001b[38;5;28;01mif\u001b[39;00m ax \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43madd_subplot\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\figure.py:782\u001b[0m, in \u001b[0;36mFigureBase.add_subplot\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 780\u001b[0m args \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtuple\u001b[39m(\u001b[38;5;28mmap\u001b[39m(\u001b[38;5;28mint\u001b[39m, \u001b[38;5;28mstr\u001b[39m(args[\u001b[38;5;241m0\u001b[39m])))\n\u001b[0;32m 781\u001b[0m projection_class, pkw \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_process_projection_requirements(\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[1;32m--> 782\u001b[0m ax \u001b[38;5;241m=\u001b[39m \u001b[43mprojection_class\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpkw\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 783\u001b[0m key \u001b[38;5;241m=\u001b[39m (projection_class, pkw)\n\u001b[0;32m 784\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_add_axes_internal(ax, key)\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\axes\\_base.py:678\u001b[0m, in \u001b[0;36m_AxesBase.__init__\u001b[1;34m(self, fig, facecolor, frameon, sharex, sharey, label, xscale, yscale, box_aspect, *args, **kwargs)\u001b[0m\n\u001b[0;32m 675\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mset_axisbelow(mpl\u001b[38;5;241m.\u001b[39mrcParams[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124maxes.axisbelow\u001b[39m\u001b[38;5;124m'\u001b[39m])\n\u001b[0;32m 677\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_rasterization_zorder \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m--> 678\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mclear\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 680\u001b[0m \u001b[38;5;66;03m# funcs used to format x and y - fall back on major formatters\u001b[39;00m\n\u001b[0;32m 681\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfmt_xdata \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\axes\\_base.py:1388\u001b[0m, in \u001b[0;36m_AxesBase.clear\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 1386\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcla()\n\u001b[0;32m 1387\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m-> 1388\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__clear\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\axes\\_base.py:1355\u001b[0m, in \u001b[0;36m_AxesBase.__clear\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 1351\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpatch\u001b[38;5;241m.\u001b[39mset_transform(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtransAxes)\n\u001b[0;32m 1353\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mset_axis_on()\n\u001b[1;32m-> 1355\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mxaxis\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset_clip_path\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpatch\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1356\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39myaxis\u001b[38;5;241m.\u001b[39mset_clip_path(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpatch)\n\u001b[0;32m 1358\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_sharex \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\_api\\deprecation.py:297\u001b[0m, in \u001b[0;36mrename_parameter..wrapper\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 292\u001b[0m warn_deprecated(\n\u001b[0;32m 293\u001b[0m since, message\u001b[38;5;241m=\u001b[39m\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mThe \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mold\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[38;5;124m parameter of \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfunc\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m() \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 294\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas been renamed \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mnew\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[38;5;124m since Matplotlib \u001b[39m\u001b[38;5;132;01m{\u001b[39;00msince\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m; support \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 295\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfor the old name will be dropped %(removal)s.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 296\u001b[0m kwargs[new] \u001b[38;5;241m=\u001b[39m kwargs\u001b[38;5;241m.\u001b[39mpop(old)\n\u001b[1;32m--> 297\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\axis.py:1110\u001b[0m, in \u001b[0;36mAxis.set_clip_path\u001b[1;34m(self, path, transform)\u001b[0m\n\u001b[0;32m 1108\u001b[0m \u001b[38;5;129m@_api\u001b[39m\u001b[38;5;241m.\u001b[39mrename_parameter(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m3.8\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mclippath\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mpath\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 1109\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mset_clip_path\u001b[39m(\u001b[38;5;28mself\u001b[39m, path, transform\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[1;32m-> 1110\u001b[0m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset_clip_path\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtransform\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1111\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m child \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmajorTicks \u001b[38;5;241m+\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mminorTicks:\n\u001b[0;32m 1112\u001b[0m child\u001b[38;5;241m.\u001b[39mset_clip_path(path, transform)\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\artist.py:802\u001b[0m, in \u001b[0;36mArtist.set_clip_path\u001b[1;34m(self, path, transform)\u001b[0m\n\u001b[0;32m 800\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m transform \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 801\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(path, Rectangle):\n\u001b[1;32m--> 802\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mclipbox \u001b[38;5;241m=\u001b[39m TransformedBbox(\u001b[43mBbox\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43munit\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m,\n\u001b[0;32m 803\u001b[0m path\u001b[38;5;241m.\u001b[39mget_transform())\n\u001b[0;32m 804\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_clippath \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 805\u001b[0m success \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\transforms.py:797\u001b[0m, in \u001b[0;36mBbox.unit\u001b[1;34m()\u001b[0m\n\u001b[0;32m 794\u001b[0m \u001b[38;5;129m@staticmethod\u001b[39m\n\u001b[0;32m 795\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21munit\u001b[39m():\n\u001b[0;32m 796\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Create a new unit `Bbox` from (0, 0) to (1, 1).\"\"\"\u001b[39;00m\n\u001b[1;32m--> 797\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mBbox\u001b[49m\u001b[43m(\u001b[49m\u001b[43m[\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\matplotlib\\transforms.py:771\u001b[0m, in \u001b[0;36mBbox.__init__\u001b[1;34m(self, points, **kwargs)\u001b[0m\n\u001b[0;32m 768\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mBbox points must be of the form \u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[0;32m 769\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m[[x0, y0], [x1, y1]]\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 770\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_points \u001b[38;5;241m=\u001b[39m points\n\u001b[1;32m--> 771\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_minpos \u001b[38;5;241m=\u001b[39m _default_minpos\u001b[38;5;241m.\u001b[39mcopy()\n\u001b[0;32m 772\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ignore \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[0;32m 773\u001b[0m \u001b[38;5;66;03m# it is helpful in some contexts to know if the bbox is a\u001b[39;00m\n\u001b[0;32m 774\u001b[0m \u001b[38;5;66;03m# default or has been mutated; we store the orig points to\u001b[39;00m\n\u001b[0;32m 775\u001b[0m \u001b[38;5;66;03m# support the mutated methods\u001b[39;00m\n", + "\u001b[1;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "size = (256,256)\n", + "if not os.path.exists(path_to_pictures):\n", + " os.mkdir(path_to_pictures)\n", + "for subdir in os.listdir(path_to_binaries):\n", + " filepath = path_to_binaries + '/' + subdir + '/'\n", + " if not os.path.exists(path_to_pictures +'/' + subdir):\n", + " os.mkdir(path_to_pictures + '/' + subdir)\n", + " files = os.listdir(filepath)\n", + " for file in tqdm(files):\n", + " savepath = path_to_pictures +'/' + subdir + '/' + file + '.npy'\n", + " savepath_real_png = path_to_pictures +'/' + subdir + '/' + file + '_real' + '.png' \n", + " savepath_imag_png = path_to_pictures +'/' + subdir + '/' + file + '_imag' + '.png' \n", + " savepath_spec_png = path_to_pictures +'/' + subdir + '/' + file + '_spec' + '.png'\n", + " if not os.path.exists(savepath):\n", + " img = sig2pic_with_spec(path_to_data=filepath, filename=file, specT=s, resize = size)\n", + " gc.collect()\n", + " try:\n", + " \n", + " plt.imshow(img[0])\n", + " plt.savefig(savepath_real_png)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " \n", + " plt.imshow(img[1])\n", + " plt.savefig(savepath_imag_png)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + "\n", + " plt.imshow(img[2])\n", + " plt.savefig(savepath_spec_png)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " \n", + " np.save(savepath, img)\n", + " \n", + " except Exception:\n", + " continue\n", + " print('Dir: ', subdir , ' finished!')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "58ff5fbd", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9f9ad366", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/train_scripts/ImageDatasetCreate_spec_imag_real_915.ipynb b/train_scripts/ImageDatasetCreate_spec_imag_real_915.ipynb new file mode 100644 index 0000000..e5a98e9 --- /dev/null +++ b/train_scripts/ImageDatasetCreate_spec_imag_real_915.ipynb @@ -0,0 +1,564 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "id": "4fdb98fc-65bb-467e-be0c-168fee9b0fca", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cuda:0\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import time\n", + "import io\n", + "import cv2\n", + "import copy\n", + "import os\n", + "from tqdm import tqdm\n", + "import torch.nn as nn\n", + "import torch\n", + "import torchvision\n", + "from torch.utils.data import Dataset\n", + "from torch import default_generator, randperm\n", + "from PIL import Image\n", + "#from torch._utils import _accumulate\n", + "import csv\n", + "from torch.utils.data.dataset import Subset\n", + "from scipy import ndimage\n", + "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n", + "print(device)\n", + "batch_size = 16\n", + "momentum=0.9\n", + "lr = 1e-3\n", + "import random\n", + "sub_sample = 0.5\n", + "import matplotlib\n", + "import gc\n", + "import torchsig.utils as u\n", + "import torchsig.transforms.transforms as T\n", + "from torchsig.transforms import functional as F\n", + "matplotlib.use('Agg')\n", + "import matplotlib as mpl\n", + "mpl.rcParams['agg.path.chunksize'] = 256*256\n", + "plt.ioff()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "4848b066-2e09-4c1c-b8fa-8e3fa84d907a", + "metadata": {}, + "outputs": [], + "source": [ + "s = T.Spectrogram(nperseg=1024)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "9267fbe1", + "metadata": {}, + "outputs": [], + "source": [ + "def sig2pic_with_spec(path_to_data, filename, specT=None,figsize=(16,16), dpi=16, resize = None):\n", + " try:\n", + " if specT is None:\n", + " specT = T.Spectrogram(nperseg=1024)\n", + " with open(path_to_data + filename, 'rb') as file:\n", + " tmp = np.frombuffer(file.read(), dtype=np.complex64)\n", + " signal = tmp\n", + "\n", + " #rint(\"vSE ok\")\n", + "\n", + " spectr = np.array(F.spectrogram(signal, fft_size=specT.fft_size, fft_stride=specT.fft_stride)[:, :figsize[0] * dpi])\n", + " #print(\"VSE OK\")\n", + " mag = np.abs(signal)\n", + " real = signal.real\n", + "\n", + " fig2 = plt.figure(figsize = figsize)\n", + " plt.axes(ylim=(-1, 1))\n", + "\n", + " plt.plot(real, color='black')\n", + " plt.gca().set_axis_off()\n", + " plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, hspace = 0, wspace = 0)\n", + " plt.margins(0,0)\n", + " buf2 = io.BytesIO()\n", + " fig2.savefig(buf2, format=\"png\", dpi=dpi)\n", + " buf2.seek(0)\n", + " img_arr2 = np.frombuffer(buf2.getvalue(), dtype=np.uint8)\n", + " buf2.close()\n", + " img2 = cv2.imdecode(img_arr2, 1)\n", + " img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " plt.close(fig2)\n", + "\n", + " fig3 = plt.figure(figsize = figsize)\n", + " plt.axes(ylim=(-1, 1))\n", + "\n", + " plt.plot(mag, color='black')\n", + " plt.gca().set_axis_off()\n", + " plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, hspace = 0, wspace = 0)\n", + " plt.margins(0,0)\n", + " buf3 = io.BytesIO()\n", + " fig3.savefig(buf3, format=\"png\", dpi=dpi)\n", + " buf3.seek(0)\n", + " img_arr3 = np.frombuffer(buf3.getvalue(), dtype=np.uint8)\n", + " buf3.close()\n", + " img3 = cv2.imdecode(img_arr3, 1)\n", + " img3 = cv2.cvtColor(img3, cv2.COLOR_BGR2GRAY)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " plt.close(fig3)\n", + "\n", + " if resize != None:\n", + " resized_real = cv2.resize(img2, resize)\n", + " resized_mag = cv2.resize(img3, resize)\n", + " resized_spectr = cv2.resize(spectr, resize)\n", + " img = np.asarray([resized_real, resized_mag, resized_spectr], dtype=np.float32)\n", + " return img\n", + " img = np.asarray([img2, img3, spectr], dtype=np.float32)\n", + " return img\n", + " except Exception as e:\n", + " print(str(e))\n", + " return None" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "448da74a-e0ae-44d8-9877-8dd1f257a24f", + "metadata": {}, + "outputs": [], + "source": [ + "selected_freq=750\n", + "\n", + "path_to_binaries = f'/mnt/nvme1/dataset/{selected_freq}'\n", + "path_to_pictures = f'/mnt/nvme1/dataset_img/noise/{selected_freq}_jpg'" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "ac4945a8-29c4-4da4-945f-08658953e3e5", + "metadata": {}, + "outputs": [], + "source": [ + "from tqdm import tqdm" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "6f226f86-5d72-4573-8af6-750128b70263", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2026-03-25_16-59-25: 0%| | 0/40 [00:00" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import time\n", + "import io\n", + "import cv2\n", + "import copy\n", + "import os\n", + "from tqdm import tqdm\n", + "import torch.nn as nn\n", + "import torch\n", + "import torchvision\n", + "from torch.utils.data import Dataset\n", + "from torch import default_generator, randperm\n", + "from PIL import Image\n", + "#from torch._utils import _accumulate\n", + "import csv\n", + "from torch.utils.data.dataset import Subset\n", + "from scipy import ndimage\n", + "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n", + "print(device)\n", + "batch_size = 16\n", + "momentum=0.9\n", + "lr = 1e-3\n", + "import random\n", + "sub_sample = 0.5\n", + "import matplotlib\n", + "import gc\n", + "matplotlib.use('Agg')\n", + "import matplotlib as mpl\n", + "mpl.rcParams['agg.path.chunksize'] = 256*256\n", + "plt.ioff()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "9267fbe1", + "metadata": {}, + "outputs": [], + "source": [ + "def sig2pic_with_spec(path_to_data, filename, figsize=(16,16), dpi=16, resize = None):\n", + " try:\n", + " array = np.load(path_to_data+filename)\n", + "\n", + " if resize != None:\n", + " resized_real = cv2.resize(array[0], resize)\n", + " resized_mag = cv2.resize(array[1], resize)\n", + " resized_spectr = cv2.resize(array[2], resize)\n", + " img = np.asarray(array, dtype=np.float32)\n", + " return img\n", + " \n", + " img = np.asarray(array, dtype=np.float32)\n", + " return img\n", + " \n", + " except Exception as e:\n", + " print(str(e))\n", + " return None" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "448da74a-e0ae-44d8-9877-8dd1f257a24f", + "metadata": {}, + "outputs": [], + "source": [ + "path_to_binaries = 'C:/Users/snytk/Lerning_NN_for_work/datasets/2.4_learning'\n", + "path_to_pictures = 'C:/Users/snytk/Lerning_NN_for_work/datasets_jpg/2.4_jpg_learning'" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "ac4945a8-29c4-4da4-945f-08658953e3e5", + "metadata": {}, + "outputs": [], + "source": [ + "from tqdm import tqdm" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "6f226f86-5d72-4573-8af6-750128b70263", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████| 8751/8751 [1:01:54<00:00, 2.36it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dir: drone finished!\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████| 11202/11202 [1:19:30<00:00, 2.35it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dir: noise finished!\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "size = (256,256)\n", + "if not os.path.exists(path_to_pictures):\n", + " os.mkdir(path_to_pictures)\n", + "for subdir in os.listdir(path_to_binaries):\n", + " filepath = path_to_binaries + '/' + subdir + '/'\n", + " if not os.path.exists(path_to_pictures +'/' + subdir):\n", + " os.mkdir(path_to_pictures + '/' + subdir)\n", + " files = os.listdir(filepath)\n", + " for file in tqdm(files):\n", + " savepath_real_png = path_to_pictures +'/' + subdir + '/' + file + '_real' + '.jpg' \n", + " savepath_imag_png = path_to_pictures +'/' + subdir + '/' + file + '_imag' + '.jpg' \n", + " savepath_spec_png = path_to_pictures +'/' + subdir + '/' + file + '_spec' + '.jpg'\n", + " if not os.path.exists(savepath_real_png):\n", + " img = sig2pic_with_spec(path_to_data=filepath, filename=file, resize = size)\n", + " gc.collect()\n", + " \n", + " try:\n", + " plt.imshow(img[0])\n", + " plt.savefig(savepath_real_png)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " \n", + " plt.imshow(img[1])\n", + " plt.savefig(savepath_imag_png)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + "\n", + " plt.imshow(img[2])\n", + " plt.savefig(savepath_spec_png)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " \n", + " except Exception:\n", + " continue\n", + " print('Dir: ', subdir , ' finished!')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cfbd309d", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/train_scripts/ImageDatasetCreate_spec_imag_real_from_npy_to_jpg_1.2.ipynb b/train_scripts/ImageDatasetCreate_spec_imag_real_from_npy_to_jpg_1.2.ipynb new file mode 100644 index 0000000..e5a0fed --- /dev/null +++ b/train_scripts/ImageDatasetCreate_spec_imag_real_from_npy_to_jpg_1.2.ipynb @@ -0,0 +1,360 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "4fdb98fc-65bb-467e-be0c-168fee9b0fca", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cuda:0\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import time\n", + "import io\n", + "import cv2\n", + "import copy\n", + "import os\n", + "from tqdm import tqdm\n", + "import torch.nn as nn\n", + "import torch\n", + "import torchvision\n", + "from torch.utils.data import Dataset\n", + "from torch import default_generator, randperm\n", + "from PIL import Image\n", + "#from torch._utils import _accumulate\n", + "import csv\n", + "from torch.utils.data.dataset import Subset\n", + "from scipy import ndimage\n", + "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n", + "print(device)\n", + "batch_size = 16\n", + "momentum=0.9\n", + "lr = 1e-3\n", + "import random\n", + "sub_sample = 0.5\n", + "import matplotlib\n", + "import gc\n", + "matplotlib.use('Agg')\n", + "import matplotlib as mpl\n", + "mpl.rcParams['agg.path.chunksize'] = 256*256\n", + "plt.ioff()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "9267fbe1", + "metadata": {}, + "outputs": [], + "source": [ + "def sig2pic_with_spec(path_to_data, filename, figsize=(16,16), dpi=16, resize = None):\n", + " try:\n", + " array = np.load(path_to_data+filename)\n", + "\n", + " if resize != None:\n", + " resized_real = cv2.resize(array[0], resize)\n", + " resized_mag = cv2.resize(array[1], resize)\n", + " resized_spectr = cv2.resize(array[2], resize)\n", + " img = np.asarray(array, dtype=np.float32)\n", + " return img\n", + " \n", + " img = np.asarray(array, dtype=np.float32)\n", + " return img\n", + " \n", + " except Exception as e:\n", + " print(str(e))\n", + " return None\n", + " \n", + " \n", + " \n", + "\n", + "def pre_func_ensemble(data=None, src ='', ind_inference=0):\n", + " try:\n", + " import matplotlib.pyplot as plt\n", + " matplotlib.use('Agg')\n", + " plt.ioff()\n", + "\n", + " figsize = (16, 16)\n", + " dpi = 16\n", + "\n", + " signal = np.vectorize(complex)(data[0], data[1])\n", + " #np.save(src + '_inference_2400_' + str(ind_inference) + '.npy', signal)\n", + " spec = transform.Spectrogram(nperseg=256)\n", + " spectr = np.array(spec(signal)[:,:figsize[0] * dpi])\n", + " fig1 = plt.figure(figsize = figsize)\n", + " plt.axes(ylim=(-1, 1))\n", + " sigr = signal.real\n", + " sigi = signal.imag\n", + " \n", + " plt.plot(sigr, color='black')\n", + " plt.gca().set_axis_off()\n", + " plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, hspace = 0, wspace = 0)\n", + " plt.margins(0,0)\n", + " buf1 = io.BytesIO()\n", + " fig1.savefig(buf1, format=\"png\", dpi=dpi)\n", + " buf1.seek(0)\n", + " img_arr1 = np.frombuffer(buf1.getvalue(), dtype=np.uint8)\n", + " buf1.close()\n", + " img1 = cv2.imdecode(img_arr1, 1)\n", + " img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " plt.close(fig1)\n", + "\n", + " fig2 = plt.figure(figsize = figsize)\n", + " plt.axes(ylim=(-1, 1))\n", + " sigr = signal.real\n", + " sigi = signal.imag\n", + " \n", + " plt.plot(sigi, color='black')\n", + " plt.gca().set_axis_off()\n", + " plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, hspace = 0, wspace = 0)\n", + " plt.margins(0,0)\n", + " buf = io.BytesIO()\n", + " fig2.savefig(buf, format=\"png\", dpi=dpi)\n", + " buf.seek(0)\n", + " img_arr = np.frombuffer(buf.getvalue(), dtype=np.uint8)\n", + " buf.close()\n", + " img = cv2.imdecode(img_arr, 1)\n", + " img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " plt.close(fig2)\n", + "\n", + " img = np.array([img1, img2, spectr])\n", + " \n", + " cv2.destroyAllWindows()\n", + " del signal\n", + " del spec\n", + " del spectr\n", + " del img1\n", + " del img2\n", + " del sigr\n", + " del sigi\n", + " del buf\n", + " del buf1\n", + " del img_arr\n", + " del img_arr1\n", + " cv2.destroyAllWindows()\n", + " gc.collect()\n", + "\n", + " print('Подготовка данных завершена')\n", + " print()\n", + " return img\n", + "\n", + " except Exception as e:\n", + " print(str(e))\n", + " return None\n", + "\n", + "\n", + "def build_func_ensemble(file_model='', file_config='', num_classes=None):\n", + " try:\n", + " import matplotlib.pyplot as plt\n", + " matplotlib.use('Agg')\n", + " plt.ioff()\n", + " torch.cuda.empty_cache()\n", + " model1 = models.resnet18(pretrained=False)\n", + " model2 = models.resnet50(pretrained=False)\n", + " model3 = models.resnet101(pretrained=False)\n", + "\n", + " num_classes = 2\n", + "\n", + " model1.fc = nn.Linear(model1.fc.in_features, num_classes)\n", + " model2.fc = nn.Linear(model2.fc.in_features, num_classes)\n", + " model3.fc = nn.Linear(model3.fc.in_features, num_classes)\n", + "\n", + " class Ensemble(nn.Module):\n", + " def __init__(self, model1, model2, model3):\n", + " super(Ensemble, self).__init__()\n", + " self.model1 = model1\n", + " self.model2 = model2\n", + " self.model3 = model3\n", + " self.fc = nn.Linear(3 * num_classes, num_classes)\n", + "\n", + " def forward(self, x):\n", + " x1 = self.model1(x)\n", + " x2 = self.model2(x)\n", + " x3 = self.model3(x)\n", + " x = torch.cat((x1, x2, x3), dim=1)\n", + " x = self.fc(x)\n", + " return x\n", + "\n", + " model = Ensemble(model1, model2, model3)\n", + "\n", + " device = 'cuda' if torch.cuda.is_available() else 'cpu'\n", + " if device != 'cpu':\n", + " model = model.to(device)\n", + " model.load_state_dict(torch.load(file_model, map_location=device))\n", + " model.eval()\n", + "\n", + " cv2.destroyAllWindows()\n", + " del model1\n", + " del model2\n", + " del model3\n", + " gc.collect()\n", + "\n", + " print('Инициализация модели завершена')\n", + " print()\n", + " return model\n", + "\n", + " except Exception as exc:\n", + " print(str(exc))\n", + " return None\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "448da74a-e0ae-44d8-9877-8dd1f257a24f", + "metadata": {}, + "outputs": [], + "source": [ + "path_to_binaries = 'C:/Users/snytk/Lerning_NN_for_work/datasets/1.2_learning'\n", + "path_to_pictures = 'C:/Users/snytk/Lerning_NN_for_work/datasets_jpg/1.2_jpg_learning'" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "ac4945a8-29c4-4da4-945f-08658953e3e5", + "metadata": {}, + "outputs": [], + "source": [ + "from tqdm import tqdm" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "6f226f86-5d72-4573-8af6-750128b70263", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 963/963 [06:36<00:00, 2.43it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dir: drone finished!\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1724/1724 [11:41<00:00, 2.46it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dir: noise finished!\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "size = (256,256)\n", + "if not os.path.exists(path_to_pictures):\n", + " os.mkdir(path_to_pictures)\n", + "for subdir in os.listdir(path_to_binaries):\n", + " filepath = path_to_binaries + '/' + subdir + '/'\n", + " if not os.path.exists(path_to_pictures +'/' + subdir):\n", + " os.mkdir(path_to_pictures + '/' + subdir)\n", + " files = os.listdir(filepath)\n", + " for file in tqdm(files):\n", + " savepath_real_png = path_to_pictures +'/' + subdir + '/' + file + '_real' + '.jpg' \n", + " savepath_imag_png = path_to_pictures +'/' + subdir + '/' + file + '_imag' + '.jpg' \n", + " savepath_spec_png = path_to_pictures +'/' + subdir + '/' + file + '_spec' + '.jpg'\n", + " if not os.path.exists(savepath_real_png):\n", + " img = sig2pic_with_spec(path_to_data=filepath, filename=file, resize = size)\n", + " gc.collect()\n", + " \n", + " try:\n", + " plt.imshow(img[0])\n", + " plt.savefig(savepath_real_png)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " \n", + " plt.imshow(img[1])\n", + " plt.savefig(savepath_imag_png)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + "\n", + " plt.imshow(img[2])\n", + " plt.savefig(savepath_spec_png)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " \n", + " except Exception:\n", + " continue\n", + " print('Dir: ', subdir , ' finished!')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "871d7ab6", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/train_scripts/ImageDatasetCreate_spec_imag_real_from_npy_to_jpg_2.4.ipynb b/train_scripts/ImageDatasetCreate_spec_imag_real_from_npy_to_jpg_2.4.ipynb new file mode 100644 index 0000000..8fbe1f7 --- /dev/null +++ b/train_scripts/ImageDatasetCreate_spec_imag_real_from_npy_to_jpg_2.4.ipynb @@ -0,0 +1,194 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "4fdb98fc-65bb-467e-be0c-168fee9b0fca", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cuda:0\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import time\n", + "import io\n", + "import cv2\n", + "import copy\n", + "import os\n", + "from tqdm import tqdm\n", + "import torch.nn as nn\n", + "import torch\n", + "import torchvision\n", + "from torch.utils.data import Dataset\n", + "from torch import default_generator, randperm\n", + "from PIL import Image\n", + "#from torch._utils import _accumulate\n", + "import csv\n", + "from torch.utils.data.dataset import Subset\n", + "from scipy import ndimage\n", + "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n", + "print(device)\n", + "batch_size = 16\n", + "momentum=0.9\n", + "lr = 1e-3\n", + "import random\n", + "sub_sample = 0.5\n", + "import matplotlib\n", + "import gc\n", + "matplotlib.use('Agg')\n", + "import matplotlib as mpl\n", + "mpl.rcParams['agg.path.chunksize'] = 256*256\n", + "plt.ioff()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "9267fbe1", + "metadata": {}, + "outputs": [], + "source": [ + "def sig2pic_with_spec(path_to_data, filename, figsize=(16,16), dpi=16, resize = None):\n", + " try:\n", + " array = np.load(path_to_data+filename)\n", + "\n", + " if resize != None:\n", + " resized_real = cv2.resize(array[0], resize)\n", + " resized_mag = cv2.resize(array[1], resize)\n", + " resized_spectr = cv2.resize(array[2], resize)\n", + " img = np.asarray(array, dtype=np.float32)\n", + " return img\n", + " \n", + " img = np.asarray(array, dtype=np.float32)\n", + " return img\n", + " \n", + " except Exception as e:\n", + " print(str(e))\n", + " return None" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "448da74a-e0ae-44d8-9877-8dd1f257a24f", + "metadata": {}, + "outputs": [], + "source": [ + "path_to_binaries = 'C:/Users/snytk/Lerning_NN_for_work/datasets/2.4_learning'\n", + "path_to_pictures = 'C:/Users/snytk/Lerning_NN_for_work/datasets_jpg/2.4_jpg_learning'" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "ac4945a8-29c4-4da4-945f-08658953e3e5", + "metadata": {}, + "outputs": [], + "source": [ + "from tqdm import tqdm" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6f226f86-5d72-4573-8af6-750128b70263", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 2%|█▍ | 158/8751 [01:06<1:01:14, 2.34it/s]" + ] + } + ], + "source": [ + "size = (256,256)\n", + "if not os.path.exists(path_to_pictures):\n", + " os.mkdir(path_to_pictures)\n", + "for subdir in os.listdir(path_to_binaries):\n", + " filepath = path_to_binaries + '/' + subdir + '/'\n", + " if not os.path.exists(path_to_pictures +'/' + subdir):\n", + " os.mkdir(path_to_pictures + '/' + subdir)\n", + " files = os.listdir(filepath)\n", + " for file in tqdm(files):\n", + " savepath_real_png = path_to_pictures +'/' + subdir + '/' + file + '_real' + '.jpg' \n", + " savepath_imag_png = path_to_pictures +'/' + subdir + '/' + file + '_imag' + '.jpg' \n", + " savepath_spec_png = path_to_pictures +'/' + subdir + '/' + file + '_spec' + '.jpg'\n", + " if not os.path.exists(savepath_real_png):\n", + " img = sig2pic_with_spec(path_to_data=filepath, filename=file, resize = size)\n", + " gc.collect()\n", + " \n", + " try:\n", + " plt.imshow(img[0])\n", + " plt.savefig(savepath_real_png)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " \n", + " plt.imshow(img[1])\n", + " plt.savefig(savepath_imag_png)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + "\n", + " plt.imshow(img[2])\n", + " plt.savefig(savepath_spec_png)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " \n", + " except Exception:\n", + " continue\n", + " print('Dir: ', subdir , ' finished!')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "871d7ab6", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/train_scripts/ImageDatasetCreate_spec_imag_real_from_npy_to_jpg_2_4_Copy1.ipynb b/train_scripts/ImageDatasetCreate_spec_imag_real_from_npy_to_jpg_2_4_Copy1.ipynb new file mode 100644 index 0000000..8fbe1f7 --- /dev/null +++ b/train_scripts/ImageDatasetCreate_spec_imag_real_from_npy_to_jpg_2_4_Copy1.ipynb @@ -0,0 +1,194 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "4fdb98fc-65bb-467e-be0c-168fee9b0fca", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cuda:0\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import time\n", + "import io\n", + "import cv2\n", + "import copy\n", + "import os\n", + "from tqdm import tqdm\n", + "import torch.nn as nn\n", + "import torch\n", + "import torchvision\n", + "from torch.utils.data import Dataset\n", + "from torch import default_generator, randperm\n", + "from PIL import Image\n", + "#from torch._utils import _accumulate\n", + "import csv\n", + "from torch.utils.data.dataset import Subset\n", + "from scipy import ndimage\n", + "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n", + "print(device)\n", + "batch_size = 16\n", + "momentum=0.9\n", + "lr = 1e-3\n", + "import random\n", + "sub_sample = 0.5\n", + "import matplotlib\n", + "import gc\n", + "matplotlib.use('Agg')\n", + "import matplotlib as mpl\n", + "mpl.rcParams['agg.path.chunksize'] = 256*256\n", + "plt.ioff()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "9267fbe1", + "metadata": {}, + "outputs": [], + "source": [ + "def sig2pic_with_spec(path_to_data, filename, figsize=(16,16), dpi=16, resize = None):\n", + " try:\n", + " array = np.load(path_to_data+filename)\n", + "\n", + " if resize != None:\n", + " resized_real = cv2.resize(array[0], resize)\n", + " resized_mag = cv2.resize(array[1], resize)\n", + " resized_spectr = cv2.resize(array[2], resize)\n", + " img = np.asarray(array, dtype=np.float32)\n", + " return img\n", + " \n", + " img = np.asarray(array, dtype=np.float32)\n", + " return img\n", + " \n", + " except Exception as e:\n", + " print(str(e))\n", + " return None" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "448da74a-e0ae-44d8-9877-8dd1f257a24f", + "metadata": {}, + "outputs": [], + "source": [ + "path_to_binaries = 'C:/Users/snytk/Lerning_NN_for_work/datasets/2.4_learning'\n", + "path_to_pictures = 'C:/Users/snytk/Lerning_NN_for_work/datasets_jpg/2.4_jpg_learning'" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "ac4945a8-29c4-4da4-945f-08658953e3e5", + "metadata": {}, + "outputs": [], + "source": [ + "from tqdm import tqdm" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6f226f86-5d72-4573-8af6-750128b70263", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 2%|█▍ | 158/8751 [01:06<1:01:14, 2.34it/s]" + ] + } + ], + "source": [ + "size = (256,256)\n", + "if not os.path.exists(path_to_pictures):\n", + " os.mkdir(path_to_pictures)\n", + "for subdir in os.listdir(path_to_binaries):\n", + " filepath = path_to_binaries + '/' + subdir + '/'\n", + " if not os.path.exists(path_to_pictures +'/' + subdir):\n", + " os.mkdir(path_to_pictures + '/' + subdir)\n", + " files = os.listdir(filepath)\n", + " for file in tqdm(files):\n", + " savepath_real_png = path_to_pictures +'/' + subdir + '/' + file + '_real' + '.jpg' \n", + " savepath_imag_png = path_to_pictures +'/' + subdir + '/' + file + '_imag' + '.jpg' \n", + " savepath_spec_png = path_to_pictures +'/' + subdir + '/' + file + '_spec' + '.jpg'\n", + " if not os.path.exists(savepath_real_png):\n", + " img = sig2pic_with_spec(path_to_data=filepath, filename=file, resize = size)\n", + " gc.collect()\n", + " \n", + " try:\n", + " plt.imshow(img[0])\n", + " plt.savefig(savepath_real_png)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " \n", + " plt.imshow(img[1])\n", + " plt.savefig(savepath_imag_png)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + "\n", + " plt.imshow(img[2])\n", + " plt.savefig(savepath_spec_png)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " \n", + " except Exception:\n", + " continue\n", + " print('Dir: ', subdir , ' finished!')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "871d7ab6", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/train_scripts/ImageDatasetCreate_spec_imag_real_from_npy_to_jpg_915.ipynb b/train_scripts/ImageDatasetCreate_spec_imag_real_from_npy_to_jpg_915.ipynb new file mode 100644 index 0000000..635dbf9 --- /dev/null +++ b/train_scripts/ImageDatasetCreate_spec_imag_real_from_npy_to_jpg_915.ipynb @@ -0,0 +1,236 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "4fdb98fc-65bb-467e-be0c-168fee9b0fca", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cuda:0\n", + "['Solarize_Light2', '_classic_test_patch', '_mpl-gallery', '_mpl-gallery-nogrid', 'bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn-v0_8', 'seaborn-v0_8-bright', 'seaborn-v0_8-colorblind', 'seaborn-v0_8-dark', 'seaborn-v0_8-dark-palette', 'seaborn-v0_8-darkgrid', 'seaborn-v0_8-deep', 'seaborn-v0_8-muted', 'seaborn-v0_8-notebook', 'seaborn-v0_8-paper', 'seaborn-v0_8-pastel', 'seaborn-v0_8-poster', 'seaborn-v0_8-talk', 'seaborn-v0_8-ticks', 'seaborn-v0_8-white', 'seaborn-v0_8-whitegrid', 'tableau-colorblind10']\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import time\n", + "import io\n", + "import cv2\n", + "import copy\n", + "import os\n", + "from tqdm import tqdm\n", + "import torch.nn as nn\n", + "import torch\n", + "import torchvision\n", + "from torch.utils.data import Dataset\n", + "from torch import default_generator, randperm\n", + "from PIL import Image\n", + "#from torch._utils import _accumulate\n", + "import csv\n", + "from torch.utils.data.dataset import Subset\n", + "from scipy import ndimage\n", + "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n", + "print(device)\n", + "batch_size = 16\n", + "momentum=0.9\n", + "lr = 1e-3\n", + "import random\n", + "sub_sample = 0.5\n", + "import matplotlib\n", + "import gc\n", + "matplotlib.use('Agg')\n", + "import matplotlib as mpl\n", + "mpl.rcParams['agg.path.chunksize'] = 256*256\n", + "#plt.style.use('mplstyle')\n", + "plt.style.use('ggplot')\n", + "plt.grid(None)\n", + "plt.rcParams[\"axes.grid\"] = False\n", + "print(plt.style.available)\n", + "plt.ioff()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "9267fbe1", + "metadata": {}, + "outputs": [], + "source": [ + "def sig2pic_with_spec(path_to_data, filename, figsize=(16,16), dpi=16, resize = None):\n", + " try:\n", + " array = np.load(path_to_data+filename)\n", + "\n", + " if resize != None:\n", + " resized_real = cv2.resize(array[0], resize)\n", + " resized_mag = cv2.resize(array[1], resize)\n", + " resized_spectr = cv2.resize(array[2], resize)\n", + " img = np.asarray(array, dtype=np.float32)\n", + " return img\n", + " \n", + " img = np.asarray(array, dtype=np.float32)\n", + " return img\n", + " \n", + " except Exception as e:\n", + " print(str(e))\n", + " return None" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "448da74a-e0ae-44d8-9877-8dd1f257a24f", + "metadata": {}, + "outputs": [], + "source": [ + "path_to_binaries = 'C:/Users/snytk/Lerning_NN_for_work/datasets/915_learning'\n", + "path_to_pictures = 'C:/Users/snytk/Lerning_NN_for_work/datasets_jpg/915_jpg_learning'" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "ac4945a8-29c4-4da4-945f-08658953e3e5", + "metadata": {}, + "outputs": [], + "source": [ + "from tqdm import tqdm" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "6f226f86-5d72-4573-8af6-750128b70263", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 856/856 [10:50<00:00, 1.32it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dir: drone finished!\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 627/627 [08:40<00:00, 1.20it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dir: noise finished!\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "size = (256,256)\n", + "if not os.path.exists(path_to_pictures):\n", + " os.mkdir(path_to_pictures)\n", + "for subdir in os.listdir(path_to_binaries):\n", + " filepath = path_to_binaries + '/' + subdir + '/'\n", + " if not os.path.exists(path_to_pictures +'/' + subdir):\n", + " os.mkdir(path_to_pictures + '/' + subdir)\n", + " files = os.listdir(filepath)\n", + " for file in tqdm(files):\n", + " savepath_real_png = path_to_pictures +'/' + subdir + '/' + file + '_real' + '.jpg' \n", + " savepath_imag_png = path_to_pictures +'/' + subdir + '/' + file + '_imag' + '.jpg' \n", + " savepath_spec_png = path_to_pictures +'/' + subdir + '/' + file + '_spec' + '.jpg'\n", + " if not os.path.exists(savepath_real_png):\n", + " img = sig2pic_with_spec(path_to_data=filepath, filename=file, resize = size)\n", + " gc.collect()\n", + " \n", + " try:\n", + " plt.imshow(img[0])\n", + " plt.savefig(savepath_real_png)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " \n", + " plt.imshow(img[1])\n", + " plt.savefig(savepath_imag_png)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + "\n", + " plt.imshow(img[2])\n", + " plt.savefig(savepath_spec_png)\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " \n", + " except Exception:\n", + " continue\n", + " print('Dir: ', subdir , ' finished!')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "871d7ab6", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e080bb07", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/train_scripts/Jetson_пароли.txt b/train_scripts/Jetson_пароли.txt new file mode 100644 index 0000000..375fa26 --- /dev/null +++ b/train_scripts/Jetson_пароли.txt @@ -0,0 +1,7 @@ +Для ящика на выставки: +aleksandr@192.168.3.85 19751975 +aleksandr@192.168.3.86 19751975 + +Для ящика на Липецк: +aleksandr@192.168.3.85 19751975 +aleksandr@192.168.3.86 19751975 diff --git a/train_scripts/PTH_to_PT.ipynb b/train_scripts/PTH_to_PT.ipynb new file mode 100644 index 0000000..097af24 --- /dev/null +++ b/train_scripts/PTH_to_PT.ipynb @@ -0,0 +1,55 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "a89c0273", + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "import torchvision\n", + "\n", + "def convert_pth_to_pt(pth_path, pt_path, model_class):\n", + " state_dict = torch.load(pth_path)\n", + " model = model_class()\n", + " model.load_state_dict(state_dict)\n", + " torch.save(model, pt_path)\n", + " print(f'Model saved to {pt_path}')\n", + "\n", + "class ModelClass(torch.nn.Module):\n", + " def __init__(self):\n", + " super(ModelClass, self).__init__()\n", + "\n", + " def forward(self, x):\n", + " pass\n", + "\n", + "pth_path = 'model.pth'\n", + "pt_path = 'model.pt'\n", + "\n", + "convert_pth_to_pt(pth_path, pt_path, ModelClass)\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/train_scripts/Training_models.ipynb b/train_scripts/Training_models.ipynb new file mode 100644 index 0000000..08d3eef --- /dev/null +++ b/train_scripts/Training_models.ipynb @@ -0,0 +1,463 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "5a13ad6b-56c9-4381-b376-1765f6dd7553", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Импортирование библиотек" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "7311cb4a-5bf3-4268-b431-43eea10e9ed6", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cuda\n" + ] + }, + { + "ename": "error", + "evalue": "OpenCV(4.10.0) D:\\a\\opencv-python\\opencv-python\\opencv\\modules\\highgui\\src\\window.cpp:1295: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvDestroyAllWindows'\n", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31merror\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[1], line 37\u001b[0m\n\u001b[0;32m 35\u001b[0m \u001b[38;5;28mprint\u001b[39m(device)\n\u001b[0;32m 36\u001b[0m torch\u001b[38;5;241m.\u001b[39mcuda\u001b[38;5;241m.\u001b[39mempty_cache()\n\u001b[1;32m---> 37\u001b[0m \u001b[43mcv2\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdestroyAllWindows\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 38\u001b[0m gc\u001b[38;5;241m.\u001b[39mcollect()\n", + "\u001b[1;31merror\u001b[0m: OpenCV(4.10.0) D:\\a\\opencv-python\\opencv-python\\opencv\\modules\\highgui\\src\\window.cpp:1295: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvDestroyAllWindows'\n" + ] + } + ], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "from torch.utils.data import Dataset, DataLoader\n", + "from torch import default_generator, randperm\n", + "from torch.utils.data.dataset import Subset\n", + "import torchvision.transforms as transforms\n", + "from torchvision.io import read_image\n", + "from importlib import import_module\n", + "import matplotlib.pyplot as plt\n", + "from torchvision import models\n", + "import torch, torchvision\n", + "from pathlib import Path\n", + "from PIL import Image\n", + "import torch.nn as nn\n", + "from tqdm import tqdm\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib\n", + "import os, shutil\n", + "import mlconfig\n", + "import random\n", + "import shutil\n", + "import timeit\n", + "import copy\n", + "import time\n", + "import cv2\n", + "import csv\n", + "import sys\n", + "import io\n", + "import gc\n", + "\n", + "plt.rcParams[\"savefig.bbox\"] = 'tight'\n", + "torch.manual_seed(1)\n", + "#matplotlib.use('Agg')\n", + "device = 'cuda' if torch.cuda.is_available() else 'cpu'\n", + "print(device)\n", + "torch.cuda.empty_cache()\n", + "cv2.destroyAllWindows()\n", + "gc.collect()" + ] + }, + { + "cell_type": "markdown", + "id": "384de097-82c6-41f5-bda9-b2f54bc99593", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Подготовка и обучение детектирование" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "46e4dc99-6994-4fee-a32e-f3983bd991bd", + "metadata": {}, + "outputs": [], + "source": [ + "def prepare_and_learning_detection(num_classes, num_samples, path_dataset, model_name, config_name, model):\n", + " num_samples_per_class = num_samples // num_classes\n", + "\n", + " #----------Создаём папку для сохранения результатов обучения--------------\n", + " \n", + " ind = 1\n", + " while True:\n", + " if os.path.exists(\"models/\" + model_name + str(ind)):\n", + " ind += 1\n", + " else:\n", + " os.mkdir(\"models/\" + model_name + str(ind))\n", + " path_res = \"models/\" + model_name + str(ind) + '/'\n", + " break\n", + " \n", + " #----------Создаём файл dataset.csv для обучения--------------\n", + " \n", + " pd_columns = ['file_name']\n", + " df = pd.DataFrame(columns=pd_columns)\n", + " \n", + " subdirs = os.listdir(path_dataset)\n", + " for subdir in subdirs:\n", + " files = os.listdir(path_dataset + subdir + '/')\n", + " num_samples_per_class = min(num_samples_per_class, len(files))\n", + " for subdir in subdirs:\n", + " files = os.listdir(path_dataset + subdir + '/')\n", + " random.shuffle(files)\n", + " files_to_process = files[:num_samples_per_class]\n", + " for file in files_to_process:\n", + " row = pd.DataFrame({pd_columns[0]: [str(path_dataset + subdir + '/' + file)]})\n", + " df = pd.concat([df, row], ignore_index=True)\n", + " \n", + " df.to_csv(path_res + 'dataset.csv', index=False)\n", + " \n", + " #----------Импортируем параметры для обучения--------------\n", + " \n", + " def load_function(attr):\n", + " module_, func = attr.rsplit('.', maxsplit=1)\n", + " return getattr(import_module(module_), func)\n", + " \n", + " config = mlconfig.load('config_' + config_name + '.yaml')\n", + " \n", + " #----------Создаём класс датасета--------------\n", + " \n", + " class MyDataset(Dataset):\n", + " def __init__(self, path_dataset, csv_file):\n", + " data=[]\n", + " with open(path_dataset + csv_file, newline='') as csvfile:\n", + " reader = csv.reader(csvfile, delimiter=' ', quotechar='|')\n", + " for row in list(reader)[1:]:\n", + " row = str(row)\n", + " data.append(row[2: len(row)-2])\n", + " self.sig_filenames = data\n", + " self.path_dataset = path_dataset\n", + " \n", + " def __len__(self):\n", + " return len(self.sig_filenames)\n", + " \n", + " def __getitem__(self, idx):\n", + " data_file = np.asarray(np.load(self.sig_filenames[idx], 'r+'), dtype=np.float32)\n", + " if 'drone' in list(self.sig_filenames[idx].split('/')):\n", + " label = torch.tensor(0)\n", + " if 'noise' in list(self.sig_filenames[idx].split('/')):\n", + " label = torch.tensor(1)\n", + " return data_file, label\n", + " \n", + " #----------Создаём датасет--------------\n", + " \n", + " dataset = MyDataset(path_dataset=path_res, csv_file='dataset.csv')\n", + " train_set, valid_set = torch.utils.data.random_split(dataset, [0.7, 0.3], generator=torch.Generator().manual_seed(42))\n", + " batch_size = config.batch_size\n", + " train_dataloader = torch.utils.data.DataLoader(train_set, batch_size=batch_size, shuffle=True, drop_last=True)\n", + " valid_dataloader = torch.utils.data.DataLoader(valid_set, batch_size=batch_size, shuffle=True, drop_last=True)\n", + " \n", + " dataloaders = {}\n", + " dataloaders['train'] = train_dataloader\n", + " dataloaders['val'] = valid_dataloader\n", + " dataset_sizes = {}\n", + " dataset_sizes['train'] = len(train_set)\n", + " dataset_sizes['val'] = len(valid_set)\n", + "\n", + " #----------Обучаем модель--------------\n", + "\n", + " val_loss = []\n", + " val_acc = []\n", + " train_loss = []\n", + " train_acc = []\n", + " epochs = config.epoch\n", + " \n", + " best_acc = 0.0\n", + " best_model = copy.deepcopy(model.state_dict())\n", + " limit = config.limit\n", + " epoch_limit = epochs\n", + " \n", + " start = timeit.default_timer()\n", + " for epoch in range(1, epochs+1):\n", + " print(f\"Epoch : {epoch}\\n\")\n", + " dataloader = None\n", + " \n", + " for phase in ['train', 'val']:\n", + " running_loss = 0.0\n", + " running_corrects = 0\n", + " \n", + " for (img, label) in tqdm(dataloaders[phase]):\n", + " img, label = img.to(device), label.to(device)\n", + " optimizer.zero_grad()\n", + " \n", + " with torch.set_grad_enabled(phase == 'train'):\n", + " output = model(img)\n", + " _, pred = torch.max(output.data, 1)\n", + " loss = criterion(output, label)\n", + " if phase=='train' :\n", + " loss.backward()\n", + " optimizer.step()\n", + " \n", + " running_loss += loss.item() * img.size(0)\n", + " running_corrects += torch.sum(pred == label.data)\n", + " \n", + " epoch_loss = running_loss / dataset_sizes[phase]\n", + " epoch_acc = running_corrects.double() / dataset_sizes[phase]\n", + " \n", + " print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc))\n", + " \n", + " if phase=='train' :\n", + " train_loss.append(epoch_loss)\n", + " train_acc.append(epoch_acc)\n", + " else :\n", + " val_loss.append(epoch_loss)\n", + " val_acc.append(epoch_acc)\n", + " if val_acc[-1] > best_acc :\n", + " ind_limit = 0\n", + " best_acc = val_acc[-1]\n", + " best_model = copy.deepcopy(model.state_dict())\n", + " torch.save(best_model, path_res + model_name + '.pth')\n", + " else:\n", + " ind_limit += 1\n", + " \n", + " if ind_limit >= limit:\n", + " break\n", + " \n", + " if ind_limit >= limit:\n", + " epoch_limit = epoch\n", + " break\n", + " \n", + " print()\n", + " \n", + " end = timeit.default_timer()\n", + " print(f\"Total time elapsed = {end - start} seconds\")\n", + " epoch_limit += 1\n", + " \n", + " #----------Вывод графиков и сохранение результатов обучения--------------\n", + " \n", + " train_acc = np.asarray(list(map(lambda x: x.item(), train_acc)))\n", + " val_acc = np.asarray(list(map(lambda x: x.item(), val_acc)))\n", + " \n", + " np.save(path_res+'train_acc.npy', train_acc)\n", + " np.save(path_res+'val_acc.npy', val_acc)\n", + " np.save(path_res+'train_loss.npy', train_loss)\n", + " np.save(path_res+'val_loss.npy', val_loss)\n", + " \n", + " plt.figure()\n", + " plt.plot(range(1,epoch_limit), train_loss, color='blue')\n", + " plt.plot(range(1,epoch_limit), val_loss, color='red')\n", + " plt.xlabel('Epoch')\n", + " plt.ylabel('Loss')\n", + " plt.title('Loss Curve')\n", + " plt.legend(['Train Loss', 'Validation Loss'])\n", + " plt.show()\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " \n", + " plt.figure()\n", + " plt.plot(range(1,epoch_limit), train_acc, color='blue')\n", + " plt.plot(range(1,epoch_limit), val_acc, color='red')\n", + " plt.xlabel('Epoch')\n", + " plt.ylabel('Accuracy')\n", + " plt.title('Accuracy Curve')\n", + " plt.legend(['Train Accuracy', 'Validation Accuracy'])\n", + " plt.show()\n", + " \n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " torch.cuda.empty_cache()\n", + " cv2.destroyAllWindows()\n", + " del model\n", + " gc.collect()\n", + "\n", + " return path_res, model_name" + ] + }, + { + "cell_type": "markdown", + "id": "93c136ee", + "metadata": {}, + "source": [ + "### Ensemble" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "52e8d4c5", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\snytk\\miniconda3\\envs\\python311\\Lib\\site-packages\\torchvision\\models\\_utils.py:208: UserWarning: The parameter 'pretrained' is deprecated since 0.13 and may be removed in the future, please use 'weights' instead.\n", + " warnings.warn(\n", + "C:\\Users\\snytk\\miniconda3\\envs\\python311\\Lib\\site-packages\\torchvision\\models\\_utils.py:223: UserWarning: Arguments other than a weight enum or `None` for 'weights' are deprecated since 0.13 and may be removed in the future. The current behavior is equivalent to passing `weights=None`.\n", + " warnings.warn(msg)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch : 1\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 437/437 [23:49<00:00, 3.27s/it]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0884 Acc: 0.9634\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 187/187 [09:15<00:00, 2.97s/it]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0342 Acc: 0.9873\n", + "\n", + "Epoch : 2\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 84%|██████████████████████████████████████████████████████████████████▊ | 365/437 [19:28<04:18, 3.59s/it]" + ] + } + ], + "source": [ + "#----------Инициализируем модель и параметры обучения--------------\n", + "\n", + "torch.cuda.empty_cache()\n", + "cv2.destroyAllWindows()\n", + "gc.collect()\n", + "\n", + "num_classes = 3\n", + "config_name = \"ensemble\"\n", + " \n", + "def load_function(attr):\n", + " module_, func = attr.rsplit('.', maxsplit=1)\n", + " return getattr(import_module(module_), func)\n", + " \n", + "config = mlconfig.load('config_' + config_name + '.yaml')\n", + "\n", + "model1 = models.resnet18(pretrained=False)\n", + "model2 = models.resnet50(pretrained=False)\n", + "model3 = models.resnet101(pretrained=False)\n", + "\n", + "num_classes = 2\n", + "\n", + "model1.fc = nn.Linear(model1.fc.in_features, num_classes)\n", + "model2.fc = nn.Linear(model2.fc.in_features, num_classes)\n", + "model3.fc = nn.Linear(model3.fc.in_features, num_classes)\n", + "\n", + "class Ensemble(nn.Module):\n", + " def __init__(self, model1, model2, model3):\n", + " super(Ensemble, self).__init__()\n", + " self.model1 = model1\n", + " self.model2 = model2\n", + " self.model3 = model3\n", + " self.fc = nn.Linear(3 * num_classes, num_classes)\n", + "\n", + " def forward(self, x):\n", + " x1 = self.model1(x)\n", + " x2 = self.model2(x)\n", + " x3 = self.model3(x)\n", + " x = torch.cat((x1, x2, x3), dim=1)\n", + " x = self.fc(x)\n", + " return x\n", + "\n", + "model = Ensemble(model1, model2, model3)\n", + "\n", + "optimizer = load_function(config.optimizer.name)(model.parameters(), lr=config.optimizer.lr)\n", + "criterion = load_function(config.loss_function.name)()\n", + "scheduler = load_function(config.scheduler.name)(optimizer, step_size=config.scheduler.step_size, gamma=config.scheduler.gamma)\n", + "\n", + "if device != 'cpu':\n", + " model = model.to(device)\n", + "\n", + "#----------Создания датасета и обучение модели--------------\n", + "\n", + "path_res, model_name = prepare_and_learning_detection(num_classes = num_classes, num_samples = 10000, path_dataset = \"//192.168.1.64/data/DATASETS/2.4/2.4_learning/\", \n", + " model_name = config_name+\"_2.4_\", config_name = config_name, model=model)\n", + "\n", + "\n", + "torch.cuda.empty_cache()\n", + "cv2.destroyAllWindows()\n", + "del model\n", + "gc.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "57d18676", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Отсутствует", + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/train_scripts/Training_models_1.2-Copy1.ipynb b/train_scripts/Training_models_1.2-Copy1.ipynb new file mode 100644 index 0000000..8e57045 --- /dev/null +++ b/train_scripts/Training_models_1.2-Copy1.ipynb @@ -0,0 +1,689 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "5a13ad6b-56c9-4381-b376-1765f6dd7553", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Импортирование библиотек" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "7311cb4a-5bf3-4268-b431-43eea10e9ed6", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cuda\n" + ] + }, + { + "data": { + "text/plain": [ + "1336" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "from torch.utils.data import Dataset, DataLoader\n", + "from torch import default_generator, randperm\n", + "from torch.utils.data.dataset import Subset\n", + "import torchvision.transforms as transforms\n", + "from torchvision.io import read_image\n", + "from importlib import import_module\n", + "import matplotlib.pyplot as plt\n", + "from torchvision import models\n", + "import torch, torchvision\n", + "from pathlib import Path\n", + "from PIL import Image\n", + "import torch.nn as nn\n", + "from tqdm import tqdm\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib\n", + "import os, shutil\n", + "import mlconfig\n", + "import random\n", + "import shutil\n", + "import timeit\n", + "import copy\n", + "import time\n", + "import cv2\n", + "import csv\n", + "import sys\n", + "import io\n", + "import gc\n", + "\n", + "plt.rcParams[\"savefig.bbox\"] = 'tight'\n", + "torch.manual_seed(1)\n", + "#matplotlib.use('Agg')\n", + "device = 'cuda' if torch.cuda.is_available() else 'cpu'\n", + "print(device)\n", + "torch.cuda.empty_cache()\n", + "cv2.destroyAllWindows()\n", + "gc.collect()" + ] + }, + { + "cell_type": "markdown", + "id": "384de097-82c6-41f5-bda9-b2f54bc99593", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Подготовка и обучение детектирование" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "46e4dc99-6994-4fee-a32e-f3983bd991bd", + "metadata": {}, + "outputs": [], + "source": [ + "def prepare_and_learning_detection(num_classes, num_samples, path_dataset, model_name, config_name, model):\n", + " num_samples_per_class = num_samples // num_classes\n", + "\n", + " #----------Создаём папку для сохранения результатов обучения--------------\n", + " \n", + " ind = 1\n", + " while True:\n", + " if os.path.exists(\"models/\" + model_name + str(ind)):\n", + " ind += 1\n", + " else:\n", + " os.mkdir(\"models/\" + model_name + str(ind))\n", + " path_res = \"models/\" + model_name + str(ind) + '/'\n", + " break\n", + " \n", + " #----------Создаём файл dataset.csv для обучения--------------\n", + " \n", + " pd_columns = ['file_name']\n", + " df = pd.DataFrame(columns=pd_columns)\n", + " \n", + " subdirs = os.listdir(path_dataset)\n", + " for subdir in subdirs:\n", + " files = os.listdir(path_dataset + subdir + '/')\n", + " num_samples_per_class = min(num_samples_per_class, len(files))\n", + " for subdir in subdirs:\n", + " files = os.listdir(path_dataset + subdir + '/')\n", + " random.shuffle(files)\n", + " files_to_process = files[:num_samples_per_class]\n", + " for file in files_to_process:\n", + " row = pd.DataFrame({pd_columns[0]: [str(path_dataset + subdir + '/' + file)]})\n", + " df = pd.concat([df, row], ignore_index=True)\n", + " \n", + " df.to_csv(path_res + 'dataset.csv', index=False)\n", + " \n", + " #----------Импортируем параметры для обучения--------------\n", + " \n", + " def load_function(attr):\n", + " module_, func = attr.rsplit('.', maxsplit=1)\n", + " return getattr(import_module(module_), func)\n", + " \n", + " config = mlconfig.load('config_' + config_name + '.yaml')\n", + " \n", + " #----------Создаём класс датасета--------------\n", + " \n", + " class MyDataset(Dataset):\n", + " def __init__(self, path_dataset, csv_file):\n", + " data=[]\n", + " with open(path_dataset + csv_file, newline='') as csvfile:\n", + " reader = csv.reader(csvfile, delimiter=' ', quotechar='|')\n", + " for row in list(reader)[1:]:\n", + " row = str(row)\n", + " data.append(row[2: len(row)-2])\n", + " self.sig_filenames = data\n", + " self.path_dataset = path_dataset\n", + " \n", + " def __len__(self):\n", + " return len(self.sig_filenames)\n", + " \n", + " def __getitem__(self, idx):\n", + " image_real = np.asarray(cv2.split(cv2.imread(self.sig_filenames[idx][:-8]+'real.jpg')), dtype=np.float32)\n", + " if 'drone' in list(self.sig_filenames[idx].split('/')):\n", + " label = torch.tensor(0)\n", + " if 'noise' in list(self.sig_filenames[idx].split('/')):\n", + " label = torch.tensor(1)\n", + " return image_real, label\n", + " \n", + " #----------Создаём датасет--------------\n", + " \n", + " dataset = MyDataset(path_dataset=path_res, csv_file='dataset.csv')\n", + " train_set, valid_set = torch.utils.data.random_split(dataset, [0.7, 0.3], generator=torch.Generator().manual_seed(42))\n", + " batch_size = config.batch_size\n", + " train_dataloader = torch.utils.data.DataLoader(train_set, batch_size=batch_size, shuffle=True, drop_last=True)\n", + " valid_dataloader = torch.utils.data.DataLoader(valid_set, batch_size=batch_size, shuffle=True, drop_last=True)\n", + " \n", + " dataloaders = {}\n", + " dataloaders['train'] = train_dataloader\n", + " dataloaders['val'] = valid_dataloader\n", + " dataset_sizes = {}\n", + " dataset_sizes['train'] = len(train_set)\n", + " dataset_sizes['val'] = len(valid_set)\n", + "\n", + " #----------Обучаем модель--------------\n", + "\n", + " val_loss = []\n", + " val_acc = []\n", + " train_loss = []\n", + " train_acc = []\n", + " epochs = config.epoch\n", + " \n", + " best_acc = 0.0\n", + " best_model = copy.deepcopy(model.state_dict())\n", + " limit = config.limit\n", + " epoch_limit = epochs\n", + " \n", + " start = timeit.default_timer()\n", + " for epoch in range(1, epochs+1):\n", + " print(f\"Epoch : {epoch}\\n\")\n", + " dataloader = None\n", + " \n", + " for phase in ['train', 'val']:\n", + " running_loss = 0.0\n", + " running_corrects = 0\n", + " \n", + " for (img, label) in tqdm(dataloaders[phase]):\n", + " img, label = img.to(device), label.to(device)\n", + " optimizer.zero_grad()\n", + " \n", + " with torch.set_grad_enabled(phase == 'train'):\n", + " output = model(img)\n", + " _, pred = torch.max(output.data, 1)\n", + " loss = criterion(output, label)\n", + " if phase=='train' :\n", + " loss.backward()\n", + " optimizer.step()\n", + " \n", + " running_loss += loss.item() * img.size(0)\n", + " running_corrects += torch.sum(pred == label.data)\n", + " \n", + " epoch_loss = running_loss / dataset_sizes[phase]\n", + " epoch_acc = running_corrects.double() / dataset_sizes[phase]\n", + " \n", + " print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc))\n", + " \n", + " if phase=='train' :\n", + " train_loss.append(epoch_loss)\n", + " train_acc.append(epoch_acc)\n", + " else :\n", + " val_loss.append(epoch_loss)\n", + " val_acc.append(epoch_acc)\n", + " if val_acc[-1] > best_acc :\n", + " ind_limit = 0\n", + " best_acc = val_acc[-1]\n", + " best_model = copy.deepcopy(model.state_dict())\n", + " torch.save(best_model, path_res + model_name + '.pth')\n", + " else:\n", + " ind_limit += 1\n", + " \n", + " if ind_limit >= limit:\n", + " break\n", + " \n", + " if ind_limit >= limit:\n", + " epoch_limit = epoch\n", + " break\n", + " \n", + " print()\n", + " \n", + " end = timeit.default_timer()\n", + " print(f\"Total time elapsed = {end - start} seconds\")\n", + " epoch_limit += 1\n", + " \n", + " #----------Вывод графиков и сохранение результатов обучения--------------\n", + " \n", + " train_acc = np.asarray(list(map(lambda x: x.item(), train_acc)))\n", + " val_acc = np.asarray(list(map(lambda x: x.item(), val_acc)))\n", + " \n", + " np.save(path_res+'train_acc.npy', train_acc)\n", + " np.save(path_res+'val_acc.npy', val_acc)\n", + " np.save(path_res+'train_loss.npy', train_loss)\n", + " np.save(path_res+'val_loss.npy', val_loss)\n", + " \n", + " plt.figure()\n", + " plt.plot(range(1,epoch_limit), train_loss, color='blue')\n", + " plt.plot(range(1,epoch_limit), val_loss, color='red')\n", + " plt.xlabel('Epoch')\n", + " plt.ylabel('Loss')\n", + " plt.title('Loss Curve')\n", + " plt.legend(['Train Loss', 'Validation Loss'])\n", + " plt.show()\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " \n", + " plt.figure()\n", + " plt.plot(range(1,epoch_limit), train_acc, color='blue')\n", + " plt.plot(range(1,epoch_limit), val_acc, color='red')\n", + " plt.xlabel('Epoch')\n", + " plt.ylabel('Accuracy')\n", + " plt.title('Accuracy Curve')\n", + " plt.legend(['Train Accuracy', 'Validation Accuracy'])\n", + " plt.show()\n", + " \n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " torch.cuda.empty_cache()\n", + " cv2.destroyAllWindows()\n", + " del model\n", + " gc.collect()\n", + "\n", + " return path_res, model_name" + ] + }, + { + "cell_type": "markdown", + "id": "93c136ee", + "metadata": {}, + "source": [ + "### Ensemble" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "52e8d4c5", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\snytk\\miniconda3\\envs\\python311\\Lib\\site-packages\\torchvision\\models\\_utils.py:208: UserWarning: The parameter 'pretrained' is deprecated since 0.13 and may be removed in the future, please use 'weights' instead.\n", + " warnings.warn(\n", + "C:\\Users\\snytk\\miniconda3\\envs\\python311\\Lib\\site-packages\\torchvision\\models\\_utils.py:223: UserWarning: Arguments other than a weight enum or `None` for 'weights' are deprecated since 0.13 and may be removed in the future. The current behavior is equivalent to passing `weights=ResNet18_Weights.IMAGENET1K_V1`. You can also use `weights=ResNet18_Weights.DEFAULT` to get the most up-to-date weights.\n", + " warnings.warn(msg)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch : 1\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1011/1011 [00:59<00:00, 17.03it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.2450 Acc: 0.8981\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 433/433 [00:12<00:00, 33.55it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.1915 Acc: 0.9192\n", + "\n", + "Epoch : 2\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1011/1011 [00:59<00:00, 16.96it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.1875 Acc: 0.9219\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 433/433 [00:12<00:00, 33.40it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.1749 Acc: 0.9279\n", + "\n", + "Epoch : 3\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1011/1011 [00:59<00:00, 16.98it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.1548 Acc: 0.9362\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 433/433 [00:13<00:00, 32.83it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.1660 Acc: 0.9221\n", + "\n", + "Epoch : 4\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1011/1011 [00:59<00:00, 17.13it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0797 Acc: 0.9726\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 433/433 [00:12<00:00, 33.63it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.1211 Acc: 0.9475\n", + "\n", + "Epoch : 7\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1011/1011 [00:58<00:00, 17.21it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0610 Acc: 0.9778\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 433/433 [00:12<00:00, 33.87it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0871 Acc: 0.9636\n", + "\n", + "Epoch : 8\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1011/1011 [00:58<00:00, 17.16it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0315 Acc: 0.9884\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 433/433 [00:12<00:00, 33.69it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.2154 Acc: 0.9452\n", + "\n", + "Epoch : 9\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1011/1011 [00:58<00:00, 17.23it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0404 Acc: 0.9852\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 433/433 [00:12<00:00, 33.85it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0957 Acc: 0.9729\n", + "\n", + "Epoch : 10\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1011/1011 [00:58<00:00, 17.19it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0285 Acc: 0.9896\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 433/433 [00:18<00:00, 24.04it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.1035 Acc: 0.9735\n", + "\n", + "Total time elapsed = 725.3019790999999 seconds\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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t2/fTvF8qTnGzs4OABAZGZlo/+tuxjqdLsm+8+fP4+zZs5g2bRoGDBiA2rVro0qVKsidO3ei43LlygVLS8s3xgQAn376KXLnzo358+djw4YNCAoKQr9+/d74voYNGyI2Nhbbtm1747GAfP5XPzuQts8PAJ9//jlevHiBdevW4cmTJ9i6dSu6dOmSaAxTnjx50KBBA5w8eTLZR48ePVIVM5EpYwJEZGZiY2OxYsUKFC1aFPv370/yGDJkCO7du4edO3cCkG6X/fv348qVK689Z+PGjXH16lXs27fvtcfEz3T6+++/E+3funVrqmOPTwpenQ6+cOHCRM/t7e1Rq1YtbNiw4Y2tHXZ2dujduzdWrFiBmTNnomLFiqhevfobY+nRowfy58+PoUOH4s6dO8ke89tvv+m3PTw8cPXq1URJ0KNHj+Dn5/fGa72sdOnS8PLywrJly7BmzRpERkbi888/T3RMs2bNcP78eRQtWhSenp5JHm5ubmm6JpFJ0noQEhFlrm3btikA6scff0z29QcPHihbW1vVsmVLpZRSt2/fVq6uripfvnxq9uzZau/evWrTpk2qV69e6tKlS0oppUJDQ1XZsmWVo6OjmjhxotqzZ4/6/fff1eDBg9W+ffv0565fv77KmTOnWrx4sdqzZ48aNmyYKl68eLKDoLNly5YktqioKFW0aFHl7u6u1qxZo3bt2qX69eunSpQooQCosWPH6o8NCAhQjo6OqkiRImrRokVq3759au3atapjx44qNDQ00Xlv376trKysFAC1ZMmSVH+XJ06cUHnz5lV58+ZV48ePV3v27FEHDhxQixcvVrVq1VI5cuTQH3vkyBEFQLVp00bt3r1brVmzRlWsWFG5u7snOwh62rRpr73uwoULFQBVoEABVa1atSSv3717V7m7u6tSpUqpBQsWqL1796rt27er+fPnq6ZNm6pbt26l+jMSmSomQERmpmXLlsrGxibF2VEdOnRQVlZWKigoSCml1K1bt1T37t1V/vz5lbW1tXJzc1Pt2rVT9+/f17/nyZMnauDAgapQoULK2tpa5cuXTzVt2lRdvnxZf8y9e/dUmzZtVK5cuVT27NlVp06d1KlTp1KdACml1MWLF9VHH32knJycVM6cOVXbtm1VYGBgkgQo/ti2bduq3LlzKxsbG1WoUCHVrVs39eLFiyTnrV27tsqVK5cK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iF8tMJWUUknOndw1X01SdDod4l6uFf+K3bt3486dO2jfvn2i/bGxsdizZw8aN24M+xRq06f0GgBY/H8Ky8vf1evGJL2c3AHAt99+i927d2P69OkoVqwY7O3t0aZNG/3P503XBoCePXuic+fOmDVrFpYtW4b27dtn2iB2opfduQO0bQscOybPR4+Wae5vsxYWUVowATIEnQ545WZlrNq1a4eBAwdizZo1WLFiBXr16qVPGA4fPowWLVroWz/i4uLwzz//oHTp0qk6d5kyZRAYGIi7d+/Czc0NgEyxf9nRo0fh7u6OUaNG6fe9OjPNxsZG39qS0rVWrFiB58+f6xOFo0ePwsLCAiVKlEhVvMlZunQpOnTokCg+APjhhx+wdOlSNG7cGBUqVMCKFSsQHR2dJMFycnKCh4cH9u7dizp16iQ5f968eQHIlP733nsPABINiE7J4cOH0a1bN7Rq1QoAEBYWhhs3buhfL1++POLi4nDw4MHXljxo0qQJsmXLBm9vb+zcuROHDh1K1bWJDOnAAaB9e1m8M3t2KWzYrJnWUZG5YReYmXF0dET79u0xcuRI3L17F926ddO/VqxYMfj6+sLPzw+XLl1Cnz59EBQUlOpz169fHyVLlkSXLl1w9uxZHD58OEkiUaxYMQQGBmLdunW4du0a5syZg82bNyc6xsPDA9evX0dAQAAePnyIyMjIJNf67LPPYGdnh65du+L8+fPYv38/BgwYgM6dO8PFxSVtX8r/PXjwANu2bUPXrl1Rrly5RI+uXbti69atePDgAfr374/Q0FB06NABp06dwj///INVq1bpu97GjRuHGTNmYM6cOfjnn3/w119/Ye7cuQCkleaDDz7ADz/8gIsXL+LQoUMYPXp0quIrVqwYfvvtNwQEBODs2bP49NNPE7VmeXh4oGvXrujevTu2bNmC69ev48CBA/j111/1x1haWqJbt24YMWIEihUrlmwXJVFGUQqYNg2oX1+Sn3fflS4vJj+kBSZAZqhHjx548uQJ6tevr589BABjxoxBpUqV0LBhQ9SuXRv58+dHy5YtU31eCwsLbN68GZGRkXj//ffRs2dPTJo0KdExLVq0wNdff43+/fujYsWK8PPzw5gxYxId07p1azRq1Ah16tRB3rx5k52K7+DggN27d+Px48eoUqUK2rRpg3r16mHevHlp+zJesnLlSmTL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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "67" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#----------Инициализируем модель и параметры обучения--------------\n", + "\n", + "torch.cuda.empty_cache()\n", + "cv2.destroyAllWindows()\n", + "gc.collect()\n", + "\n", + "config_name = \"ensemble\"\n", + " \n", + "def load_function(attr):\n", + " module_, func = attr.rsplit('.', maxsplit=1)\n", + " return getattr(import_module(module_), func)\n", + " \n", + "config = mlconfig.load('config_' + config_name + '.yaml')\n", + "\n", + "model = models.resnet18(pretrained=True)\n", + "\n", + "num_classes = 2\n", + "\n", + "model.fc = nn.Linear(model.fc.in_features, num_classes)\n", + "\n", + "class Model(nn.Module):\n", + " def __init__(self, model):\n", + " super(Model, self).__init__()\n", + " self.model = model\n", + "\n", + " def forward(self, x):\n", + " x = self.model(x)\n", + " return x\n", + "\n", + "model = Model(model)\n", + "\n", + "optimizer = load_function(config.optimizer.name)(model.parameters(), lr=config.optimizer.lr)\n", + "criterion = load_function(config.loss_function.name)()\n", + "scheduler = load_function(config.scheduler.name)(optimizer, step_size=config.scheduler.step_size, gamma=config.scheduler.gamma)\n", + "\n", + "if device != 'cpu':\n", + " model = model.to(device)\n", + "\n", + "#----------Создания датасета и обучение модели--------------\n", + "\n", + "path_res, model_name = prepare_and_learning_detection(num_classes = num_classes, num_samples = 20000, path_dataset = \"C:/Users/snytk/Lerning_NN_for_work/datasets_jpg/1.2_jpg_learning/\", \n", + " model_name = config_name+\"_1.2_jpg_\", config_name = config_name, model=model)\n", + "\n", + "\n", + "torch.cuda.empty_cache()\n", + "cv2.destroyAllWindows()\n", + "del model\n", + "gc.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4234ee26", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Отсутствует", + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/train_scripts/Training_models_1.2.ipynb b/train_scripts/Training_models_1.2.ipynb new file mode 100644 index 0000000..5e170f5 --- /dev/null +++ b/train_scripts/Training_models_1.2.ipynb @@ -0,0 +1,667 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "5a13ad6b-56c9-4381-b376-1765f6dd7553", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Импортирование библиотек" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "7311cb4a-5bf3-4268-b431-43eea10e9ed6", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cuda\n" + ] + }, + { + "data": { + "text/plain": [ + "112" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "from torch.utils.data import Dataset, DataLoader\n", + "from torch import default_generator, randperm\n", + "from torch.utils.data.dataset import Subset\n", + "import torchvision.transforms as transforms\n", + "from torchvision.io import read_image\n", + "from importlib import import_module\n", + "import matplotlib.pyplot as plt\n", + "from torchvision import models\n", + "import torch, torchvision\n", + "from pathlib import Path\n", + "from PIL import Image\n", + "import torch.nn as nn\n", + "from tqdm import tqdm\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib\n", + "import os, shutil\n", + "import mlconfig\n", + "import random\n", + "import shutil\n", + "import timeit\n", + "import copy\n", + "import time\n", + "import cv2\n", + "import csv\n", + "import sys\n", + "import io\n", + "import gc\n", + "\n", + "plt.rcParams[\"savefig.bbox\"] = 'tight'\n", + "torch.manual_seed(1)\n", + "#matplotlib.use('Agg')\n", + "device = 'cuda' if torch.cuda.is_available() else 'cpu'\n", + "print(device)\n", + "torch.cuda.empty_cache()\n", + "cv2.destroyAllWindows()\n", + "gc.collect()" + ] + }, + { + "cell_type": "markdown", + "id": "384de097-82c6-41f5-bda9-b2f54bc99593", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Подготовка и обучение детектирование" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "46e4dc99-6994-4fee-a32e-f3983bd991bd", + "metadata": {}, + "outputs": [], + "source": [ + "def prepare_and_learning_detection(num_classes, num_samples, path_dataset, model_name, config_name, model,selected_freq):\n", + " num_samples_per_class = num_samples // num_classes\n", + "\n", + " #----------Создаём папку для сохранения результатов обучения--------------\n", + " os.makedirs(\"models\", exist_ok=True)\n", + " ind = 1\n", + " while True:\n", + " if os.path.exists(\"models/\" + model_name + str(ind)):\n", + " ind += 1\n", + " else:\n", + " os.mkdir(\"models/\" + model_name + str(ind))\n", + " path_res = \"models/\" + model_name + str(ind) + '/'\n", + " break\n", + " \n", + " #----------Создаём файл dataset.csv для обучения--------------\n", + " \n", + " pd_columns = ['file_name']\n", + " df = pd.DataFrame(columns=pd_columns)\n", + " \n", + " subdirs = os.listdir(path_dataset)\n", + " print(subdirs)\n", + " \n", + " for subdir in subdirs:\n", + " freq_dir = os.path.join(path_dataset, subdir, str(selected_freq))\n", + " if not os.path.isdir(freq_dir):\n", + " continue\n", + "\n", + " files = [\n", + " f for f in os.listdir(freq_dir)\n", + " if os.path.isfile(os.path.join(freq_dir, f)) and f.endswith('.npy')\n", + " ]\n", + " num_samples_per_class = min(num_samples_per_class, len(files))\n", + "\n", + " for subdir in subdirs:\n", + " freq_dir = os.path.join(path_dataset, subdir, str(selected_freq))\n", + " if not os.path.isdir(freq_dir):\n", + " continue\n", + "\n", + " files = [\n", + " f for f in os.listdir(freq_dir)\n", + " if os.path.isfile(os.path.join(freq_dir, f)) and f.endswith('.npy')\n", + " ]\n", + " random.shuffle(files)\n", + " files_to_process = files[:num_samples_per_class]\n", + "\n", + " for file in files_to_process:\n", + " row = pd.DataFrame({\n", + " pd_columns[0]: [str(os.path.join(freq_dir, file))]\n", + " })\n", + " df = pd.concat([df, row], ignore_index=True)\n", + "\n", + " dataset_csv_path = os.path.join(path_res, 'dataset.csv')\n", + " df.to_csv(dataset_csv_path, index=False)\n", + "\n", + " if not os.path.exists(dataset_csv_path):\n", + " raise RuntimeError(f'dataset.csv was not created: {dataset_csv_path}')\n", + " #----------Импортируем параметры для обучения--------------\n", + " \n", + " def load_function(attr):\n", + " module_, func = attr.rsplit('.', maxsplit=1)\n", + " return getattr(import_module(module_), func)\n", + " \n", + " config = mlconfig.load('config_' + config_name + '.yaml')\n", + " \n", + " #----------Создаём класс датасета--------------\n", + " \n", + " class MyDataset(Dataset):\n", + " def __init__(self, path_dataset, csv_file):\n", + " data=[]\n", + " with open(os.path.join(path_dataset, csv_file), newline='') as csvfile:\n", + " reader = csv.reader(csvfile, delimiter=' ', quotechar='|')\n", + " for row in list(reader)[1:]:\n", + " row = str(row)\n", + " data.append(row[2: len(row)-2])\n", + " self.sig_filenames = data\n", + " self.path_dataset = path_dataset\n", + " \n", + " def __len__(self):\n", + " return len(self.sig_filenames)\n", + " \n", + " def __getitem__(self, idx):\n", + " base = os.path.splitext(self.sig_filenames[idx])[0]\n", + "\n", + " image_real = np.asarray(cv2.split(cv2.imread(base + '_real.png')), dtype=np.float32)\n", + " image_imag = np.asarray(cv2.split(cv2.imread(base + '_imag.png')), dtype=np.float32)\n", + " image_spec = np.asarray(cv2.split(cv2.imread(base + '_spec.png')), dtype=np.float32)\n", + "\n", + " if 'drone' in list(self.sig_filenames[idx].split('/')):\n", + " label = torch.tensor(0)\n", + " if 'noise' in list(self.sig_filenames[idx].split('/')):\n", + " label = torch.tensor(1)\n", + " return image_real, image_imag, image_spec, label\n", + " \n", + " #----------Создаём датасет--------------\n", + " \n", + " dataset = MyDataset(path_dataset=path_res, csv_file='dataset.csv')\n", + " train_set, valid_set = torch.utils.data.random_split(dataset, [0.7, 0.3], generator=torch.Generator().manual_seed(42))\n", + " batch_size = config.batch_size\n", + " train_dataloader = torch.utils.data.DataLoader(train_set, batch_size=batch_size, shuffle=True, drop_last=True)\n", + " valid_dataloader = torch.utils.data.DataLoader(valid_set, batch_size=batch_size, shuffle=True, drop_last=True)\n", + " \n", + " dataloaders = {}\n", + " dataloaders['train'] = train_dataloader\n", + " dataloaders['val'] = valid_dataloader\n", + " dataset_sizes = {}\n", + " dataset_sizes['train'] = len(train_set)\n", + " dataset_sizes['val'] = len(valid_set)\n", + "\n", + " #----------Обучаем модель--------------\n", + "\n", + " val_loss = []\n", + " val_acc = []\n", + " train_loss = []\n", + " train_acc = []\n", + " epochs = config.epoch\n", + " \n", + " best_acc = 0.0\n", + " best_model = copy.deepcopy(model.state_dict())\n", + " limit = config.limit\n", + " epoch_limit = epochs\n", + " \n", + " start = timeit.default_timer()\n", + " for epoch in range(1, epochs+1):\n", + " print(f\"Epoch : {epoch}\\n\")\n", + " dataloader = None\n", + " \n", + " for phase in ['train', 'val']:\n", + " running_loss = 0.0\n", + " running_corrects = 0\n", + " \n", + " for (img1, img2, img3, label) in tqdm(dataloaders[phase]):\n", + " img1, img2, img3, label = img1.to(device), img2.to(device), img3.to(device), label.to(device)\n", + " optimizer.zero_grad()\n", + " \n", + " with torch.set_grad_enabled(phase == 'train'):\n", + " output = model([img1, img2, img3])\n", + " _, pred = torch.max(output.data, 1)\n", + " loss = criterion(output, label)\n", + " if phase=='train' :\n", + " loss.backward()\n", + " optimizer.step()\n", + " \n", + " running_loss += loss.item() * 3 * img1.size(0)\n", + " running_corrects += torch.sum(pred == label.data)\n", + " \n", + " epoch_loss = running_loss / dataset_sizes[phase]\n", + " epoch_acc = running_corrects.double() / dataset_sizes[phase]\n", + " \n", + " print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc))\n", + " \n", + " if phase=='train' :\n", + " train_loss.append(epoch_loss)\n", + " train_acc.append(epoch_acc)\n", + " else :\n", + " val_loss.append(epoch_loss)\n", + " val_acc.append(epoch_acc)\n", + " if val_acc[-1] > best_acc :\n", + " ind_limit = 0\n", + " best_acc = val_acc[-1]\n", + " best_model = copy.deepcopy(model.state_dict())\n", + " torch.save(best_model, path_res + model_name + '.pth')\n", + " else:\n", + " ind_limit += 1\n", + " \n", + " if ind_limit >= limit:\n", + " break\n", + " \n", + " if ind_limit >= limit:\n", + " epoch_limit = epoch\n", + " break\n", + " \n", + " print()\n", + " \n", + " end = timeit.default_timer()\n", + " print(f\"Total time elapsed = {end - start} seconds\")\n", + " epoch_limit += 1\n", + " \n", + " #----------Вывод графиков и сохранение результатов обучения--------------\n", + " \n", + " train_acc = np.asarray(list(map(lambda x: x.item(), train_acc)))\n", + " val_acc = np.asarray(list(map(lambda x: x.item(), val_acc)))\n", + " \n", + " np.save(path_res+'train_acc.npy', train_acc)\n", + " np.save(path_res+'val_acc.npy', val_acc)\n", + " np.save(path_res+'train_loss.npy', train_loss)\n", + " np.save(path_res+'val_loss.npy', val_loss)\n", + " \n", + " plt.figure()\n", + " plt.plot(range(1,epoch_limit), train_loss, color='blue')\n", + " plt.plot(range(1,epoch_limit), val_loss, color='red')\n", + " plt.xlabel('Epoch')\n", + " plt.ylabel('Loss')\n", + " plt.title('Loss Curve')\n", + " plt.legend(['Train Loss', 'Validation Loss'])\n", + " plt.show()\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " \n", + " plt.figure()\n", + " plt.plot(range(1,epoch_limit), train_acc, color='blue')\n", + " plt.plot(range(1,epoch_limit), val_acc, color='red')\n", + " plt.xlabel('Epoch')\n", + " plt.ylabel('Accuracy')\n", + " plt.title('Accuracy Curve')\n", + " plt.legend(['Train Accuracy', 'Validation Accuracy'])\n", + " plt.show()\n", + " \n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " torch.cuda.empty_cache()\n", + " cv2.destroyAllWindows()\n", + " del model\n", + " gc.collect()\n", + "\n", + " return path_res, model_name" + ] + }, + { + "cell_type": "markdown", + "id": "93c136ee", + "metadata": {}, + "source": [ + "### Ensemble" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "52e8d4c5", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/sibscience-4/from_ssh/DroneDetector/.venv-train/lib/python3.12/site-packages/torchvision/models/_utils.py:208: UserWarning: The parameter 'pretrained' is deprecated since 0.13 and may be removed in the future, please use 'weights' instead.\n", + " warnings.warn(\n", + "/home/sibscience-4/from_ssh/DroneDetector/.venv-train/lib/python3.12/site-packages/torchvision/models/_utils.py:223: UserWarning: Arguments other than a weight enum or `None` for 'weights' are deprecated since 0.13 and may be removed in the future. The current behavior is equivalent to passing `weights=None`.\n", + " warnings.warn(msg)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['noise', 'drone']\n", + "Epoch : 1\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 168/168 [01:10<00:00, 2.39it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0628 Acc: 0.9956\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 72/72 [00:11<00:00, 6.27it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0029 Acc: 1.0000\n", + "\n", + "Epoch : 2\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 168/168 [01:10<00:00, 2.38it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0018 Acc: 0.9956\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 72/72 [00:11<00:00, 6.13it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0011 Acc: 1.0000\n", + "\n", + "Epoch : 3\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 168/168 [01:10<00:00, 2.38it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0008 Acc: 0.9956\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 72/72 [00:11<00:00, 6.20it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0006 Acc: 1.0000\n", + "\n", + "Epoch : 4\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 168/168 [01:10<00:00, 2.38it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0005 Acc: 0.9956\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 72/72 [00:11<00:00, 6.13it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0004 Acc: 1.0000\n", + "\n", + "Epoch : 5\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 168/168 [01:10<00:00, 2.38it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0003 Acc: 0.9956\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 72/72 [00:11<00:00, 6.12it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0003 Acc: 1.0000\n", + "\n", + "Epoch : 6\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 168/168 [01:10<00:00, 2.38it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0002 Acc: 0.9956\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 72/72 [00:11<00:00, 6.11it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0002 Acc: 1.0000\n", + "Total time elapsed = 493.41988416798995 seconds\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHHCAYAAABXx+fLAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAUC5JREFUeJzt3Xl0VPX9//HnTEISEpKwJywRVMIeEtYQQNZAUGqNG5FSNmn9agGxqFVENjfcaFFBKFqB9ieCWKEUEQgREAVkCasiKmWJQlgUEhIggcz9/THMwJgASZjkzkxej3PumTt3PvfO+061eXnv+95rMQzDQERERKQCsZpdgIiIiEh5UwASERGRCkcBSERERCocBSARERGpcBSAREREpMJRABIREZEKRwFIREREKhwFIBEREalwFIBERESkwlEAEhERkQpHAUhEbtjcuXOxWCxs3brV7FKKZceOHfz+978nKiqKwMBAqlevTmJiInPmzKGgoMDs8kSkHPibXYCISHl69913efjhh4mIiGDQoEFER0dz5swZ0tLSGD58OEePHuWZZ54xu0wRKWMKQCJSYWzatImHH36YhIQEli9fTmhoqPOzxx57jK1bt7Jnzx63fFdubi4hISFu2ZaIuJ9OgYlIudm+fTu33347YWFhVKlShV69erFp0yaXMRcuXGDy5MlER0cTFBREjRo16NKlC6mpqc4xmZmZDBs2jPr16xMYGEidOnW46667OHjw4DW/f/LkyVgsFt5//32X8OPQrl07hg4dCsDatWuxWCysXbvWZczBgwexWCzMnTvXuWzo0KFUqVKF/fv3c8cddxAaGsrAgQMZOXIkVapU4ezZs4W+a8CAAURGRrqccvv000+57bbbCAkJITQ0lH79+vH1119fc59EpHQUgESkXHz99dfcdttt7Ny5k7/85S+MHz+eAwcO0L17d7766ivnuEmTJjF58mR69OjB9OnTGTduHDfddBPp6enOMffeey+LFy9m2LBhvP322zz66KOcOXOGw4cPX/X7z549S1paGl27duWmm25y+/5dvHiRpKQkateuzeuvv869995LSkoKubm5fPLJJ4Vq+e9//8t9992Hn58fAP/617/o168fVapU4ZVXXmH8+PF88803dOnS5brBTkRKwRARuUFz5swxAGPLli1XHZOcnGwEBAQY+/fvdy47cuSIERoaanTt2tW5LDY21ujXr99Vt3Pq1CkDMF577bUS1bhz504DMEaPHl2s8WvWrDEAY82aNS7LDxw4YADGnDlznMuGDBliAMbTTz/tMtZmsxn16tUz7r33XpflH374oQEYn3/+uWEYhnHmzBmjatWqxh//+EeXcZmZmUZ4eHih5SJy43QESETKXEFBAatWrSI5OZlbbrnFubxOnTr87ne/44svviA7OxuAqlWr8vXXX/P9998Xua3KlSsTEBDA2rVrOXXqVLFrcGy/qFNf7vLII4+4vLdYLNx///0sX76cnJwc5/KFCxdSr149unTpAkBqaiqnT59mwIABnDx50jn5+fkRHx/PmjVryqxmkYpKAUhEytyJEyc4e/YsTZo0KfRZs2bNsNlsZGRkAPDcc89x+vRpGjduTExMDE8++SS7du1yjg8MDOSVV17h008/JSIigq5du/Lqq6+SmZl5zRrCwsIAOHPmjBv37DJ/f3/q169faHlKSgrnzp1j6dKlAOTk5LB8+XLuv/9+LBYLgDPs9ezZk1q1arlMq1at4vjx42VSs0hFpgAkIh6la9eu7N+/n/fee4+WLVvy7rvv0qZNG959913nmMcee4zvvvuOKVOmEBQUxPjx42nWrBnbt2+/6nYbNWqEv78/u3fvLlYdjnDya1e7T1BgYCBWa+H/S+3YsSMNGzbkww8/BOC///0v586dIyUlxTnGZrMB9j6g1NTUQtN//vOfYtUsIsWnACQiZa5WrVoEBwezb9++Qp99++23WK1WoqKinMuqV6/OsGHD+OCDD8jIyKBVq1ZMmjTJZb1bb72Vxx9/nFWrVrFnzx7y8/OZOnXqVWsIDg6mZ8+efP75586jTddSrVo1AE6fPu2y/NChQ9dd99f69+/PihUryM7OZuHChTRs2JCOHTu67AtA7dq1SUxMLDR17969xN8pItemACQiZc7Pz48+ffrwn//8x+WKpmPHjjF//ny6dOniPEX1888/u6xbpUoVGjVqRF5eHmC/gur8+fMuY2699VZCQ0OdY65m4sSJGIbBoEGDXHpyHLZt28a8efMAaNCgAX5+fnz++ecuY95+++3i7fQVUlJSyMvLY968eaxYsYL+/fu7fJ6UlERYWBgvvfQSFy5cKLT+iRMnSvydInJtuhGiiLjNe++9x4oVKwotHz16NC+88AKpqal06dKFP/3p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sHr1agDCw8MLbSM3N5ekpCQSEhLYsmULx48f5w9/+AMjR450CXlr1qyhTp06rFmzhh9++IGUlBTi4uL4YyluTGez2ZzhZ926dVy8eJERI0aQkpLi/Fs+cOBAWrduzcyZM/Hz82PHjh1UqlQJgBEjRpCfn8/nn39OSEgI33zzDVWqVClxHSViSCFZWVkGYGRlZZXL933yiWGAYTRoYBg2W7l8pYhImTh37pzxzTffGOfOnbMvyMmx/x+cGVNOTrHr3rt3rwEYa9ascS677bbbjN///vdXXadfv37G448/7nzfrVs3Y/To0c73DRo0MP72t78ZhmEYK1euNPz9/Y2ffvrJ+fmnn35qAMbixYuv+h2vvfaa0bZtW+f7iRMnGrGxsYXGXbmd2bNnG9WqVTNyrtj/Tz75xLBarUZmZqZhGIYxZMgQo0GDBsbFixedY+6//34jJSXlqrXMmTPHCA8PL/KzVatWGX5+fsbhw4edy77++msDMDZv3mwYhmGEhoYac+fOLXL9mJgYY9KkSVf97isV+mfsCiX5++1Tl8F7q27dICDA/kiM7783uxoRkYqnadOmdOrUiffeew+AH374gfXr1zN8+HAACgoKeP7554mJiaF69epUqVKFlStXFvs5k3v37iUqKoq6des6lxV1wc/ChQvp3LkzkZGRVKlShWeffbbEz7Lcu3cvsbGxhISEOJd17twZm83mcpFQixYt8PPzc76vU6fOVR9FVZzvjIqKcrmPXvPmzalatSp79+4F7H2/f/jDH0hMTOTll19m//79zrGPPvooL7zwAp07d2bixImlajovKQUgDxASAo4WJV0NJiI+JTgYcnLMmYKDS1Tq8OHD+fe//82ZM2eYM2cOt956K926dQPgtdde44033uCpp55izZo17Nixg6SkJPLz8932U23cuJGBAwdyxx13sGzZMrZv3864cePc+h1Xcpx+crBYLM776ZWFSZMm8fXXX9OvXz8+++wzmjdvzuLFiwH4wx/+wP/+9z8GDRrE7t27adeuHW+99VaZ1QIKQB7DcTWY7gckIj7FYrH/V54ZUzH6f67Uv39/rFYr8+fP55///CcPPvigsx/oyy+/5K677uL3v/89sbGx3HLLLXz33XfF3nazZs3IyMhwubBn06ZNLmM2bNhAgwYNGDduHO3atSM6OppDv3padkBAAAUFBdf9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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkkAAAHHCAYAAACr0swBAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAASbFJREFUeJzt3Xl4Dvf+//HXnci+CSILEUs1QYnTWBot6jQVSx1LVDg0obTVojRHW0pLq6qLqrW6HEuLllqr9cVJY2k5WooopZbQIhKhJRsics/vD7/ex92MJRpu0ufjuua63J/7fc+8Z5pz3a8z87lnLIZhGAIAAIAdJ0c3AAAAcCsiJAEAAJggJAEAAJggJAEAAJggJAEAAJggJAEAAJggJAEAAJggJAEAAJggJAEAAJggJAEAAJggJAG4qnfffVcWi0VNmzZ1dCu3pePHj2vo0KGKiIiQp6envLy8FBUVpVdffVWnT592dHsALsPCs9sAXM29996rY8eO6eeff9b+/ft1xx13OLql28aWLVvUrl075eXlqVevXoqKipIkff/995o/f76aNWum//znPw7uEoAZQhKAKzp06JBq1qypJUuW6IknntCAAQM0atQoR7dlKj8/X15eXo5uw+b06dO66667dOHCBa1bt04RERF27x8/flwffvihRo4c+ae3davtO1AWcLkNwBXNmzdP/v7+at++vbp27ap58+aZ1p0+fVrPPPOMqlevLjc3N1WtWlUJCQk6efKkrebcuXMaPXq07rzzTrm7uys4OFhdunRRWlqaJGndunWyWCxat26d3bp//vlnWSwWzZ492zbWu3dveXt7Ky0tTe3atZOPj4969uwpSfrmm2/08MMPq1q1anJzc1NoaKieeeYZnT17tljfP/30k7p166aAgAB5eHgoPDxcI0aMkCStXbtWFotFS5cuLfa5Tz75RBaLRZs2bbrssXv//feVnp6uCRMmFAtIkhQYGGgXkCwWi0aPHl2srnr16urdu7ft9ezZs2WxWLR+/Xo99dRTqly5sqpWrapFixbZxs16sVgs2rVrl92+d+3aVRUqVJC7u7saNWqk5cuXX3Z/gL+aco5uAMCtbd68eerSpYtcXV3Vo0cPTZ8+XVu2bFHjxo1tNXl5eWrevLn27NmjRx99VHfffbdOnjyp5cuX6+jRo6pUqZKKior00EMPKSUl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t29fLV68WLm5uZo1a5Zq1apl+1J96623NGnSJD3//PNau3atUlNTFRsbq/Pnz5faodq0aZN69uypdu3a6csvv9T27ds1YsSIUt3Gpf4YZCwWiy3smFm9erXS09MVHx+vcuXKqVy5curevbt++eUX26/PPTw8Lvv5K70nXZxeI12cjP27y82RujQAStLQoUO1dOlSvfbaa/rmm2+Umpqq+vXr247d1bYtSf369dP8+fN19uxZzZo1S/Hx8Td84n2JQ9Lhw4dVo0aNYuNhYWElTtMAAAezWCQvL8cs1zAf6VLdunWTk5OTPvnkE3388cd69NFHbfOTNm7cqI4dO6pXr16KjIxUzZo1tW/fvmted506dXTkyBFlZGTYxr799lu7mv/+978KCwvTiBEj1KhRI9WuXVu//PKLXY2rq+tVnzxRp04d7dixQ/n5+baxjRs3ysnJSeHh4dfc8x/NmDFD3bt3V2pqqt3SvXt32wTuBg0a6JtvvjENNz4+Pqpevfplb+cTEBAgSXbH6NJJ3FeyceNG9e7dW507d1b9+vUVFBSkn3/+2fZ+/fr1ZbVatX79+suuo127dvLy8tL06dO1atUqPfroo9e07T+jxCGpcuXKpvej2LFjhypWrFgqTQEA8Efe3t6Kj4/X8OHDlZGRod69e9veq127tpKTk/Xf//5Xe/bs0RNPPKHjx49f87pjYmJ05513KjExUTt27NA333yjESNG2NXUrl1bhw8f1vz585WWlqbJkycXewpF9erVdejQIaWmpurkyZOm9ynq2bOn3N3dlZiYqF27dmnt2rUaNGiQHnnkEQUGBpbsoPx/J06c0BdffKHExETddddddktCQoKWLVum3377TQMHDlROTo66d++u77//Xvv379ecOXNsl/lGjx6tt99+W5MnT9b+/fu1bds2TZkyRdLFsz333HOPXn/9de3Zs0fr16/XyJEjr6m/2rVra8mSJUpNTdWOHTv0z3/+0+6sWPXq1ZWYmKhHH31Uy5Yt06FDh7Ru3Tp99tlnthpnZ2f17t1bw4cPV+3atU0vh5a2EoekHj166Omnn9batWtVVFSkoqIirVmzRoMHD1b37t1vRI8AAEi6eMnt1KlTio2NtZs/NHLkSN19992KjY3V/fffr6CgoBLd3drJyUlLly7V2bNn1aRJE/Xr109jx461q/nHP/6hZ555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+d0333yjvXv3ql+/flfsdfjw4crOzrYtR44cuY49BgAAtwuHhiRXV1dFRUXZTZa2Wq1KSUlRdHT0FT/r7u6uKlWq6MKFC1q8eLE6duxYrMbLy0vBwcE6deqUVq9ebVozY8YMRUVFKTIy8orbc3Nzk6+vr90CAADKrnKObiApKUmJiYlq1KiRmjRpookTJyo/P199+vSRJCUkJKhKlSoaN26cJOm7775Tenq6GjZsqPT0dI0ePVpWq1XPPfecbZ2rV6+WYRgKDw/XgQMH9OyzzyoiIsK2zt/l5ORo4cKFevvtt2/eDgMAgNuCw0NSfHy8Tpw4oZdeekmZmZlq2LChVq1aZZvMffjwYbu5ROfOndPIkSN18OBBeXt7q127dpozZ47Kly9vq8nOztbw4cN19OhRVahQQXFxcRo7dqxcXFzstj1//nwZhqEePXrclH0FAAC3D4ffJ+l2xX2SAAC4/dw290kCAAC4VRGSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATDg8JE2bNk3Vq1eXu7u7mjZtqs2bN1+2trCwUK+88opq1aold3d3RUZGatWqVXY1ubm5GjJkiMLCwuTh4aFmzZppy5Ytxda1Z88e/eMf/5Cfn5+8vLzUuHFjHT58uNT3DwAA3J4cGpIWLFigpKQkjRo1Stu2bVNkZKRiY2OVlZVlWj9y5Ei9//77mjJlinbv3q3+/furc+fO2r59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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "67" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#----------Инициализируем модель и параметры обучения--------------\n", + "\n", + "torch.cuda.empty_cache()\n", + "cv2.destroyAllWindows()\n", + "gc.collect()\n", + "\n", + "num_classes = 3\n", + "config_name = \"ensemble\"\n", + " \n", + "def load_function(attr):\n", + " module_, func = attr.rsplit('.', maxsplit=1)\n", + " return getattr(import_module(module_), func)\n", + " \n", + "config = mlconfig.load('config_' + config_name + '.yaml')\n", + "\n", + "model1 = models.resnet18(pretrained=False)\n", + "model2 = models.resnet50(pretrained=False)\n", + "model3 = models.resnet101(pretrained=False)\n", + "\n", + "num_classes = 2\n", + "\n", + "model1.fc = nn.Linear(model1.fc.in_features, num_classes)\n", + "model2.fc = nn.Linear(model2.fc.in_features, num_classes)\n", + "model3.fc = nn.Linear(model3.fc.in_features, num_classes)\n", + "\n", + "class Ensemble(nn.Module):\n", + " def __init__(self, model1, model2, model3):\n", + " super(Ensemble, self).__init__()\n", + " self.model1 = model1\n", + " self.model2 = model2\n", + " self.model3 = model3\n", + " self.fc = nn.Linear(3 * num_classes, num_classes)\n", + "\n", + " def forward(self, x):\n", + " x1 = self.model1(x[0])\n", + " x2 = self.model2(x[1])\n", + " x3 = self.model3(x[2])\n", + " x = torch.cat((x1, x2, x3), dim=1)\n", + " x = self.fc(x)\n", + " return x\n", + "\n", + "model = Ensemble(model1, model2, model3)\n", + "\n", + "optimizer = load_function(config.optimizer.name)(model.parameters(), lr=config.optimizer.lr)\n", + "criterion = load_function(config.loss_function.name)()\n", + "scheduler = load_function(config.scheduler.name)(optimizer, step_size=config.scheduler.step_size, gamma=config.scheduler.gamma)\n", + "\n", + "if device != 'cpu':\n", + " model = model.to(device)\n", + "\n", + "#----------Создания датасета и обучение модели--------------\n", + "\n", + "path_res, model_name = prepare_and_learning_detection(num_classes = num_classes, num_samples = 10000, path_dataset = \"/mnt/nvme1/dataset_img\", \n", + " selected_freq=1200,model_name = config_name+\"_1.2_jpg_\", config_name = config_name, model=model)\n", + "\n", + "\n", + "torch.cuda.empty_cache()\n", + "cv2.destroyAllWindows()\n", + "del model\n", + "gc.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4234ee26", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Отсутствует", + "kernelspec": { + "display_name": ".venv-train (3.12.3)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/train_scripts/Training_models_2.4-Copy1.ipynb b/train_scripts/Training_models_2.4-Copy1.ipynb new file mode 100644 index 0000000..40b4db4 --- /dev/null +++ b/train_scripts/Training_models_2.4-Copy1.ipynb @@ -0,0 +1,465 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "5a13ad6b-56c9-4381-b376-1765f6dd7553", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Импортирование библиотек" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "7311cb4a-5bf3-4268-b431-43eea10e9ed6", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cuda\n" + ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "from torch.utils.data import Dataset, DataLoader\n", + "from torch import default_generator, randperm\n", + "from torch.utils.data.dataset import Subset\n", + "import torchvision.transforms as transforms\n", + "from torchvision.io import read_image\n", + "from importlib import import_module\n", + "import matplotlib.pyplot as plt\n", + "from torchvision import models\n", + "import torch, torchvision\n", + "from pathlib import Path\n", + "from PIL import Image\n", + "import torch.nn as nn\n", + "from tqdm import tqdm\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib\n", + "import os, shutil\n", + "import mlconfig\n", + "import random\n", + "import shutil\n", + "import timeit\n", + "import copy\n", + "import time\n", + "import cv2\n", + "import csv\n", + "import sys\n", + "import io\n", + "import gc\n", + "\n", + "plt.rcParams[\"savefig.bbox\"] = 'tight'\n", + "torch.manual_seed(1)\n", + "#matplotlib.use('Agg')\n", + "device = 'cuda' if torch.cuda.is_available() else 'cpu'\n", + "print(device)\n", + "torch.cuda.empty_cache()\n", + "cv2.destroyAllWindows()\n", + "gc.collect()" + ] + }, + { + "cell_type": "markdown", + "id": "384de097-82c6-41f5-bda9-b2f54bc99593", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Подготовка и обучение детектирование" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "46e4dc99-6994-4fee-a32e-f3983bd991bd", + "metadata": {}, + "outputs": [], + "source": [ + "def prepare_and_learning_detection(num_classes, num_samples, path_dataset, model_name, config_name, model):\n", + " num_samples_per_class = num_samples // num_classes\n", + "\n", + " #----------Создаём папку для сохранения результатов обучения--------------\n", + " \n", + " ind = 1\n", + " while True:\n", + " if os.path.exists(\"models/\" + model_name + str(ind)):\n", + " ind += 1\n", + " else:\n", + " os.mkdir(\"models/\" + model_name + str(ind))\n", + " path_res = \"models/\" + model_name + str(ind) + '/'\n", + " break\n", + " \n", + " #----------Создаём файл dataset.csv для обучения--------------\n", + " \n", + " pd_columns = ['file_name']\n", + " df = pd.DataFrame(columns=pd_columns)\n", + " \n", + " subdirs = os.listdir(path_dataset)\n", + " for subdir in subdirs:\n", + " files = os.listdir(path_dataset + subdir + '/')\n", + " num_samples_per_class = min(num_samples_per_class, len(files))\n", + " for subdir in subdirs:\n", + " files = os.listdir(path_dataset + subdir + '/')\n", + " random.shuffle(files)\n", + " files_to_process = files[:num_samples_per_class]\n", + " for file in files_to_process:\n", + " row = pd.DataFrame({pd_columns[0]: [str(path_dataset + subdir + '/' + file)]})\n", + " df = pd.concat([df, row], ignore_index=True)\n", + " \n", + " df.to_csv(path_res + 'dataset.csv', index=False)\n", + " \n", + " #----------Импортируем параметры для обучения--------------\n", + " \n", + " def load_function(attr):\n", + " module_, func = attr.rsplit('.', maxsplit=1)\n", + " return getattr(import_module(module_), func)\n", + " \n", + " config = mlconfig.load('config_' + config_name + '.yaml')\n", + " \n", + " #----------Создаём класс датасета--------------\n", + " \n", + " class MyDataset(Dataset):\n", + " def __init__(self, path_dataset, csv_file):\n", + " data=[]\n", + " with open(path_dataset + csv_file, newline='') as csvfile:\n", + " reader = csv.reader(csvfile, delimiter=' ', quotechar='|')\n", + " for row in list(reader)[1:]:\n", + " row = str(row)\n", + " data.append(row[2: len(row)-2])\n", + " self.sig_filenames = data\n", + " self.path_dataset = path_dataset\n", + " \n", + " def __len__(self):\n", + " return len(self.sig_filenames)\n", + " \n", + " def __getitem__(self, idx):\n", + " image_real = np.asarray(cv2.split(cv2.imread(self.sig_filenames[idx][:-8]+'real.jpg')), dtype=np.float32)\n", + " if 'drone' in list(self.sig_filenames[idx].split('/')):\n", + " label = torch.tensor(0)\n", + " if 'noise' in list(self.sig_filenames[idx].split('/')):\n", + " label = torch.tensor(1)\n", + " return image_real, label\n", + " \n", + " #----------Создаём датасет--------------\n", + " \n", + " dataset = MyDataset(path_dataset=path_res, csv_file='dataset.csv')\n", + " train_set, valid_set = torch.utils.data.random_split(dataset, [0.7, 0.3], generator=torch.Generator().manual_seed(42))\n", + " batch_size = config.batch_size\n", + " train_dataloader = torch.utils.data.DataLoader(train_set, batch_size=batch_size, shuffle=True, drop_last=True)\n", + " valid_dataloader = torch.utils.data.DataLoader(valid_set, batch_size=batch_size, shuffle=True, drop_last=True)\n", + " \n", + " dataloaders = {}\n", + " dataloaders['train'] = train_dataloader\n", + " dataloaders['val'] = valid_dataloader\n", + " dataset_sizes = {}\n", + " dataset_sizes['train'] = len(train_set)\n", + " dataset_sizes['val'] = len(valid_set)\n", + "\n", + " #----------Обучаем модель--------------\n", + "\n", + " val_loss = []\n", + " val_acc = []\n", + " train_loss = []\n", + " train_acc = []\n", + " epochs = config.epoch\n", + " \n", + " best_acc = 0.0\n", + " best_model = copy.deepcopy(model.state_dict())\n", + " limit = config.limit\n", + " epoch_limit = epochs\n", + " \n", + " start = timeit.default_timer()\n", + " for epoch in range(1, epochs+1):\n", + " print(f\"Epoch : {epoch}\\n\")\n", + " dataloader = None\n", + " \n", + " for phase in ['train', 'val']:\n", + " running_loss = 0.0\n", + " running_corrects = 0\n", + " \n", + " for (img, label) in tqdm(dataloaders[phase]):\n", + " img, label = img.to(device), label.to(device)\n", + " optimizer.zero_grad()\n", + " \n", + " with torch.set_grad_enabled(phase == 'train'):\n", + " output = model(img)\n", + " _, pred = torch.max(output.data, 1)\n", + " loss = criterion(output, label)\n", + " if phase=='train' :\n", + " loss.backward()\n", + " optimizer.step()\n", + " \n", + " running_loss += loss.item() * img.size(0)\n", + " running_corrects += torch.sum(pred == label.data)\n", + " \n", + " epoch_loss = running_loss / dataset_sizes[phase]\n", + " epoch_acc = running_corrects.double() / dataset_sizes[phase]\n", + " \n", + " print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc))\n", + " \n", + " if phase=='train' :\n", + " train_loss.append(epoch_loss)\n", + " train_acc.append(epoch_acc)\n", + " else :\n", + " val_loss.append(epoch_loss)\n", + " val_acc.append(epoch_acc)\n", + " if val_acc[-1] > best_acc :\n", + " ind_limit = 0\n", + " best_acc = val_acc[-1]\n", + " best_model = copy.deepcopy(model.state_dict())\n", + " torch.save(best_model, path_res + model_name + '.pth')\n", + " else:\n", + " ind_limit += 1\n", + " \n", + " if ind_limit >= limit:\n", + " break\n", + " \n", + " if ind_limit >= limit:\n", + " epoch_limit = epoch\n", + " break\n", + " \n", + " print()\n", + " \n", + " end = timeit.default_timer()\n", + " print(f\"Total time elapsed = {end - start} seconds\")\n", + " epoch_limit += 1\n", + " \n", + " #----------Вывод графиков и сохранение результатов обучения--------------\n", + " \n", + " train_acc = np.asarray(list(map(lambda x: x.item(), train_acc)))\n", + " val_acc = np.asarray(list(map(lambda x: x.item(), val_acc)))\n", + " \n", + " np.save(path_res+'train_acc.npy', train_acc)\n", + " np.save(path_res+'val_acc.npy', val_acc)\n", + " np.save(path_res+'train_loss.npy', train_loss)\n", + " np.save(path_res+'val_loss.npy', val_loss)\n", + " \n", + " plt.figure()\n", + " plt.plot(range(1,epoch_limit), train_loss, color='blue')\n", + " plt.plot(range(1,epoch_limit), val_loss, color='red')\n", + " plt.xlabel('Epoch')\n", + " plt.ylabel('Loss')\n", + " plt.title('Loss Curve')\n", + " plt.legend(['Train Loss', 'Validation Loss'])\n", + " plt.show()\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " \n", + " plt.figure()\n", + " plt.plot(range(1,epoch_limit), train_acc, color='blue')\n", + " plt.plot(range(1,epoch_limit), val_acc, color='red')\n", + " plt.xlabel('Epoch')\n", + " plt.ylabel('Accuracy')\n", + " plt.title('Accuracy Curve')\n", + " plt.legend(['Train Accuracy', 'Validation Accuracy'])\n", + " plt.show()\n", + " \n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " torch.cuda.empty_cache()\n", + " cv2.destroyAllWindows()\n", + " del model\n", + " gc.collect()\n", + "\n", + " return path_res, model_name" + ] + }, + { + "cell_type": "markdown", + "id": "93c136ee", + "metadata": {}, + "source": [ + "### Ensemble" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "52e8d4c5", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\snytk\\miniconda3\\envs\\python311\\Lib\\site-packages\\torchvision\\models\\_utils.py:208: UserWarning: The parameter 'pretrained' is deprecated since 0.13 and may be removed in the future, please use 'weights' instead.\n", + " warnings.warn(\n", + "C:\\Users\\snytk\\miniconda3\\envs\\python311\\Lib\\site-packages\\torchvision\\models\\_utils.py:223: UserWarning: Arguments other than a weight enum or `None` for 'weights' are deprecated since 0.13 and may be removed in the future. The current behavior is equivalent to passing `weights=ResNet18_Weights.IMAGENET1K_V1`. You can also use `weights=ResNet18_Weights.DEFAULT` to get the most up-to-date weights.\n", + " warnings.warn(msg)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch : 1\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 0/337 [00:00 42\u001b[0m path_res, model_name \u001b[38;5;241m=\u001b[39m \u001b[43mprepare_and_learning_detection\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnum_classes\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mnum_classes\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnum_samples\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m20000\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpath_dataset\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m//192.168.11.63/data/DATASETS/Energomash/2400_learning/\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[0;32m 43\u001b[0m \u001b[43m \u001b[49m\u001b[43mmodel_name\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mconfig_name\u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m_2.4_jpg_\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mconfig_name\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mconfig_name\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmodel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmodel\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 46\u001b[0m torch\u001b[38;5;241m.\u001b[39mcuda\u001b[38;5;241m.\u001b[39mempty_cache()\n\u001b[0;32m 47\u001b[0m cv2\u001b[38;5;241m.\u001b[39mdestroyAllWindows()\n", + "Cell \u001b[1;32mIn[2], line 108\u001b[0m, in \u001b[0;36mprepare_and_learning_detection\u001b[1;34m(num_classes, num_samples, path_dataset, model_name, config_name, model)\u001b[0m\n\u001b[0;32m 105\u001b[0m optimizer\u001b[38;5;241m.\u001b[39mzero_grad()\n\u001b[0;32m 107\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m torch\u001b[38;5;241m.\u001b[39mset_grad_enabled(phase \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtrain\u001b[39m\u001b[38;5;124m'\u001b[39m):\n\u001b[1;32m--> 108\u001b[0m output \u001b[38;5;241m=\u001b[39m \u001b[43mmodel\u001b[49m\u001b[43m(\u001b[49m\u001b[43mimg\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 109\u001b[0m _, pred \u001b[38;5;241m=\u001b[39m torch\u001b[38;5;241m.\u001b[39mmax(output\u001b[38;5;241m.\u001b[39mdata, \u001b[38;5;241m1\u001b[39m)\n\u001b[0;32m 110\u001b[0m loss \u001b[38;5;241m=\u001b[39m criterion(output, label)\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\torch\\nn\\modules\\module.py:1553\u001b[0m, in \u001b[0;36mModule._wrapped_call_impl\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1551\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_compiled_call_impl(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;66;03m# type: ignore[misc]\u001b[39;00m\n\u001b[0;32m 1552\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m-> 1553\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_impl\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\torch\\nn\\modules\\module.py:1562\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1557\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[0;32m 1558\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[0;32m 1559\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[0;32m 1560\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[0;32m 1561\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[1;32m-> 1562\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1564\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 1565\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "Cell \u001b[1;32mIn[10], line 28\u001b[0m, in \u001b[0;36mModel.forward\u001b[1;34m(self, x)\u001b[0m\n\u001b[0;32m 26\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\u001b[38;5;28mself\u001b[39m, x):\n\u001b[0;32m 27\u001b[0m \u001b[38;5;28mprint\u001b[39m(x)\n\u001b[1;32m---> 28\u001b[0m x \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmodel\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 29\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m x\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\torch\\nn\\modules\\module.py:1553\u001b[0m, in \u001b[0;36mModule._wrapped_call_impl\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1551\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_compiled_call_impl(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;66;03m# type: ignore[misc]\u001b[39;00m\n\u001b[0;32m 1552\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m-> 1553\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_impl\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\torch\\nn\\modules\\module.py:1562\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1557\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[0;32m 1558\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[0;32m 1559\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[0;32m 1560\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[0;32m 1561\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[1;32m-> 1562\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1564\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 1565\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\torchvision\\models\\resnet.py:285\u001b[0m, in \u001b[0;36mResNet.forward\u001b[1;34m(self, x)\u001b[0m\n\u001b[0;32m 284\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\u001b[38;5;28mself\u001b[39m, x: Tensor) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Tensor:\n\u001b[1;32m--> 285\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_forward_impl\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\torchvision\\models\\resnet.py:268\u001b[0m, in \u001b[0;36mResNet._forward_impl\u001b[1;34m(self, x)\u001b[0m\n\u001b[0;32m 266\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_forward_impl\u001b[39m(\u001b[38;5;28mself\u001b[39m, x: Tensor) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Tensor:\n\u001b[0;32m 267\u001b[0m \u001b[38;5;66;03m# See note [TorchScript super()]\u001b[39;00m\n\u001b[1;32m--> 268\u001b[0m x \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconv1\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 269\u001b[0m x \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbn1(x)\n\u001b[0;32m 270\u001b[0m x \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mrelu(x)\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\torch\\nn\\modules\\module.py:1553\u001b[0m, in \u001b[0;36mModule._wrapped_call_impl\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1551\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_compiled_call_impl(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;66;03m# type: ignore[misc]\u001b[39;00m\n\u001b[0;32m 1552\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m-> 1553\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_impl\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\torch\\nn\\modules\\module.py:1562\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1557\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[0;32m 1558\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[0;32m 1559\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[0;32m 1560\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[0;32m 1561\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[1;32m-> 1562\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1564\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 1565\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\torch\\nn\\modules\\conv.py:458\u001b[0m, in \u001b[0;36mConv2d.forward\u001b[1;34m(self, input)\u001b[0m\n\u001b[0;32m 457\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;28minput\u001b[39m: Tensor) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Tensor:\n\u001b[1;32m--> 458\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_conv_forward\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mweight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbias\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\torch\\nn\\modules\\conv.py:454\u001b[0m, in \u001b[0;36mConv2d._conv_forward\u001b[1;34m(self, input, weight, bias)\u001b[0m\n\u001b[0;32m 450\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpadding_mode \u001b[38;5;241m!=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mzeros\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[0;32m 451\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m F\u001b[38;5;241m.\u001b[39mconv2d(F\u001b[38;5;241m.\u001b[39mpad(\u001b[38;5;28minput\u001b[39m, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_reversed_padding_repeated_twice, mode\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpadding_mode),\n\u001b[0;32m 452\u001b[0m weight, bias, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstride,\n\u001b[0;32m 453\u001b[0m _pair(\u001b[38;5;241m0\u001b[39m), \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdilation, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mgroups)\n\u001b[1;32m--> 454\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mF\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconv2d\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mweight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbias\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstride\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 455\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpadding\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdilation\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgroups\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[1;31mRuntimeError\u001b[0m: Expected 3D (unbatched) or 4D (batched) input to conv2d, but got input of size: [4, 0]" + ] + } + ], + "source": [ + "#----------Инициализируем модель и параметры обучения--------------\n", + "\n", + "torch.cuda.empty_cache()\n", + "cv2.destroyAllWindows()\n", + "gc.collect()\n", + "\n", + "config_name = \"ensemble\"\n", + " \n", + "def load_function(attr):\n", + " module_, func = attr.rsplit('.', maxsplit=1)\n", + " return getattr(import_module(module_), func)\n", + " \n", + "config = mlconfig.load('config_' + config_name + '.yaml')\n", + "\n", + "model = models.resnet18(pretrained=True)\n", + "\n", + "num_classes = 2\n", + "\n", + "model.fc = nn.Linear(model.fc.in_features, num_classes)\n", + "\n", + "class Model(nn.Module):\n", + " def __init__(self, model):\n", + " super(Model, self).__init__()\n", + " self.model = model\n", + "\n", + " def forward(self, x):\n", + " print(x)\n", + " x = self.model(x)\n", + " return x\n", + "\n", + "model = Model(model)\n", + "\n", + "optimizer = load_function(config.optimizer.name)(model.parameters(), lr=config.optimizer.lr)\n", + "criterion = load_function(config.loss_function.name)()\n", + "scheduler = load_function(config.scheduler.name)(optimizer, step_size=config.scheduler.step_size, gamma=config.scheduler.gamma)\n", + "\n", + "if device != 'cpu':\n", + " model = model.to(device)\n", + "\n", + "#----------Создания датасета и обучение модели--------------\n", + "\n", + "path_res, model_name = prepare_and_learning_detection(num_classes = num_classes, num_samples = 20000, path_dataset = \"//192.168.11.63/data/DATASETS/Energomash/2400_learning/\", \n", + " model_name = config_name+\"_2.4_jpg_\", config_name = config_name, model=model)\n", + "\n", + "\n", + "torch.cuda.empty_cache()\n", + "cv2.destroyAllWindows()\n", + "del model\n", + "gc.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "57d18676", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c10afb29", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Отсутствует", + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/train_scripts/Training_models_2.4-Copy2.ipynb b/train_scripts/Training_models_2.4-Copy2.ipynb new file mode 100644 index 0000000..6d08155 --- /dev/null +++ b/train_scripts/Training_models_2.4-Copy2.ipynb @@ -0,0 +1,772 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "5a13ad6b-56c9-4381-b376-1765f6dd7553", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Импортирование библиотек" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "7311cb4a-5bf3-4268-b431-43eea10e9ed6", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cuda\n" + ] + }, + { + "data": { + "text/plain": [ + "12" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "from torch.utils.data import Dataset, DataLoader\n", + "from torch import default_generator, randperm\n", + "from torch.utils.data.dataset import Subset\n", + "import torchvision.transforms as transforms\n", + "from torchvision.io import read_image\n", + "from importlib import import_module\n", + "import matplotlib.pyplot as plt\n", + "from torchvision import models\n", + "import torch, torchvision\n", + "from pathlib import Path\n", + "from PIL import Image\n", + "import torch.nn as nn\n", + "from tqdm import tqdm\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib\n", + "import os, shutil\n", + "import mlconfig\n", + "import random\n", + "import shutil\n", + "import timeit\n", + "import copy\n", + "import time\n", + "import cv2\n", + "import csv\n", + "import sys\n", + "import io\n", + "import gc\n", + "\n", + "plt.rcParams[\"savefig.bbox\"] = 'tight'\n", + "torch.manual_seed(1)\n", + "#matplotlib.use('Agg')\n", + "device = 'cuda' if torch.cuda.is_available() else 'cpu'\n", + "print(device)\n", + "torch.cuda.empty_cache()\n", + "cv2.destroyAllWindows()\n", + "gc.collect()" + ] + }, + { + "cell_type": "markdown", + "id": "384de097-82c6-41f5-bda9-b2f54bc99593", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Подготовка и обучение детектирование" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "46e4dc99-6994-4fee-a32e-f3983bd991bd", + "metadata": {}, + "outputs": [], + "source": [ + "def prepare_and_learning_detection(num_classes, num_samples, path_dataset, model_name, config_name, model):\n", + " num_samples_per_class = num_samples // num_classes\n", + "\n", + " #----------Создаём папку для сохранения результатов обучения--------------\n", + " \n", + " ind = 1\n", + " while True:\n", + " if os.path.exists(\"models/\" + model_name + str(ind)):\n", + " ind += 1\n", + " else:\n", + " os.mkdir(\"models/\" + model_name + str(ind))\n", + " path_res = \"models/\" + model_name + str(ind) + '/'\n", + " break\n", + " \n", + " #----------Создаём файл dataset.csv для обучения--------------\n", + " \n", + " pd_columns = ['file_name']\n", + " df = pd.DataFrame(columns=pd_columns)\n", + " \n", + " subdirs = os.listdir(path_dataset)\n", + " for subdir in subdirs:\n", + " files = os.listdir(path_dataset + subdir + '/')\n", + " num_samples_per_class = min(num_samples_per_class, len(files))\n", + " for subdir in subdirs:\n", + " files = os.listdir(path_dataset + subdir + '/')\n", + " random.shuffle(files)\n", + " files_to_process = files[:num_samples_per_class]\n", + " for file in files_to_process:\n", + " row = pd.DataFrame({pd_columns[0]: [str(path_dataset + subdir + '/' + file)]})\n", + " df = pd.concat([df, row], ignore_index=True)\n", + " \n", + " df.to_csv(path_res + 'dataset.csv', index=False)\n", + " \n", + " #----------Импортируем параметры для обучения--------------\n", + " \n", + " def load_function(attr):\n", + " module_, func = attr.rsplit('.', maxsplit=1)\n", + " return getattr(import_module(module_), func)\n", + " \n", + " config = mlconfig.load('config_' + config_name + '.yaml')\n", + " \n", + " #----------Создаём класс датасета--------------\n", + " \n", + " class MyDataset(Dataset):\n", + " def __init__(self, path_dataset, csv_file):\n", + " data=[]\n", + " with open(path_dataset + csv_file, newline='') as csvfile:\n", + " reader = csv.reader(csvfile, delimiter=' ', quotechar='|')\n", + " for row in list(reader)[1:]:\n", + " row = str(row)\n", + " data.append(row[2: len(row)-2])\n", + " self.sig_filenames = data\n", + " self.path_dataset = path_dataset\n", + " \n", + " def __len__(self):\n", + " return len(self.sig_filenames)\n", + " \n", + " def __getitem__(self, idx):\n", + " image_real = np.asarray(cv2.split(cv2.imread(self.sig_filenames[idx][:-8]+'real.jpg')), dtype=np.float32)\n", + " image_imag = np.asarray(cv2.split(cv2.imread(self.sig_filenames[idx][:-8]+'imag.jpg')), dtype=np.float32)\n", + " image_spec = np.asarray(cv2.split(cv2.imread(self.sig_filenames[idx][:-8]+'spec.jpg')), dtype=np.float32)\n", + " if 'drone' in list(self.sig_filenames[idx].split('/')):\n", + " label = torch.tensor(0)\n", + " if 'noise' in list(self.sig_filenames[idx].split('/')):\n", + " label = torch.tensor(1)\n", + " return image_real, image_imag, image_spec, label\n", + " \n", + " #----------Создаём датасет--------------\n", + " \n", + " dataset = MyDataset(path_dataset=path_res, csv_file='dataset.csv')\n", + " train_set, valid_set = torch.utils.data.random_split(dataset, [0.7, 0.3], generator=torch.Generator().manual_seed(42))\n", + " batch_size = config.batch_size\n", + " train_dataloader = torch.utils.data.DataLoader(train_set, batch_size=batch_size, shuffle=True, drop_last=True)\n", + " valid_dataloader = torch.utils.data.DataLoader(valid_set, batch_size=batch_size, shuffle=True, drop_last=True)\n", + " \n", + " dataloaders = {}\n", + " dataloaders['train'] = train_dataloader\n", + " dataloaders['val'] = valid_dataloader\n", + " dataset_sizes = {}\n", + " dataset_sizes['train'] = len(train_set)\n", + " dataset_sizes['val'] = len(valid_set)\n", + "\n", + " #----------Обучаем модель--------------\n", + "\n", + " val_loss = []\n", + " val_acc = []\n", + " train_loss = []\n", + " train_acc = []\n", + " epochs = config.epoch\n", + " \n", + " best_acc = 0.0\n", + " best_model = copy.deepcopy(model.state_dict())\n", + " limit = config.limit\n", + " epoch_limit = epochs\n", + " \n", + " start = timeit.default_timer()\n", + " for epoch in range(1, epochs+1):\n", + " print(f\"Epoch : {epoch}\\n\")\n", + " dataloader = None\n", + " \n", + " for phase in ['train', 'val']:\n", + " running_loss = 0.0\n", + " running_corrects = 0\n", + " \n", + " for (img1, img2, img3, label) in tqdm(dataloaders[phase]):\n", + " img1, img2, img3, label = img1.to(device), img2.to(device), img3.to(device), label.to(device)\n", + " optimizer.zero_grad()\n", + " \n", + " with torch.set_grad_enabled(phase == 'train'):\n", + " output = model([img1, img2, img3])\n", + " _, pred = torch.max(output.data, 1)\n", + " loss = criterion(output, label)\n", + " if phase=='train' :\n", + " loss.backward()\n", + " optimizer.step()\n", + " \n", + " running_loss += loss.item() * 3 * img1.size(0)\n", + " running_corrects += torch.sum(pred == label.data)\n", + " \n", + " epoch_loss = running_loss / dataset_sizes[phase]\n", + " epoch_acc = running_corrects.double() / dataset_sizes[phase]\n", + " \n", + " print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc))\n", + " \n", + " if phase=='train' :\n", + " train_loss.append(epoch_loss)\n", + " train_acc.append(epoch_acc)\n", + " else :\n", + " val_loss.append(epoch_loss)\n", + " val_acc.append(epoch_acc)\n", + " if val_acc[-1] > best_acc :\n", + " ind_limit = 0\n", + " best_acc = val_acc[-1]\n", + " best_model = copy.deepcopy(model.state_dict())\n", + " torch.save(best_model, path_res + model_name + '.pth')\n", + " else:\n", + " ind_limit += 1\n", + " \n", + " if ind_limit >= limit:\n", + " break\n", + " \n", + " if ind_limit >= limit:\n", + " epoch_limit = epoch\n", + " break\n", + " \n", + " print()\n", + " \n", + " end = timeit.default_timer()\n", + " print(f\"Total time elapsed = {end - start} seconds\")\n", + " epoch_limit += 1\n", + " \n", + " #----------Вывод графиков и сохранение результатов обучения--------------\n", + " \n", + " train_acc = np.asarray(list(map(lambda x: x.item(), train_acc)))\n", + " val_acc = np.asarray(list(map(lambda x: x.item(), val_acc)))\n", + " \n", + " np.save(path_res+'train_acc.npy', train_acc)\n", + " np.save(path_res+'val_acc.npy', val_acc)\n", + " np.save(path_res+'train_loss.npy', train_loss)\n", + " np.save(path_res+'val_loss.npy', val_loss)\n", + " \n", + " plt.figure()\n", + " plt.plot(range(1,epoch_limit), train_loss, color='blue')\n", + " plt.plot(range(1,epoch_limit), val_loss, color='red')\n", + " plt.xlabel('Epoch')\n", + " plt.ylabel('Loss')\n", + " plt.title('Loss Curve')\n", + " plt.legend(['Train Loss', 'Validation Loss'])\n", + " plt.show()\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " \n", + " plt.figure()\n", + " plt.plot(range(1,epoch_limit), train_acc, color='blue')\n", + " plt.plot(range(1,epoch_limit), val_acc, color='red')\n", + " plt.xlabel('Epoch')\n", + " plt.ylabel('Accuracy')\n", + " plt.title('Accuracy Curve')\n", + " plt.legend(['Train Accuracy', 'Validation Accuracy'])\n", + " plt.show()\n", + " \n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " torch.cuda.empty_cache()\n", + " cv2.destroyAllWindows()\n", + " del model\n", + " gc.collect()\n", + "\n", + " return path_res, model_name" + ] + }, + { + "cell_type": "markdown", + "id": "93c136ee", + "metadata": {}, + "source": [ + "### Ensemble" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "52e8d4c5", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\snytk\\miniconda3\\envs\\python311\\Lib\\site-packages\\torchvision\\models\\_utils.py:208: UserWarning: The parameter 'pretrained' is deprecated since 0.13 and may be removed in the future, please use 'weights' instead.\n", + " warnings.warn(\n", + "C:\\Users\\snytk\\miniconda3\\envs\\python311\\Lib\\site-packages\\torchvision\\models\\_utils.py:223: UserWarning: Arguments other than a weight enum or `None` for 'weights' are deprecated since 0.13 and may be removed in the future. The current behavior is equivalent to passing `weights=None`.\n", + " warnings.warn(msg)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch : 1\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 3500/3500 [33:47<00:00, 1.73it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.3107 Acc: 0.9612\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1500/1500 [05:45<00:00, 4.34it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0993 Acc: 0.9893\n", + "\n", + "Epoch : 2\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 3500/3500 [25:20<00:00, 2.30it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0911 Acc: 0.9896\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1500/1500 [04:40<00:00, 5.34it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0354 Acc: 0.9980\n", + "\n", + "Epoch : 3\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 3500/3500 [24:52<00:00, 2.34it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0519 Acc: 0.9938\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1500/1500 [04:13<00:00, 5.92it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0525 Acc: 0.9942\n", + "\n", + "Epoch : 4\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 3500/3500 [25:23<00:00, 2.30it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0347 Acc: 0.9961\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1500/1500 [04:44<00:00, 5.27it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0190 Acc: 0.9975\n", + "\n", + "Epoch : 5\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 3500/3500 [24:50<00:00, 2.35it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0302 Acc: 0.9965\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1500/1500 [04:22<00:00, 5.72it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0338 Acc: 0.9958\n", + "\n", + "Epoch : 6\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 3500/3500 [24:44<00:00, 2.36it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0223 Acc: 0.9970\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1500/1500 [04:20<00:00, 5.77it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0111 Acc: 0.9992\n", + "\n", + "Epoch : 7\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 3500/3500 [24:40<00:00, 2.36it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0215 Acc: 0.9979\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1500/1500 [04:22<00:00, 5.71it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0133 Acc: 0.9982\n", + "\n", + "Epoch : 8\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 3500/3500 [24:42<00:00, 2.36it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0184 Acc: 0.9979\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1500/1500 [04:17<00:00, 5.83it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0343 Acc: 0.9962\n", + "\n", + "Epoch : 9\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 3500/3500 [24:35<00:00, 2.37it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0090 Acc: 0.9990\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1500/1500 [04:15<00:00, 5.86it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0175 Acc: 0.9978\n", + "\n", + "Epoch : 10\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 3500/3500 [25:01<00:00, 2.33it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0189 Acc: 0.9982\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1500/1500 [04:47<00:00, 5.21it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0349 Acc: 0.9960\n", + "\n", + "Total time elapsed = 18231.4253906 seconds\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkkAAAHFCAYAAADmGm0KAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAB3rUlEQVR4nO3deVhU1f8H8PcwDDAs4oJsLiyuKK5gKFpqmYZLWlpqalpqWpqa9U3NzCWXsjR/pZAbpqZippalpeSuaCiGqSi44wIiLqCiLMP5/XGagZEBAYGBmffreeaRuXNn7rkDMm/O+dxzFEIIASIiIiLSY2HsBhARERGVRwxJRERERAYwJBEREREZwJBEREREZABDEhEREZEBDElEREREBjAkERERERnAkERERERkAEMSERERkQEMSUT0RN9++y0UCgV8fX2N3ZQK6caNG5g4cSKaNGkCe3t72NjYoF69ehg7dizOnj1r7OYRUT4UXJaEiJ6kefPmOH78OADg8OHDCAgIMHKLKo7IyEh0794dQgiMHj0abdq0gZWVFWJjY/Hjjz/i5MmTuHPnjrGbSUQGMCQRUYGOHj2KVq1aoVu3bti6dSuGDx+OJUuWGLtZBqWlpcHW1tbYzdBJTU1FgwYNoFKpEBERgZo1a+bZ5+eff0afPn2e+lgajQZZWVmwtrZ+6tciIonDbURUoOXLlwMAvvjiCwQGBiIsLAxpaWl59rt27Rreeecd1KpVC1ZWVnB3d0efPn1w48YN3T53797Fhx9+CG9vb1hbW8PZ2Rldu3bFmTNnAAB79uyBQqHAnj179F770qVLUCgU+OGHH3TbhgwZAnt7e5w4cQKdO3eGg4MDXnjhBQBAeHg4evbsiZo1a8LGxgZ169bFiBEjkJycnKfdZ86cQf/+/eHi4gJra2vUrl0bb775JtLT03Hp0iVYWlpizpw5eZ63b98+KBQKbNiwId/3bunSpUhMTMTcuXMNBiQAegGpQ4cO6NChQ559hgwZAk9Pzzzvx9y5czFz5kx4eXnB2toaP/30E6ysrDBlyhSD56lQKPDtt9/qtiUmJmLEiBGoWbMmrKys4OXlhenTpyMrKyvfcyIyJ5bGbgARlV8PHz7EunXr0KpVK/j6+uLtt9/GsGHDsGHDBgwePFi337Vr19CqVStkZmbik08+QdOmTXHr1i1s374dd+7cgYuLC+7du4d27drh0qVLmDBhAgICAnD//n3s27cPCQkJaNiwYZHbl5GRgZdffhkjRozAxIkTdR/u58+fR5s2bTBs2DA4Ojri0qVLmD9/Ptq1a4cTJ05ApVIBAI4fP4527drByckJM2bMQL169ZCQkIAtW7YgIyMDnp6eePnll/H999/j448/hlKp1B174cKFcHd3xyuvvJJv+3bs2AGlUokePXoU+dwK49tvv0X9+vXx9ddfo1KlSqhXrx66d++OlStXYvr06bCwyPk7eMWKFbCyssKAAQMAyID0zDPPwMLCAp999hnq1KmDQ4cOYebMmbh06RJWrFhRKm0mqlAEEVE+Vq1aJQCI77//XgghxL1794S9vb149tln9fZ7++23hUqlEjExMfm+1owZMwQAER4enu8+u3fvFgDE7t279bZfvHhRABArVqzQbRs8eLAAIEJDQws8h+zsbJGZmSkuX74sAIhff/1V99jzzz8vKleuLJKSkp7Yps2bN+u2Xbt2TVhaWorp06cXeOyGDRsKV1fXAvfJrX379qJ9+/Z5tg8ePFh4eHjo7mvfjzp16oiMjAy9fbds2SIAiB07dui2ZWVlCXd3d9G7d2/dthEjRgh7e3tx+fJlved//fXXAoA4depUodtNZKo43EZE+Vq+fDnUajX69esHALC3t8drr72G/fv3612V9ccff6Bjx47w8fHJ97X++OMP1K9fH506dSrRNvbu3TvPtqSkJIwcORK1atWCpaUlVCoVPDw8AACnT58GIOuX9u7di9dffx3Vq1fP9/U7dOiAZs2aYdGiRbpt33//PRQKBd55550SPZeievnll3W9YlpBQUFwdXXV6wnavn07rl+/jrffflu37ffff0fHjh3h7u6OrKws3S0oKAgAsHfv3rI5CaJyjCGJiAw6d+4c9u3bh27dukEIgbt37+Lu3bu6GprQ0FDdvjdv3sy35qYo+xSVra0tKlWqpLctOzsbnTt3xqZNm/Dxxx9j586diIyMxOHDhwHIIUQAuHPnDjQaTaHaNGbMGOzcuROxsbHIzMzE0qVL0adPH7i6uhb4vNq1a+PmzZt48OBBMc+wYG5ubnm2WVpaYtCgQdi8eTPu3r0LAPjhhx/g5uaGLl266Pa7ceMGfvvtN6hUKr1b48aNAcBg/RaRuWFIIiKDQkNDIYTAzz//jCpVquhu3bp1AwCs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L774IsLCwpCenl4abaNyJvdM2/+t8EJERGSyihyS3n//fURFRSEqKgqNGjXCmDFj4ObmhtGjR+PYsWOl0UYqJ1iPRERE5qTYNUnNmjXD//3f/+HatWuYOnUqli1bhlatWqFZs2YIDQ0FVzsxPUePyn8ZkoiIyBwUe4HbzMxMbN68GStWrEB4eDhat26NoUOH4vr165g8eTL++usvrF27tiTbSkbEom0iIjI3RQ5Jx44dw4oVK7Bu3ToolUoMGjQI33zzDRo2bKjbp3PnznjuuedKtKFkXCzaJiIic1PkkNSqVSu8+OKLCAkJQa9evaBSqfLs06hRI/Tr169EGkjlQ+6Ztlm0TURE5qDIIenChQvw8PAocB87OzusWLGi2I2i8odF20REZG6KXLidlJSEv//+O8/2v//+G0e1lb1kchiSiIjI3BQ5JI0aNQpXrlzJs/3atWsYNWpUiTSKyheNBvjnH/k1QxIREZmLIoekmJgYtGzZMs/2Fi1aICYmpkQaReVLbGxO0XaDBsZuDRERUdkockiytrbGjRs38mxPSEiApWWxZxSgckw71Na8OYu2iYjIfBQ5JL344ouYNGkSUlJSdNvu3r2LTz75BC+++GKJNo7KB9YjERGROSpy18+8efPw3HPPwcPDAy1atAAAREdHw8XFBatXry7xBpLxaUOSv79x20FERFSWihySatSogX///Rdr1qzB8ePHoVar8dZbb6F///4G50yiik2jAbRL8rEniYiIzEmxiojs7OzwzjvvlHRbqBxi0TYREZmrYldax8TEID4+HhkZGXrbX3755aduFJUfLNomIiJzVawZt1955RWcOHECCoUCQggAgEKhAABoNJqSbSEZFYu2iYjIXBX56raxY8fCy8sLN27cgK2tLU6dOoV9+/bB398fe/bsKYUmkjExJBERkbkqck/SoUOHsGvXLlSvXh0WFhawsLBAu3btMGfOHIwZMwb/aKdmpgqPM20TEZE5K3JPkkajgb29PQDAyckJ169fBwB4eHggNja2ZFtHRhUXBzx4ANjaAg0bGrs1REREZavIPUm+vr74999/4e3tjYCAAMydOxdWVlZYsmQJvL29S6ONZCQs2iYiInNW5JD06aef4sGDBwCAmTNnonv37nj22WdRrVo1rF+/vsQbSMbDeiQiIjJnRQ5JXbp00X3t7e2NmJgY3L59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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "67" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#----------Инициализируем модель и параметры обучения--------------\n", + "\n", + "torch.cuda.empty_cache()\n", + "cv2.destroyAllWindows()\n", + "gc.collect()\n", + "\n", + "num_classes = 3\n", + "config_name = \"ensemble\"\n", + " \n", + "def load_function(attr):\n", + " module_, func = attr.rsplit('.', maxsplit=1)\n", + " return getattr(import_module(module_), func)\n", + " \n", + "config = mlconfig.load('config_' + config_name + '.yaml')\n", + "\n", + "model1 = models.resnet18(pretrained=False)\n", + "model2 = models.resnet50(pretrained=False)\n", + "model3 = models.resnet101(pretrained=False)\n", + "\n", + "num_classes = 2\n", + "\n", + "model1.fc = nn.Linear(model1.fc.in_features, num_classes)\n", + "model2.fc = nn.Linear(model2.fc.in_features, num_classes)\n", + "model3.fc = nn.Linear(model3.fc.in_features, num_classes)\n", + "\n", + "class Ensemble(nn.Module):\n", + " def __init__(self, model1, model2, model3):\n", + " super(Ensemble, self).__init__()\n", + " self.model1 = model1\n", + " self.model2 = model2\n", + " self.model3 = model3\n", + " self.fc = nn.Linear(3 * num_classes, num_classes)\n", + "\n", + " def forward(self, x):\n", + " x1 = self.model1(x[0])\n", + " x2 = self.model2(x[1])\n", + " x3 = self.model3(x[2])\n", + " x = torch.cat((x1, x2, x3), dim=1)\n", + " x = self.fc(x)\n", + " return x\n", + "\n", + "model = Ensemble(model1, model2, model3)\n", + "\n", + "optimizer = load_function(config.optimizer.name)(model.parameters(), lr=config.optimizer.lr)\n", + "criterion = load_function(config.loss_function.name)()\n", + "scheduler = load_function(config.scheduler.name)(optimizer, step_size=config.scheduler.step_size, gamma=config.scheduler.gamma)\n", + "\n", + "if device != 'cpu':\n", + " model = model.to(device)\n", + "\n", + "#----------Создания датасета и обучение модели--------------\n", + "\n", + "path_res, model_name = prepare_and_learning_detection(num_classes = num_classes, num_samples = 20000, path_dataset = \"C:/Users/snytk/Lerning_NN_for_work/datasets_jpg/2.4_jpg_learning/\", \n", + " model_name = config_name+\"_2.4_jpg_\", config_name = config_name, model=model)\n", + "\n", + "\n", + "torch.cuda.empty_cache()\n", + "cv2.destroyAllWindows()\n", + "del model\n", + "gc.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "57d18676", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Отсутствует", + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/train_scripts/Training_models_2.4-Copy3.ipynb b/train_scripts/Training_models_2.4-Copy3.ipynb new file mode 100644 index 0000000..40b4db4 --- /dev/null +++ b/train_scripts/Training_models_2.4-Copy3.ipynb @@ -0,0 +1,465 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "5a13ad6b-56c9-4381-b376-1765f6dd7553", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Импортирование библиотек" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "7311cb4a-5bf3-4268-b431-43eea10e9ed6", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cuda\n" + ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "from torch.utils.data import Dataset, DataLoader\n", + "from torch import default_generator, randperm\n", + "from torch.utils.data.dataset import Subset\n", + "import torchvision.transforms as transforms\n", + "from torchvision.io import read_image\n", + "from importlib import import_module\n", + "import matplotlib.pyplot as plt\n", + "from torchvision import models\n", + "import torch, torchvision\n", + "from pathlib import Path\n", + "from PIL import Image\n", + "import torch.nn as nn\n", + "from tqdm import tqdm\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib\n", + "import os, shutil\n", + "import mlconfig\n", + "import random\n", + "import shutil\n", + "import timeit\n", + "import copy\n", + "import time\n", + "import cv2\n", + "import csv\n", + "import sys\n", + "import io\n", + "import gc\n", + "\n", + "plt.rcParams[\"savefig.bbox\"] = 'tight'\n", + "torch.manual_seed(1)\n", + "#matplotlib.use('Agg')\n", + "device = 'cuda' if torch.cuda.is_available() else 'cpu'\n", + "print(device)\n", + "torch.cuda.empty_cache()\n", + "cv2.destroyAllWindows()\n", + "gc.collect()" + ] + }, + { + "cell_type": "markdown", + "id": "384de097-82c6-41f5-bda9-b2f54bc99593", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Подготовка и обучение детектирование" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "46e4dc99-6994-4fee-a32e-f3983bd991bd", + "metadata": {}, + "outputs": [], + "source": [ + "def prepare_and_learning_detection(num_classes, num_samples, path_dataset, model_name, config_name, model):\n", + " num_samples_per_class = num_samples // num_classes\n", + "\n", + " #----------Создаём папку для сохранения результатов обучения--------------\n", + " \n", + " ind = 1\n", + " while True:\n", + " if os.path.exists(\"models/\" + model_name + str(ind)):\n", + " ind += 1\n", + " else:\n", + " os.mkdir(\"models/\" + model_name + str(ind))\n", + " path_res = \"models/\" + model_name + str(ind) + '/'\n", + " break\n", + " \n", + " #----------Создаём файл dataset.csv для обучения--------------\n", + " \n", + " pd_columns = ['file_name']\n", + " df = pd.DataFrame(columns=pd_columns)\n", + " \n", + " subdirs = os.listdir(path_dataset)\n", + " for subdir in subdirs:\n", + " files = os.listdir(path_dataset + subdir + '/')\n", + " num_samples_per_class = min(num_samples_per_class, len(files))\n", + " for subdir in subdirs:\n", + " files = os.listdir(path_dataset + subdir + '/')\n", + " random.shuffle(files)\n", + " files_to_process = files[:num_samples_per_class]\n", + " for file in files_to_process:\n", + " row = pd.DataFrame({pd_columns[0]: [str(path_dataset + subdir + '/' + file)]})\n", + " df = pd.concat([df, row], ignore_index=True)\n", + " \n", + " df.to_csv(path_res + 'dataset.csv', index=False)\n", + " \n", + " #----------Импортируем параметры для обучения--------------\n", + " \n", + " def load_function(attr):\n", + " module_, func = attr.rsplit('.', maxsplit=1)\n", + " return getattr(import_module(module_), func)\n", + " \n", + " config = mlconfig.load('config_' + config_name + '.yaml')\n", + " \n", + " #----------Создаём класс датасета--------------\n", + " \n", + " class MyDataset(Dataset):\n", + " def __init__(self, path_dataset, csv_file):\n", + " data=[]\n", + " with open(path_dataset + csv_file, newline='') as csvfile:\n", + " reader = csv.reader(csvfile, delimiter=' ', quotechar='|')\n", + " for row in list(reader)[1:]:\n", + " row = str(row)\n", + " data.append(row[2: len(row)-2])\n", + " self.sig_filenames = data\n", + " self.path_dataset = path_dataset\n", + " \n", + " def __len__(self):\n", + " return len(self.sig_filenames)\n", + " \n", + " def __getitem__(self, idx):\n", + " image_real = np.asarray(cv2.split(cv2.imread(self.sig_filenames[idx][:-8]+'real.jpg')), dtype=np.float32)\n", + " if 'drone' in list(self.sig_filenames[idx].split('/')):\n", + " label = torch.tensor(0)\n", + " if 'noise' in list(self.sig_filenames[idx].split('/')):\n", + " label = torch.tensor(1)\n", + " return image_real, label\n", + " \n", + " #----------Создаём датасет--------------\n", + " \n", + " dataset = MyDataset(path_dataset=path_res, csv_file='dataset.csv')\n", + " train_set, valid_set = torch.utils.data.random_split(dataset, [0.7, 0.3], generator=torch.Generator().manual_seed(42))\n", + " batch_size = config.batch_size\n", + " train_dataloader = torch.utils.data.DataLoader(train_set, batch_size=batch_size, shuffle=True, drop_last=True)\n", + " valid_dataloader = torch.utils.data.DataLoader(valid_set, batch_size=batch_size, shuffle=True, drop_last=True)\n", + " \n", + " dataloaders = {}\n", + " dataloaders['train'] = train_dataloader\n", + " dataloaders['val'] = valid_dataloader\n", + " dataset_sizes = {}\n", + " dataset_sizes['train'] = len(train_set)\n", + " dataset_sizes['val'] = len(valid_set)\n", + "\n", + " #----------Обучаем модель--------------\n", + "\n", + " val_loss = []\n", + " val_acc = []\n", + " train_loss = []\n", + " train_acc = []\n", + " epochs = config.epoch\n", + " \n", + " best_acc = 0.0\n", + " best_model = copy.deepcopy(model.state_dict())\n", + " limit = config.limit\n", + " epoch_limit = epochs\n", + " \n", + " start = timeit.default_timer()\n", + " for epoch in range(1, epochs+1):\n", + " print(f\"Epoch : {epoch}\\n\")\n", + " dataloader = None\n", + " \n", + " for phase in ['train', 'val']:\n", + " running_loss = 0.0\n", + " running_corrects = 0\n", + " \n", + " for (img, label) in tqdm(dataloaders[phase]):\n", + " img, label = img.to(device), label.to(device)\n", + " optimizer.zero_grad()\n", + " \n", + " with torch.set_grad_enabled(phase == 'train'):\n", + " output = model(img)\n", + " _, pred = torch.max(output.data, 1)\n", + " loss = criterion(output, label)\n", + " if phase=='train' :\n", + " loss.backward()\n", + " optimizer.step()\n", + " \n", + " running_loss += loss.item() * img.size(0)\n", + " running_corrects += torch.sum(pred == label.data)\n", + " \n", + " epoch_loss = running_loss / dataset_sizes[phase]\n", + " epoch_acc = running_corrects.double() / dataset_sizes[phase]\n", + " \n", + " print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc))\n", + " \n", + " if phase=='train' :\n", + " train_loss.append(epoch_loss)\n", + " train_acc.append(epoch_acc)\n", + " else :\n", + " val_loss.append(epoch_loss)\n", + " val_acc.append(epoch_acc)\n", + " if val_acc[-1] > best_acc :\n", + " ind_limit = 0\n", + " best_acc = val_acc[-1]\n", + " best_model = copy.deepcopy(model.state_dict())\n", + " torch.save(best_model, path_res + model_name + '.pth')\n", + " else:\n", + " ind_limit += 1\n", + " \n", + " if ind_limit >= limit:\n", + " break\n", + " \n", + " if ind_limit >= limit:\n", + " epoch_limit = epoch\n", + " break\n", + " \n", + " print()\n", + " \n", + " end = timeit.default_timer()\n", + " print(f\"Total time elapsed = {end - start} seconds\")\n", + " epoch_limit += 1\n", + " \n", + " #----------Вывод графиков и сохранение результатов обучения--------------\n", + " \n", + " train_acc = np.asarray(list(map(lambda x: x.item(), train_acc)))\n", + " val_acc = np.asarray(list(map(lambda x: x.item(), val_acc)))\n", + " \n", + " np.save(path_res+'train_acc.npy', train_acc)\n", + " np.save(path_res+'val_acc.npy', val_acc)\n", + " np.save(path_res+'train_loss.npy', train_loss)\n", + " np.save(path_res+'val_loss.npy', val_loss)\n", + " \n", + " plt.figure()\n", + " plt.plot(range(1,epoch_limit), train_loss, color='blue')\n", + " plt.plot(range(1,epoch_limit), val_loss, color='red')\n", + " plt.xlabel('Epoch')\n", + " plt.ylabel('Loss')\n", + " plt.title('Loss Curve')\n", + " plt.legend(['Train Loss', 'Validation Loss'])\n", + " plt.show()\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " \n", + " plt.figure()\n", + " plt.plot(range(1,epoch_limit), train_acc, color='blue')\n", + " plt.plot(range(1,epoch_limit), val_acc, color='red')\n", + " plt.xlabel('Epoch')\n", + " plt.ylabel('Accuracy')\n", + " plt.title('Accuracy Curve')\n", + " plt.legend(['Train Accuracy', 'Validation Accuracy'])\n", + " plt.show()\n", + " \n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " torch.cuda.empty_cache()\n", + " cv2.destroyAllWindows()\n", + " del model\n", + " gc.collect()\n", + "\n", + " return path_res, model_name" + ] + }, + { + "cell_type": "markdown", + "id": "93c136ee", + "metadata": {}, + "source": [ + "### Ensemble" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "52e8d4c5", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\snytk\\miniconda3\\envs\\python311\\Lib\\site-packages\\torchvision\\models\\_utils.py:208: UserWarning: The parameter 'pretrained' is deprecated since 0.13 and may be removed in the future, please use 'weights' instead.\n", + " warnings.warn(\n", + "C:\\Users\\snytk\\miniconda3\\envs\\python311\\Lib\\site-packages\\torchvision\\models\\_utils.py:223: UserWarning: Arguments other than a weight enum or `None` for 'weights' are deprecated since 0.13 and may be removed in the future. The current behavior is equivalent to passing `weights=ResNet18_Weights.IMAGENET1K_V1`. You can also use `weights=ResNet18_Weights.DEFAULT` to get the most up-to-date weights.\n", + " warnings.warn(msg)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch : 1\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 0/337 [00:00 42\u001b[0m path_res, model_name \u001b[38;5;241m=\u001b[39m \u001b[43mprepare_and_learning_detection\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnum_classes\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mnum_classes\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnum_samples\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m20000\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpath_dataset\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m//192.168.11.63/data/DATASETS/Energomash/2400_learning/\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[0;32m 43\u001b[0m \u001b[43m \u001b[49m\u001b[43mmodel_name\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mconfig_name\u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m_2.4_jpg_\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mconfig_name\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mconfig_name\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmodel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmodel\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 46\u001b[0m torch\u001b[38;5;241m.\u001b[39mcuda\u001b[38;5;241m.\u001b[39mempty_cache()\n\u001b[0;32m 47\u001b[0m cv2\u001b[38;5;241m.\u001b[39mdestroyAllWindows()\n", + "Cell \u001b[1;32mIn[2], line 108\u001b[0m, in \u001b[0;36mprepare_and_learning_detection\u001b[1;34m(num_classes, num_samples, path_dataset, model_name, config_name, model)\u001b[0m\n\u001b[0;32m 105\u001b[0m optimizer\u001b[38;5;241m.\u001b[39mzero_grad()\n\u001b[0;32m 107\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m torch\u001b[38;5;241m.\u001b[39mset_grad_enabled(phase \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtrain\u001b[39m\u001b[38;5;124m'\u001b[39m):\n\u001b[1;32m--> 108\u001b[0m output \u001b[38;5;241m=\u001b[39m \u001b[43mmodel\u001b[49m\u001b[43m(\u001b[49m\u001b[43mimg\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 109\u001b[0m _, pred \u001b[38;5;241m=\u001b[39m torch\u001b[38;5;241m.\u001b[39mmax(output\u001b[38;5;241m.\u001b[39mdata, \u001b[38;5;241m1\u001b[39m)\n\u001b[0;32m 110\u001b[0m loss \u001b[38;5;241m=\u001b[39m criterion(output, label)\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\torch\\nn\\modules\\module.py:1553\u001b[0m, in \u001b[0;36mModule._wrapped_call_impl\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1551\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_compiled_call_impl(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;66;03m# type: ignore[misc]\u001b[39;00m\n\u001b[0;32m 1552\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m-> 1553\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_impl\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\torch\\nn\\modules\\module.py:1562\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1557\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[0;32m 1558\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[0;32m 1559\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[0;32m 1560\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[0;32m 1561\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[1;32m-> 1562\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1564\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 1565\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "Cell \u001b[1;32mIn[10], line 28\u001b[0m, in \u001b[0;36mModel.forward\u001b[1;34m(self, x)\u001b[0m\n\u001b[0;32m 26\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\u001b[38;5;28mself\u001b[39m, x):\n\u001b[0;32m 27\u001b[0m \u001b[38;5;28mprint\u001b[39m(x)\n\u001b[1;32m---> 28\u001b[0m x \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmodel\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 29\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m x\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\torch\\nn\\modules\\module.py:1553\u001b[0m, in \u001b[0;36mModule._wrapped_call_impl\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1551\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_compiled_call_impl(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;66;03m# type: ignore[misc]\u001b[39;00m\n\u001b[0;32m 1552\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m-> 1553\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_impl\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\torch\\nn\\modules\\module.py:1562\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1557\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[0;32m 1558\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[0;32m 1559\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[0;32m 1560\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[0;32m 1561\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[1;32m-> 1562\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1564\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 1565\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\torchvision\\models\\resnet.py:285\u001b[0m, in \u001b[0;36mResNet.forward\u001b[1;34m(self, x)\u001b[0m\n\u001b[0;32m 284\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\u001b[38;5;28mself\u001b[39m, x: Tensor) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Tensor:\n\u001b[1;32m--> 285\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_forward_impl\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\torchvision\\models\\resnet.py:268\u001b[0m, in \u001b[0;36mResNet._forward_impl\u001b[1;34m(self, x)\u001b[0m\n\u001b[0;32m 266\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_forward_impl\u001b[39m(\u001b[38;5;28mself\u001b[39m, x: Tensor) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Tensor:\n\u001b[0;32m 267\u001b[0m \u001b[38;5;66;03m# See note [TorchScript super()]\u001b[39;00m\n\u001b[1;32m--> 268\u001b[0m x \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconv1\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 269\u001b[0m x \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbn1(x)\n\u001b[0;32m 270\u001b[0m x \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mrelu(x)\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\torch\\nn\\modules\\module.py:1553\u001b[0m, in \u001b[0;36mModule._wrapped_call_impl\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1551\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_compiled_call_impl(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;66;03m# type: ignore[misc]\u001b[39;00m\n\u001b[0;32m 1552\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m-> 1553\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_impl\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\torch\\nn\\modules\\module.py:1562\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1557\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[0;32m 1558\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[0;32m 1559\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[0;32m 1560\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[0;32m 1561\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[1;32m-> 1562\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1564\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 1565\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\torch\\nn\\modules\\conv.py:458\u001b[0m, in \u001b[0;36mConv2d.forward\u001b[1;34m(self, input)\u001b[0m\n\u001b[0;32m 457\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;28minput\u001b[39m: Tensor) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Tensor:\n\u001b[1;32m--> 458\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_conv_forward\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mweight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbias\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\miniconda3\\envs\\python311\\Lib\\site-packages\\torch\\nn\\modules\\conv.py:454\u001b[0m, in \u001b[0;36mConv2d._conv_forward\u001b[1;34m(self, input, weight, bias)\u001b[0m\n\u001b[0;32m 450\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpadding_mode \u001b[38;5;241m!=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mzeros\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[0;32m 451\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m F\u001b[38;5;241m.\u001b[39mconv2d(F\u001b[38;5;241m.\u001b[39mpad(\u001b[38;5;28minput\u001b[39m, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_reversed_padding_repeated_twice, mode\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpadding_mode),\n\u001b[0;32m 452\u001b[0m weight, bias, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstride,\n\u001b[0;32m 453\u001b[0m _pair(\u001b[38;5;241m0\u001b[39m), \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdilation, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mgroups)\n\u001b[1;32m--> 454\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mF\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconv2d\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mweight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbias\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstride\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 455\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpadding\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdilation\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgroups\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[1;31mRuntimeError\u001b[0m: Expected 3D (unbatched) or 4D (batched) input to conv2d, but got input of size: [4, 0]" + ] + } + ], + "source": [ + "#----------Инициализируем модель и параметры обучения--------------\n", + "\n", + "torch.cuda.empty_cache()\n", + "cv2.destroyAllWindows()\n", + "gc.collect()\n", + "\n", + "config_name = \"ensemble\"\n", + " \n", + "def load_function(attr):\n", + " module_, func = attr.rsplit('.', maxsplit=1)\n", + " return getattr(import_module(module_), func)\n", + " \n", + "config = mlconfig.load('config_' + config_name + '.yaml')\n", + "\n", + "model = models.resnet18(pretrained=True)\n", + "\n", + "num_classes = 2\n", + "\n", + "model.fc = nn.Linear(model.fc.in_features, num_classes)\n", + "\n", + "class Model(nn.Module):\n", + " def __init__(self, model):\n", + " super(Model, self).__init__()\n", + " self.model = model\n", + "\n", + " def forward(self, x):\n", + " print(x)\n", + " x = self.model(x)\n", + " return x\n", + "\n", + "model = Model(model)\n", + "\n", + "optimizer = load_function(config.optimizer.name)(model.parameters(), lr=config.optimizer.lr)\n", + "criterion = load_function(config.loss_function.name)()\n", + "scheduler = load_function(config.scheduler.name)(optimizer, step_size=config.scheduler.step_size, gamma=config.scheduler.gamma)\n", + "\n", + "if device != 'cpu':\n", + " model = model.to(device)\n", + "\n", + "#----------Создания датасета и обучение модели--------------\n", + "\n", + "path_res, model_name = prepare_and_learning_detection(num_classes = num_classes, num_samples = 20000, path_dataset = \"//192.168.11.63/data/DATASETS/Energomash/2400_learning/\", \n", + " model_name = config_name+\"_2.4_jpg_\", config_name = config_name, model=model)\n", + "\n", + "\n", + "torch.cuda.empty_cache()\n", + "cv2.destroyAllWindows()\n", + "del model\n", + "gc.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "57d18676", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c10afb29", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Отсутствует", + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/train_scripts/Training_models_2.4.ipynb b/train_scripts/Training_models_2.4.ipynb new file mode 100644 index 0000000..6d08155 --- /dev/null +++ b/train_scripts/Training_models_2.4.ipynb @@ -0,0 +1,772 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "5a13ad6b-56c9-4381-b376-1765f6dd7553", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Импортирование библиотек" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "7311cb4a-5bf3-4268-b431-43eea10e9ed6", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cuda\n" + ] + }, + { + "data": { + "text/plain": [ + "12" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "from torch.utils.data import Dataset, DataLoader\n", + "from torch import default_generator, randperm\n", + "from torch.utils.data.dataset import Subset\n", + "import torchvision.transforms as transforms\n", + "from torchvision.io import read_image\n", + "from importlib import import_module\n", + "import matplotlib.pyplot as plt\n", + "from torchvision import models\n", + "import torch, torchvision\n", + "from pathlib import Path\n", + "from PIL import Image\n", + "import torch.nn as nn\n", + "from tqdm import tqdm\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib\n", + "import os, shutil\n", + "import mlconfig\n", + "import random\n", + "import shutil\n", + "import timeit\n", + "import copy\n", + "import time\n", + "import cv2\n", + "import csv\n", + "import sys\n", + "import io\n", + "import gc\n", + "\n", + "plt.rcParams[\"savefig.bbox\"] = 'tight'\n", + "torch.manual_seed(1)\n", + "#matplotlib.use('Agg')\n", + "device = 'cuda' if torch.cuda.is_available() else 'cpu'\n", + "print(device)\n", + "torch.cuda.empty_cache()\n", + "cv2.destroyAllWindows()\n", + "gc.collect()" + ] + }, + { + "cell_type": "markdown", + "id": "384de097-82c6-41f5-bda9-b2f54bc99593", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Подготовка и обучение детектирование" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "46e4dc99-6994-4fee-a32e-f3983bd991bd", + "metadata": {}, + "outputs": [], + "source": [ + "def prepare_and_learning_detection(num_classes, num_samples, path_dataset, model_name, config_name, model):\n", + " num_samples_per_class = num_samples // num_classes\n", + "\n", + " #----------Создаём папку для сохранения результатов обучения--------------\n", + " \n", + " ind = 1\n", + " while True:\n", + " if os.path.exists(\"models/\" + model_name + str(ind)):\n", + " ind += 1\n", + " else:\n", + " os.mkdir(\"models/\" + model_name + str(ind))\n", + " path_res = \"models/\" + model_name + str(ind) + '/'\n", + " break\n", + " \n", + " #----------Создаём файл dataset.csv для обучения--------------\n", + " \n", + " pd_columns = ['file_name']\n", + " df = pd.DataFrame(columns=pd_columns)\n", + " \n", + " subdirs = os.listdir(path_dataset)\n", + " for subdir in subdirs:\n", + " files = os.listdir(path_dataset + subdir + '/')\n", + " num_samples_per_class = min(num_samples_per_class, len(files))\n", + " for subdir in subdirs:\n", + " files = os.listdir(path_dataset + subdir + '/')\n", + " random.shuffle(files)\n", + " files_to_process = files[:num_samples_per_class]\n", + " for file in files_to_process:\n", + " row = pd.DataFrame({pd_columns[0]: [str(path_dataset + subdir + '/' + file)]})\n", + " df = pd.concat([df, row], ignore_index=True)\n", + " \n", + " df.to_csv(path_res + 'dataset.csv', index=False)\n", + " \n", + " #----------Импортируем параметры для обучения--------------\n", + " \n", + " def load_function(attr):\n", + " module_, func = attr.rsplit('.', maxsplit=1)\n", + " return getattr(import_module(module_), func)\n", + " \n", + " config = mlconfig.load('config_' + config_name + '.yaml')\n", + " \n", + " #----------Создаём класс датасета--------------\n", + " \n", + " class MyDataset(Dataset):\n", + " def __init__(self, path_dataset, csv_file):\n", + " data=[]\n", + " with open(path_dataset + csv_file, newline='') as csvfile:\n", + " reader = csv.reader(csvfile, delimiter=' ', quotechar='|')\n", + " for row in list(reader)[1:]:\n", + " row = str(row)\n", + " data.append(row[2: len(row)-2])\n", + " self.sig_filenames = data\n", + " self.path_dataset = path_dataset\n", + " \n", + " def __len__(self):\n", + " return len(self.sig_filenames)\n", + " \n", + " def __getitem__(self, idx):\n", + " image_real = np.asarray(cv2.split(cv2.imread(self.sig_filenames[idx][:-8]+'real.jpg')), dtype=np.float32)\n", + " image_imag = np.asarray(cv2.split(cv2.imread(self.sig_filenames[idx][:-8]+'imag.jpg')), dtype=np.float32)\n", + " image_spec = np.asarray(cv2.split(cv2.imread(self.sig_filenames[idx][:-8]+'spec.jpg')), dtype=np.float32)\n", + " if 'drone' in list(self.sig_filenames[idx].split('/')):\n", + " label = torch.tensor(0)\n", + " if 'noise' in list(self.sig_filenames[idx].split('/')):\n", + " label = torch.tensor(1)\n", + " return image_real, image_imag, image_spec, label\n", + " \n", + " #----------Создаём датасет--------------\n", + " \n", + " dataset = MyDataset(path_dataset=path_res, csv_file='dataset.csv')\n", + " train_set, valid_set = torch.utils.data.random_split(dataset, [0.7, 0.3], generator=torch.Generator().manual_seed(42))\n", + " batch_size = config.batch_size\n", + " train_dataloader = torch.utils.data.DataLoader(train_set, batch_size=batch_size, shuffle=True, drop_last=True)\n", + " valid_dataloader = torch.utils.data.DataLoader(valid_set, batch_size=batch_size, shuffle=True, drop_last=True)\n", + " \n", + " dataloaders = {}\n", + " dataloaders['train'] = train_dataloader\n", + " dataloaders['val'] = valid_dataloader\n", + " dataset_sizes = {}\n", + " dataset_sizes['train'] = len(train_set)\n", + " dataset_sizes['val'] = len(valid_set)\n", + "\n", + " #----------Обучаем модель--------------\n", + "\n", + " val_loss = []\n", + " val_acc = []\n", + " train_loss = []\n", + " train_acc = []\n", + " epochs = config.epoch\n", + " \n", + " best_acc = 0.0\n", + " best_model = copy.deepcopy(model.state_dict())\n", + " limit = config.limit\n", + " epoch_limit = epochs\n", + " \n", + " start = timeit.default_timer()\n", + " for epoch in range(1, epochs+1):\n", + " print(f\"Epoch : {epoch}\\n\")\n", + " dataloader = None\n", + " \n", + " for phase in ['train', 'val']:\n", + " running_loss = 0.0\n", + " running_corrects = 0\n", + " \n", + " for (img1, img2, img3, label) in tqdm(dataloaders[phase]):\n", + " img1, img2, img3, label = img1.to(device), img2.to(device), img3.to(device), label.to(device)\n", + " optimizer.zero_grad()\n", + " \n", + " with torch.set_grad_enabled(phase == 'train'):\n", + " output = model([img1, img2, img3])\n", + " _, pred = torch.max(output.data, 1)\n", + " loss = criterion(output, label)\n", + " if phase=='train' :\n", + " loss.backward()\n", + " optimizer.step()\n", + " \n", + " running_loss += loss.item() * 3 * img1.size(0)\n", + " running_corrects += torch.sum(pred == label.data)\n", + " \n", + " epoch_loss = running_loss / dataset_sizes[phase]\n", + " epoch_acc = running_corrects.double() / dataset_sizes[phase]\n", + " \n", + " print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc))\n", + " \n", + " if phase=='train' :\n", + " train_loss.append(epoch_loss)\n", + " train_acc.append(epoch_acc)\n", + " else :\n", + " val_loss.append(epoch_loss)\n", + " val_acc.append(epoch_acc)\n", + " if val_acc[-1] > best_acc :\n", + " ind_limit = 0\n", + " best_acc = val_acc[-1]\n", + " best_model = copy.deepcopy(model.state_dict())\n", + " torch.save(best_model, path_res + model_name + '.pth')\n", + " else:\n", + " ind_limit += 1\n", + " \n", + " if ind_limit >= limit:\n", + " break\n", + " \n", + " if ind_limit >= limit:\n", + " epoch_limit = epoch\n", + " break\n", + " \n", + " print()\n", + " \n", + " end = timeit.default_timer()\n", + " print(f\"Total time elapsed = {end - start} seconds\")\n", + " epoch_limit += 1\n", + " \n", + " #----------Вывод графиков и сохранение результатов обучения--------------\n", + " \n", + " train_acc = np.asarray(list(map(lambda x: x.item(), train_acc)))\n", + " val_acc = np.asarray(list(map(lambda x: x.item(), val_acc)))\n", + " \n", + " np.save(path_res+'train_acc.npy', train_acc)\n", + " np.save(path_res+'val_acc.npy', val_acc)\n", + " np.save(path_res+'train_loss.npy', train_loss)\n", + " np.save(path_res+'val_loss.npy', val_loss)\n", + " \n", + " plt.figure()\n", + " plt.plot(range(1,epoch_limit), train_loss, color='blue')\n", + " plt.plot(range(1,epoch_limit), val_loss, color='red')\n", + " plt.xlabel('Epoch')\n", + " plt.ylabel('Loss')\n", + " plt.title('Loss Curve')\n", + " plt.legend(['Train Loss', 'Validation Loss'])\n", + " plt.show()\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " \n", + " plt.figure()\n", + " plt.plot(range(1,epoch_limit), train_acc, color='blue')\n", + " plt.plot(range(1,epoch_limit), val_acc, color='red')\n", + " plt.xlabel('Epoch')\n", + " plt.ylabel('Accuracy')\n", + " plt.title('Accuracy Curve')\n", + " plt.legend(['Train Accuracy', 'Validation Accuracy'])\n", + " plt.show()\n", + " \n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " torch.cuda.empty_cache()\n", + " cv2.destroyAllWindows()\n", + " del model\n", + " gc.collect()\n", + "\n", + " return path_res, model_name" + ] + }, + { + "cell_type": "markdown", + "id": "93c136ee", + "metadata": {}, + "source": [ + "### Ensemble" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "52e8d4c5", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\snytk\\miniconda3\\envs\\python311\\Lib\\site-packages\\torchvision\\models\\_utils.py:208: UserWarning: The parameter 'pretrained' is deprecated since 0.13 and may be removed in the future, please use 'weights' instead.\n", + " warnings.warn(\n", + "C:\\Users\\snytk\\miniconda3\\envs\\python311\\Lib\\site-packages\\torchvision\\models\\_utils.py:223: UserWarning: Arguments other than a weight enum or `None` for 'weights' are deprecated since 0.13 and may be removed in the future. The current behavior is equivalent to passing `weights=None`.\n", + " warnings.warn(msg)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch : 1\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 3500/3500 [33:47<00:00, 1.73it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.3107 Acc: 0.9612\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1500/1500 [05:45<00:00, 4.34it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0993 Acc: 0.9893\n", + "\n", + "Epoch : 2\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 3500/3500 [25:20<00:00, 2.30it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0911 Acc: 0.9896\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1500/1500 [04:40<00:00, 5.34it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0354 Acc: 0.9980\n", + "\n", + "Epoch : 3\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 3500/3500 [24:52<00:00, 2.34it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0519 Acc: 0.9938\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1500/1500 [04:13<00:00, 5.92it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0525 Acc: 0.9942\n", + "\n", + "Epoch : 4\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 3500/3500 [25:23<00:00, 2.30it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0347 Acc: 0.9961\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1500/1500 [04:44<00:00, 5.27it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0190 Acc: 0.9975\n", + "\n", + "Epoch : 5\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 3500/3500 [24:50<00:00, 2.35it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0302 Acc: 0.9965\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1500/1500 [04:22<00:00, 5.72it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0338 Acc: 0.9958\n", + "\n", + "Epoch : 6\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 3500/3500 [24:44<00:00, 2.36it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0223 Acc: 0.9970\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1500/1500 [04:20<00:00, 5.77it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0111 Acc: 0.9992\n", + "\n", + "Epoch : 7\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 3500/3500 [24:40<00:00, 2.36it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0215 Acc: 0.9979\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1500/1500 [04:22<00:00, 5.71it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0133 Acc: 0.9982\n", + "\n", + "Epoch : 8\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 3500/3500 [24:42<00:00, 2.36it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0184 Acc: 0.9979\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1500/1500 [04:17<00:00, 5.83it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0343 Acc: 0.9962\n", + "\n", + "Epoch : 9\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 3500/3500 [24:35<00:00, 2.37it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0090 Acc: 0.9990\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1500/1500 [04:15<00:00, 5.86it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0175 Acc: 0.9978\n", + "\n", + "Epoch : 10\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 3500/3500 [25:01<00:00, 2.33it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0189 Acc: 0.9982\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 1500/1500 [04:47<00:00, 5.21it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0349 Acc: 0.9960\n", + "\n", + "Total time elapsed = 18231.4253906 seconds\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkkAAAHFCAYAAADmGm0KAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAB3rUlEQVR4nO3deVhU1f8H8PcwDDAs4oJsLiyuKK5gKFpqmYZLWlpqalpqWpqa9U3NzCWXsjR/pZAbpqZippalpeSuaCiGqSi44wIiLqCiLMP5/XGagZEBAYGBmffreeaRuXNn7rkDMm/O+dxzFEIIASIiIiLSY2HsBhARERGVRwxJRERERAYwJBEREREZwJBEREREZABDEhEREZEBDElEREREBjAkERERERnAkERERERkAEMSERERkQEMSUT0RN9++y0UCgV8fX2N3ZQK6caNG5g4cSKaNGkCe3t72NjYoF69ehg7dizOnj1r7OYRUT4UXJaEiJ6kefPmOH78OADg8OHDCAgIMHKLKo7IyEh0794dQgiMHj0abdq0gZWVFWJjY/Hjjz/i5MmTuHPnjrGbSUQGMCQRUYGOHj2KVq1aoVu3bti6dSuGDx+OJUuWGLtZBqWlpcHW1tbYzdBJTU1FgwYNoFKpEBERgZo1a+bZ5+eff0afPn2e+lgajQZZWVmwtrZ+6tciIonDbURUoOXLlwMAvvjiCwQGBiIsLAxpaWl59rt27Rreeecd1KpVC1ZWVnB3d0efPn1w48YN3T53797Fhx9+CG9vb1hbW8PZ2Rldu3bFmTNnAAB79uyBQqHAnj179F770qVLUCgU+OGHH3TbhgwZAnt7e5w4cQKdO3eGg4MDXnjhBQBAeHg4evbsiZo1a8LGxgZ169bFiBEjkJycnKfdZ86cQf/+/eHi4gJra2vUrl0bb775JtLT03Hp0iVYWlpizpw5eZ63b98+KBQKbNiwId/3bunSpUhMTMTcuXMNBiQAegGpQ4cO6NChQ559hgwZAk9Pzzzvx9y5czFz5kx4eXnB2toaP/30E6ysrDBlyhSD56lQKPDtt9/qtiUmJmLEiBGoWbMmrKys4OXlhenTpyMrKyvfcyIyJ5bGbgARlV8PHz7EunXr0KpVK/j6+uLtt9/GsGHDsGHDBgwePFi337Vr19CqVStkZmbik08+QdOmTXHr1i1s374dd+7cgYuLC+7du4d27drh0qVLmDBhAgICAnD//n3s27cPCQkJaNiwYZHbl5GRgZdffhkjRozAxIkTdR/u58+fR5s2bTBs2DA4Ojri0qVLmD9/Ptq1a4cTJ05ApVIBAI4fP4527drByckJM2bMQL169ZCQkIAtW7YgIyMDnp6eePnll/H999/j448/hlKp1B174cKFcHd3xyuvvJJv+3bs2AGlUokePXoU+dwK49tvv0X9+vXx9ddfo1KlSqhXrx66d++OlStXYvr06bCwyPk7eMWKFbCyssKAAQMAyID0zDPPwMLCAp999hnq1KmDQ4cOYebMmbh06RJWrFhRKm0mqlAEEVE+Vq1aJQCI77//XgghxL1794S9vb149tln9fZ7++23hUqlEjExMfm+1owZMwQAER4enu8+u3fvFgDE7t279bZfvHhRABArVqzQbRs8eLAAIEJDQws8h+zsbJGZmSkuX74sAIhff/1V99jzzz8vKleuLJKSkp7Yps2bN+u2Xbt2TVhaWorp06cXeOyGDRsKV1fXAvfJrX379qJ9+/Z5tg8ePFh4eHjo7mvfjzp16oiMjAy9fbds2SIAiB07dui2ZWVlCXd3d9G7d2/dthEjRgh7e3tx+fJlved//fXXAoA4depUodtNZKo43EZE+Vq+fDnUajX69esHALC3t8drr72G/fv3612V9ccff6Bjx47w8fHJ97X++OMP1K9fH506dSrRNvbu3TvPtqSkJIwcORK1atWCpaUlVCoVPDw8AACnT58GIOuX9u7di9dffx3Vq1fP9/U7dOiAZs2aYdGiRbpt33//PRQKBd55550SPZeievnll3W9YlpBQUFwdXXV6wnavn07rl+/jrffflu37ffff0fHjh3h7u6OrKws3S0oKAgAsHfv3rI5CaJyjCGJiAw6d+4c9u3bh27dukEIgbt37+Lu3bu6GprQ0FDdvjdv3sy35qYo+xSVra0tKlWqpLctOzsbnTt3xqZNm/Dxxx9j586diIyMxOHDhwHIIUQAuHPnDjQaTaHaNGbMGOzcuROxsbHIzMzE0qVL0adPH7i6uhb4vNq1a+PmzZt48OBBMc+wYG5ubnm2WVpaYtCgQdi8eTPu3r0LAPjhhx/g5uaGLl266Pa7ceMGfvvtN6hUKr1b48aNAcBg/RaRuWFIIiKDQkNDIYTAzz//jCpVquhu3bp1AwCs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L774IsLCwpCenl4abaNyJvdM2/+t8EJERGSyihyS3n//fURFRSEqKgqNGjXCmDFj4ObmhtGjR+PYsWOl0UYqJ1iPRERE5qTYNUnNmjXD//3f/+HatWuYOnUqli1bhlatWqFZs2YIDQ0FVzsxPUePyn8ZkoiIyBwUe4HbzMxMbN68GStWrEB4eDhat26NoUOH4vr165g8eTL++usvrF27tiTbSkbEom0iIjI3RQ5Jx44dw4oVK7Bu3ToolUoMGjQI33zzDRo2bKjbp3PnznjuuedKtKFkXCzaJiIic1PkkNSqVSu8+OKLCAkJQa9evaBSqfLs06hRI/Tr169EGkjlQ+6Ztlm0TURE5qDIIenChQvw8PAocB87OzusWLGi2I2i8odF20REZG6KXLidlJSEv//+O8/2v//+G0e1lb1kchiSiIjI3BQ5JI0aNQpXrlzJs/3atWsYNWpUiTSKyheNBvjnH/k1QxIREZmLIoekmJgYtGzZMs/2Fi1aICYmpkQaReVLbGxO0XaDBsZuDRERUdkockiytrbGjRs38mxPSEiApWWxZxSgckw71Na8OYu2iYjIfBQ5JL344ouYNGkSUlJSdNvu3r2LTz75BC+++GKJNo7KB9YjERGROSpy18+8efPw3HPPwcPDAy1atAAAREdHw8XFBatXry7xBpLxaUOSv79x20FERFSWihySatSogX///Rdr1qzB8ePHoVar8dZbb6F///4G50yiik2jAbRL8rEniYiIzEmxiojs7OzwzjvvlHRbqBxi0TYREZmrYldax8TEID4+HhkZGXrbX3755aduFJUfLNomIiJzVawZt1955RWcOHECCoUCQggAgEKhAABoNJqSbSEZFYu2iYjIXBX56raxY8fCy8sLN27cgK2tLU6dOoV9+/bB398fe/bsKYUmkjExJBERkbkqck/SoUOHsGvXLlSvXh0WFhawsLBAu3btMGfOHIwZMwb/aKdmpgqPM20TEZE5K3JPkkajgb29PQDAyckJ169fBwB4eHggNja2ZFtHRhUXBzx4ANjaAg0bGrs1REREZavIPUm+vr74999/4e3tjYCAAMydOxdWVlZYsmQJvL29S6ONZCQs2iYiInNW5JD06aef4sGDBwCAmTNnonv37nj22WdRrVo1rF+/vsQbSMbDeiQiIjJnRQ5JXbp00X3t7e2NmJgY3L59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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "67" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#----------Инициализируем модель и параметры обучения--------------\n", + "\n", + "torch.cuda.empty_cache()\n", + "cv2.destroyAllWindows()\n", + "gc.collect()\n", + "\n", + "num_classes = 3\n", + "config_name = \"ensemble\"\n", + " \n", + "def load_function(attr):\n", + " module_, func = attr.rsplit('.', maxsplit=1)\n", + " return getattr(import_module(module_), func)\n", + " \n", + "config = mlconfig.load('config_' + config_name + '.yaml')\n", + "\n", + "model1 = models.resnet18(pretrained=False)\n", + "model2 = models.resnet50(pretrained=False)\n", + "model3 = models.resnet101(pretrained=False)\n", + "\n", + "num_classes = 2\n", + "\n", + "model1.fc = nn.Linear(model1.fc.in_features, num_classes)\n", + "model2.fc = nn.Linear(model2.fc.in_features, num_classes)\n", + "model3.fc = nn.Linear(model3.fc.in_features, num_classes)\n", + "\n", + "class Ensemble(nn.Module):\n", + " def __init__(self, model1, model2, model3):\n", + " super(Ensemble, self).__init__()\n", + " self.model1 = model1\n", + " self.model2 = model2\n", + " self.model3 = model3\n", + " self.fc = nn.Linear(3 * num_classes, num_classes)\n", + "\n", + " def forward(self, x):\n", + " x1 = self.model1(x[0])\n", + " x2 = self.model2(x[1])\n", + " x3 = self.model3(x[2])\n", + " x = torch.cat((x1, x2, x3), dim=1)\n", + " x = self.fc(x)\n", + " return x\n", + "\n", + "model = Ensemble(model1, model2, model3)\n", + "\n", + "optimizer = load_function(config.optimizer.name)(model.parameters(), lr=config.optimizer.lr)\n", + "criterion = load_function(config.loss_function.name)()\n", + "scheduler = load_function(config.scheduler.name)(optimizer, step_size=config.scheduler.step_size, gamma=config.scheduler.gamma)\n", + "\n", + "if device != 'cpu':\n", + " model = model.to(device)\n", + "\n", + "#----------Создания датасета и обучение модели--------------\n", + "\n", + "path_res, model_name = prepare_and_learning_detection(num_classes = num_classes, num_samples = 20000, path_dataset = \"C:/Users/snytk/Lerning_NN_for_work/datasets_jpg/2.4_jpg_learning/\", \n", + " model_name = config_name+\"_2.4_jpg_\", config_name = config_name, model=model)\n", + "\n", + "\n", + "torch.cuda.empty_cache()\n", + "cv2.destroyAllWindows()\n", + "del model\n", + "gc.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "57d18676", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Отсутствует", + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/train_scripts/Training_models_915-Copy1.ipynb b/train_scripts/Training_models_915-Copy1.ipynb new file mode 100644 index 0000000..20a6384 --- /dev/null +++ b/train_scripts/Training_models_915-Copy1.ipynb @@ -0,0 +1,759 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "5a13ad6b-56c9-4381-b376-1765f6dd7553", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Импортирование библиотек" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "7311cb4a-5bf3-4268-b431-43eea10e9ed6", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cuda\n" + ] + }, + { + "data": { + "text/plain": [ + "12" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "from torch.utils.data import Dataset, DataLoader\n", + "from torch import default_generator, randperm\n", + "from torch.utils.data.dataset import Subset\n", + "import torchvision.transforms as transforms\n", + "from torchvision.io import read_image\n", + "from importlib import import_module\n", + "import matplotlib.pyplot as plt\n", + "from torchvision import models\n", + "import torch, torchvision\n", + "from pathlib import Path\n", + "from PIL import Image\n", + "import torch.nn as nn\n", + "from tqdm import tqdm\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib\n", + "import os, shutil\n", + "import mlconfig\n", + "import random\n", + "import shutil\n", + "import timeit\n", + "import copy\n", + "import time\n", + "import cv2\n", + "import csv\n", + "import sys\n", + "import io\n", + "import gc\n", + "\n", + "plt.rcParams[\"savefig.bbox\"] = 'tight'\n", + "torch.manual_seed(1)\n", + "#matplotlib.use('Agg')\n", + "device = 'cuda' if torch.cuda.is_available() else 'cpu'\n", + "print(device)\n", + "torch.cuda.empty_cache()\n", + "cv2.destroyAllWindows()\n", + "gc.collect()" + ] + }, + { + "cell_type": "markdown", + "id": "384de097-82c6-41f5-bda9-b2f54bc99593", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Подготовка и обучение детектирование" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "46e4dc99-6994-4fee-a32e-f3983bd991bd", + "metadata": {}, + "outputs": [], + "source": [ + "def prepare_and_learning_detection(num_classes, num_samples, path_dataset, model_name, config_name, model):\n", + " num_samples_per_class = num_samples // num_classes\n", + "\n", + " #----------Создаём папку для сохранения результатов обучения--------------\n", + " \n", + " ind = 1\n", + " while True:\n", + " if os.path.exists(\"models/\" + model_name + str(ind)):\n", + " ind += 1\n", + " else:\n", + " os.mkdir(\"models/\" + model_name + str(ind))\n", + " path_res = \"models/\" + model_name + str(ind) + '/'\n", + " break\n", + " \n", + " #----------Создаём файл dataset.csv для обучения--------------\n", + " \n", + " pd_columns = ['file_name']\n", + " df = pd.DataFrame(columns=pd_columns)\n", + " \n", + " subdirs = os.listdir(path_dataset)\n", + " for subdir in subdirs:\n", + " files = os.listdir(path_dataset + subdir + '/')\n", + " num_samples_per_class = min(num_samples_per_class, len(files))\n", + " for subdir in subdirs:\n", + " files = os.listdir(path_dataset + subdir + '/')\n", + " random.shuffle(files)\n", + " files_to_process = files[:num_samples_per_class]\n", + " for file in files_to_process:\n", + " row = pd.DataFrame({pd_columns[0]: [str(path_dataset + subdir + '/' + file)]})\n", + " df = pd.concat([df, row], ignore_index=True)\n", + " \n", + " df.to_csv(path_res + 'dataset.csv', index=False)\n", + " \n", + " #----------Импортируем параметры для обучения--------------\n", + " \n", + " def load_function(attr):\n", + " module_, func = attr.rsplit('.', maxsplit=1)\n", + " return getattr(import_module(module_), func)\n", + " \n", + " config = mlconfig.load('config_' + config_name + '.yaml')\n", + " \n", + " #----------Создаём класс датасета--------------\n", + " \n", + " class MyDataset(Dataset):\n", + " def __init__(self, path_dataset, csv_file):\n", + " data=[]\n", + " with open(path_dataset + csv_file, newline='') as csvfile:\n", + " reader = csv.reader(csvfile, delimiter=' ', quotechar='|')\n", + " for row in list(reader)[1:]:\n", + " row = str(row)\n", + " data.append(row[2: len(row)-2])\n", + " self.sig_filenames = data\n", + " self.path_dataset = path_dataset\n", + " \n", + " def __len__(self):\n", + " return len(self.sig_filenames)\n", + " \n", + " def __getitem__(self, idx):\n", + " image_real = np.asarray(cv2.split(cv2.imread(self.sig_filenames[idx][:-8]+'real.jpg')), dtype=np.float32)\n", + " if 'drone' in list(self.sig_filenames[idx].split('/')):\n", + " label = torch.tensor(0)\n", + " if 'noise' in list(self.sig_filenames[idx].split('/')):\n", + " label = torch.tensor(1)\n", + " return image_real, label\n", + " \n", + " #----------Создаём датасет--------------\n", + " \n", + " dataset = MyDataset(path_dataset=path_res, csv_file='dataset.csv')\n", + " train_set, valid_set = torch.utils.data.random_split(dataset, [0.7, 0.3], generator=torch.Generator().manual_seed(42))\n", + " batch_size = config.batch_size\n", + " train_dataloader = torch.utils.data.DataLoader(train_set, batch_size=batch_size, shuffle=True, drop_last=True)\n", + " valid_dataloader = torch.utils.data.DataLoader(valid_set, batch_size=batch_size, shuffle=True, drop_last=True)\n", + " \n", + " dataloaders = {}\n", + " dataloaders['train'] = train_dataloader\n", + " dataloaders['val'] = valid_dataloader\n", + " dataset_sizes = {}\n", + " dataset_sizes['train'] = len(train_set)\n", + " dataset_sizes['val'] = len(valid_set)\n", + "\n", + " #----------Обучаем модель--------------\n", + "\n", + " val_loss = []\n", + " val_acc = []\n", + " train_loss = []\n", + " train_acc = []\n", + " epochs = config.epoch\n", + " \n", + " best_acc = 0.0\n", + " best_model = copy.deepcopy(model.state_dict())\n", + " limit = config.limit\n", + " epoch_limit = epochs\n", + " \n", + " start = timeit.default_timer()\n", + " for epoch in range(1, epochs+1):\n", + " print(f\"Epoch : {epoch}\\n\")\n", + " dataloader = None\n", + " \n", + " for phase in ['train', 'val']:\n", + " running_loss = 0.0\n", + " running_corrects = 0\n", + " \n", + " for (img, label) in tqdm(dataloaders[phase]):\n", + " img, label = img.to(device), label.to(device)\n", + " optimizer.zero_grad()\n", + " \n", + " with torch.set_grad_enabled(phase == 'train'):\n", + " output = model(img)\n", + " _, pred = torch.max(output.data, 1)\n", + " loss = criterion(output, label)\n", + " if phase=='train' :\n", + " loss.backward()\n", + " optimizer.step()\n", + " \n", + " running_loss += loss.item() * img.size(0)\n", + " running_corrects += torch.sum(pred == label.data)\n", + " \n", + " epoch_loss = running_loss / dataset_sizes[phase]\n", + " epoch_acc = running_corrects.double() / dataset_sizes[phase]\n", + " \n", + " print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc))\n", + " \n", + " if phase=='train' :\n", + " train_loss.append(epoch_loss)\n", + " train_acc.append(epoch_acc)\n", + " else :\n", + " val_loss.append(epoch_loss)\n", + " val_acc.append(epoch_acc)\n", + " if val_acc[-1] > best_acc :\n", + " ind_limit = 0\n", + " best_acc = val_acc[-1]\n", + " best_model = copy.deepcopy(model.state_dict())\n", + " torch.save(best_model, path_res + model_name + '.pth')\n", + " else:\n", + " ind_limit += 1\n", + " \n", + " if ind_limit >= limit:\n", + " break\n", + " \n", + " if ind_limit >= limit:\n", + " epoch_limit = epoch\n", + " break\n", + " \n", + " print()\n", + " \n", + " end = timeit.default_timer()\n", + " print(f\"Total time elapsed = {end - start} seconds\")\n", + " epoch_limit += 1\n", + " \n", + " #----------Вывод графиков и сохранение результатов обучения--------------\n", + " \n", + " train_acc = np.asarray(list(map(lambda x: x.item(), train_acc)))\n", + " val_acc = np.asarray(list(map(lambda x: x.item(), val_acc)))\n", + " \n", + " np.save(path_res+'train_acc.npy', train_acc)\n", + " np.save(path_res+'val_acc.npy', val_acc)\n", + " np.save(path_res+'train_loss.npy', train_loss)\n", + " np.save(path_res+'val_loss.npy', val_loss)\n", + " \n", + " plt.figure()\n", + " plt.plot(range(1,epoch_limit), train_loss, color='blue')\n", + " plt.plot(range(1,epoch_limit), val_loss, color='red')\n", + " plt.xlabel('Epoch')\n", + " plt.ylabel('Loss')\n", + " plt.title('Loss Curve')\n", + " plt.legend(['Train Loss', 'Validation Loss'])\n", + " plt.show()\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " \n", + " plt.figure()\n", + " plt.plot(range(1,epoch_limit), train_acc, color='blue')\n", + " plt.plot(range(1,epoch_limit), val_acc, color='red')\n", + " plt.xlabel('Epoch')\n", + " plt.ylabel('Accuracy')\n", + " plt.title('Accuracy Curve')\n", + " plt.legend(['Train Accuracy', 'Validation Accuracy'])\n", + " plt.show()\n", + " \n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " torch.cuda.empty_cache()\n", + " cv2.destroyAllWindows()\n", + " del model\n", + " gc.collect()\n", + "\n", + " return path_res, model_name" + ] + }, + { + "cell_type": "markdown", + "id": "93c136ee", + "metadata": {}, + "source": [ + "### Ensemble" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "52e8d4c5", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\snytk\\miniconda3\\envs\\python311\\Lib\\site-packages\\torchvision\\models\\_utils.py:208: UserWarning: The parameter 'pretrained' is deprecated since 0.13 and may be removed in the future, please use 'weights' instead.\n", + " warnings.warn(\n", + "C:\\Users\\snytk\\miniconda3\\envs\\python311\\Lib\\site-packages\\torchvision\\models\\_utils.py:223: UserWarning: Arguments other than a weight enum or `None` for 'weights' are deprecated since 0.13 and may be removed in the future. The current behavior is equivalent to passing `weights=ResNet18_Weights.IMAGENET1K_V1`. You can also use `weights=ResNet18_Weights.DEFAULT` to get the most up-to-date weights.\n", + " warnings.warn(msg)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch : 1\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 658/658 [01:56<00:00, 5.63it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.1856 Acc: 0.9362\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 282/282 [00:35<00:00, 8.03it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0901 Acc: 0.9654\n", + "\n", + "Epoch : 2\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 658/658 [01:50<00:00, 5.95it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.1103 Acc: 0.9556\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 282/282 [00:36<00:00, 7.63it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.1421 Acc: 0.9211\n", + "\n", + "Epoch : 3\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 658/658 [01:40<00:00, 6.57it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0895 Acc: 0.9636\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 282/282 [00:32<00:00, 8.76it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.1153 Acc: 0.9610\n", + "\n", + "Epoch : 4\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 658/658 [01:42<00:00, 6.45it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0745 Acc: 0.9704\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 282/282 [00:36<00:00, 7.81it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.1168 Acc: 0.9610\n", + "\n", + "Epoch : 5\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 658/658 [01:47<00:00, 6.10it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0599 Acc: 0.9776\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 282/282 [00:34<00:00, 8.27it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0316 Acc: 0.9902\n", + "\n", + "Epoch : 6\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 658/658 [01:46<00:00, 6.16it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0383 Acc: 0.9856\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 282/282 [00:35<00:00, 8.04it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0240 Acc: 0.9929\n", + "\n", + "Epoch : 7\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 658/658 [01:49<00:00, 6.01it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0185 Acc: 0.9932\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 282/282 [00:33<00:00, 8.31it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0139 Acc: 0.9956\n", + "\n", + "Epoch : 8\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 658/658 [01:48<00:00, 6.09it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0272 Acc: 0.9905\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 282/282 [00:36<00:00, 7.82it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0361 Acc: 0.9876\n", + "\n", + "Epoch : 9\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 658/658 [01:46<00:00, 6.16it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0194 Acc: 0.9947\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 282/282 [00:38<00:00, 7.37it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0092 Acc: 0.9973\n", + "\n", + "Epoch : 10\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 658/658 [01:49<00:00, 6.01it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.0156 Acc: 0.9935\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 282/282 [00:34<00:00, 8.16it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.0283 Acc: 0.9894\n", + "\n", + "Total time elapsed = 1432.5218361000007 seconds\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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HTvinXfewa1bt4x6n0SkJ0ZbdpWI6DkNGDBAWFpaCnt7e51t2rRpQgghAIhhw4bpvMfPz0/873//E0IIsWzZMuHk5CTu3bunfX379u3CwsJCJCQkCCGEcHd3FxMmTMgzBgBi4sSJ2uf37t0TKpVK7Ny5U2/3SUTGwzFARGQS/P39sXTpUp19zs7O2sdNmzbVea1p06aIjo4GAJw5cwb169eHvb299vXmzZsjKysLMTExUKlUuH79Ol555ZV8Y6hXr572sb29PRwcHJCYmPi8t0RECmICREQmwd7ePkeX1LOoVCoAgBBC+zi3Y+zs7Ap0PrVaneO9WVlZhYqJiIoGjgEiomLh8OHDOZ7XrFkTAFCrVi1ER0fj/v372tcPHjwICwsLVK9eHQ4ODvD09MSuXbuMGjMRKYctQERkEtLS0pCQkKCzz8rKCmXLlgUAbNiwAb6+vmjRogV++uknREREYOXKlQCAd955B5MnT8aAAQMwZcoU/Pfffxg5ciT69esHFxcXAMCUKVMwbNgwlC9fHh06dMDdu3dx8OBBjBw50rg3SkRGwQSIiEzC77//Djc3N519NWrUwNmzZwHICq2QkBB88MEHcHV1xU8//YRatWoBAEqUKIE//vgDo0aNQuPGjVGiRAn06NEDc+fO1Z5rwIABePjwIebNm4dPPvkEZcuWRc+ePY13g0RkVCohhFA6CCKiF6FSqbB582Z0795d6VCIyERwDBARERGZHSZAREREZHY4BoiITB578omosNgCRERERGaHCRARERGZHSZAREREZHaYABEREZHZYQJEREREZocJEBEREZkdJkBERERkdpgAERERkdlhAkRERERm5/9RqjhgABHcPQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "67" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#----------Инициализируем модель и параметры обучения--------------\n", + "\n", + "torch.cuda.empty_cache()\n", + "cv2.destroyAllWindows()\n", + "gc.collect()\n", + "\n", + "config_name = \"ensemble\"\n", + " \n", + "def load_function(attr):\n", + " module_, func = attr.rsplit('.', maxsplit=1)\n", + " return getattr(import_module(module_), func)\n", + " \n", + "config = mlconfig.load('config_' + config_name + '.yaml')\n", + "\n", + "model = models.resnet18(pretrained=True)\n", + "\n", + "num_classes = 2\n", + "\n", + "model.fc = nn.Linear(model.fc.in_features, num_classes)\n", + "\n", + "class Model(nn.Module):\n", + " def __init__(self, model):\n", + " super(Model, self).__init__()\n", + " self.model = model\n", + "\n", + " def forward(self, x):\n", + " x = self.model(x)\n", + " return x\n", + "\n", + "model = Model(model)\n", + "\n", + "optimizer = load_function(config.optimizer.name)(model.parameters(), lr=config.optimizer.lr)\n", + "criterion = load_function(config.loss_function.name)()\n", + "scheduler = load_function(config.scheduler.name)(optimizer, step_size=config.scheduler.step_size, gamma=config.scheduler.gamma)\n", + "\n", + "if device != 'cpu':\n", + " model = model.to(device)\n", + "\n", + "#----------Создания датасета и обучение модели--------------\n", + "\n", + "path_res, model_name = prepare_and_learning_detection(num_classes = num_classes, num_samples = 20000, path_dataset = \"C:/Users/snytk/Lerning_NN_for_work/datasets_jpg/915_jpg_learning/\", \n", + " model_name = config_name+\"_915_jpg_\", config_name = config_name, model=model)\n", + "\n", + "\n", + "torch.cuda.empty_cache()\n", + "cv2.destroyAllWindows()\n", + "del model\n", + "gc.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4234ee26", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ebb4d1db", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Отсутствует", + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/train_scripts/Training_models_915.ipynb b/train_scripts/Training_models_915.ipynb new file mode 100644 index 0000000..945e2be --- /dev/null +++ b/train_scripts/Training_models_915.ipynb @@ -0,0 +1,503 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "5a13ad6b-56c9-4381-b376-1765f6dd7553", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Импортирование библиотек" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "7311cb4a-5bf3-4268-b431-43eea10e9ed6", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cuda\n" + ] + }, + { + "data": { + "text/plain": [ + "12" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "from torch.utils.data import Dataset, DataLoader\n", + "from torch import default_generator, randperm\n", + "from torch.utils.data.dataset import Subset\n", + "import torchvision.transforms as transforms\n", + "from torchvision.io import read_image\n", + "from importlib import import_module\n", + "import matplotlib.pyplot as plt\n", + "from torchvision import models\n", + "import torch, torchvision\n", + "from pathlib import Path\n", + "from PIL import Image\n", + "import torch.nn as nn\n", + "from tqdm import tqdm\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib\n", + "import os, shutil\n", + "import mlconfig\n", + "import random\n", + "import shutil\n", + "import timeit\n", + "import copy\n", + "import time\n", + "import cv2\n", + "import csv\n", + "import sys\n", + "import io\n", + "import gc\n", + "\n", + "plt.rcParams[\"savefig.bbox\"] = 'tight'\n", + "torch.manual_seed(1)\n", + "#matplotlib.use('Agg')\n", + "device = 'cuda' if torch.cuda.is_available() else 'cpu'\n", + "print(device)\n", + "torch.cuda.empty_cache()\n", + "cv2.destroyAllWindows()\n", + "gc.collect()" + ] + }, + { + "cell_type": "markdown", + "id": "384de097-82c6-41f5-bda9-b2f54bc99593", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Подготовка и обучение детектирование" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "46e4dc99-6994-4fee-a32e-f3983bd991bd", + "metadata": {}, + "outputs": [], + "source": [ + "def prepare_and_learning_detection(num_classes, num_samples, path_dataset, model_name, config_name, model):\n", + " num_samples_per_class = num_samples // num_classes\n", + "\n", + " #----------Создаём папку для сохранения результатов обучения--------------\n", + " \n", + " ind = 1\n", + " while True:\n", + " if os.path.exists(\"models/\" + model_name + str(ind)):\n", + " ind += 1\n", + " else:\n", + " os.mkdir(\"models/\" + model_name + str(ind))\n", + " path_res = \"models/\" + model_name + str(ind) + '/'\n", + " break\n", + " \n", + " #----------Создаём файл dataset.csv для обучения--------------\n", + " \n", + " pd_columns = ['file_name']\n", + " df = pd.DataFrame(columns=pd_columns)\n", + " \n", + " subdirs = os.listdir(path_dataset)\n", + " for subdir in subdirs:\n", + " files = os.listdir(path_dataset + subdir + '/')\n", + " num_samples_per_class = min(num_samples_per_class, len(files))\n", + " for subdir in subdirs:\n", + " files = os.listdir(path_dataset + subdir + '/')\n", + " random.shuffle(files)\n", + " files_to_process = files[:num_samples_per_class]\n", + " for file in files_to_process:\n", + " row = pd.DataFrame({pd_columns[0]: [str(path_dataset + subdir + '/' + file)]})\n", + " df = pd.concat([df, row], ignore_index=True)\n", + " \n", + " df.to_csv(path_res + 'dataset.csv', index=False)\n", + " \n", + " #----------Импортируем параметры для обучения--------------\n", + " \n", + " def load_function(attr):\n", + " module_, func = attr.rsplit('.', maxsplit=1)\n", + " return getattr(import_module(module_), func)\n", + " \n", + " config = mlconfig.load('config_' + config_name + '.yaml')\n", + " \n", + " #----------Создаём класс датасета--------------\n", + " \n", + " class MyDataset(Dataset):\n", + " def __init__(self, path_dataset, csv_file):\n", + " data=[]\n", + " with open(path_dataset + csv_file, newline='') as csvfile:\n", + " reader = csv.reader(csvfile, delimiter=' ', quotechar='|')\n", + " for row in list(reader)[1:]:\n", + " row = str(row)\n", + " data.append(row[2: len(row)-2])\n", + " self.sig_filenames = data\n", + " self.path_dataset = path_dataset\n", + " \n", + " def __len__(self):\n", + " return len(self.sig_filenames)\n", + " \n", + " def __getitem__(self, idx):\n", + " image_real = np.asarray(cv2.split(cv2.imread(self.sig_filenames[idx][:-8]+'real.jpg')), dtype=np.float32)\n", + " image_imag = np.asarray(cv2.split(cv2.imread(self.sig_filenames[idx][:-8]+'imag.jpg')), dtype=np.float32)\n", + " image_spec = np.asarray(cv2.split(cv2.imread(self.sig_filenames[idx][:-8]+'spec.jpg')), dtype=np.float32)\n", + " if 'drone' in list(self.sig_filenames[idx].split('/')):\n", + " label = torch.tensor(0)\n", + " if 'noise' in list(self.sig_filenames[idx].split('/')):\n", + " label = torch.tensor(1)\n", + " return image_real, image_imag, image_spec, label\n", + " \n", + " #----------Создаём датасет--------------\n", + " \n", + " dataset = MyDataset(path_dataset=path_res, csv_file='dataset.csv')\n", + " train_set, valid_set = torch.utils.data.random_split(dataset, [0.7, 0.3], generator=torch.Generator().manual_seed(42))\n", + " batch_size = config.batch_size\n", + " train_dataloader = torch.utils.data.DataLoader(train_set, batch_size=batch_size, shuffle=True, drop_last=True)\n", + " valid_dataloader = torch.utils.data.DataLoader(valid_set, batch_size=batch_size, shuffle=True, drop_last=True)\n", + " \n", + " dataloaders = {}\n", + " dataloaders['train'] = train_dataloader\n", + " dataloaders['val'] = valid_dataloader\n", + " dataset_sizes = {}\n", + " dataset_sizes['train'] = len(train_set)\n", + " dataset_sizes['val'] = len(valid_set)\n", + "\n", + " #----------Обучаем модель--------------\n", + "\n", + " val_loss = []\n", + " val_acc = []\n", + " train_loss = []\n", + " train_acc = []\n", + " epochs = config.epoch\n", + " \n", + " best_acc = 0.0\n", + " best_model = copy.deepcopy(model.state_dict())\n", + " limit = config.limit\n", + " epoch_limit = epochs\n", + " \n", + " start = timeit.default_timer()\n", + " for epoch in range(1, epochs+1):\n", + " print(f\"Epoch : {epoch}\\n\")\n", + " dataloader = None\n", + " \n", + " for phase in ['train', 'val']:\n", + " running_loss = 0.0\n", + " running_corrects = 0\n", + " \n", + " for (img1, img2, img3, label) in tqdm(dataloaders[phase]):\n", + " img1, img2, img3, label = img1.to(device), img2.to(device), img3.to(device), label.to(device)\n", + " optimizer.zero_grad()\n", + " \n", + " with torch.set_grad_enabled(phase == 'train'):\n", + " output = model([img1, img2, img3])\n", + " _, pred = torch.max(output.data, 1)\n", + " loss = criterion(output, label)\n", + " if phase=='train' :\n", + " loss.backward()\n", + " optimizer.step()\n", + " \n", + " running_loss += loss.item() * 3 * img1.size(0)\n", + " running_corrects += torch.sum(pred == label.data)\n", + " \n", + " epoch_loss = running_loss / dataset_sizes[phase]\n", + " epoch_acc = running_corrects.double() / dataset_sizes[phase]\n", + " \n", + " print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc))\n", + " \n", + " if phase=='train' :\n", + " train_loss.append(epoch_loss)\n", + " train_acc.append(epoch_acc)\n", + " else :\n", + " val_loss.append(epoch_loss)\n", + " val_acc.append(epoch_acc)\n", + " if val_acc[-1] > best_acc :\n", + " ind_limit = 0\n", + " best_acc = val_acc[-1]\n", + " best_model = copy.deepcopy(model.state_dict())\n", + " torch.save(best_model, path_res + model_name + '.pth')\n", + " else:\n", + " ind_limit += 1\n", + " \n", + " if ind_limit >= limit:\n", + " break\n", + " \n", + " if ind_limit >= limit:\n", + " epoch_limit = epoch\n", + " break\n", + " \n", + " print()\n", + " \n", + " end = timeit.default_timer()\n", + " print(f\"Total time elapsed = {end - start} seconds\")\n", + " epoch_limit += 1\n", + " \n", + " #----------Вывод графиков и сохранение результатов обучения--------------\n", + " \n", + " train_acc = np.asarray(list(map(lambda x: x.item(), train_acc)))\n", + " val_acc = np.asarray(list(map(lambda x: x.item(), val_acc)))\n", + " \n", + " np.save(path_res+'train_acc.npy', train_acc)\n", + " np.save(path_res+'val_acc.npy', val_acc)\n", + " np.save(path_res+'train_loss.npy', train_loss)\n", + " np.save(path_res+'val_loss.npy', val_loss)\n", + " \n", + " plt.figure()\n", + " plt.plot(range(1,epoch_limit), train_loss, color='blue')\n", + " plt.plot(range(1,epoch_limit), val_loss, color='red')\n", + " plt.xlabel('Epoch')\n", + " plt.ylabel('Loss')\n", + " plt.title('Loss Curve')\n", + " plt.legend(['Train Loss', 'Validation Loss'])\n", + " plt.show()\n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " \n", + " plt.figure()\n", + " plt.plot(range(1,epoch_limit), train_acc, color='blue')\n", + " plt.plot(range(1,epoch_limit), val_acc, color='red')\n", + " plt.xlabel('Epoch')\n", + " plt.ylabel('Accuracy')\n", + " plt.title('Accuracy Curve')\n", + " plt.legend(['Train Accuracy', 'Validation Accuracy'])\n", + " plt.show()\n", + " \n", + " plt.clf()\n", + " plt.cla()\n", + " plt.close()\n", + " torch.cuda.empty_cache()\n", + " cv2.destroyAllWindows()\n", + " del model\n", + " gc.collect()\n", + "\n", + " return path_res, model_name" + ] + }, + { + "cell_type": "markdown", + "id": "93c136ee", + "metadata": {}, + "source": [ + "### Ensemble" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "52e8d4c5", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\snytk\\miniconda3\\envs\\python311\\Lib\\site-packages\\torchvision\\models\\_utils.py:208: UserWarning: The parameter 'pretrained' is deprecated since 0.13 and may be removed in the future, please use 'weights' instead.\n", + " warnings.warn(\n", + "C:\\Users\\snytk\\miniconda3\\envs\\python311\\Lib\\site-packages\\torchvision\\models\\_utils.py:223: UserWarning: Arguments other than a weight enum or `None` for 'weights' are deprecated since 0.13 and may be removed in the future. The current behavior is equivalent to passing `weights=None`.\n", + " warnings.warn(msg)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch : 1\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████| 658/658 [1:00:26<00:00, 5.51s/it]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.6663 Acc: 0.9241\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 282/282 [02:45<00:00, 1.71it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.4023 Acc: 0.9557\n", + "\n", + "Epoch : 2\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 658/658 [43:11<00:00, 3.94s/it]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train Loss: 0.4096 Acc: 0.9514\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 282/282 [00:47<00:00, 5.98it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "val Loss: 0.3390 Acc: 0.9574\n", + "\n", + "Epoch : 3\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 8%|██████▍ | 52/658 [04:26<51:43, 5.12s/it]" + ] + } + ], + "source": [ + "#----------Инициализируем модель и параметры обучения--------------\n", + "\n", + "torch.cuda.empty_cache()\n", + "cv2.destroyAllWindows()\n", + "gc.collect()\n", + "\n", + "num_classes = 3\n", + "config_name = \"ensemble\"\n", + " \n", + "def load_function(attr):\n", + " module_, func = attr.rsplit('.', maxsplit=1)\n", + " return getattr(import_module(module_), func)\n", + " \n", + "config = mlconfig.load('config_' + config_name + '.yaml')\n", + "\n", + "model1 = models.resnet18(pretrained=False)\n", + "model2 = models.resnet50(pretrained=False)\n", + "model3 = models.resnet101(pretrained=False)\n", + "\n", + "num_classes = 2\n", + "\n", + "model1.fc = nn.Linear(model1.fc.in_features, num_classes)\n", + "model2.fc = nn.Linear(model2.fc.in_features, num_classes)\n", + "model3.fc = nn.Linear(model3.fc.in_features, num_classes)\n", + "\n", + "class Ensemble(nn.Module):\n", + " def __init__(self, model1, model2, model3):\n", + " super(Ensemble, self).__init__()\n", + " self.model1 = model1\n", + " self.model2 = model2\n", + " self.model3 = model3\n", + " self.fc = nn.Linear(3 * num_classes, num_classes)\n", + "\n", + " def forward(self, x):\n", + " x1 = self.model1(x[0])\n", + " x2 = self.model2(x[1])\n", + " x3 = self.model3(x[2])\n", + " x = torch.cat((x1, x2, x3), dim=1)\n", + " x = self.fc(x)\n", + " return x\n", + "\n", + "model = Ensemble(model1, model2, model3)\n", + "\n", + "optimizer = load_function(config.optimizer.name)(model.parameters(), lr=config.optimizer.lr)\n", + "criterion = load_function(config.loss_function.name)()\n", + "scheduler = load_function(config.scheduler.name)(optimizer, step_size=config.scheduler.step_size, gamma=config.scheduler.gamma)\n", + "\n", + "if device != 'cpu':\n", + " model = model.to(device)\n", + "\n", + "#----------Создания датасета и обучение модели--------------\n", + "\n", + "path_res, model_name = prepare_and_learning_detection(num_classes = num_classes, num_samples = 5000, path_dataset = \"C:/Users/snytk/Lerning_NN_for_work/datasets_jpg/915_jpg_learning/\", \n", + " model_name = config_name+\"_915_jpg_\", config_name = config_name, model=model)\n", + "\n", + "\n", + "torch.cuda.empty_cache()\n", + "cv2.destroyAllWindows()\n", + "del model\n", + "gc.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "57d18676", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eab69324", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Отсутствует", + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/train_scripts/Untitled.ipynb b/train_scripts/Untitled.ipynb new file mode 100644 index 0000000..5ebef6e --- /dev/null +++ b/train_scripts/Untitled.ipynb @@ -0,0 +1,370 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 13, + "id": "c1b1a484", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['id', 'module_id', 'createdAt', 'registeredAt', 'data', 'createdBy', 'type']\n", + "['291725', '1', '2025-02-14 13:58:03', '2025-02-14 13:58:01', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291722', '1', '2025-02-14 13:57:32', '2025-02-14 13:57:30', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291721', '1', '2025-02-14 13:57:29', '2025-02-14 13:57:27', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291718', '1', '2025-02-14 13:56:58', '2025-02-14 13:56:55', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291715', '1', '2025-02-14 13:56:26', '2025-02-14 13:56:24', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291711', '1', '2025-02-14 13:55:53', '2025-02-14 13:55:51', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291710', '1', '2025-02-14 13:55:50', '2025-02-14 13:55:48', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291706', '1', '2025-02-14 13:55:17', '2025-02-14 13:55:15', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291700', '1', '2025-02-14 13:54:15', '2025-02-14 13:54:13', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291697', '1', '2025-02-14 13:53:44', '2025-02-14 13:53:42', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291696', '1', '2025-02-14 13:53:41', '2025-02-14 13:53:39', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291693', '1', '2025-02-14 13:53:10', '2025-02-14 13:53:07', '[{\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291692', '1', '2025-02-14 13:53:07', '2025-02-14 13:53:05', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291688', '1', '2025-02-14 13:52:34', '2025-02-14 13:52:32', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291685', '1', '2025-02-14 13:52:03', '2025-02-14 13:52:01', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291684', '1', '2025-02-14 13:52:01', '2025-02-14 13:51:59', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291681', '1', '2025-02-14 13:51:30', '2025-02-14 13:51:28', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291677', '1', '2025-02-14 13:50:57', '2025-02-14 13:50:55', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291676', '1', '2025-02-14 13:50:53', '2025-02-14 13:50:51', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291673', '1', '2025-02-14 13:50:21', '2025-02-14 13:50:19', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291672', '1', '2025-02-14 13:50:18', '2025-02-14 13:50:16', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291669', '1', '2025-02-14 13:49:47', '2025-02-14 13:49:45', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291668', '1', '2025-02-14 13:49:36', '2025-02-14 13:49:34', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291665', '1', '2025-02-14 13:49:05', '2025-02-14 13:49:03', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291664', '1', '2025-02-14 13:49:03', '2025-02-14 13:49:01', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291661', '1', '2025-02-14 13:48:32', '2025-02-14 13:48:30', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291657', '1', '2025-02-14 13:47:59', '2025-02-14 13:47:57', '[{\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291656', '1', '2025-02-14 13:47:56', '2025-02-14 13:47:54', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291653', '1', '2025-02-14 13:47:24', '2025-02-14 13:47:22', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291621', '1', '2025-02-14 13:15:52', '2025-02-14 13:15:50', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291615', '1', '2025-02-14 13:14:50', '2025-02-14 13:14:48', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291614', '1', '2025-02-14 13:14:45', '2025-02-14 13:14:43', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291611', '1', '2025-02-14 13:14:14', '2025-02-14 13:14:12', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291607', '1', '2025-02-14 13:13:38', '2025-02-14 13:13:36', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291551', '1', '2025-02-14 12:17:59', '2025-02-14 12:17:57', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291548', '1', '2025-02-14 12:17:28', '2025-02-14 12:17:26', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291547', '1', '2025-02-14 12:17:26', '2025-02-14 12:17:24', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291544', '1', '2025-02-14 12:16:55', '2025-02-14 12:16:53', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291543', '1', '2025-02-14 12:16:51', '2025-02-14 12:16:49', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291540', '1', '2025-02-14 12:16:20', '2025-02-14 12:16:18', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291335', '1', '2025-02-14 08:51:24', '2025-02-14 08:51:22', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291332', '1', '2025-02-14 08:50:53', '2025-02-14 08:50:51', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291331', '1', '2025-02-14 08:50:48', '2025-02-14 08:50:46', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291328', '1', '2025-02-14 08:50:17', '2025-02-14 08:50:14', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291327', '1', '2025-02-14 08:50:11', '2025-02-14 08:50:09', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291324', '1', '2025-02-14 08:49:40', '2025-02-14 08:49:38', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291323', '1', '2025-02-14 08:49:36', '2025-02-14 08:49:34', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291320', '1', '2025-02-14 08:49:05', '2025-02-14 08:49:03', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291317', '1', '2025-02-14 08:48:34', '2025-02-14 08:48:32', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291316', '1', '2025-02-14 08:48:32', '2025-02-14 08:48:30', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291313', '1', '2025-02-14 08:48:01', '2025-02-14 08:47:59', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291312', '1', '2025-02-14 08:47:46', '2025-02-14 08:47:44', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291309', '1', '2025-02-14 08:47:15', '2025-02-14 08:47:13', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291308', '1', '2025-02-14 08:47:13', '2025-02-14 08:47:11', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291305', '1', '2025-02-14 08:46:41', '2025-02-14 08:46:39', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291304', '1', '2025-02-14 08:46:25', '2025-02-14 08:46:23', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291301', '1', '2025-02-14 08:45:54', '2025-02-14 08:45:52', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291300', '1', '2025-02-14 08:45:52', '2025-02-14 08:45:50', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291297', '1', '2025-02-14 08:45:21', '2025-02-14 08:45:19', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291296', '1', '2025-02-14 08:45:17', '2025-02-14 08:45:15', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291293', '1', '2025-02-14 08:44:46', '2025-02-14 08:44:44', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291292', '1', '2025-02-14 08:44:33', '2025-02-14 08:44:31', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291289', '1', '2025-02-14 08:44:02', '2025-02-14 08:44:00', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291288', '1', '2025-02-14 08:43:53', '2025-02-14 08:43:50', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291285', '1', '2025-02-14 08:43:21', '2025-02-14 08:43:19', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291284', '1', '2025-02-14 08:43:19', '2025-02-14 08:43:17', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291281', '1', '2025-02-14 08:42:48', '2025-02-14 08:42:46', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291280', '1', '2025-02-14 08:42:32', '2025-02-14 08:42:30', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291277', '1', '2025-02-14 08:42:01', '2025-02-14 08:41:59', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291276', '1', '2025-02-14 08:41:57', '2025-02-14 08:41:55', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291269', '1', '2025-02-14 08:40:52', '2025-02-14 08:40:50', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['291265', '1', '2025-02-14 08:40:19', '2025-02-14 08:40:17', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290775', '1', '2025-02-14 00:29:43', '2025-02-14 00:29:41', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290772', '1', '2025-02-14 00:29:12', '2025-02-14 00:29:10', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290768', '1', '2025-02-14 00:28:38', '2025-02-14 00:28:36', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290767', '1', '2025-02-14 00:28:27', '2025-02-14 00:28:25', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290764', '1', '2025-02-14 00:27:56', '2025-02-14 00:27:54', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290763', '1', '2025-02-14 00:27:46', '2025-02-14 00:27:44', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290760', '1', '2025-02-14 00:27:15', '2025-02-14 00:27:13', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290756', '1', '2025-02-14 00:26:42', '2025-02-14 00:26:40', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290752', '1', '2025-02-14 00:25:59', '2025-02-14 00:25:57', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290748', '1', '2025-02-14 00:25:26', '2025-02-14 00:25:24', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290744', '1', '2025-02-14 00:24:51', '2025-02-14 00:24:49', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290743', '1', '2025-02-14 00:24:41', '2025-02-14 00:24:39', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290740', '1', '2025-02-14 00:24:10', '2025-02-14 00:24:08', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290739', '1', '2025-02-14 00:24:00', '2025-02-14 00:23:58', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290736', '1', '2025-02-14 00:23:29', '2025-02-14 00:23:27', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290735', '1', '2025-02-14 00:23:24', '2025-02-14 00:23:22', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290732', '1', '2025-02-14 00:22:53', '2025-02-14 00:22:51', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290728', '1', '2025-02-14 00:22:20', '2025-02-14 00:22:18', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290727', '1', '2025-02-14 00:22:17', '2025-02-14 00:22:15', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290724', '1', '2025-02-14 00:21:46', '2025-02-14 00:21:44', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290721', '1', '2025-02-14 00:21:15', '2025-02-14 00:21:13', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290720', '1', '2025-02-14 00:21:10', '2025-02-14 00:21:08', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290717', '1', '2025-02-14 00:20:39', '2025-02-14 00:20:37', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290716', '1', '2025-02-14 00:20:34', '2025-02-14 00:20:32', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290713', '1', '2025-02-14 00:20:02', '2025-02-14 00:20:00', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290712', '1', '2025-02-14 00:20:00', '2025-02-14 00:19:58', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290709', '1', '2025-02-14 00:19:29', '2025-02-14 00:19:27', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290705', '1', '2025-02-14 00:18:56', '2025-02-14 00:18:54', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290704', '1', '2025-02-14 00:18:48', '2025-02-14 00:18:46', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290701', '1', '2025-02-14 00:18:17', '2025-02-14 00:18:15', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290700', '1', '2025-02-14 00:18:12', '2025-02-14 00:18:10', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290697', '1', '2025-02-14 00:17:41', '2025-02-14 00:17:39', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290693', '1', '2025-02-14 00:17:08', '2025-02-14 00:17:06', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290692', '1', '2025-02-14 00:17:06', '2025-02-14 00:17:03', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290689', '1', '2025-02-14 00:16:34', '2025-02-14 00:16:32', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290685', '1', '2025-02-14 00:16:01', '2025-02-14 00:15:59', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290682', '1', '2025-02-14 00:15:30', '2025-02-14 00:15:28', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290676', '1', '2025-02-14 00:09:52', '2025-02-14 00:09:50', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290673', '1', '2025-02-14 00:09:21', '2025-02-14 00:09:19', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290672', '1', '2025-02-14 00:09:19', '2025-02-14 00:09:17', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290669', '1', '2025-02-14 00:08:48', '2025-02-14 00:08:46', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290661', '1', '2025-02-14 00:00:53', '2025-02-14 00:00:51', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290658', '1', '2025-02-14 00:00:22', '2025-02-14 00:00:19', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290654', '1', '2025-02-13 23:59:45', '2025-02-13 23:59:43', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290650', '1', '2025-02-13 23:59:12', '2025-02-13 23:59:10', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290649', '1', '2025-02-13 23:59:08', '2025-02-13 23:59:06', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290646', '1', '2025-02-13 23:58:37', '2025-02-13 23:58:35', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290645', '1', '2025-02-13 23:58:28', '2025-02-13 23:58:26', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290642', '1', '2025-02-13 23:57:57', '2025-02-13 23:57:55', '[{\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290641', '1', '2025-02-13 23:57:55', '2025-02-13 23:57:53', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290638', '1', '2025-02-13 23:57:24', '2025-02-13 23:57:22', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290637', '1', '2025-02-13 23:57:22', '2025-02-13 23:57:20', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290634', '1', '2025-02-13 23:56:51', '2025-02-13 23:56:49', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290633', '1', '2025-02-13 23:56:47', '2025-02-13 23:56:45', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290630', '1', '2025-02-13 23:56:15', '2025-02-13 23:56:13', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290629', '1', '2025-02-13 23:56:10', '2025-02-13 23:56:08', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290626', '1', '2025-02-13 23:55:39', '2025-02-13 23:55:37', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290625', '1', '2025-02-13 23:55:30', '2025-02-13 23:55:28', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290622', '1', '2025-02-13 23:54:59', '2025-02-13 23:54:57', '[{\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290621', '1', '2025-02-13 23:54:57', '2025-02-13 23:54:55', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290618', '1', '2025-02-13 23:54:26', '2025-02-13 23:54:24', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290617', '1', '2025-02-13 23:54:23', '2025-02-13 23:54:21', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290614', '1', '2025-02-13 23:53:52', '2025-02-13 23:53:50', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290613', '1', '2025-02-13 23:53:41', '2025-02-13 23:53:39', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290610', '1', '2025-02-13 23:53:09', '2025-02-13 23:53:07', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290441', '1', '2025-02-13 21:04:20', '2025-02-13 21:04:18', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290438', '1', '2025-02-13 21:03:49', '2025-02-13 21:03:47', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290431', '1', '2025-02-13 21:02:44', '2025-02-13 21:02:42', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290427', '1', '2025-02-13 21:02:04', '2025-02-13 21:02:02', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290423', '1', '2025-02-13 21:01:31', '2025-02-13 21:01:29', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290419', '1', '2025-02-13 21:00:56', '2025-02-13 21:00:54', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290418', '1', '2025-02-13 21:00:46', '2025-02-13 21:00:44', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290415', '1', '2025-02-13 21:00:15', '2025-02-13 21:00:13', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290414', '1', '2025-02-13 21:00:06', '2025-02-13 21:00:04', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290411', '1', '2025-02-13 20:59:35', '2025-02-13 20:59:33', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290407', '1', '2025-02-13 20:59:02', '2025-02-13 20:59:00', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290406', '1', '2025-02-13 20:58:54', '2025-02-13 20:58:51', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290403', '1', '2025-02-13 20:58:22', '2025-02-13 20:58:20', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290399', '1', '2025-02-13 20:57:48', '2025-02-13 20:57:46', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290398', '1', '2025-02-13 20:57:41', '2025-02-13 20:57:39', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290395', '1', '2025-02-13 20:57:10', '2025-02-13 20:57:08', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290394', '1', '2025-02-13 20:57:06', '2025-02-13 20:57:04', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290390', '1', '2025-02-13 20:56:32', '2025-02-13 20:56:30', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290387', '1', '2025-02-13 20:56:01', '2025-02-13 20:55:59', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290386', '1', '2025-02-13 20:55:59', '2025-02-13 20:55:57', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290383', '1', '2025-02-13 20:55:28', '2025-02-13 20:55:26', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290382', '1', '2025-02-13 20:55:26', '2025-02-13 20:55:24', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290379', '1', '2025-02-13 20:54:55', '2025-02-13 20:54:53', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290378', '1', '2025-02-13 20:54:44', '2025-02-13 20:54:42', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290375', '1', '2025-02-13 20:54:13', '2025-02-13 20:54:11', '[{\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290374', '1', '2025-02-13 20:54:11', '2025-02-13 20:54:09', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290371', '1', '2025-02-13 20:53:40', '2025-02-13 20:53:38', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290370', '1', '2025-02-13 20:53:37', '2025-02-13 20:53:34', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290363', '1', '2025-02-13 20:52:32', '2025-02-13 20:52:30', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290299', '1', '2025-02-13 19:48:43', '2025-02-13 19:48:41', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290296', '1', '2025-02-13 19:48:12', '2025-02-13 19:48:10', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290295', '1', '2025-02-13 19:48:07', '2025-02-13 19:48:05', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290292', '1', '2025-02-13 19:47:36', '2025-02-13 19:47:34', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290291', '1', '2025-02-13 19:47:34', '2025-02-13 19:47:32', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290288', '1', '2025-02-13 19:47:03', '2025-02-13 19:47:01', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290287', '1', '2025-02-13 19:46:59', '2025-02-13 19:46:56', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290280', '1', '2025-02-13 19:45:54', '2025-02-13 19:45:52', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290229', '1', '2025-02-13 18:55:16', '2025-02-13 18:55:14', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290226', '1', '2025-02-13 18:54:45', '2025-02-13 18:54:43', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290225', '1', '2025-02-13 18:54:43', '2025-02-13 18:54:41', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290222', '1', '2025-02-13 18:54:12', '2025-02-13 18:54:10', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290221', '1', '2025-02-13 18:53:52', '2025-02-13 18:53:50', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290218', '1', '2025-02-13 18:53:21', '2025-02-13 18:53:19', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290089', '1', '2025-02-13 16:44:59', '2025-02-13 16:44:57', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290086', '1', '2025-02-13 16:44:28', '2025-02-13 16:44:26', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290085', '1', '2025-02-13 16:44:19', '2025-02-13 16:44:17', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290082', '1', '2025-02-13 16:43:48', '2025-02-13 16:43:45', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290078', '1', '2025-02-13 16:43:14', '2025-02-13 16:43:12', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290074', '1', '2025-02-13 16:42:40', '2025-02-13 16:42:38', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290073', '1', '2025-02-13 16:42:29', '2025-02-13 16:42:27', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290070', '1', '2025-02-13 16:41:58', '2025-02-13 16:41:56', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290069', '1', '2025-02-13 16:41:55', '2025-02-13 16:41:53', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290066', '1', '2025-02-13 16:41:24', '2025-02-13 16:41:22', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290063', '1', '2025-02-13 16:40:53', '2025-02-13 16:40:51', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290062', '1', '2025-02-13 16:40:49', '2025-02-13 16:40:47', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290058', '1', '2025-02-13 16:40:16', '2025-02-13 16:40:13', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290055', '1', '2025-02-13 16:39:44', '2025-02-13 16:39:42', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290054', '1', '2025-02-13 16:39:41', '2025-02-13 16:39:39', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290048', '1', '2025-02-13 16:38:39', '2025-02-13 16:38:37', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290047', '1', '2025-02-13 16:38:37', '2025-02-13 16:38:35', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290044', '1', '2025-02-13 16:38:06', '2025-02-13 16:38:04', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290043', '1', '2025-02-13 16:37:58', '2025-02-13 16:37:56', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290040', '1', '2025-02-13 16:37:27', '2025-02-13 16:37:25', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290039', '1', '2025-02-13 16:37:25', '2025-02-13 16:37:23', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290036', '1', '2025-02-13 16:36:54', '2025-02-13 16:36:52', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290028', '1', '2025-02-13 16:35:46', '2025-02-13 16:35:44', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290027', '1', '2025-02-13 16:35:36', '2025-02-13 16:35:34', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290024', '1', '2025-02-13 16:35:05', '2025-02-13 16:35:03', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290023', '1', '2025-02-13 16:35:00', '2025-02-13 16:34:58', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290020', '1', '2025-02-13 16:34:29', '2025-02-13 16:34:27', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290019', '1', '2025-02-13 16:34:26', '2025-02-13 16:34:24', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['290016', '1', '2025-02-13 16:33:55', '2025-02-13 16:33:53', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289835', '1', '2025-02-13 13:32:33', '2025-02-13 13:32:31', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289832', '1', '2025-02-13 13:32:02', '2025-02-13 13:31:59', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289831', '1', '2025-02-13 13:31:25', '2025-02-13 13:31:23', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289828', '1', '2025-02-13 13:30:54', '2025-02-13 13:30:52', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289827', '1', '2025-02-13 13:30:52', '2025-02-13 13:30:50', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289824', '1', '2025-02-13 13:30:21', '2025-02-13 13:30:19', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289823', '1', '2025-02-13 13:30:16', '2025-02-13 13:30:14', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289820', '1', '2025-02-13 13:29:45', '2025-02-13 13:29:43', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289819', '1', '2025-02-13 13:29:41', '2025-02-13 13:29:39', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289816', '1', '2025-02-13 13:29:10', '2025-02-13 13:29:08', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289815', '1', '2025-02-13 13:29:03', '2025-02-13 13:29:01', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289812', '1', '2025-02-13 13:28:32', '2025-02-13 13:28:30', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289811', '1', '2025-02-13 13:28:30', '2025-02-13 13:28:27', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289808', '1', '2025-02-13 13:27:58', '2025-02-13 13:27:56', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289807', '1', '2025-02-13 13:27:38', '2025-02-13 13:27:36', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289804', '1', '2025-02-13 13:27:07', '2025-02-13 13:27:05', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289749', '1', '2025-02-13 12:34:53', '2025-02-13 12:34:51', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289745', '1', '2025-02-13 12:34:20', '2025-02-13 12:34:18', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289741', '1', '2025-02-13 12:33:44', '2025-02-13 12:33:42', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289737', '1', '2025-02-13 12:33:11', '2025-02-13 12:33:09', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289736', '1', '2025-02-13 12:33:06', '2025-02-13 12:33:04', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289733', '1', '2025-02-13 12:32:35', '2025-02-13 12:32:33', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289729', '1', '2025-02-13 12:32:02', '2025-02-13 12:32:00', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289728', '1', '2025-02-13 12:31:57', '2025-02-13 12:31:54', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289725', '1', '2025-02-13 12:31:25', '2025-02-13 12:31:23', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289721', '1', '2025-02-13 12:30:52', '2025-02-13 12:30:50', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289720', '1', '2025-02-13 12:30:47', '2025-02-13 12:30:45', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289717', '1', '2025-02-13 12:30:16', '2025-02-13 12:30:14', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289713', '1', '2025-02-13 12:29:43', '2025-02-13 12:29:41', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289712', '1', '2025-02-13 12:29:38', '2025-02-13 12:29:36', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289709', '1', '2025-02-13 12:29:07', '2025-02-13 12:29:05', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289705', '1', '2025-02-13 12:28:34', '2025-02-13 12:28:31', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289704', '1', '2025-02-13 12:28:28', '2025-02-13 12:28:26', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289701', '1', '2025-02-13 12:27:57', '2025-02-13 12:27:55', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289697', '1', '2025-02-13 12:27:24', '2025-02-13 12:27:22', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289693', '1', '2025-02-13 12:26:50', '2025-02-13 12:26:48', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289692', '1', '2025-02-13 12:26:46', '2025-02-13 12:26:44', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289689', '1', '2025-02-13 12:26:15', '2025-02-13 12:26:13', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289685', '1', '2025-02-13 12:25:41', '2025-02-13 12:25:39', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289684', '1', '2025-02-13 12:25:37', '2025-02-13 12:25:34', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 8, \"light_len\": 8, \"triggered\": true}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289681', '1', '2025-02-13 12:25:05', '2025-02-13 12:25:03', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289680', '1', '2025-02-13 12:25:00', '2025-02-13 12:24:58', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289677', '1', '2025-02-13 12:24:29', '2025-02-13 12:24:27', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289673', '1', '2025-02-13 12:23:56', '2025-02-13 12:23:54', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289669', '1', '2025-02-13 12:23:22', '2025-02-13 12:23:20', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289665', '1', '2025-02-13 12:22:48', '2025-02-13 12:22:46', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289664', '1', '2025-02-13 12:22:42', '2025-02-13 12:22:40', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289661', '1', '2025-02-13 12:22:11', '2025-02-13 12:22:08', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289657', '1', '2025-02-13 12:21:37', '2025-02-13 12:21:35', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289656', '1', '2025-02-13 12:21:34', '2025-02-13 12:21:32', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289653', '1', '2025-02-13 12:21:03', '2025-02-13 12:21:01', '[{\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289652', '1', '2025-02-13 12:21:00', '2025-02-13 12:20:58', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289649', '1', '2025-02-13 12:20:29', '2025-02-13 12:20:27', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289648', '1', '2025-02-13 12:20:23', '2025-02-13 12:20:21', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289645', '1', '2025-02-13 12:19:52', '2025-02-13 12:19:50', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289644', '1', '2025-02-13 12:19:50', '2025-02-13 12:19:48', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289641', '1', '2025-02-13 12:19:19', '2025-02-13 12:19:17', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289640', '1', '2025-02-13 12:19:16', '2025-02-13 12:19:13', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289637', '1', '2025-02-13 12:18:44', '2025-02-13 12:18:42', '[{\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289636', '1', '2025-02-13 12:18:41', '2025-02-13 12:18:39', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289633', '1', '2025-02-13 12:18:10', '2025-02-13 12:18:08', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289632', '1', '2025-02-13 12:18:04', '2025-02-13 12:18:02', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289629', '1', '2025-02-13 12:17:33', '2025-02-13 12:17:31', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289628', '1', '2025-02-13 12:17:31', '2025-02-13 12:17:29', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289625', '1', '2025-02-13 12:17:00', '2025-02-13 12:16:58', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289624', '1', '2025-02-13 12:16:58', '2025-02-13 12:16:56', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289621', '1', '2025-02-13 12:16:27', '2025-02-13 12:16:25', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289620', '1', '2025-02-13 12:16:24', '2025-02-13 12:16:22', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289617', '1', '2025-02-13 12:15:53', '2025-02-13 12:15:50', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289616', '1', '2025-02-13 12:15:45', '2025-02-13 12:15:43', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289613', '1', '2025-02-13 12:15:14', '2025-02-13 12:15:12', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289612', '1', '2025-02-13 12:15:11', '2025-02-13 12:15:09', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289609', '1', '2025-02-13 12:14:40', '2025-02-13 12:14:38', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289606', '1', '2025-02-13 12:14:09', '2025-02-13 12:14:07', '[{\"freq\": 433, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289605', '1', '2025-02-13 12:14:05', '2025-02-13 12:14:03', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['289602', '1', '2025-02-13 12:13:34', '2025-02-13 12:13:32', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 868, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "['287824', '1', '2025-02-12 04:41:04', '2025-02-12 04:41:02', '[{\"freq\": 433, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 700, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 868, \"amplitude\": 9, \"triggered\": true}, {\"freq\": 915, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 1200, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 2400, \"amplitude\": 0, \"light_len\": 0, \"triggered\": false}, {\"freq\": 5200, \"amplitude\": 0, \"triggered\": false}, {\"freq\": 5800, \"amplitude\": 0, \"triggered\": false}]', 'NULL', 'freq']\n", + "Данные успешно обработаны и сохранены в History_change_1.csv\n" + ] + } + ], + "source": [ + "import csv\n", + "\n", + "# Путь к входному CSV-файлу\n", + "input_file = 'History_1.csv'\n", + "\n", + "# Путь к выходному CSV-файлу (с правильно разделёнными данными)\n", + "output_file = 'History_change_1.csv'\n", + "\n", + "# Открываем исходный файл для чтения и новый файл для записи\n", + "with open(input_file, mode='r', encoding='utf-8') as infile:\n", + " with open(output_file, mode='w', encoding='utf-8-sig', newline='') as outfile:\n", + "\n", + " # Создаем объект reader для чтения CSV с учетом кавычек\n", + " reader = csv.reader(infile, delimiter=',', quotechar='\"')\n", + "\n", + " # Создаем объект writer для записи в новый CSV-файл\n", + " writer = csv.writer(outfile, delimiter=';', quotechar=\"'\", quoting=csv.QUOTE_MINIMAL)\n", + "\n", + " # Проходимся по каждой строке в исходном файле\n", + " for row in reader:\n", + " # Записываем строку в выходной файл\n", + " print(row)\n", + " writer.writerow(row)\n", + "\n", + "print(f\"Данные успешно обработаны и сохранены в {output_file}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "caf7679f", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "97cfbd11", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/train_scripts/config_ensemble.yaml b/train_scripts/config_ensemble.yaml new file mode 100644 index 0000000..ca9be33 --- /dev/null +++ b/train_scripts/config_ensemble.yaml @@ -0,0 +1,20 @@ +# Training params +epoch : 10 +batch_size : 4 +num_workers: 8 +limit : 5 + +# Optimizer +optimizer : + name : torch.optim.Adam + lr : 0.0001 + +# Criterion +loss_function : + name : torch.nn.CrossEntropyLoss + +# Scheduler +scheduler : + name : torch.optim.lr_scheduler.StepLR + gamma : 0.01 + step_size : 10 \ No newline at end of file diff --git a/train_scripts/models/ensemble_1.2_jpg_10/dataset.csv b/train_scripts/models/ensemble_1.2_jpg_10/dataset.csv new file mode 100644 index 0000000..bc276d4 --- /dev/null +++ b/train_scripts/models/ensemble_1.2_jpg_10/dataset.csv @@ -0,0 +1,964 @@ +file_name +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1261.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_333.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_53.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_933.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_81.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_193.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_419.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1440.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_501.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_475.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_981.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_837.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_880.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_150.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1802.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_363.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_360.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_161.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_199.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_43.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1275.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_54.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_833.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_459.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1814.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_338.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_451.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_414.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_968.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_328.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1243.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_64.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_8.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1826.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_444.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_842.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_779.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_847.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1250.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_903.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_455.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_406.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_778.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1341.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_751.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_44.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_511.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_743.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_888.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_497.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1805.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1821.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_194.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_875.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1279.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_25.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_366.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_885.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_912.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_473.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_828.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_740.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_492.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1455.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_97.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1357.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_135.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1292.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1778.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_483.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_493.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_21.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_498.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_973.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_373.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_907.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1380.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1329.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_958.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_860.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_179.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1818.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_49.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_780.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_314.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_951.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1427.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_756.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_400.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_307.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_99.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_89.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1255.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1378.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_389.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_770.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_446.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_437.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_937.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_369.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_883.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_499.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_515.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1372.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_128.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_476.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_915.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1286.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_959.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_61.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_832.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_836.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1823.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1807.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1409.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1245.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_929.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_336.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_433.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1320.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1825.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_935.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1801.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_500.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1309.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_480.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_442.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1267.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_965.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_412.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1405.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1343.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_416.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1411.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_417.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_384.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_116.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_491.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1434.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_733.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1448.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_471.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1780.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1340.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_144.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_126.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_140.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_859.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1333.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_784.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1824.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_5.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_4.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_36.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_908.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_477.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_801.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_466.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_109.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_824.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_825.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_16.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_771.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1373.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1314.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_900.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_404.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_808.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_441.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_435.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_881.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1235.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1306.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_797.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_851.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1307.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_130.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_330.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_826.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_159.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1244.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_149.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_66.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_760.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1812.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1797.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1226.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_308.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1330.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_465.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_753.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_931.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_821.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_205.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_69.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_90.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1442.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1392.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1410.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1456.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_35.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_168.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1257.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_479.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_869.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1384.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_458.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_754.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_984.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_979.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_735.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_325.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1272.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_985.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_834.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1280.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_85.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_884.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1241.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_42.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1274.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1349.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_827.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1396.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_502.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1789.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_899.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1297.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_142.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1352.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1772.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1435.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_844.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_153.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_70.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1777.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1326.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_909.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_157.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1438.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_349.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_204.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_403.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_347.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_861.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1385.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_20.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1822.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_310.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_505.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_858.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_344.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1322.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_445.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_134.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1381.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_852.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_391.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_341.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_960.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_901.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_758.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_831.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_507.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1429.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_486.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1783.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_878.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_132.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_450.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_164.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_320.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_434.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_197.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1369.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_350.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_854.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_12.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_358.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1779.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_313.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_790.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1315.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1360.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_795.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_469.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_764.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1334.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_916.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_38.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_440.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_383.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_180.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1398.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_169.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1449.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_773.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_430.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_806.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_815.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_729.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1236.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_864.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_346.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_944.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_72.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1366.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1246.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_156.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_22.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_182.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_68.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_882.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_106.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_186.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_810.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_436.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_27.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_478.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_848.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1231.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1337.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1324.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_845.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_387.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_438.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_129.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_814.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1239.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_332.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1294.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1444.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_902.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1224.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_18.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_28.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_474.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_971.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1412.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_23.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1262.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_335.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1785.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_898.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1356.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_362.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1443.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_396.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_381.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_13.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_58.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_408.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_51.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_811.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_393.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_65.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1281.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_407.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_490.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1273.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1424.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1269.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1259.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_983.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1790.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1339.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_9.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_113.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_425.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_146.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1225.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1445.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_356.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_399.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1287.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1342.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1382.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_829.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_772.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_865.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_187.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_46.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1348.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1303.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_203.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_911.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_122.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_482.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1419.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_942.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1408.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_820.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_105.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1828.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1436.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_120.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_736.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_429.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1403.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1452.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_467.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1251.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_422.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_319.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_495.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_956.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1776.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_83.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_966.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_781.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_428.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_452.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_37.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_755.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_757.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_30.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_155.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_786.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1389.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_78.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_111.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_809.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_131.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_361.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_782.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1371.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_962.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_928.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1407.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_930.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_463.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1361.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_424.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_394.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1390.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1377.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_472.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_411.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1454.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1238.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1282.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_886.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_812.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1256.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_862.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_787.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1794.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1325.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1432.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1363.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_67.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_76.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1800.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_410.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1816.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_817.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_785.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1304.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_2.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1283.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_59.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_950.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1817.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1295.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_379.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_374.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_192.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_342.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_974.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_73.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_800.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1317.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1383.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1331.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_167.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_891.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_3.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_160.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_201.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1347.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1323.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_513.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_481.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_162.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_896.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_439.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_367.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_506.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_166.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1827.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_206.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1387.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1299.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_910.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_395.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_124.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1451.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_352.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_29.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_857.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_94.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_747.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_202.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_62.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_165.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_955.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_40.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1417.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_10.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_200.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_863.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_151.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_462.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_39.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_976.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_895.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1811.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_55.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_110.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1351.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1300.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1426.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_485.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_34.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1254.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_893.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_191.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_849.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_431.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1242.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_121.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_101.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1420.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_60.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_207.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_119.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_783.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_92.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_748.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_823.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_334.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1370.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_957.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1284.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1365.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1368.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_329.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_514.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_98.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_830.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1804.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_954.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1264.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1414.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_376.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_775.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_388.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_163.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_324.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1327.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1318.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_917.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1290.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_972.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1437.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_26.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_876.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_759.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_918.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_835.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_850.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_32.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_802.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1277.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_74.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_734.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_742.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_977.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_923.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_108.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_327.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_807.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_114.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1319.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_91.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_198.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_813.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_368.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_461.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_796.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_426.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_326.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1421.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1311.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_749.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_19.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1379.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1397.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_453.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_96.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_33.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1271.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_402.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_311.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1345.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_970.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_93.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1815.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_88.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_371.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_767.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_975.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_372.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_938.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_853.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_894.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_79.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_752.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1404.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1353.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_732.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_184.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_323.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_961.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1258.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_792.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_777.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_765.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1316.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_107.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_147.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_804.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_304.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_978.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_762.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_840.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1228.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1232.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1302.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_148.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1792.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_351.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_154.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1313.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_949.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1268.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1781.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_185.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_731.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_741.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1293.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1233.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_138.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_737.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1346.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_488.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1394.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_7.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_927.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_871.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_943.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_941.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_868.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_45.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_468.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_774.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_48.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_919.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1820.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1431.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_504.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1796.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1810.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_353.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_738.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_322.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_82.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1237.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_136.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_87.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_380.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_897.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1400.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_17.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_95.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_143.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_791.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1799.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_924.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_343.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_867.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_872.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_370.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1375.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1247.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1344.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_123.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1406.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_139.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_24.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_874.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1782.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_822.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_102.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1386.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_302.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_0.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_71.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_856.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1321.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_421.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1775.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1430.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_460.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1332.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_873.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1355.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_409.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_397.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_905.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_727.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_117.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_805.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1788.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_398.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1359.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1301.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1252.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1362.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_57.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_420.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_382.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_793.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_127.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1803.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_103.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_879.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_945.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1308.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_798.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_789.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_359.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1358.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1374.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_63.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1376.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_510.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_969.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_494.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_11.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_50.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_375.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1266.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_77.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1447.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1441.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1336.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_443.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_390.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1270.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_803.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_385.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_321.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1439.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_354.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_470.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1401.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_337.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_746.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1248.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_305.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_115.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_75.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_904.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_769.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1457.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_183.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1263.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_331.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_345.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_952.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1249.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_6.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_889.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_31.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1305.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_315.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_750.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_301.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1422.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_137.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1298.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1253.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1230.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_866.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_982.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_364.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_763.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_418.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_348.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_449.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1354.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1388.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1819.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1415.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1291.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_340.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1791.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_925.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_14.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_15.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_41.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_766.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_892.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_788.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_312.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_355.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1829.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1278.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1260.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_946.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1350.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_84.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_306.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_100.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_118.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_52.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_196.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_303.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_181.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1786.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_739.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_309.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1798.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_508.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_152.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_489.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_887.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_794.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_86.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1806.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_843.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_457.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_819.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_768.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1402.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_934.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_838.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_339.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_378.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1335.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_914.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1453.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1425.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1240.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_940.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_846.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_456.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_920.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1423.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_906.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_744.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1793.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_145.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_936.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1310.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1229.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1446.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_487.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_405.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1338.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1393.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1413.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_503.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_730.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_454.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_377.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_728.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_818.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_415.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1328.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_980.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1265.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_447.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_496.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_855.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_745.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_316.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_401.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_816.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_932.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_509.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1296.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1433.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1774.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1809.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_158.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_464.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_761.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1288.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_922.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_413.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_392.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1289.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_141.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_133.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1450.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_967.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_877.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1773.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_125.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_365.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_318.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1367.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_841.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_776.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_178.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1813.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_512.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_953.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1787.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_47.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_926.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1808.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_317.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_484.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_357.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_947.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_839.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1285.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1234.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_799.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1784.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_432.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_56.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1395.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_104.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_870.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_963.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_427.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_423.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1428.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_386.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_913.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1364.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_939.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1416.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1418.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_948.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_112.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_195.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1391.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1795.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_921.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_80.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1312.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1276.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1227.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1399.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_448.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_964.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_890.npy.npy diff --git a/train_scripts/models/ensemble_1.2_jpg_11/dataset.csv b/train_scripts/models/ensemble_1.2_jpg_11/dataset.csv new file mode 100644 index 0000000..4561abb --- /dev/null +++ b/train_scripts/models/ensemble_1.2_jpg_11/dataset.csv @@ -0,0 +1,964 @@ +file_name +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1258.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_890.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1780.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_362.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_166.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_754.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_780.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1401.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1811.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_854.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_178.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1804.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_818.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_441.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_372.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_333.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1304.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1799.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_428.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_506.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_163.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_497.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1411.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_425.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_459.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1358.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_482.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_968.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1337.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_496.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_842.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1353.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_808.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_90.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_961.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_128.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_32.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_474.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_918.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_738.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_964.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_135.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_744.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_883.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_162.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_316.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1395.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1280.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_764.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_866.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_835.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_479.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_783.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_151.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_838.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_779.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_909.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1237.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_943.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_156.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_311.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_8.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_806.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_402.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_481.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_962.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_50.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_819.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_421.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1447.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_200.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1362.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1446.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_805.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_832.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_14.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_13.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1373.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_371.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_515.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1444.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_797.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_326.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_929.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_180.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_917.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_955.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_827.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1805.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_184.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1386.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_21.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1440.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_420.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_795.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_345.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_504.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_114.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_375.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_383.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_954.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_355.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_849.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_817.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1292.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_386.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_191.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_467.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1414.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1404.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_824.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1775.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_946.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_739.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_36.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1308.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_382.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_462.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_123.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_390.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_387.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1807.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1406.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_353.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_446.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_912.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1423.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_951.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_429.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_887.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_937.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1824.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_830.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_348.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_424.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1431.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_380.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1393.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_131.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1230.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_411.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1227.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_320.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_899.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1416.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_67.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_182.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_907.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_765.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_406.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_939.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1425.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_352.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_126.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_15.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1343.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_407.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1409.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_748.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_72.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_106.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_816.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_511.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_392.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1823.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_360.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_404.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1389.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_92.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1275.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1364.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1336.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_882.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1298.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_31.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1817.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_510.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_144.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_314.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1347.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_330.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1344.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_760.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1787.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1399.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_306.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_388.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1369.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_44.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_729.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_340.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1809.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_98.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_80.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1352.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_847.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_139.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_401.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_47.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_860.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1436.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_821.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1428.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_397.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_449.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_329.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_845.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_99.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_39.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1786.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_303.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1357.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1360.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1264.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_447.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_746.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1410.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1330.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1814.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_75.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_958.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_349.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1417.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_494.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_53.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_960.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1225.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_86.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1795.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_919.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_37.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_452.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_498.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_859.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_341.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_57.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_444.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_136.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_507.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_508.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_374.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_395.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_898.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_980.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_485.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_42.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_851.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1327.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1350.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_470.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1276.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_204.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_321.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_758.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_920.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_83.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_34.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_186.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_776.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1248.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_751.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_207.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_130.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_502.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_38.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_361.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_736.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1260.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_886.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_196.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_367.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_158.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_319.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1412.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_179.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_843.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_796.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1351.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_74.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_430.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_893.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_500.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_159.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1813.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_801.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_873.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1374.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_152.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_51.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1449.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_343.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_62.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1290.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_30.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1398.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1456.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_941.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_9.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_458.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_59.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_837.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_435.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_307.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_120.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_793.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_60.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1257.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_185.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_457.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_503.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1403.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_804.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1437.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1310.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_85.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_305.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_150.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_137.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_863.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_985.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_2.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_836.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1300.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_164.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_813.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_768.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_865.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_913.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_318.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1778.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1287.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_914.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_923.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1822.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_756.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_488.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_512.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1796.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1321.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1777.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_111.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1311.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1421.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_761.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1808.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_16.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_869.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1328.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1326.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_398.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_461.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_23.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_875.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_168.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_433.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1251.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_921.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_165.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1812.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_928.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_335.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_133.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1235.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_342.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1245.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_456.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_489.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_115.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_463.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_143.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_149.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1323.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_206.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1791.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1241.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_978.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_325.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_877.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_472.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_774.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_902.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_938.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_377.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1246.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_358.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1265.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1453.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_740.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_499.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1319.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1450.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_925.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_426.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1256.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_922.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1429.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1296.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_789.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_142.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_187.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_45.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_413.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_916.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_49.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_391.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_0.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_181.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_91.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_344.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1339.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_61.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1826.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_731.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1402.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1806.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_769.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1281.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_192.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_28.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_116.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1259.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_312.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_417.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_811.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_369.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_767.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_448.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_932.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1232.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_743.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1371.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_895.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_434.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_878.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1419.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_427.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1819.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1262.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_466.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1366.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_905.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1438.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_778.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_455.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_880.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1427.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_927.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1242.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_495.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1443.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_953.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1375.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1789.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_112.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_834.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1279.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_96.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_803.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1293.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1228.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1354.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1334.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_867.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_831.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_442.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_464.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1377.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_966.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1372.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_889.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_897.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_40.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_900.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_101.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_825.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_436.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_22.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_408.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1829.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_965.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_117.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_65.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_840.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_812.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1324.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1783.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_122.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1305.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1793.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_393.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_844.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_105.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_205.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_41.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_826.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_766.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_940.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1828.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_981.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1779.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1396.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_141.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_302.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1384.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_87.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_203.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_876.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_104.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_734.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_870.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_460.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_25.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1413.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_107.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_926.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_815.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_450.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1773.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_437.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1782.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_931.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1294.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_351.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_947.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_888.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_728.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_422.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_118.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_157.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_147.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_901.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_95.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_792.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1355.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_416.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_19.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_791.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1238.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_892.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_17.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_759.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_983.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_93.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_509.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_109.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1239.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_800.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1309.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1359.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_755.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_957.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_322.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_952.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_84.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_129.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_119.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1333.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1307.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_323.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1397.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1253.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_451.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_752.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1381.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1435.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_100.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1442.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_194.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1340.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1301.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_338.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_195.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1229.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_378.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1394.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_486.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_833.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1408.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_385.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_346.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_747.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1289.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1451.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1233.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_336.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1356.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_948.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_20.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1269.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_959.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1317.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1341.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_807.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_58.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_52.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_432.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_839.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1422.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_782.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1801.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1810.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_313.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_33.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1297.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_443.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_331.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1378.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_125.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1342.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_27.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1430.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1790.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_862.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1338.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1254.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_477.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1426.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_492.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_872.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_820.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_110.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1236.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_868.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1348.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_772.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_108.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1303.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_737.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_405.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_423.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_794.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_394.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1313.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_970.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_77.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1452.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_790.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_483.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_82.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_490.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_121.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1800.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1792.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1325.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1306.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_359.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1277.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_484.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_468.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_410.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_160.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1231.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_473.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_493.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_809.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_858.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_373.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_788.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_969.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_911.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_802.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_975.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_846.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1434.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_94.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1244.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_950.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_505.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1240.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1424.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_69.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_379.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_749.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_885.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_71.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_10.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_350.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_376.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_810.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_967.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_347.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_785.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_370.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1314.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_140.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_852.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_848.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_487.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_54.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_24.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1266.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_148.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_763.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1252.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_798.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_29.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_97.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1335.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1415.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_88.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_841.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1827.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_183.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_514.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_963.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1433.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_727.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1295.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_202.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1255.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_735.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_786.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_480.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1250.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_366.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_414.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_103.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1349.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1261.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1391.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_364.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_363.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_56.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1286.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1267.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_879.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1785.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_864.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1821.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_12.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1263.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_5.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1322.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_770.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_412.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_368.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1400.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_757.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1802.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_935.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_155.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1302.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_43.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1316.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_742.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_339.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_146.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_18.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_198.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1270.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_134.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_73.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1818.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_857.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_979.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1383.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_933.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1272.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1284.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_903.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_357.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_945.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_465.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_356.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_400.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1291.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_419.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1772.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1388.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1318.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1346.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1370.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_773.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_891.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_332.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_127.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1788.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_750.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1382.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_384.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1420.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_753.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1249.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_102.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_7.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1278.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1361.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1455.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1784.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_781.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_822.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_469.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_762.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_874.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_324.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1243.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_984.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1224.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_775.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_396.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1407.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_942.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_310.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1331.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_513.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_501.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_894.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_930.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_491.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1797.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_169.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_476.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_977.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_46.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1815.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_777.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_944.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1441.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_973.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1798.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_881.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_850.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_915.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_853.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_787.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1376.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1320.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_6.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_956.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_55.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_328.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_855.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_784.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1445.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1803.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_949.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1329.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_884.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_403.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_138.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1345.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_68.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_389.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_445.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_934.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1282.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_301.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_936.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1439.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1283.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1781.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_478.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_828.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_733.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_365.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1271.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1299.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_418.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1363.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1457.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_3.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_317.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_315.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_475.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1454.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_76.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_193.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1268.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_337.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_976.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_908.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_48.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_124.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1332.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_26.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_896.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_910.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1387.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_439.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1367.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1226.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_145.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_167.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1448.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_354.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1390.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_70.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1273.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1288.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1405.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_201.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_982.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_829.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_906.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_64.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_304.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1825.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_161.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_741.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_924.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_113.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1432.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_399.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_4.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_454.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_814.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_972.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_861.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1774.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1368.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1315.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_199.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1794.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1274.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_89.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_381.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_153.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1380.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_81.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1385.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_440.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1816.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1418.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_904.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_823.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1379.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_799.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_732.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1285.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_308.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_154.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_11.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_438.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_309.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_415.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1365.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1247.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_856.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_453.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_971.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1820.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_431.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_471.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_197.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1776.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_409.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_327.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_66.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1234.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_771.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_35.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_132.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_974.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_871.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_334.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_78.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1312.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_745.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_79.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1392.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_730.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_63.npy.npy diff --git a/train_scripts/models/ensemble_1.2_jpg_11/ensemble_1.2_jpg_.pth b/train_scripts/models/ensemble_1.2_jpg_11/ensemble_1.2_jpg_.pth new file mode 100644 index 0000000..e07b602 Binary files /dev/null and b/train_scripts/models/ensemble_1.2_jpg_11/ensemble_1.2_jpg_.pth differ diff --git a/train_scripts/models/ensemble_1.2_jpg_11/train_acc.npy b/train_scripts/models/ensemble_1.2_jpg_11/train_acc.npy new file mode 100644 index 0000000..3a49a34 Binary files /dev/null and b/train_scripts/models/ensemble_1.2_jpg_11/train_acc.npy differ diff --git a/train_scripts/models/ensemble_1.2_jpg_11/train_loss.npy b/train_scripts/models/ensemble_1.2_jpg_11/train_loss.npy new file mode 100644 index 0000000..15f34ac Binary files /dev/null and b/train_scripts/models/ensemble_1.2_jpg_11/train_loss.npy differ diff --git a/train_scripts/models/ensemble_1.2_jpg_11/val_acc.npy b/train_scripts/models/ensemble_1.2_jpg_11/val_acc.npy new file mode 100644 index 0000000..cc6612e Binary files /dev/null and b/train_scripts/models/ensemble_1.2_jpg_11/val_acc.npy differ diff --git a/train_scripts/models/ensemble_1.2_jpg_11/val_loss.npy b/train_scripts/models/ensemble_1.2_jpg_11/val_loss.npy new file mode 100644 index 0000000..44d2935 Binary files /dev/null and b/train_scripts/models/ensemble_1.2_jpg_11/val_loss.npy differ diff --git a/train_scripts/models/ensemble_1.2_jpg_2/dataset.csv b/train_scripts/models/ensemble_1.2_jpg_2/dataset.csv new file mode 100644 index 0000000..2b5147b --- /dev/null +++ b/train_scripts/models/ensemble_1.2_jpg_2/dataset.csv @@ -0,0 +1 @@ +file_name diff --git a/train_scripts/models/ensemble_1.2_jpg_3/dataset.csv b/train_scripts/models/ensemble_1.2_jpg_3/dataset.csv new file mode 100644 index 0000000..2b5147b --- /dev/null +++ b/train_scripts/models/ensemble_1.2_jpg_3/dataset.csv @@ -0,0 +1 @@ +file_name diff --git a/train_scripts/models/ensemble_1.2_jpg_4/dataset.csv b/train_scripts/models/ensemble_1.2_jpg_4/dataset.csv new file mode 100644 index 0000000..2b5147b --- /dev/null +++ b/train_scripts/models/ensemble_1.2_jpg_4/dataset.csv @@ -0,0 +1 @@ +file_name diff --git a/train_scripts/models/ensemble_1.2_jpg_5/dataset.csv b/train_scripts/models/ensemble_1.2_jpg_5/dataset.csv new file mode 100644 index 0000000..2b5147b --- /dev/null +++ b/train_scripts/models/ensemble_1.2_jpg_5/dataset.csv @@ -0,0 +1 @@ +file_name diff --git a/train_scripts/models/ensemble_1.2_jpg_6/dataset.csv b/train_scripts/models/ensemble_1.2_jpg_6/dataset.csv new file mode 100644 index 0000000..2b5147b --- /dev/null +++ b/train_scripts/models/ensemble_1.2_jpg_6/dataset.csv @@ -0,0 +1 @@ +file_name diff --git a/train_scripts/models/ensemble_1.2_jpg_7/dataset.csv b/train_scripts/models/ensemble_1.2_jpg_7/dataset.csv new file mode 100644 index 0000000..2b5147b --- /dev/null +++ b/train_scripts/models/ensemble_1.2_jpg_7/dataset.csv @@ -0,0 +1 @@ +file_name diff --git a/train_scripts/models/ensemble_1.2_jpg_8/dataset.csv b/train_scripts/models/ensemble_1.2_jpg_8/dataset.csv new file mode 100644 index 0000000..2b5147b --- /dev/null +++ b/train_scripts/models/ensemble_1.2_jpg_8/dataset.csv @@ -0,0 +1 @@ +file_name diff --git a/train_scripts/models/ensemble_1.2_jpg_9/dataset.csv b/train_scripts/models/ensemble_1.2_jpg_9/dataset.csv new file mode 100644 index 0000000..61c4412 --- /dev/null +++ b/train_scripts/models/ensemble_1.2_jpg_9/dataset.csv @@ -0,0 +1,964 @@ +file_name +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_443.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_183.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_403.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_163.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_349.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_922.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_830.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_893.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_386.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1774.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1224.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_780.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_482.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_38.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1301.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_503.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_848.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_881.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_195.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1431.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_793.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1808.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_819.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_484.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1392.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1324.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_2.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_890.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_974.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_395.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_91.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_43.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_151.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1288.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_917.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_382.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_814.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1383.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1275.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_125.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1351.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1449.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_847.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_131.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_414.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_868.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1293.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_448.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_312.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_795.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1294.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_486.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_182.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1243.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1791.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1323.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_978.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1785.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_970.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_192.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_872.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_100.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1304.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1415.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1309.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1245.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1322.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1816.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1442.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1367.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1260.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1452.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_411.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_843.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1377.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1412.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_962.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_185.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_308.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_383.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_729.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_773.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_870.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_52.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_417.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1432.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1292.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_54.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1819.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1378.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1315.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_318.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_108.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1249.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_439.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_864.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_80.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1800.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_451.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1405.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_373.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_378.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1346.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1335.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_849.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1799.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_730.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_0.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_740.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_950.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_968.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_836.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_809.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1368.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1451.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1433.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_311.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_502.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_113.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1790.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1350.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_14.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_24.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_951.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1289.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_415.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_902.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_426.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1341.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1826.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_757.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1406.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_133.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_11.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_831.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_167.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1359.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_70.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_76.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_48.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_943.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_110.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_820.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_8.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_731.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_846.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_481.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1328.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_980.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1361.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_60.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_138.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1330.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_910.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_148.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_733.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1334.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_10.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1435.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1313.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_472.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_877.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_908.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_901.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1266.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_315.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_84.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_776.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1332.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1354.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_940.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_401.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1329.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1804.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_63.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_181.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_891.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_37.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_932.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_322.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1455.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_61.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1797.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1331.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1262.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_926.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_959.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_127.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_40.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_385.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_826.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_31.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1296.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_973.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_480.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_865.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_966.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_958.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_343.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_827.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_744.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_434.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_77.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_119.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_894.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_909.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_436.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_369.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_497.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_126.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_29.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_418.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1318.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_420.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_874.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_205.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_811.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_858.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_20.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1272.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_323.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_45.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_327.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_357.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_845.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_916.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_953.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1298.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1299.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_783.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1306.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_307.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_69.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1823.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_356.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_348.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_155.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_412.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_316.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_821.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_756.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1775.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_326.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_147.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_930.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1815.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1443.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1440.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_918.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_90.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_186.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1801.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_850.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_180.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_961.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_98.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_317.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_828.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1430.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1286.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_504.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1233.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_812.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_483.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1307.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_179.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_474.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_46.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_4.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1278.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1393.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_361.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_882.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_166.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_99.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_198.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_306.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1402.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_899.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_907.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_863.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1254.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_861.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_202.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_490.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_377.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_409.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1300.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_897.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1250.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_912.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1454.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1409.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_808.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_7.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1240.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_204.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1407.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_71.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_768.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_765.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_952.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1287.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_905.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_25.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_461.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1283.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_117.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_946.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1226.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_68.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_491.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_458.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_353.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_338.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1339.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_772.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_860.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_83.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1348.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_732.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_360.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_141.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_364.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1347.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_487.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_366.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_388.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1234.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_466.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_320.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_109.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1338.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_118.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1434.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_787.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_337.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_515.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1295.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_379.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1410.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_421.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_358.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_62.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1271.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1242.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_825.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_324.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_920.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1413.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_450.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1411.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_302.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1794.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_914.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_906.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1382.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1357.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_470.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_50.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1356.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_876.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_835.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1389.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_840.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1265.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_784.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_87.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_816.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_494.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1362.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_479.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_896.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_507.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1388.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_67.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_498.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_866.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1380.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1305.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_747.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_977.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_106.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_132.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_346.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1387.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_146.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_428.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_755.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_342.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_32.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_365.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_471.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1239.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_339.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1230.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_423.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_786.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1811.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_880.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_929.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_65.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1227.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_921.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_938.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1337.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_154.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1438.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_791.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1238.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_945.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1371.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_161.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_329.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1384.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_473.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_788.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_95.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_129.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_469.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_394.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_855.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_944.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1798.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1813.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_200.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1369.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_404.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_936.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1400.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_981.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_303.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_44.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_82.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_781.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_782.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_355.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_738.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_55.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1822.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_513.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_112.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_124.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_856.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_749.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1342.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_465.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1394.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1439.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_207.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_785.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_325.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1437.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1404.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_751.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1302.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_64.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_734.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_904.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_511.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_889.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_424.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1776.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_122.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1386.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1817.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_468.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1333.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1399.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_442.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_802.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_832.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_397.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1788.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_430.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_145.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_767.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1320.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1277.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1803.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_960.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_984.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_937.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_96.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1810.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_115.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_508.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_867.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_341.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_375.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1436.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_105.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_197.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_778.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_965.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1379.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1235.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_892.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_413.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_362.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_396.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_815.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_301.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_963.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1316.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1786.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_898.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_78.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_399.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_829.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_144.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1343.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1818.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_86.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_883.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1425.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1241.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_967.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1358.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_759.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_805.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_330.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_432.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_89.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1448.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_387.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_851.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1228.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_381.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_380.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_114.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_56.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_16.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_485.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1787.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_26.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1418.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1268.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1267.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_931.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1420.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_763.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_478.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_752.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_168.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_107.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_505.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_956.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1336.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_496.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_332.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1276.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_199.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1772.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_463.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_139.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_390.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_728.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_495.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_367.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_822.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1773.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1261.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_878.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1229.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_790.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_433.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1258.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_441.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_939.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_328.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_493.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1403.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_467.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1809.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_879.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1423.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_903.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_979.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_873.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1802.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_392.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1363.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_823.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_152.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_975.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1447.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1280.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_331.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1821.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1327.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_304.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_352.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_19.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_319.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1303.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1284.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_875.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1398.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_410.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1456.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_169.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1370.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_22.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1257.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_350.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_347.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_871.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1419.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_794.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_72.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1353.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_81.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_427.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1256.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_102.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1395.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1312.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_862.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1344.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_806.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_93.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_143.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_810.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_735.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_23.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_919.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1795.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_345.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1248.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1269.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_184.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1780.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_39.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1251.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_47.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_770.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1824.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_727.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_391.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_985.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1784.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_475.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1807.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_976.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_85.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_813.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_21.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_398.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_746.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_120.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_771.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1263.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_736.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_111.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_887.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_158.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_18.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_393.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_512.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1317.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1390.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_969.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_745.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1308.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_17.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_49.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_196.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_59.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_447.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_964.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1397.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_134.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1427.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_789.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_454.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1225.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1340.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_305.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_431.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_748.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_954.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_800.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1781.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_79.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1777.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1273.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_807.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_462.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_101.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_775.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_933.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_499.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1792.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_123.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1385.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1806.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_971.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_492.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_41.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_799.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_74.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_66.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_948.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1376.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1457.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_798.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_947.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_949.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_309.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1424.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_28.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_750.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1396.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_340.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_9.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1453.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1365.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_359.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_488.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_455.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_335.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1325.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_869.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_453.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_927.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1319.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_444.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_983.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_333.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_178.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_165.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_310.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_164.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_501.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_446.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_376.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1231.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_818.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_895.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1391.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_506.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1416.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_162.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1375.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_384.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_27.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_838.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1779.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_452.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_737.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_853.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_884.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_854.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1783.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_739.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_193.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_187.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1279.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_476.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1812.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_935.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1326.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_34.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_30.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1429.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_754.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_792.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1252.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_885.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_94.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_58.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_456.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_500.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_859.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_489.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1311.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_766.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_344.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_140.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_834.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1796.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_206.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_801.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_201.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_363.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_15.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_191.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_389.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_408.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1366.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1414.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_422.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1782.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_762.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_955.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_130.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_435.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_924.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_440.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_934.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1445.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_160.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_6.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_128.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_97.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1450.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1349.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1247.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_760.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_841.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_203.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_459.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1820.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_370.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_445.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_769.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_817.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1829.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1274.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_402.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1444.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1352.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_844.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_925.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_742.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_804.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_354.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_753.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_464.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1236.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1441.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_368.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_336.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1793.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1253.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_774.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_406.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_351.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1814.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_797.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_35.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1381.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_371.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_407.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1373.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1259.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1401.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1255.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_824.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_194.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_941.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_923.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1408.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_915.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1428.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1310.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_833.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_157.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_457.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_13.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_57.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_886.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1446.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_116.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_972.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_321.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_156.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1372.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_314.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_839.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_416.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_12.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_928.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_313.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_372.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_438.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_104.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_419.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_425.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_137.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1426.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_477.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1291.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_449.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1321.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_88.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_842.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_857.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_53.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1270.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_374.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_837.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_405.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_779.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_913.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_852.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_777.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_460.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_51.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1778.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1360.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_957.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_153.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_42.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_136.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1825.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_803.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_510.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_150.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1789.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_982.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1290.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_73.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_911.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1417.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_741.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_437.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_900.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_888.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_36.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_400.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_92.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1232.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1285.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1422.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_942.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1281.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_159.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1364.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1421.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1282.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_761.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1244.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_758.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_75.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1827.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_103.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_764.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_5.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_3.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1246.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_334.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_429.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_796.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1264.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_509.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1237.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1297.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_142.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1374.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1355.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1314.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_33.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1828.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_135.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_514.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_121.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_149.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1345.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_1805.npy.npy +/mnt/nvme1/dataset_img/drone/1200/HackA5_1.2_743.npy.npy diff --git a/train_scripts/my_csv_make.ipynb b/train_scripts/my_csv_make.ipynb new file mode 100644 index 0000000..138f368 --- /dev/null +++ b/train_scripts/my_csv_make.ipynb @@ -0,0 +1,58 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "id": "537ea5d0-1d6c-423e-9417-171b70a76c66", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import pandas as pd\n", + "\n", + "path = '//192.168.11.63/data/DATASETS/Energomash/915_learning'\n", + "pd_columns = ['file_name']\n", + "df = pd.DataFrame(columns=pd_columns)\n", + "\n", + "p = 0\n", + "for i in os.walk(path):\n", + " p+=1\n", + " if p != 1:\n", + " for j in i[2]:\n", + " row = pd.DataFrame({pd_columns[0]: [str(str(i[0]) + '\\\\' + str(j)).replace('\\\\', '/')]})\n", + " df = pd.concat([df, row], ignore_index=True)\n", + "\n", + "df.to_csv(path + '\\dataset.csv', index=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8f6e1ff8", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/train_scripts/requirements-train.txt b/train_scripts/requirements-train.txt new file mode 100644 index 0000000..64a427a --- /dev/null +++ b/train_scripts/requirements-train.txt @@ -0,0 +1,24 @@ +# Base deps for notebooks in train_scripts/. +# +# Install order for this repo: +# python -m pip install -r deploy/requirements/nn_gpu_pinned.txt +# python -m pip install -r train_scripts/requirements-train.txt +# python -m pip install -e ./torchsig --no-deps +# +# Notes: +# - Do not install `torchsig` from PyPI: the project uses the local repo copy. +# - Main NN service pins come from deploy/requirements/nn_common.txt. +# - For notebooks use GUI OpenCV, so this file uses `opencv-python`, not headless. + +ipykernel +jupyterlab +numpy==2.1.3 +matplotlib==3.10.0 +tqdm==4.67.1 +PyYAML==6.0.2 +mlconfig==0.3.2 +scikit-learn==1.6.0 +opencv-python==4.10.0.84 +pandas +Pillow +scipy diff --git a/train_scripts/train_scripts.zip b/train_scripts/train_scripts.zip new file mode 100644 index 0000000..9dd2629 Binary files /dev/null and b/train_scripts/train_scripts.zip differ diff --git a/train_scripts/triangulation_accurate.ipynb b/train_scripts/triangulation_accurate.ipynb new file mode 100644 index 0000000..6034c79 --- /dev/null +++ b/train_scripts/triangulation_accurate.ipynb @@ -0,0 +1,91 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "689613d2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "80.58750000000002\n", + "(array([8.97705408, 4.95 , 0. ]), array([-8.97705408, 4.95 , 0. ]))\n" + ] + } + ], + "source": [ + "import numpy \n", + "from math import sqrt as square\n", + "from numpy import sqrt, dot, cross \n", + "from numpy.linalg import norm \n", + "\n", + "#rssi = [rssi, max_rssi, min_rssi, gamma]\n", + "\n", + "def dist(rssi):\n", + " rssi = list(map(float, rssi))\n", + " return square(abs(rssi[0]-rssi[1]))*rssi[3]/square(abs(rssi[0]-rssi[2]))\n", + "\n", + "def sol(x1,x2,x3,rssi1,rssi2,rssi3):\n", + " r1 = dist(rssi1)\n", + " r2 = dist(rssi2)\n", + " r3 = dist(rssi3)\n", + " x1=numpy.array(x1)\n", + " x2=numpy.array(x2)\n", + " x3=numpy.array(x3)\n", + " temp1 = x2-x1 \n", + " e_x = temp1/norm(temp1) \n", + " temp2 = x3-x1 \n", + " i = dot(e_x,temp2) \n", + " temp3 = temp2 - i*e_x \n", + " e_y = temp3/norm(temp3) \n", + " e_z = cross(e_x,e_y) \n", + " d = norm(x2-x1) \n", + " j = dot(e_y,temp2) \n", + " x = (r1*r1 - r2*r2 + d*d) / (2*d) \n", + " y = (r1*r1 - r3*r3 -2*i*x + i*i + j*j) / (2*j) \n", + " temp4 = r1*r1 - x*x - y*y \n", + " print(temp4)\n", + " if temp4<0: \n", + " return \"Нет пересечения!\"\n", + " z = sqrt(temp4) \n", + " p_12_a = x1 + x*e_x + y*e_y + z*e_z \n", + " p_12_b = x1 + x*e_x + y*e_y - z*e_z \n", + " return p_12_a,p_12_b\n", + "\n", + "\n", + "print(sol([0,0,1],[0,0,-1],[0,10,0],[50,100,0,10.3],[50,100,0,10.3],[50,100,0,10.3]))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0a68f35a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/train_scripts/triangulation_direction_2D.ipynb b/train_scripts/triangulation_direction_2D.ipynb new file mode 100644 index 0000000..5b4d93a --- /dev/null +++ b/train_scripts/triangulation_direction_2D.ipynb @@ -0,0 +1,57 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "f18afe4b", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy \n", + "from math import sqrt as square\n", + "from numpy import sqrt, dot, cross \n", + "from numpy.linalg import norm \n", + "\n", + "#rssi = [rssi, max_rssi, min_rssi, gamma]\n", + "\n", + "def dist(rssi):\n", + " rssi = list(map(float, rssi))\n", + " return square(abs(rssi[0]-rssi[1]))*rssi[3]/square(abs(rssi[0]-rssi[2]))\n", + "\n", + "def sol(x1,x2,x3,rssi1,rssi2,rssi3):\n", + " r1 = dist(rssi1)\n", + " r2 = dist(rssi2)\n", + " r3 = dist(rssi3)\n", + " x1=numpy.array(x1)\n", + " x2=numpy.array(x2)\n", + " x3=numpy.array(x3)\n", + " \n", + " return sector.\n", + "\n", + "\n", + "print(sol([0,0,1],[0,0,-1],[0,10,0],[50,100,0,10.3],[50,100,0,10.3],[50,100,0,10.3]))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}