제 2회 수소에너지 활용을 위한 임베디드 AI 해커톤 챌린지 캠프
4학년 1학기가 시작되면서 자동차공학과 복수전공을 시작했다.
공대생에서 공공대생(꾱대생)으로 진화했다.
방학동안 자작차 동아리 활동을 할 때,
제 2회 수소에너지 활용을 위한 임베디드 AI 해커톤 챌린지 캠프가 열린다는 공지를 봤다.
1회 때의 아쉬움이 많았기에, 다시 출전하기로 다짐했다.
무야호!
1. 발단
저번에 참여했던 기계과 중 1명은 군대를 가고, 1명은 개인사정으로 불참했다.
어쩔 수 없이 저번에 같이 참여했던 자차과 친구와 나(컴공&자차 꾱대생) 둘이서 참가했다.
팀명은 sudo 였다.
리눅스 환경에서 프로그래밍 할 때 sudo를 붙이면 강제적으로 명령어가 실행된다.
안되는 일이 있으면 강제로 되게 하여라...라는 컴공과 유머였는데 아무도 알아주지 않아 슬펐다.
우리는 < 수소 취화 감지 및 AI 예측 앱 >을 기획했다.
다음은 개발 기획서다
수소 취화 감지 및 AI 예측 앱
프로젝트 소개: 수소 취화율을 감지하고 예측하여 실험실 및 수소 관련 시설에서 효율적인 수소 관리를 돕는 혁신적인 AI 기반 애플리케이션을 개발하는 것입니다. 수소는 친환경 에너지원으로 주목받고 있지만, 안전한 관리를 위해서는 수소 취화 현상을 모니터링하고 적절히 대응하는 것이 필수적입니다.
수소 취화는 금속이 수소를 흡수하여 강도와 연성이 감소하는 현상으로, 수소를 저장하고 운송하는 과정에서 큰 위험 요소가 됩니다. 현재 수소 취화를 실시간으로 모니터링하고 예측할 수 있는 시스템은 부족한 상황입니다. 이를 해결하기 위해 우리는 수소 취화 감지 및 예측 시스템을 개발하여 수소 관련 시설의 안전성을 높이고, 운영 효율성을 극대화하고자 합니다.
프로젝트 필요성: 본 프로젝트는 수소 에너지 시스템의 안전성과 신뢰성을 높이기 위한 실질적인 솔루션을 제공합니다. 라즈베리 파이 5와 다양한 센서를 활용하여 수소 취화를 실시간으로 모니터링하고, AI 모델을 통해 취화 가능성을 예측합니다.
기대효과:
-안전성 향상: 실시간 모니터링과 조기 경고를 통해 수소 취화로 인한 사고를 사전에 예방할 수 있습니다.
-비용 절감: 조기 경고 시스템을 통해 유지보수 비용을 절감하고, 시스템의 다운타임을 최소화할 수 있습니다.
-신뢰성 증대: 데이터 기반의 예측 모델을 통해 수소 에너지 시스템의 신뢰성을 높이고, 사용자와 투자자의 신뢰를 확보할 수 있습니다.
-환경 보호: 수소 에너지의 안정적인 활용을 통해 화석 연료 사용을 줄이고, 탄소 배출을 감소시켜 환경 보호에 기여할 수 있습니다.
주요기능:
1. 실시간 데이터 수집:
수소 농도, 온도, 응력 등의 데이터를 실시간으로 측정하여 라즈베리 파이 5에 전달합니다.
2. 데이터 분석 및 예측:
라즈베리 파이 5가 수집된 데이터를 AI 모델에 입력하여 수소 취화 가능성을 예측합니다.
3. 실시간 경고 제공:
AI 모델이 이상 징후를 감지하면, 사용자에게 실시간으로 경고를 전송합니다. 이를 통해 사용자는 신속하게 대응할 수 있습니다.
2. 전개
사전 미팅 때, 주최측에서 '서비스 기획'에 초점을 두어 심사를 한다고 했다.
그래서 자차과 친구가 서비스 기획, 발표를 맡기로 했고,
나는 그것을 제외한 나머지 모두 (하드웨어 구성, 회로 구성, 백엔드 프로그래밍, 프론트엔드 프로그래밍, Ai 모델 설계 및 구현 등등)을 맡았다.
우연히도 1회 때 참가했던 그 자리 그대로 앉게 되었다
지금 생각해보니 혹시 주최측의 의도였을까...?
1회 때와 다르게 멘토멘티 시스템이 생겼다.
우리 팀을 담당한 멘토님은 IT 회사 현직자였다.
우리팀의 최대 문제점은 수소 취화를 검출할 방범이 없다는 것이었다!
수소 취화가 된 걸 알기 위해서는 금속의 응력을 알아야 하는데
쓸 때마다 실험을 통해 응력을 알아낼 수 없고...
그때의 멘토님의 말씀
" 그냥 카메라 모듈로 수소 취화된 부분을 현미경으로 찍고 이미지 데이터를 AI에 돌리죠?"
(정확히 이러한 워딩은 쓰지 않았다)
대박이다. 역시 현직자는 다르다.
따라서 시스템 아키텍트를 변경 해야 했다.
변경 전:
변경 후:
3. 위기
이미지 판별하는 AI 모델을 쓰려면 python을 써야하지만
문제는 난 파이썬을 써본 적이 없다는 것!
Hello world 조차 출력해 본 적이 없는 상태였다!
그러나 나는 1인 개발자
아무도 나를 도와주지 않는다
이 악물고 코드를 구성하기 시작했다.
개발 스케줄
1일차:
* 라즈베리파이4에 카메라 모듈을 달았다. 라즈베리파이로 이미지를 수집하는 데에 성공했다.
* 이후에 라즈베리파이 -> 컴퓨터로 이미지를 넘기는 방법을 서치했다. openssh를 사용할 예정이었다.
하지만, 어떤 이유에서인지 전혀 되지 않았다...
* 발표 준비를 도왔다. 2일차에 중간평가가 진행되었기 때문이다.
2일차:
* 중간평가의 발표는 괜찮게 끝났다. 멘토단에서 좋은 반응을 받았다!
* 멘토님의 도움으로 라즈베리파이 -> 컴퓨터로 이미지를 옮기는 nginx 서버를 구축했다
* Ai 모델을 본격적으로 구현하기 시작했다! cnn 모델로 opencv 라이브러리와 tensorflow를 이용했다.
* 이미지 전처리 프로그램을 완전히 구현했다
3일차:
* AI를 완벽하게 구현했다. Ai 학습시켜서 이미지 판별까지 성공했다.
* 그러나 학습시킨 이미지가 많아질 수록 부정확해졌다... 이미지 퀄리티가 안 좋았기 때문이라고 추정
* flask 서버를 구축했다!
* 이후 최종 발표를 도왔다.
4일차:
최종 발표
프로토 타입
중간평가 때 멘토단에서
"취화된 부분을 모두 찍을 것이냐 아니면 일부만 찍어서 감지할 것이냐?" 라는 질문이 나왔다.
취화가 취약한 부분을 예측할 수는 없었고, 답은 모든 부분을 찍을 수 밖에 없는데....
그걸 어떻게 하냐 말이지...
그때!
기자재에 수소 전기 자동차 키트를 신청한 것이 생각났다.
수소를 발생시키기 위해 신청한 것이었으나 수소를 발생시킬 이유가 없어졌으니
필요도 없어졌지만...
이것은 모든 부분을 돌아다니게 할 수 있고 심지어 수소로 움직인다!!!
이거 완전 럭키비키였다!
자동차에 라즈베리 부착 -> 라즈베리로 연결된 카메라 모듈로 이미지 수집 (카메라 모듈에 100배율 가능한 현미경 달음)
해커톤 캠프라는 한계 때문에 100배율된 수소 취화 이미지를 찍어 수집하는 걸로 실험을 실행했다.
AI 모델
import os
import cv2
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
# 이미지 파일 경로 설정
image_dir = 'C:/Users/UserK/test_real'
# 데이터 전처리 함수
def load_and_preprocess_images(image_dir, img_size=(224, 224)):
images = []
labels = []
for img_file in os.listdir(image_dir):
img_path = os.path.join(image_dir, img_file)
img = cv2.imread(img_path)
img = cv2.resize(img, img_size)
img = img / 255.0 # 이미지 정규화
images.append(img)
# 예시: 파일명에 따라 레이블을 지정할 수 있습니다.
label = 1 if 'hydrogen_embrittlement' in img_file else 0
labels.append(label)
return np.array(images), np.array(labels)
# 이미지 및 레이블 로드
X, y = load_and_preprocess_images(image_dir)
# CNN 모델 구성 함수
def create_model(input_shape):
model = Sequential([
Conv2D(32, (3, 3), activation='relu', input_shape=input_shape),
MaxPooling2D(pool_size=(2, 2)),
Conv2D(64, (3, 3), activation='relu'),
MaxPooling2D(pool_size=(2, 2)),
Flatten(),
Dense(128, activation='relu'),
Dropout(0.5),
Dense(1, activation='sigmoid') # 이진 분류를 위한 시그모이드 활성화 함수
])
return model
# 모델 생성 및 컴파일
model = create_model(X.shape[1:])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# 모델 학습
model.fit(X, y, epochs=1, batch_size=1, validation_split=0.2)
멘토님의 도움과 다른 곳에서 도움을 많이 받아 구성했다.
미천한 실력에서 급하게 구성한 거라
말도 안되는 부분이 많다(...)
Server
서버는 다음과 같이 구성이 되었다.
서버는 멘토님의 도움을 많이 받았다...
4. 절정
최종발표는 잘 진행되었다.
당연하게도... 친구가 발표, 발표자료 제작만 4일 동안 맡아서 그것만 준비했기 때문이다.
심사위원분은 4분은 교수, 1분은 수소에너지 관련 회사를 운영하시는 사업가 분
이렇게 5분이었다.
5. 결과
결과는 장려상!
더 높은 결과를 원했지만, 그래도 장려상에 만족하기로 했다.
8팀 중 유일하게 발표 때 시현한 팀이 대상을 탔다.
그럴 줄 알았으면 발표 때 우리도 자동차 굴릴 걸...
https://kienews.com/news/newsview.php?ncode=1065578986227667
국립강릉원주대 스마트수소에너지사업단 ‘제2회 임베디드 AI 해커톤 챌린지 캠프’ 성료
수소에너지 산업 발전시킬 차세대 미래 인재 양성
kienews.com
여러 경험을 쌓을 수 있어 좋은 기회였다.
현직자 분과 여러 기능에 대해 배울 수 있어 좋았다.
서버를 구성하는 법이나 Ai를 구현하는 법과 같은 것을 배울 수 있어 기뻤다.
관련 코드:
https://github.com/youngmumi/Hydrogen-embrittlement-detection-and-AI-prediction
GitHub - youngmumi/Hydrogen-embrittlement-detection-and-AI-prediction: 수소 취화 감지 및 AI 예측 웹 애플리케이션
수소 취화 감지 및 AI 예측 웹 애플리케이션 개발. Contribute to youngmumi/Hydrogen-embrittlement-detection-and-AI-prediction development by creating an account on GitHub.
github.com
'해커톤' 카테고리의 다른 글
제 1회 수소에너지 활용을 위한 임베디드 AI 해커톤 챌린지 캠프 (5) | 2024.09.09 |
---|