포스트

싱크홀(공동) 자동 분석 AI 모델 VisualCavity AI v0.1.0

싱크홀(공동) 자동 분석 AI 모델 VisualCavity AI

  • Tool :
    Google Colab Python tensorflow Keras OpenCV ElementTree numpy


🔔 1. Introduction

📌 모델 소개

  • 개발 환경 : Google Colab
  • 개발 목적 : GPR 데이터 분석 수준 하향
  • 개발 내용 : 싱크홀(공동) 자동 분석 프로그램(VIsualCavity) 제작을 위한 이미지 학습 AI 모델
  • 개발 역량 : Python 라이브러리, XML 파싱, AI의 이미지 학습 과정 및 딥러닝 모델 이해
  • 주요 자료 : 지하 물리 탐사로 획득한 70,732장의 싱크홀 또는 지장물 이미지

📌 개념 정리

  • CNN : 신경망(Convolutional Neural Network)의 축약어이며, 이미지 학습용 딥러닝의 한 종류임
  • GPR : 지하투과레이더(Ground Penetrating Radar)의 축약어이며, 지하 탐사시 사용되는 장비임
  • 싱크홀 : 전문 용어로는 공동(cavity)이라고 하며, 지면 아래에 발생된 빈 공간을 의미함
  • 지장물 : 하수도관, 상수도관, 가스관 등 지하에 매설된 무언가를 의미함
  • 맨홀: 지장물과 지상 공간을 잇는 매개체 역할을 함
  • GPR 장비를 이용한 지하 물리 탐사 모습은 아래와 같음
figure
GPR 지하 물리 탐사 모습


🔔 2. Methodology

📌 개발 환경

  • Google Colab에서 Python 코드를 작성하였습니다.
  • 주로 사용된 Python 라이브러리는 TensorFlow, OpenCV 입니다.
  • AI 학습용 이미지 데이터 출처는 과학기술정보통신부 주관의 AI Hub 사이트입니다.

📌 AI 모델 구축을 위한 코딩 순서

  1. Python 내부 라이브러리 사용
  2. 학습시킬 싱크홀 이미지 1장에 대한 JPG 및 XML 파일의 경로 설정
  3. 이미지 전처리를 위한 함수 정의
  4. 이미지 로드 및 전처리를 위한 함수 작성
  5. XML 파일에서 이미지 정보 습득을 위한 함수 정의
  6. XML 파일을 파싱 후 데이터 추출
  7. CNN 모델 구성(CNN : 컨볼루션 신경망 : Convolution Neural Network)
  8. 모델 컴파일(Compile : 사람이 작성한 코드를 컴퓨터에게 이해시키는 과정)
  9. 모델에 입력할 이미지 및 레이블 데이터 세팅
  10. 이미지 데이터를 모델에 맞게 형태 변환
  11. 모델 훈련(epochs 활용)

📌 GPR 이미지 소개

  • GPR 장비를 이용하여 파악된 지하 단면은 일부 편집이 필요합니다.
  • 왜냐하면 이미지 학습을 위한 관심 영역을 설정해야 되기 때문입니다.
  • 지하 단면의 길이는 차량형 GPR 탐사 장비가 이동한 거리 만큼입니다.
  • 예를들면 1 km의 지하 단면 이미지에서 관심있는 일부만 편집해야 됩니다.
  • 더 나아가 Bounding Box 좌표로 AI가 학습해야 될 부분을 설정해야 됩니다.
  • 아래는 GPR 장비로 파악된 “대칭형 공동(싱크홀)” 및 “맨홀(지장물)” 이미지의 예시입니다.
figure
공동에 대한 GPR 탐사 결과
figure
맨홀에 대한 GPR 탐사 결과


🔔 3. Results : 전체 코드

📌 이미지 학습에 사용된 코드 및 간략한 설명

  • 이미지 학습 AI 모델 구축을 위해 작성된 전체 코드는 아래와 같습니다.
  • 또한 대부분의 코드에 해당 코드 작성 이유를 서술하였습니다.

📌 AI 모델의 이미지 학습을 위한 Python 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# Python 내부 라이브러리 사용
import xml.etree.ElementTree as ET  # XML 파일을 파싱하기 위한 라이브러리를 사용하였습니다.
import cv2  # 이미지 처리 및 컴퓨터 비전 작업을 위한 OpenCV 라이브러리를 사용하였습니다.
import numpy as np  # 이미지 배열을 위한 라이브러리를 사용하였습니다.
import tensorflow as tf  # 딥러닝 모델 구축을 위한 TensorFlow 라이브러리를 사용하였습니다.
from tensorflow.keras import layers, models  # 모델의 레이어를 적용하기 위해 TensorFlow의 Keras API를 사용하였습니다.
from tensorflow.keras.preprocessing import image  # 이미지 로드 및 전처리를 위한 함수를 사용하였습니다.
from tensorflow.keras.preprocessing.image import img_to_array  # 이미지를 넘파이 배열로 변환하는 함수를 사용하였습니다.

# 학습시킬 이미지 1장에 대한 JPG 및 XML 파일의 경로 설정
image_path = "/content/drive/MyDrive/MyPJT/Cavity_PJT/cavity_sample_img.jpg" # JPG 파일 경로입니다.
xml_path = "/content/drive/MyDrive/MyPJT/Cavity_PJT/cavity_sample_xml.xml" # XML 파일 경로입니다.

# 이미지 전처리를 위한 함수 정의
def preprocess_image(image_path, target_size=(256, 256)):
    img = image.load_img(image_path, target_size=target_size)  # 이미지를 로드하고 target_size로 크기를 조정하였습니다.
    img_array = img_to_array(img)  # 이미지 배열을 Numpy에 맞게 변환하였습니다.
    img_array = np.expand_dims(img_array, axis=0)  # 이미지 배열 관련 배치 차원을 추가하였습니다.
    img_array /= 255.0  # 이미지를 0과 1 사이의 값으로 정규화(중복 제거)하였습니다.
    return img_array  # 이미지 전처리가 완료되면, 전처리된 이미지의 배열을 반환하도록 함수를 정의하였습니다.

# 이미지 로드 및 전처리를 위한 함수 작성
img_array = preprocess_image(image_path) # 상기 정의한 함수에 대한 내용을 작성하였습니다.

# XML 파일에서 이미지 정보 파싱을 위한 함수 정의(파싱 : 필요한 정보를 추출하는 것)
def parse_annotation(xml_path):
    tree = ET.parse(xml_path)  # ElementTree로 XML 파일을 파싱하였습니다.
    root = tree.getroot()  # 파싱된 XML 파일에 루트 엘리먼트를 적용하였습니다.

    filename = root.find('filename').text  # 이미지의 데이터의 이름을 추출하는 함수를 작성하였습니다.
    object_name = root.find('.//object/name').text  # 객체의 이름을 추출하는 함수를 작성하였습니다.

    # 바운딩 박스 좌표 추출(ROI : Region of Interst)
    xmin = float(root.find('.//bndbox/xmin').text)
    ymin = float(root.find('.//bndbox/ymin').text)
    xmax = float(root.find('.//bndbox/xmax').text)
    ymax = float(root.find('.//bndbox/ymax').text)

    return filename, object_name, xmin, ymin, xmax, ymax # 이미지 파싱이 완료되면 관련 정보를 추출하도록 함수를 정의하였습니다.

# XML 파일을 파싱 후 데이터 추출
filename, object_name, xmin, ymin, xmax, ymax = parse_annotation(xml_path)

# CNN 모델 구성(CNN : 컨볼루션 신경망 : Convolution Neural Network)
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(256, 256, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())  # AI 모델에 평탄화(Flatten) 레이어를 추가하기 위해 3D 특성 맵을 1D 텐서로 평탄화하였습니다.
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))  # 이진 분류를 위한 출력 레이어를 추가하였습니다.

# 모델 컴파일(Compile : 사람이 작성한 코드를 컴퓨터에게 이해시키는 과정)
model.compile(optimizer='adam',
              loss='binary_crossentropy',  # 이진 분류를 위한 손실 함수를 사용하였습니다.
              metrics=['accuracy'])  # 정확도(accuracy)를 평가 지표(metrics)로 사용하였습니다.

# 모델에 입력할 이미지 및 레이블 데이터 세팅
X_train = np.array([img_array])  # 이미지 배열을 넘파이 배열로 변환하게 하였습니다.
y_train = np.array([1])  # 이진 분류의 경우 레이블을 넘파이 배열로 변환하게 하였습니다.

# 이미지 데이터를 모델에 맞게 형태 변환
X_train = np.squeeze(X_train, axis=0)

# 모델 훈련(Epochs 활용)
model.fit(X_train, y_train, epochs=5, batch_size=1)


🔔 4. Conclusions

📌 VisualCavity AI v0.1.0 테스트 결과 판단 방법

  • Python을 이용하여 AI 모델에게 단일 이미지를 학습시켰습니다.
  • AI 이미지 학습 결과는 Epoch로 판단할 수 있습니다.
  • Epoch=1은 머신 러닝의 신경망이 데이터 세트를 한 번 통과하는 과정을 의미합니다.
  • 본 AI 모델의 Epochs는 5로 설정했기 때문에 신경망이 전체 데이터 세트를 다섯 번 통과하였습니다.
  • 아래는 5번의 Epoch로 판단할 수 있는 AI 모델의 이미지 학습 현황입니다.

📌 VisualCavity AI v0.1.0 테스트 결과

  • Epoch 1/5 : AI 모델이 데이터를 2초 동안 한 번 통과하였고 정확도는 100% (= 1)입니다.
  • Epoch 2/5 : AI 모델의 학습 정확도가 100% 유지되었고 손실 정도는 0에 가깝습니다.
  • Epoch 3/5 ~ 5/5 : AI 모델의 학습 정확도가 100%이고 손실 정도는 0입니다.
  • Epoch 값 자체로만 봤을 때는 AI 모델에 이미지가 완벽히 학습되었다고 볼 수 있습니다.

📌 VisualCavity AI v0.1.0 테스트 결과 해석

  • 정량적인 Epoch 결과는 완벽하지만 정성적으로 평가하였을 때 이 모델은 문제가 있습니다.
  • 다양성 부족 : 이미지 데이터가 유사한 경우 AI 모델이 쉽게 데이터 패턴을 학습했을 것입니다.
  • 과적합 : AI 모델이 이미지 데이터에 과도하게 fitting 되어 있어서 일반화되지 않은 것 같습니다.
  • AI 모델의 학습 정도를 정량적으로 검토하기 위해서는 Validation 데이터 역시 활용되어야 합니다.
  • 부록 내용과 같이 AI 모델의 버전을 업그레이드하며 정량적인 평가를 할 필요성이 있습니다.
  • 다음 글에 업그레이드 버전에 대한 내용을 작성하였습니다.
  • 아래는 AI 모델의 이미지 학습 결과에 대한 출력 내용입니다.
figure
VisualCavity AI v0.1.0의 Epoch 현황


🔔 5. Reference

📌 GitHub Repository 주소

싱크홀(공동) AI 자동 분석 프로그램 깃허브 링크


🔔 6. Appendix

🚀 VisualCavity AI 개발 현황 (현재 ver. 0.1.0)

  • v0.1.0 : Train 싱크홀 이미지 1장 학습 완료(2024-01-09)
    • 기초 모델을 구축하였고 단일 싱크홀 이미지를 학습시킴
  • v0.1.3 : 싱크홀 및 지장물 이미지에 대한 Train, Validation, Test 데이터셋 비중 조절
    • 기존 : Train 170,774장, Validation 21,346장
    • 변경 : Train 134,484장, Validation 28,818장, Test 28,818장
  • v0.1.7 : Test 데이터셋을 포함한 VisualCavity 개발 계획 재구성
    • 현재 : 초기 AI 모델 개발 계획
    • 추후 : 발전된 AI 모델 개발 계획(v0.1.7 이후 전반적인 개발 계획 변경 예정)
  • v0.2.0 : Train 싱크홀 이미지 11,205장 학습 완료
    • 기존 모델에 싱크홀 이미지만이 아닌 지장물 이미지를 추가적으로 학습시킴
    • 싱크홀 및 지장물을 구분할 수 있는 능력을 상승시킴
  • v0.3.0 : Validation 싱크홀 이미지 1,401장을 이용하여 학습된 이미지 11,205장에 대한 검토 완료
  • v0.4.0 : Train 싱크홀 이미지 34,136장 학습 완료
  • v0.5.0 : Validation 싱크홀 이미지 장을 이용하여 학습된 이미지 34,136장에 대한 검토 완료
  • v0.4.0 : Train 싱크홀 이미지 34,136장 학습 완료
  • v0.5.0 : Validation 싱크홀 이미지 장을 이용하여 학습된 이미지 34,136장에 대한 검토 완료
  • v0.6.0 : Train 싱크홀 및 지장물 이미지 170,774장 학습 완료
  • v0.7.0 : Validation 이미지 21,346장을 이용하여 학습된 이미지 170,774장에 대한 검토 완료
  • v0.8.0 : Train 싱크홀 이미지 98,435장 학습 완료
  • v0.9.0 : Validation 싱크홀 이미지 12,304장을 이용하여 학습된 이미지 11,205장에 대한 검토 완료
  • v1.0.0 : AI를 이용한 싱크홀 분석 모델 생성(싱크홀 분석 프로그램에 본 AI 모델을 적용시킬 예정)




이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.
<>