Compare commits
26 Commits
latex/back
...
latex/meth
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7104eb275a | ||
|
|
ee9bd98a9e | ||
|
|
279703c1bb | ||
|
|
5f00fcf7bf | ||
|
|
d41eb8c539 | ||
|
|
cc191122af | ||
|
|
802f2a01ce | ||
|
|
26d47e8538 | ||
|
|
51118c13b3 | ||
|
|
c07af1b937 | ||
|
|
c96fd43e76 | ||
|
|
083b00e914 | ||
|
|
b4fb0d64a2 | ||
|
|
d5c9d6dec4 | ||
|
|
26b276c1f9 | ||
|
|
82fb8ff629 | ||
|
|
2aa5cda6c7 | ||
|
|
fd696a41b9 | ||
|
|
077768917d | ||
|
|
b1e1edee77 | ||
|
|
452afd6580 | ||
|
|
c8509aa728 | ||
|
|
4ebfb52635 | ||
|
|
1511012e11 | ||
|
|
db2947abdf | ||
|
|
36b36c41ba |
@@ -121,8 +121,9 @@
|
|||||||
"signal_sensor2_test1 = []\n",
|
"signal_sensor2_test1 = []\n",
|
||||||
"\n",
|
"\n",
|
||||||
"for data in df:\n",
|
"for data in df:\n",
|
||||||
" signal_sensor1_test1.append(data['sensor 1'].values)\n",
|
" if not data.empty and 'sensor 1' in data.columns and 'sensor 2' in data.columns:\n",
|
||||||
" signal_sensor2_test1.append(data['sensor 2'].values)\n",
|
" signal_sensor1_test1.append(data['sensor 1'].values)\n",
|
||||||
|
" signal_sensor2_test1.append(data['sensor 2'].values)\n",
|
||||||
"\n",
|
"\n",
|
||||||
"print(len(signal_sensor1_test1))\n",
|
"print(len(signal_sensor1_test1))\n",
|
||||||
"print(len(signal_sensor2_test1))"
|
"print(len(signal_sensor2_test1))"
|
||||||
@@ -156,8 +157,6 @@
|
|||||||
"from scipy.signal import stft, hann\n",
|
"from scipy.signal import stft, hann\n",
|
||||||
"from multiprocessing import Pool\n",
|
"from multiprocessing import Pool\n",
|
||||||
"\n",
|
"\n",
|
||||||
"\n",
|
|
||||||
"\n",
|
|
||||||
"# Function to compute and append STFT data\n",
|
"# Function to compute and append STFT data\n",
|
||||||
"def process_stft(args):\n",
|
"def process_stft(args):\n",
|
||||||
" # Define STFT parameters\n",
|
" # Define STFT parameters\n",
|
||||||
@@ -199,23 +198,22 @@
|
|||||||
" # Compute STFT\n",
|
" # Compute STFT\n",
|
||||||
" frequencies, times, Zxx = stft(sensor_data, fs=Fs, window=window, nperseg=window_size, noverlap=window_size - hop_size)\n",
|
" frequencies, times, Zxx = stft(sensor_data, fs=Fs, window=window, nperseg=window_size, noverlap=window_size - hop_size)\n",
|
||||||
" magnitude = np.abs(Zxx)\n",
|
" magnitude = np.abs(Zxx)\n",
|
||||||
" flattened_stft = magnitude.flatten()\n",
|
" df_stft = pd.DataFrame(magnitude, index=frequencies, columns=times).T\n",
|
||||||
|
" df_stft.columns = [f\"Freq_{i}\" for i in frequencies]\n",
|
||||||
" \n",
|
" \n",
|
||||||
" # Define the output CSV file path\n",
|
" # Define the output CSV file path\n",
|
||||||
" stft_file_name = f'stft_data{sensor_num}_{damage_num}.csv'\n",
|
" stft_file_name = f'stft_data{sensor_num}_{damage_num}.csv'\n",
|
||||||
" sensor_output_dir = os.path.join(damage_base_path, sensor_name.lower())\n",
|
" sensor_output_dir = os.path.join(damage_base_path, sensor_name.lower())\n",
|
||||||
" os.makedirs(sensor_output_dir, exist_ok=True)\n",
|
" os.makedirs(sensor_output_dir, exist_ok=True)\n",
|
||||||
" stft_file_path = os.path.join(sensor_output_dir, stft_file_name)\n",
|
" stft_file_path = os.path.join(sensor_output_dir, stft_file_name)\n",
|
||||||
" print(stft_file_path)\n",
|
|
||||||
" # Append the flattened STFT to the CSV\n",
|
" # Append the flattened STFT to the CSV\n",
|
||||||
" try:\n",
|
" try:\n",
|
||||||
" flattened_stft_df = pd.DataFrame([flattened_stft])\n",
|
|
||||||
" if not os.path.isfile(stft_file_path):\n",
|
" if not os.path.isfile(stft_file_path):\n",
|
||||||
" # Create a new CSV\n",
|
" # Create a new CSV\n",
|
||||||
" flattened_stft_df.to_csv(stft_file_path, index=False, header=False)\n",
|
" df_stft.to_csv(stft_file_path, index=False, header=False)\n",
|
||||||
" else:\n",
|
" else:\n",
|
||||||
" # Append to existing CSV\n",
|
" # Append to existing CSV\n",
|
||||||
" flattened_stft_df.to_csv(stft_file_path, mode='a', index=False, header=False)\n",
|
" df_stft.to_csv(stft_file_path, mode='a', index=False, header=False)\n",
|
||||||
" print(f\"Appended STFT data to {stft_file_path}\")\n",
|
" print(f\"Appended STFT data to {stft_file_path}\")\n",
|
||||||
" except Exception as e:\n",
|
" except Exception as e:\n",
|
||||||
" print(f\"Error writing to {stft_file_path}: {e}\")"
|
" print(f\"Error writing to {stft_file_path}: {e}\")"
|
||||||
@@ -295,7 +293,7 @@
|
|||||||
"\n",
|
"\n",
|
||||||
"# get current y ticks in list\n",
|
"# get current y ticks in list\n",
|
||||||
"print(len(frequencies))\n",
|
"print(len(frequencies))\n",
|
||||||
"print(len(times))\n"
|
"print(len(times))"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -326,7 +324,6 @@
|
|||||||
"ready_data1 = []\n",
|
"ready_data1 = []\n",
|
||||||
"for file in os.listdir('D:/thesis/data/converted/raw/sensor1'):\n",
|
"for file in os.listdir('D:/thesis/data/converted/raw/sensor1'):\n",
|
||||||
" ready_data1.append(pd.read_csv(os.path.join('D:/thesis/data/converted/raw/sensor1', file)))\n",
|
" ready_data1.append(pd.read_csv(os.path.join('D:/thesis/data/converted/raw/sensor1', file)))\n",
|
||||||
"ready_data1[0]\n",
|
|
||||||
"# colormesh give title x is frequency and y is time and rotate/transpose the data\n",
|
"# colormesh give title x is frequency and y is time and rotate/transpose the data\n",
|
||||||
"# Plotting the STFT Data"
|
"# Plotting the STFT Data"
|
||||||
]
|
]
|
||||||
@@ -337,8 +334,8 @@
|
|||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"ready_data1[1]\n",
|
"ready_data1[0]\n",
|
||||||
"plt.pcolormesh(ready_data1[1])"
|
"plt.pcolormesh(ready_data1[0])"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -363,8 +360,7 @@
|
|||||||
"source": [
|
"source": [
|
||||||
"ready_data2 = []\n",
|
"ready_data2 = []\n",
|
||||||
"for file in os.listdir('D:/thesis/data/converted/raw/sensor2'):\n",
|
"for file in os.listdir('D:/thesis/data/converted/raw/sensor2'):\n",
|
||||||
" ready_data2.append(pd.read_csv(os.path.join('D:/thesis/data/converted/raw/sensor2', file)))\n",
|
" ready_data2.append(pd.read_csv(os.path.join('D:/thesis/data/converted/raw/sensor2', file)))"
|
||||||
"ready_data2[5]"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -384,10 +380,25 @@
|
|||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"x1 = 0\n",
|
"x1 = 0\n",
|
||||||
"\n",
|
"print(type(ready_data1[0]))\n",
|
||||||
|
"ready_data1[0].iloc[:,0]\n",
|
||||||
|
"# x1 = x1 + ready_data1[0].shape[0]"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"x1 = 0\n",
|
||||||
|
"print(type(x1))\n",
|
||||||
"for i in range(len(ready_data1)):\n",
|
"for i in range(len(ready_data1)):\n",
|
||||||
" print(ready_data1[i].shape)\n",
|
" # print(ready_data1[i].shape)\n",
|
||||||
|
" # print(ready_data1[i].)\n",
|
||||||
|
" print(type(ready_data1[i].shape[0]))\n",
|
||||||
" x1 = x1 + ready_data1[i].shape[0]\n",
|
" x1 = x1 + ready_data1[i].shape[0]\n",
|
||||||
|
" print(type(x1))\n",
|
||||||
"\n",
|
"\n",
|
||||||
"print(x1)"
|
"print(x1)"
|
||||||
]
|
]
|
||||||
@@ -407,13 +418,6 @@
|
|||||||
"print(x2)"
|
"print(x2)"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"cell_type": "markdown",
|
|
||||||
"metadata": {},
|
|
||||||
"source": [
|
|
||||||
"### Appending"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": null,
|
||||||
@@ -455,10 +459,15 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"### Labeling"
|
"y_1 = [1,1,1,1]\n",
|
||||||
|
"y_2 = [0,1,1,1]\n",
|
||||||
|
"y_3 = [1,0,1,1]\n",
|
||||||
|
"y_4 = [1,1,0,0]"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -494,16 +503,6 @@
|
|||||||
" print(ready_data1[i].shape[0])"
|
" print(ready_data1[i].shape[0])"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"cell_type": "code",
|
|
||||||
"execution_count": null,
|
|
||||||
"metadata": {},
|
|
||||||
"outputs": [],
|
|
||||||
"source": [
|
|
||||||
"for i in range(len(y_data)):\n",
|
|
||||||
" print(ready_data2[i].shape[0])"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": null,
|
||||||
@@ -521,8 +520,7 @@
|
|||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"# len(y_data[0])\n",
|
"y_data"
|
||||||
"y_data[0]"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -806,6 +804,7 @@
|
|||||||
"\n",
|
"\n",
|
||||||
" # df1['s1'] = sensor1[sensor1.columns[-1]]\n",
|
" # df1['s1'] = sensor1[sensor1.columns[-1]]\n",
|
||||||
" # df1['s2'] = sensor2[sensor2.columns[-1]]\n",
|
" # df1['s2'] = sensor2[sensor2.columns[-1]]\n",
|
||||||
|
"ed\n",
|
||||||
" # # Combined Plot for sensor 1 and sensor 2 from data1 file in which motor is operated at 800 rpm\n",
|
" # # Combined Plot for sensor 1 and sensor 2 from data1 file in which motor is operated at 800 rpm\n",
|
||||||
"\n",
|
"\n",
|
||||||
" # plt.plot(df1['s2'], label='sensor 2')\n",
|
" # plt.plot(df1['s2'], label='sensor 2')\n",
|
||||||
@@ -835,19 +834,14 @@
|
|||||||
" # plt.show()"
|
" # plt.show()"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"cell_type": "markdown",
|
|
||||||
"metadata": {},
|
|
||||||
"source": [
|
|
||||||
"## Test with Outside of Its Training Data"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": null,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": []
|
"source": [
|
||||||
|
"spectograph('D:/thesis/data/converted/raw')"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"metadata": {
|
"metadata": {
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import pandas as pd
|
|||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
|
import numpy as np
|
||||||
from colorama import Fore, Style, init
|
from colorama import Fore, Style, init
|
||||||
from typing import TypedDict, Dict, List
|
from typing import TypedDict, Dict, List
|
||||||
from joblib import load
|
from joblib import load
|
||||||
@@ -225,25 +226,56 @@ class DataProcessor:
|
|||||||
"""
|
"""
|
||||||
idx = self._create_vector_column_index()
|
idx = self._create_vector_column_index()
|
||||||
# if overwrite:
|
# if overwrite:
|
||||||
for i in range(len(self.data)):
|
for i in range(len(self.data)): # damage(s)
|
||||||
for j in range(len(self.data[i])):
|
for j in range(len(self.data[i])): # col(s)
|
||||||
# Get the appropriate indices for slicing from idx
|
# Get the appropriate indices for slicing from idx
|
||||||
indices = idx[j]
|
indices = idx[j]
|
||||||
|
|
||||||
# Get the current DataFrame
|
# Get the current DataFrame
|
||||||
df = self.data[i][j]
|
df = self.data[i][j]
|
||||||
|
|
||||||
# Keep the 'Time' column and select only specified 'Real' columns
|
# Keep the 'Time' column and select only specifid 'Real' colmns
|
||||||
# First, we add 1 to all indices to account for 'Time' being at position 0
|
# First, we add 1 to all indices to acount for 'Time' being at positiion 0
|
||||||
real_indices = [index + 1 for index in indices]
|
real_indices = [index + 1 for index in indices]
|
||||||
|
|
||||||
# Create list with Time column index (0) and the adjusted Real indices
|
# Create list with Time column index (0) and the adjustedd Real indices
|
||||||
all_indices = [0] + [real_indices[0]] + [real_indices[-1]]
|
all_indices = [0] + [real_indices[0]] + [real_indices[-1]]
|
||||||
|
|
||||||
# Apply the slicing
|
# Apply the slicing
|
||||||
self.data[i][j] = df.iloc[:, all_indices]
|
self.data[i][j] = df.iloc[:, all_indices]
|
||||||
# TODO: if !overwrite:
|
# TODO: if !overwrite:
|
||||||
|
|
||||||
|
def export_to_csv(self, output_dir: str, file_prefix: str = "DAMAGE"):
|
||||||
|
"""
|
||||||
|
Export the processed data to CSV files in the required folder structure.
|
||||||
|
|
||||||
|
:param output_dir: Directory to save the CSV files.
|
||||||
|
:param file_prefix: Prefix for the output filenames.
|
||||||
|
"""
|
||||||
|
for group_idx, group in enumerate(self.data, start=1):
|
||||||
|
group_folder = os.path.join(output_dir, f"{file_prefix}_{group_idx}")
|
||||||
|
os.makedirs(group_folder, exist_ok=True)
|
||||||
|
for test_idx, df in enumerate(group, start=1):
|
||||||
|
# Ensure columns are named uniquely if duplicated
|
||||||
|
df = df.copy()
|
||||||
|
df.columns = ["Time", "Real_0", "Real_1"] # Rename
|
||||||
|
|
||||||
|
# Export first Real column
|
||||||
|
out1 = os.path.join(
|
||||||
|
group_folder, f"{file_prefix}_{group_idx}_TEST{test_idx}_01.csv"
|
||||||
|
)
|
||||||
|
df[["Time", "Real_0"]].rename(columns={"Real_0": "Real"}).to_csv(
|
||||||
|
out1, index=False
|
||||||
|
)
|
||||||
|
|
||||||
|
# Export last Real column
|
||||||
|
out2 = os.path.join(
|
||||||
|
group_folder, f"{file_prefix}_{group_idx}_TEST{test_idx}_02.csv"
|
||||||
|
)
|
||||||
|
df[["Time", "Real_1"]].rename(columns={"Real_1": "Real"}).to_csv(
|
||||||
|
out2, index=False
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def create_damage_files(base_path, output_base, prefix):
|
def create_damage_files(base_path, output_base, prefix):
|
||||||
# Initialize colorama
|
# Initialize colorama
|
||||||
|
|||||||
@@ -4,5 +4,22 @@ from joblib import dump, load
|
|||||||
# a = generate_damage_files_index(
|
# a = generate_damage_files_index(
|
||||||
# num_damage=6, file_index_start=1, col=5, base_path="D:/thesis/data/dataset_A"
|
# num_damage=6, file_index_start=1, col=5, base_path="D:/thesis/data/dataset_A"
|
||||||
# )
|
# )
|
||||||
# dump(DataProcessor(file_index=a), "D:/cache.joblib")
|
|
||||||
a = load("D:/cache.joblib")
|
b = generate_damage_files_index(
|
||||||
|
num_damage=6,
|
||||||
|
file_index_start=1,
|
||||||
|
col=5,
|
||||||
|
base_path="D:/thesis/data/dataset_B",
|
||||||
|
prefix="zzzBD",
|
||||||
|
)
|
||||||
|
# data_A = DataProcessor(file_index=a)
|
||||||
|
# # data.create_vector_column(overwrite=True)
|
||||||
|
# data_A.create_limited_sensor_vector_column(overwrite=True)
|
||||||
|
# data_A.export_to_csv("D:/thesis/data/converted/raw")
|
||||||
|
|
||||||
|
data_B = DataProcessor(file_index=b)
|
||||||
|
# data.create_vector_column(overwrite=True)
|
||||||
|
data_B.create_limited_sensor_vector_column(overwrite=True)
|
||||||
|
data_B.export_to_csv("D:/thesis/data/converted/raw_B")
|
||||||
|
# a = load("D:/cache.joblib")
|
||||||
|
# breakpoint()
|
||||||
|
|||||||
@@ -1,68 +1,25 @@
|
|||||||
\chapter{PENDAHULUAN}
|
\chapter{PENDAHULUAN}
|
||||||
|
|
||||||
\section{Latar Belakang}
|
\section{Latar Belakang}
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc consequat lectus dolor, a commodo odio suscipit nec. Aliquam posuere elit eget tellus dapibus, auctor ornare mi porttitor. Donec auctor aliquet nisl, quis convallis ligula rutrum id. Duis tortor ipsum, scelerisque vestibulum viverra eu, maximus vel mi. Nullam volutpat nunc et varius tempor. Vivamus convallis mi eros, aliquam semper dui tincidunt a. Morbi nunc dui, accumsan ac arcu nec, condimentum efficitur mauris. Etiam sed mauris semper, volutpat justo eu, placerat mauris. Suspendisse at erat eu arcu gravida mattis et id nunc. Aliquam malesuada magna odio, ac dictum erat vestibulum a. Mauris vel nisi sit amet elit tempor bibendum sit amet a velit. Morbi dignissim facilisis placerat.\par
|
||||||
|
|
||||||
\indent Monitor Kesehatan Struktur (\textit{Structural Health Monitoring} atau SHM) merupakan pendekatan penting untuk menjamin integritas dan keselamatan struktur teknik sipil secara berkelanjutan. Salah satu komponen struktural yang umum digunakan dalam penyambungan adalah sambungan baut (\textit{bolt joint}), yang dikenal karena kemudahan dalam perakitan dan penggunaan ulang. Namun demikian, sambungan berulir ini rentan mengalami kelonggaran akibat beban kejut atau getaran terus-menerus \parencite{chen2017}. Kelonggaran baut yang tidak terdeteksi sejak dini dapat menyebabkan kerusakan serius pada struktur, sehingga identifikasi dini terhadap kerusakan sambungan baut menjadi krusial dalam bidang teknik sipil, mesin, dan kedirgantaraan.
|
\begin{figure}
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.5\linewidth]{frontmatter/img/slice1.jpg}
|
||||||
|
\caption{Enter Caption}
|
||||||
|
\label{fig:enter-label}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
\indent Deteksi kelonggaran baut telah dilakukan melalui berbagai metode. Kelompok pertama adalah inspeksi \textit{in-situ}, seperti inspeksi visual atau penggunaan alat mekanis seperti kunci torsi dan palu. Meskipun sederhana dan murah, metode ini sulit untuk mendeteksi kerusakan pada tahap awal \parencite{j.h.park2015}. Metode palu lebih efektif dibanding visual untuk mendeteksi awal kelonggaran, tetapi akurasinya dapat terganggu oleh kebisingan lingkungan, serta memakan waktu bila diaplikasikan pada struktur dengan banyak sambungan seperti jembatan \parencite{j.h.park2015,wang2013}.
|
Pellentesque vel accumsan lorem, id vulputate metus. Nulla mollis orci ante, et euismod erat venenatis eget. Proin tempus lobortis feugiat. Fusce vitae sem quis lacus iaculis dignissim ut eget turpis. Vivamus ut nisl in enim porttitor fringilla vel et mauris. Mauris quis porttitor magna. Pellentesque molestie viverra arcu at tincidunt. Maecenas non elit arcu.\par
|
||||||
|
|
||||||
\indent Kelompok kedua menggunakan teknik berbasis penglihatan komputer seperti kamera dan pencitraan digital, termasuk deteksi rotasi kepala baut menggunakan CNN dan Faster R-CNN \parencite{zhang2020,zhao2019}. Meskipun teknik ini dapat mendeteksi kerusakan secara visual tanpa dipengaruhi oleh kebisingan akustik, tantangan tetap ada dalam hal penempatan kamera dan beban komputasi tinggi dari model deep learning, terutama dalam kondisi sempit seperti mesin kendaraan atau turbin.
|
Etiam feugiat enim sit amet tortor interdum lobortis. Curabitur elementum faucibus sapien. Morbi eget facilisis lorem. In sed suscipit metus. Etiam porttitor, libero sit amet sodales hendrerit, libero dolor hendrerit nulla, sed convallis risus leo posuere metus. Cras gravida ac elit viverra ultrices. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Maecenas dictum urna elit, nec eleifend nulla mattis sit amet. Pellentesque suscipit metus vitae leo suscipit, a vehicula quam pretium. Sed eu est ut risus convallis hendrerit a vulputate justo. Nulla sollicitudin quam ut risus euismod, quis consequat dui mattis. Mauris id eros varius, pellentesque quam quis, venenatis tellus. Nulla vitae condimentum nisl. Vestibulum suscipit scelerisque dui, non posuere purus finibus nec. Nulla ultrices felis quis vestibulum porta. Suspendisse potenti.\par
|
||||||
|
|
||||||
\indent Kelompok ketiga dan yang menjadi fokus penelitian ini adalah teknik berbasis sensor, terutama pendekatan berbasis getaran (\textit{vibration-based}). Metode ini tidak hanya efektif dalam mengatasi keterbatasan teknik sebelumnya, tetapi juga mampu mendeteksi kelonggaran baut pada tahap awal secara andal dan akurat \parencite{nichols2004,razi2013}. Dalam penelitian ini, deteksi dilakukan melalui data akselerasi struktur yang diambil dari titik-titik sambungan dalam \textit{sistem grid} yang mewakili koneksi baut secara arah kolom.
|
Nam tempus tincidunt interdum. Pellentesque at ligula ac massa semper efficitur vitae non ante. Suspendisse potenti. Cras vitae interdum erat, nec facilisis urna. Nulla commodo porttitor tellus non posuere. Vestibulum tristique ut urna quis porttitor. Sed pellentesque lectus sit amet ultrices aliquam. Aliquam erat volutpat. Nam dictum eu erat a mollis. Donec eget nulla vel risus aliquet suscipit sed at libero.\par
|
||||||
|
|
||||||
\indent Pada penelitian sebelumnya oleh \textcite{abdeljaber2017}, deteksi kerusakan struktur menggunakan 1-D Convolutional Neural Network (1-D CNN) telah diterapkan secara efektif pada struktur grid dengan 30 titik sensor. Namun, keterbatasan tetap muncul dalam hal kebutuhan sumber daya komputasi yang tinggi ketika memproses data mentah berdimensi besar dari semua sensor secara simultan \parencite{yang2020, liu2022}. Beberapa studi menyarankan bahwa transformasi sinyal seperti STFT dapat digunakan sebagai alternatif ekstraksi fitur sebelum dilakukan klasifikasi \parencite{shahid2022}. Pendekatan ini tidak hanya mengurangi kompleksitas perhitungan tetapi juga dapat mempertahankan karakteristik penting dari sinyal yang tereduksi.
|
|
||||||
|
|
||||||
\indent Oleh karena itu, penelitian ini mengadopsi pendekatan pengurangan jumlah sensor menjadi hanya dua per jalur kolom (atas dan bawah), merepresentasikan sambungan vertikal seperti susunan baut, dengan tujuan menyederhanakan model tanpa kehilangan akurasi deteksi kerusakan. Data diproses melalui transformasi STFT sebelum diklasifikasikan menggunakan model algoritma pembelajaran mesin klasik. Dengan mengevaluasi berbagai pengklasifikasi dan validasi silang antar kolom, studi ini berkontribusi dalam menciptakan sistem SHM yang efisien, rendah biaya, dan mudah diimplementasikan.
|
|
||||||
|
|
||||||
|
|
||||||
\section{Rumusan Masalah}
|
|
||||||
Untuk memandu arah penelitian ini, beberapa permasalahan utama yang akan dibahas adalah sebagai berikut:
|
|
||||||
|
|
||||||
\begin{enumerate}
|
Maecenas hendrerit pharetra bibendum. Donec ut tortor ac augue aliquam ullamcorper nec id eros. Quisque consectetur elementum ipsum vitae posuere. Sed ultricies ipsum nibh, vitae volutpat neque bibendum at. Morbi dictum metus eu bibendum malesuada. Nam scelerisque purus erat, id dictum nisl pretium vitae. Curabitur finibus commodo dui ac molestie. In sed sem ac dui dapibus ullamcorper. Aenean molestie nulla eu lorem maximus hendrerit. Vivamus viverra velit dolor, in vehicula eros facilisis at. Vivamus in rhoncus sem.
|
||||||
\item Apakah sinyal getaran yang hanya diperoleh dari sensor pada bagian atas dan bawah suatu jalur kolom masih mampu merepresentasikan fitur-fitur penting yang diperlukan untuk mengklasifikasikan kerusakan struktur secara akurat?
|
|
||||||
|
|
||||||
\item Apakah penggabungan data dari beberapa jalur kolom dapat meningkatkan kemampuan generalisasi model, meskipun jumlah sensor pada tiap jalur dibatasi?
|
|
||||||
|
|
||||||
\item Apakah algoritma machine learning klasik yang sederhana masih mampu menghasilkan model dengan kinerja yang cukup layak dibandingkan dengan model \textit{supervised} yang lebih kompleks ketika diterapkan pada skenario dengan input data sensor yang terbatas?
|
|
||||||
\end{enumerate}
|
|
||||||
% \section{Identifikasi Masalah}
|
|
||||||
% \begin{itemize}
|
|
||||||
% \item Kebanyakan kerangka kerja pada monitoring kesehatan struktur membutuhkan deretan sensor yang banyak, hal ini dibutuhkan biaya yang tinggi dan kurang praktikal untuk banyak pengaplikasian.
|
|
||||||
|
|
||||||
% \item Banyak model dengan performa tinggi bergantung pada teknik pemelajaran mendalam, sehingga dibutuhkan sumberdaya komputasi yang tinggi dan memungkinkan kurangnya kemudahan dan keterjangkauan untuk aplikasikan.
|
|
||||||
|
|
||||||
% \item Kurangnya kesederhanaan, pendeketan umum yang menyeimbangkan penggunaan sensor dengan keandalan dalam lokalisasi kerusakan.
|
|
||||||
% \end{itemize}
|
|
||||||
\section{Lingkup Penelitian}
|
\section{Lingkup Penelitian}
|
||||||
Studi ini berfokus pada dataset yang tersedia secara publik didapat dari Queen's University Grandstand Simulator (QUGS), sebuah kerangka besi level laboratorium yang dipasang dengan tiga puluh titik sensor akselerometer dan \textit{white shaker noise}. Riset terdahulu telah dilakukan pengaplikasian pemelajaran mesin jaringan saraf terhadap seluruh sensor yang terpasang penuh pada setiap titik \textit{joint} untuk mencapai akurasi yang tinggi. Akan tetapi, pada praktiknya, instrumentasi penuh seperti ini terkadang kurang efektif dari segi biaya dan kurang layak dalam skala besar.
|
|
||||||
|
|
||||||
\section{Tujuan Penelitian}
|
\section{Tujuan Penelitian}
|
||||||
\begin{enumerate}
|
|
||||||
\item Mengembangkan alur sistem (\textit{pipeline}) pemantauan kesehatan struktur (Structural Health Monitoring/SHM) yang disederhanakan dengan hanya menggunakan sepasang sensor di ujung-ujung struktur.
|
|
||||||
|
|
||||||
% \item Memperlakukan setiap grup kolom sensor sebagai elemen balok satu dimensi yang disederhanakan, dan mengevaluasi apakah karakteristik kerusakan tetap terjaga dalam energi getaran yang ditransmisikan antara kedua ujungnya.
|
|
||||||
|
|
||||||
% \item Menyusun setiap grup kolom sebagai satu dataset terpisah dan melakukan lima pengujian berbeda, di mana masing-masing grup kolom berperan sebagai data validasi secara bergantian.
|
|
||||||
|
|
||||||
% \item Menyertakan data dari setiap grup kolom ke dalam data pelatihan untuk membentuk satu model umum yang dapat digunakan untuk seluruh grup kolom.
|
|
||||||
|
|
||||||
\item Mengeksplorasi kemungkinan generalisasi satu model terhadap berbagai jalur kolom hanya dengan memanfaatkan data dari sensor pada kedua ujung kolom.
|
|
||||||
\end{enumerate}
|
|
||||||
|
|
||||||
% Dalam merespon hal tersebut, penelitian ini memperkenalkan pendekatan baru yang menekankan efisiensi pada penanganan data dan interpretasi fisik. Data pada sensor-sensor yang terpasang pada struktur grid ini dikelompokkan menjadi beberapa grup kolom, dan hanya menyisakan sensor awal dan sensor paling akhir dari setiap grup sensor sebagai input pengklasifikasian. Terdapat hipotesis bahwa energi getaran bergerak di sepanjang jalur kolom terjaga secara cukup baik antara ujung-ujung sensor untuk memungkinkan algoritma pemelajaran mesin, seperti Support-Vector Machine (SVM), Bagged Trees, Random Forest, Decision Tree, KNN, LDA, dan XGBoost, medeteksi dan mengklasifikasi secara akurat letak kerusakan.
|
|
||||||
|
|
||||||
\section{Manfaat Penelitian}
|
\section{Manfaat Penelitian}
|
||||||
|
% \subsubsection{Dolor}
|
||||||
Penelitian ini memberikan beberapa manfaat yang diharapkan dapat berkontribusi dalam pengembangan sistem deteksi kerusakan struktur, antara lain:
|
|
||||||
|
|
||||||
\begin{enumerate}
|
|
||||||
\item Penelitian ini tidak berfokus pada pengembangan arsitektur model baru maupun penerapan \textit{transfer learning}, melainkan pada perancangan alur (\textit{pipeline}) klasifikasi yang sederhana dan mudah dipahami sebagai solusi tahap awal untuk pengembangan sistem monitor kesehatan struktur.
|
|
||||||
|
|
||||||
\item Dengan pemilihan titik sensor strategis yang terbatas (hanya di ujung atas dan bawah jalur kolom \textit{grid}) serta prapemrosesan berbasis transformasi STFT, penelitian ini menunjukkan bahwa efisiensi dapat dicapai tanpa mengorbankan akurasi secara signifikan.
|
|
||||||
|
|
||||||
\item Studi ini membuktikan bahwa algoritma pembelajaran mesin klasik seperti SVM, KNN, dan LDA masih mampu memberikan performa model yang kompetitif dalam klasifikasi kerusakan, apabila dipadukan dengan ekstraksi fitur yang tepat.
|
|
||||||
|
|
||||||
\item Hasil penelitian ini diharapkan dapat menjadi alternatif sistem SHM yang lebih terjangkau dan praktis untuk diterapkan pada struktur nyata, khususnya dalam kondisi keterbatasan sumber daya.
|
|
||||||
|
|
||||||
\item Rangkaian eksperimen dan pendekatan sistematis dalam penelitian ini dapat dijadikan tolok ukur atau \textit{baseline} untuk studi komparatif selanjutnya dan pengembangan model arsitektur yang lebih kompleks.
|
|
||||||
\end{enumerate}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
Monitor Kesehatan Struktur (SHM) merupakan aspek penting dalam melakukan pemeliharaan keamanan dan kelayakan operasional pada struktur. Dari berbagai macam strategi SHM, metode berbasis getaran sudah menjadi opsi paling banyak dijumpai karena kemampuannya untuk mendeteksi perubahan struktur internal secara non-invasif. Penemuan baru-baru ini pada pemelajaran mesin (\textit{machine learning}) telah memberi wawasan luas pada penggunaan model pemelajaran mendalam (\textit{deep learning}), seperti satu dimensi jaringan saraf konvolusional (1-D CNN), untuk deteksi lokalisasi kerusakan. Model-model ini biasanya memebutuhkan data dari susunan sensor penuh dan dataset latih besar. Hal ini terkadang membuat metode tersebut membutuhkan komputasi yang intensif dan kurang memungkinkan untuk diaplikasikan pada sumber daya yang terbatas. (Need more past research)
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
\chapter{PENDAHULUAN}
|
|
||||||
|
|
||||||
\input{background}
|
|
||||||
\input{key_issue}
|
|
||||||
\input{scope}
|
|
||||||
\input{purpose}
|
|
||||||
\input{novelty}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
\section{Rumusan Masalah}
|
|
||||||
Untuk memandu arah penelitian ini, beberapa permasalahan utama yang akan dibahas adalah sebagai berikut:
|
|
||||||
|
|
||||||
\begin{enumerate}
|
|
||||||
\item Apakah sinyal getaran yang hanya diperoleh dari sensor pada bagian atas dan bawah suatu jalur kolom masih mampu merepresentasikan fitur-fitur penting yang diperlukan untuk mengklasifikasikan kerusakan struktur secara akurat?
|
|
||||||
|
|
||||||
\item Apakah penggabungan data dari beberapa jalur kolom dapat meningkatkan kemampuan generalisasi model, meskipun jumlah sensor pada tiap jalur dibatasi?
|
|
||||||
|
|
||||||
\item Apakah algoritma machine learning klasik yang sederhana masih mampu memberikan kinerja yang kompetitif dibandingkan dengan model yang lebih kompleks ketika diterapkan pada skenario dengan input data sensor yang terbatas?
|
|
||||||
\end{enumerate}
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
\section{Manfaat Penelitian}
|
|
||||||
Kontribusi utama dalam penelitian ini bukan untuk mengenalkan model arsitektur baru atau pembuatan kerangka kerja untuk \textit{transfer learning}, melainkan pembuatan saluran pipa klasifikasi yang mudah digunakan dan dipahami pada tahap awal. Saluran pipa ini mendemonstrasikan bahwa dengan pemilihan titik sensor yang tepat dan prapemrosesan yang baik, algoritma klasik masih mmampu memberi akurasi yang tinggi pada lokalisasi kerusakan dengan menyeimbangkan antara kesederhanaan, efisiensi, dan performa. Hasil dari penelitian ini diharapkan dapat bermanfaat sebagai sistem monitor kesehatan struktur rendah biaya dan tolok ukur untuk studi komparatif selanjutnya yang melibatkan model arsitektur kompleks.
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
\section{Tujuan Penelitian}
|
|
||||||
\begin{enumerate}
|
|
||||||
\item Mengembangkan alur sistem pemantauan kesehatan struktur (Structural Health Monitoring/SHM) yang disederhanakan dengan hanya menggunakan sepasang sensor (bagian atas dan bawah) dari grup kolom sensor (contoh: kolom (1,6,11,16,21,26)).
|
|
||||||
|
|
||||||
\item Memperlakukan setiap grup kolom sensor sebagai elemen balok satu dimensi yang disederhanakan, dan mengevaluasi apakah karakteristik kerusakan tetap terjaga dalam energi getaran yang ditransmisikan antara kedua ujungnya.
|
|
||||||
|
|
||||||
\item Menyusun setiap grup kolom sebagai satu dataset terpisah dan melakukan lima pengujian berbeda, di mana masing-masing grup kolom berperan sebagai data validasi secara bergantian.
|
|
||||||
|
|
||||||
\item Menyertakan data dari setiap grup kolom ke dalam data pelatihan untuk membentuk satu model umum yang dapat digunakan untuk seluruh grup kolom.
|
|
||||||
|
|
||||||
\item Mengeksplorasi kemungkinan generalisasi satu model terhadap berbagai jalur kolom hanya dengan memanfaatkan data dari sensor pada kedua ujung kolom.
|
|
||||||
\end{enumerate}
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
\section{Lingkup Penelitian}
|
|
||||||
Studi ini berfokus pada dataset yang tersedia secara publik didapat dari Queen's University Grandstand Simulator (QUGS), sebuah kerangka besi level laboratorium yang dipasang dengan tiga puluh titik sensor akselerometer. Riset terdahulu telah dilakukan pengaplikasian \textit{deep learning} terhadap seluruh sensor yang terpasang penuh pada setiap titik joint untuk mencapai akurasi yang tinggi. Akan tetapi, pada praktiknya, instrumentasi penuh seperti ini terkadang tidak efektif dari segi biaya dan tidak layak secara logis.
|
|
||||||
151
latex/chapters/id/03_methodology/data_analysis/index.tex
Normal file
151
latex/chapters/id/03_methodology/data_analysis/index.tex
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
\section{Analisis Data}
|
||||||
|
\subsection{Grid, Kode \textit{Joint}, dan Nama File}
|
||||||
|
|
||||||
|
% \begin{figure}[ht]
|
||||||
|
% \centering
|
||||||
|
% \input{chapters/img/specimen}
|
||||||
|
% \caption{Caption}
|
||||||
|
% \label{fig:enter-label}
|
||||||
|
% \end{figure}
|
||||||
|
% Dimulai dengan memberi indeks pada setiap node pengukuran dari struktur grid berukuran 6$\times$5 menggunakan sebuah bilangan bulat tunggal \(k\) dari nol hingga dua puluh sembilan. Setiap sinyal domain waktu mentah disimpan dalam file yang dinamai berdasarkan indeks ini:
|
||||||
|
% \begin{equation*}
|
||||||
|
% F_{k} = \texttt{``zzzAD}k\texttt{.TXT,''}
|
||||||
|
% \quad k = 0,1,\dots,29.
|
||||||
|
% \end{equation*}
|
||||||
|
|
||||||
|
Direpresentasikan \(F_{k}\) di sini sebagai nama file untuk \textit{node} ke-\(k\). Kemudian dilampirkan nama file tersebut sebagai superskrip pada simbol \textit{node}:
|
||||||
|
\begin{equation*}
|
||||||
|
n_{k}^{F_{k}}
|
||||||
|
\quad\text{adalah \textit{node} dengan indeks }k\text{ yang datanya diambil dari \textit{file} }F_{k}.
|
||||||
|
\end{equation*}
|
||||||
|
|
||||||
|
\subsection{Pemetaan Sensor}
|
||||||
|
|
||||||
|
Semua tiga puluh node dikelompokkan ke dalam enam folder ``damage-case``, dilabeli \(d_{i}\) untuk \(i=0,\dots,5\). Setiap folder berisi tepat lima node berurutan, yang merepresentasikan satu skenario kerusakan:
|
||||||
|
\begin{equation*}
|
||||||
|
d_{i} = \bigl\{\,n_{5i}^{F_{5i}},\;n_{5i+1}^{F_{5i+1}},\;\dots,\;n_{5i+4}^{F_{5i+4}}\bigr\},
|
||||||
|
\quad i = 0,\dots,5.
|
||||||
|
\end{equation*}
|
||||||
|
Atau secara konkrit,
|
||||||
|
\begin{align*}
|
||||||
|
d_0&=\{n_{0}^{F_0},\;n_{1}^{F_1},\;n_{2}^{F_2},\;n_{3}^{F_3},\;n_{4}^{F_4}\}\\
|
||||||
|
d_1&=\{n_{5}^{F_5},\;n_{6}^{F_6},\;n_{7}^{F_7},\;n_{8}^{F_8},\;n_{9}^{F_9}\}\\
|
||||||
|
\;\;\vdots\\
|
||||||
|
d_5&=\{n_{25}^{F_{25}},\;n_{26}^{F_{26}},\;n_{27}^{F_{27}},\;n_{28}^{F_{28}},\;n_{29}^{F_{29}}\}\\
|
||||||
|
\end{align*}
|
||||||
|
|
||||||
|
\subsection{Seleksi Sensor \textit{Node} Ujung-Ujung (Domain Waktu)}
|
||||||
|
|
||||||
|
Dari setiap folder kerusakan, kita hanya menyimpan \textit{node} pertama dan terakhir untuk mensimulasikan tata letak sensor terbatas. Subset domain waktu ini dilambangkan dengan \(d_{i}^{\mathrm{TD}}\):
|
||||||
|
\begin{equation*}
|
||||||
|
d_{i}^{\mathrm{TD}}
|
||||||
|
= \bigl\{\,n_{5i}^{F_{5i}},\;n_{5i+4}^{F_{5i+4}}\bigr\},
|
||||||
|
\quad |d_{i}^{\mathrm{TD}}| = 2.
|
||||||
|
\end{equation*}
|
||||||
|
|
||||||
|
\subsection{Ekstraksi Fitur}
|
||||||
|
|
||||||
|
Kemudian, didefinisikan operator STFT \(\mathcal{T}\) untuk memetakan sinyal domain waktu mentah dengan panjang \(L=262144\) sampel menjadi sebuah spektrogram berukuran \(513\times513\). Kemudian digunakan \textit{Hanning window} dengan panjang \(N_{w}=1024\) dan hop size \(N_{h}=512\). Bentuk kompleks dari STFT adalah:
|
||||||
|
\begin{equation*}
|
||||||
|
\begin{aligned}
|
||||||
|
\text{(1) Window function:}\quad
|
||||||
|
w[n] &= \frac12\Bigl(1 - \cos\frac{2\pi n}{N_w - 1}\Bigr),
|
||||||
|
\quad n=0,\ldots,N_w-1; \\[1ex]
|
||||||
|
\text{(2) STFT:}\quad
|
||||||
|
S_k(p,t)
|
||||||
|
&= \sum_{n=0}^{N_w-1}
|
||||||
|
x_k\bigl[t\,N_h + n\bigr]
|
||||||
|
\;w[n]\;
|
||||||
|
e^{-j2\pi p n / N_w},\\
|
||||||
|
&\quad
|
||||||
|
p = 0,\ldots,512,\quad t = 0,\ldots,512.
|
||||||
|
\end{aligned}
|
||||||
|
\end{equation*}
|
||||||
|
|
||||||
|
Pengambilan magnitudo menghasilkan matriks spektrogram pada bilah frekuensi $p$ dan \textit{frame} waktu $t$ untuk \textit{node} $k$
|
||||||
|
\begin{equation*}
|
||||||
|
\widetilde n_{k}^{F_{k}}(p,t) \;=\; \bigl|S_{k}(p,t)\bigr|
|
||||||
|
\;\in\;\mathbb{R}^{513\times513}.
|
||||||
|
\end{equation*}
|
||||||
|
Dengan demikian operatornya adalah
|
||||||
|
\begin{equation*}
|
||||||
|
\mathcal{T}:\; n_{k}^{F_{k}}\in\mathbb{R}^{262144}
|
||||||
|
\;\longmapsto\;
|
||||||
|
\widetilde n_{k}^{F_{k}}\in\mathbb{R}^{513\times513}.
|
||||||
|
\end{equation*}
|
||||||
|
|
||||||
|
\subsection{Subset Domain Frekuensi}
|
||||||
|
|
||||||
|
Kemudian, \(\mathcal{T}\) diterapkan pada \textit{node} ujung-ujung yang telah dipilih, dihasilkan:
|
||||||
|
\begin{equation*}
|
||||||
|
d_{i}^{\mathrm{FD}}
|
||||||
|
= \bigl\{\,
|
||||||
|
\widetilde n_{5i}^{F_{5i}},\;
|
||||||
|
\widetilde n_{5i+4}^{F_{5i+4}}
|
||||||
|
\,\bigr\},
|
||||||
|
\quad
|
||||||
|
|d_{i}^{\mathrm{FD}}| = 2.
|
||||||
|
\end{equation*}
|
||||||
|
|
||||||
|
\subsection{Pengelompokan Berdasarkan Letak Ujung Sensor}
|
||||||
|
|
||||||
|
Sensor-sensor ujung bagian bawah dilabeli sebagai Sensor A dan Sensor-sensor ujung bagian atas dilabeli sebagai Sensor B. Semua enam kasus kerusakan dikumpulkan menjadi satu menghasilkan dua himpunan spektrogram, masing-masing berisi enam (kasus kerusakan):
|
||||||
|
\begin{equation*}
|
||||||
|
\text{Sensor A}
|
||||||
|
=
|
||||||
|
\bigl\{\,
|
||||||
|
\widetilde n_{0}^{F_{0}},\,
|
||||||
|
\widetilde n_{5}^{F_{5}},\,
|
||||||
|
\dots,\,
|
||||||
|
\widetilde n_{25}^{F_{25}}
|
||||||
|
\bigr\},
|
||||||
|
\quad
|
||||||
|
\text{Sensor B}
|
||||||
|
=
|
||||||
|
\bigl\{\,
|
||||||
|
\widetilde n_{4}^{F_{4}},\,
|
||||||
|
\widetilde n_{9}^{F_{9}},\,
|
||||||
|
\dots,\,
|
||||||
|
\widetilde n_{29}^{F_{29}}
|
||||||
|
\bigr\}.
|
||||||
|
\end{equation*}
|
||||||
|
|
||||||
|
\subsection{Perakitan Baris dan Pelabelan}
|
||||||
|
|
||||||
|
Setiap spektrogram berukuran \(513\times513\) diartikan sebagai 513 vektor fitur berdimensi 513. Kemudian diberikan indeks pengulangan dalam satu kasus kerusakan dengan \(r\in\{0,\dots,4\}\) dan potongan waktu dengan \(t\in\{0,\dots,512\}\). Misalkan
|
||||||
|
\begin{equation*}
|
||||||
|
\mathbf{x}_{i,s,r,t}\in\mathbb{R}^{513}
|
||||||
|
\end{equation*}
|
||||||
|
menunjukkan baris (atau kolom) ke-\(t\) dari spektrogram ke-\(r\) untuk kasus kerusakan \(i\) dan sensor \(s\). Label skalar untuk kasus kerusakan tersebut adalah
|
||||||
|
\begin{equation*}
|
||||||
|
y_{i} = i,\quad i=0,\dots,5.
|
||||||
|
\end{equation*}
|
||||||
|
Kemudian didefinisikan fungsi \textit{slicing} sebagai
|
||||||
|
\begin{equation*}
|
||||||
|
\Lambda(i,s,r,t)
|
||||||
|
\;=\;
|
||||||
|
\bigl[\,
|
||||||
|
\mathbf{x}_{i,s,r,t},
|
||||||
|
\;y_{i}
|
||||||
|
\bigr]
|
||||||
|
\;\in\;\mathbb{R}^{513+1}.
|
||||||
|
\end{equation*}
|
||||||
|
|
||||||
|
\subsection{Bentuk Akhir Data untuk Pelatihan}
|
||||||
|
|
||||||
|
Seluruh baris dari enam kasus kerusakan, lima pengulangan, dan 513 potongan waktu dikumpulkan menghasilkan \textit{dataset} untuk satu sisi sensor:
|
||||||
|
\begin{equation*}
|
||||||
|
\mathcal{D}^{(s)}
|
||||||
|
=
|
||||||
|
\bigl\{
|
||||||
|
\Lambda(i,s,r,t)
|
||||||
|
\;\big|\;
|
||||||
|
i=0,\dots,5,\;
|
||||||
|
r=0,\dots,4,\;
|
||||||
|
t=0,\dots,512
|
||||||
|
\bigr\}.
|
||||||
|
\end{equation*}
|
||||||
|
Karena terdapat total \(6\times5\times513=15{,}390\) baris dan setiap baris memiliki \(513\) fitur ditambah satu kolom label, maka bentuk akhir dari data untuk satu sisi sensor yang siap digunakan untuk pelatihan adalah
|
||||||
|
\begin{equation*}
|
||||||
|
|\mathcal{D}^{(s)}| = 15\,390 \times 514.
|
||||||
|
\end{equation*}
|
||||||
7
latex/chapters/id/03_methodology/index.tex
Normal file
7
latex/chapters/id/03_methodology/index.tex
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
\chapter{METODE PENELITIAN}
|
||||||
|
|
||||||
|
\input{chapters/id/03_methodology/material/index}
|
||||||
|
\input{chapters/id/03_methodology/tool/index}
|
||||||
|
\clearpage
|
||||||
|
\input{chapters/id/03_methodology/steps/index}
|
||||||
|
\input{chapters/id/03_methodology/data_analysis/index}
|
||||||
26
latex/chapters/id/03_methodology/material/index.tex
Normal file
26
latex/chapters/id/03_methodology/material/index.tex
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
\section{Benda Uji}
|
||||||
|
|
||||||
|
Penelitian ini menggunakan data sekunder dari \textcite{abdeljaber2017}, yang tersedia secara publik dan diperoleh melalui eksperimen menggunakan \textit{Queen's University Grandstand Simulator}. Adapun rincian data yang digunakan adalah sebagai berikut:
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\item Dataset terdiri atas rekaman respons getaran dari struktur rangka baja berukuran $6 \times 5$ yang dilengkapi dengan 30 akselerometer.
|
||||||
|
\item Setiap skenario dalam dataset mencakup satu kasus struktur tanpa kerusakan (healthy) dan 30 kasus kerusakan tunggal pada masing-masing sambungan (\textit{single-joint damage}).
|
||||||
|
\item Sinyal getaran direkam dengan frekuensi pengambilan sampel sebesar 1024 Hz selama durasi 256 detik untuk tiap skenario.
|
||||||
|
\item Kerusakan struktur disimulasikan dengan cara mengendurkan baut pada sambungan-sambungan tertentu.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
Struktur dataset yang digunakan ditampilkan pada Gambar~\ref{fig:specimen-photo}.
|
||||||
|
|
||||||
|
% \begin{figure}[!ht]
|
||||||
|
% \centering
|
||||||
|
% \includegraphics[width=0.5\textwidth]{chapters/img/original_data.png}
|
||||||
|
% \caption{Overview of the original data used from Abdeljaber et al. (2017)}
|
||||||
|
% \label{fig:original-data}
|
||||||
|
% \end{figure}
|
||||||
|
|
||||||
|
\begin{figure}[ht]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.75\linewidth]{chapters/img/specimen.png}
|
||||||
|
\caption{Bentuk benda uji}
|
||||||
|
\label{fig:specimen-photo}
|
||||||
|
\end{figure}
|
||||||
33
latex/chapters/id/03_methodology/steps/data_acquisition.tex
Normal file
33
latex/chapters/id/03_methodology/steps/data_acquisition.tex
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
Dataset yang digunakan dalam penelitian ini bersumber dari basis data getaran yang dipublikasi oleh \textcite{abdeljaber2017}.
|
||||||
|
|
||||||
|
Dataset terdiri dari dua folder:
|
||||||
|
\begin{itemize}
|
||||||
|
\item \texttt{Dataset A/} – biasanya digunakan untuk pelatihan (training)
|
||||||
|
\item \texttt{Dataset B/} – biasanya digunakan untuk pengujian (testing)
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
Setiap folder berisi 31 berkas dalam format \texttt{.TXT}, yang dinamai sesuai dengan kondisi kerusakan struktur. Pola penamaan berkas adalah sebagai berikut:
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\item \texttt{zzzAU.TXT}, \texttt{zzzBU.TXT} — struktur tanpa kerusakan (sehat)
|
||||||
|
\item \texttt{zzzAD1.TXT}, \texttt{zzzAD2.TXT}, ..., \texttt{zzzAD30.TXT} — Dataset A, kerusakan pada sambungan 1–30
|
||||||
|
\item \texttt{zzzBD1.TXT}, \texttt{zzzBD2.TXT}, ..., \texttt{zzzBD30.TXT} — Dataset B, kerusakan pada sambungan 1–30
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
Sepuluh baris pertama dari setiap berkas berisi metadata yang menjelaskan konfigurasi pengujian, laju sampling, dan informasi kanal. Oleh karena itu, data deret waktu percepatan dimulai dari baris ke-11 yang berisi 31 kolom:
|
||||||
|
\begin{itemize}
|
||||||
|
\item \textbf{Kolom 1:} Waktu dalam detik
|
||||||
|
\item \textbf{Kolom 2–31:} Magnitudo percepatan dari \textit{joint} 1 hingga 30
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
Setiap sinyal di-\textit{sampling} pada frekuensi $f_s = 1024$ Hz dan direkam selama durasi total $T = 256$ detik, sehingga menghasilkan:
|
||||||
|
|
||||||
|
\begin{equation*}
|
||||||
|
N = f_s \cdot T = 1024 \times 256 = 262{,}144 \quad \text{sampel per kanal}
|
||||||
|
\end{equation*}
|
||||||
|
|
||||||
|
Dengan demikian, setiap berkas dapat direpresentasikan sebagai matriks:
|
||||||
|
\begin{equation*}
|
||||||
|
\mathbf{X}^{(c)} \in \mathbb{R}^{262{,}144 \times 31}, \quad c = 0, 1, \dots, 30
|
||||||
|
\end{equation*}
|
||||||
|
di mana $c$ mengacu pada indeks kasus (0 = sehat, 1–30 = kerusakan pada \textit{joint}n ke-$c$), dan setiap baris merepresentasikan pengukuran berdasarkan waktu di seluruh 30 kanal sensor.
|
||||||
29
latex/chapters/id/03_methodology/steps/index.tex
Normal file
29
latex/chapters/id/03_methodology/steps/index.tex
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
\section{Tahapan Penelitian}
|
||||||
|
Alur keseluruhan penelitian ini dilakukan melalui tahapan-tahapan sebagai berikut:
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.3\linewidth]{chapters/id/flow.png}
|
||||||
|
\caption{Diagram alir tahapan penelitian}
|
||||||
|
\label{fig:flowchart}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\begin{enumerate}
|
||||||
|
\item \textbf{Akuisisi Data:} Mengunduh dataset dari \textcite{abdeljaber2017} yang berisi sinyal percepatan untuk 31 kondisi struktur (1 kondisi sehat dan 30 kondisi kerusakan tunggal).
|
||||||
|
|
||||||
|
% \item \textbf{Seleksi Sensor:} Memilih sinyal dari sejumlah sensor terbatas pada garis vertikal tertentu (misalnya, node 1 dan 26) untuk mensimulasikan konfigurasi sensor yang direduksi.
|
||||||
|
|
||||||
|
\item \textbf{Pra-pemrosesan:} Melakukan normalisasi dan mengubah sinyal domain waktu mentah menjadi domain waktu-frekuensi menggunakan metode Short-Time Fourier Transform (STFT).
|
||||||
|
|
||||||
|
\item \textbf{Ekstraksi Fitur:} Menghasilkan \textit{data frame} frekuensi dalam domain waktu.
|
||||||
|
|
||||||
|
\item \textbf{Pengembangan Model:} Membangun dan melatih model klasifikasi berbasis algoritma pemelajaran mesin klasik (SVM, LDA, Bagged Trees, Random Forest, XGBoost) untuk mengklasifikasikan lokasi kerusakan struktur.
|
||||||
|
|
||||||
|
\item \textbf{Evaluasi:} Mengevaluasi kinerja model menggunakan metrik akurasi, presisi, dan confusion matrix pada berbagai skenario pengujian.
|
||||||
|
\end{enumerate}
|
||||||
|
|
||||||
|
\subsection{Akuisisi Data}
|
||||||
|
\input{chapters/id/03_methodology/steps/data_acquisition}
|
||||||
|
|
||||||
|
% \subsection{Prapemrosesan Data dan Ekstraksi Fitur}
|
||||||
|
|
||||||
39
latex/chapters/id/03_methodology/tool/hardware.tex
Normal file
39
latex/chapters/id/03_methodology/tool/hardware.tex
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
Data getaran struktur yang digunakan dalam penelitian ini diperoleh dari penelitian oleh \textcite{abdeljaber2017}, yang dilakukan menggunakan simulator struktur baja Grandstand di Queen’s University. Dalam eksperimen tersebut, struktur baja dipasang dengan akselerometer pada setiap sambungan-sambungan (\textit{joints}). Rangkaian perangkat keras yang digunakan untuk pengambilan data meliputi:
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\item \textbf{27 akselerometer PCB model 393B04} (Gambar~\ref{fig:pcb393}) untuk merekam respons percepatan pada sebagian besar titik pengukuran.
|
||||||
|
\item \textbf{3 akselerometer B\&K model 8344} (Gambar~\ref{fig:bk8344}) digunakan pada beberapa lokasi untuk validasi tambahan.
|
||||||
|
\item \textbf{Mounting magnetic PCB model 080A121} digunakan untuk menempelkan akselerometer secara aman pada struktur baja.
|
||||||
|
\item \textbf{Modal shaker (Model 2100E11)} digunakan untuk memberikan eksitasi getaran terkontrol pada struktur (Gambar~\ref{fig:shaker}). Sinyal input untuk shaker dihasilkan melalui \textbf{penguat daya SmartAmp 2100E21-400}.
|
||||||
|
\item \textbf{Dua perangkat akuisisi data 16-kanal (DT9857E-16)} digunakan secara simultan: satu untuk menghasilkan sinyal input ke shaker dan satu lagi untuk merekam data keluaran dari akselerometer (Gambar~\ref{fig:datalogger}).
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
Seluruh perangkat ini memungkinkan pengambilan data getaran dengan fidelitas tinggi, dengan laju pengambilan sampel sebesar 1024 Hz per kanal selama 256 detik untuk setiap skenario pengujian.
|
||||||
|
|
||||||
|
Adapun sumberdaya komputasi yang digunakan untuk pemrosesan semua data dan pemodelan pada skripsi ini, yaitu:
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\item \textbf{\textit{Processor}:} Intel Core i7 11th-gen @ 2.8 GHz
|
||||||
|
\item \textbf{RAM:} 2$\times$8 GB LPDDR4X
|
||||||
|
% \item \textbf{GPU:} Intel iris Xe Graphics (16 GB VRAM \textit{shared})
|
||||||
|
\item \textbf{Sistem Operasi:} Windows 10 64-bit
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=\textwidth]{chapters/img/accel393.png}
|
||||||
|
\caption{Akselerometer yang digunakan: (a) PCB 393B04, (b) B\&K 8344}
|
||||||
|
\label{fig:accel393}
|
||||||
|
\end{figure}
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.4\textwidth]{chapters/img/shaker.png}
|
||||||
|
\caption{Modal shaker (TMS 2100E11) yang dipasang pada struktur uji}
|
||||||
|
\label{fig:shaker}
|
||||||
|
\end{figure}
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.7\textwidth]{chapters/img/datalogger.png}
|
||||||
|
\caption{Perangkat akuisisi data (DT9857E-16) dan penguat daya SmartAmp 2100E21-400}
|
||||||
|
\label{fig:datalogger}
|
||||||
|
\end{figure}
|
||||||
7
latex/chapters/id/03_methodology/tool/index.tex
Normal file
7
latex/chapters/id/03_methodology/tool/index.tex
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
\section{Alat}
|
||||||
|
|
||||||
|
\subsection{Alat Perangkat Keras}
|
||||||
|
\input{chapters/id/03_methodology/tool/hardware}
|
||||||
|
|
||||||
|
\subsection{Alat Perangkat Lunak}
|
||||||
|
\input{chapters/id/03_methodology/tool/software}
|
||||||
11
latex/chapters/id/03_methodology/tool/software.tex
Normal file
11
latex/chapters/id/03_methodology/tool/software.tex
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
Berikut merupakan perangkat lunak yang digunakan selama proses penelitian ini:
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\item \textbf{Python 3.11} – digunakan untuk proses pra-pemrosesan data, pemodelan, dan evaluasi.
|
||||||
|
\item \textbf{NumPy 1.22.4} – digunakan untuk perhitungan deret numerik.
|
||||||
|
\item \textbf{Pandas 1.5.1} – digunakan untuk memanipulasi struktur data.
|
||||||
|
\item \textbf{Pandas 1.7.3} – digunakan untuk memproses sinyal.
|
||||||
|
\item \textbf{Matplotlib 3.7.1} – digunakan untuk menghasilkan plot data.
|
||||||
|
\item \textbf{Scikit-Learn 1.5.1} – digunakan untuk membangun dan melatih model dengan algoritma pemelajaran mesin klasik.
|
||||||
|
\item \textbf{Jupyter Notebook} – digunakan untuk pelatihan model dan percobaan eksperimental secara interaktif.
|
||||||
|
\end{itemize}
|
||||||
BIN
latex/chapters/img/flow.png
Normal file
BIN
latex/chapters/img/flow.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 217 KiB |
BIN
latex/chapters/img/specimen.png
Normal file
BIN
latex/chapters/img/specimen.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 976 KiB |
13
latex/chapters/img/specimen.tex
Normal file
13
latex/chapters/img/specimen.tex
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
\begin{matrix}
|
||||||
|
N_{6,5} & \text{---} & N_{6,4} & \text{---} & N_{6,3} & \text{---} & N_{6,2} & \text{---} & N_{6,1} \\
|
||||||
|
\vert & & \vert & & \vert & & \vert & & \vert \\
|
||||||
|
N_{5,5} & \text{---} & N_{5,4} & \text{---} & N_{5,3} & \text{---} & N_{5,2} & \text{---} & N_{5,1} \\
|
||||||
|
\vert & & \vert & & \vert & & \vert & & \vert \\
|
||||||
|
N_{4,5} & \text{---} & N_{4,4} & \text{---} & N_{4,3} & \text{---} & N_{4,2} & \text{---} & N_{4,1} \\
|
||||||
|
\vert & & \vert & & \vert & & \vert & & \vert \\
|
||||||
|
N_{3,5} & \text{---} & N_{3,4} & \text{---} & N_{3,3} & \text{---} & N_{3,2} & \text{---} & N_{3,1} \\
|
||||||
|
\vert & & \vert & & \vert & & \vert & & \vert \\
|
||||||
|
N_{2,5} & \text{---} & N_{2,4} & \text{---} & N_{2,3} & \text{---} & N_{2,2} & \text{---} & N_{2,1} \\
|
||||||
|
\vert & & \vert & & \vert & & \vert & & \vert \\
|
||||||
|
N_{1,5} & \text{---} & N_{1,4} & \text{---} & N_{1,3} & \text{---} & N_{1,2} & \text{---} & N_{1,1} \\
|
||||||
|
\end{matrix}
|
||||||
@@ -20,6 +20,7 @@
|
|||||||
\RequirePackage{etoolbox}
|
\RequirePackage{etoolbox}
|
||||||
\RequirePackage{tocloft}
|
\RequirePackage{tocloft}
|
||||||
\RequirePackage{tocbibind}
|
\RequirePackage{tocbibind}
|
||||||
|
\RequirePackage{amsmath,amsfonts,amssymb}
|
||||||
|
|
||||||
% Polyglossia set language
|
% Polyglossia set language
|
||||||
\setmainlanguage{bahasai}
|
\setmainlanguage{bahasai}
|
||||||
|
|||||||
Reference in New Issue
Block a user