Weights & Biases로 이미지 분류 최적화
Weights & Biases를 사용해 실험 추적과 시각화를 수행하며 이미지 분류 모델을 구축하고 추적하는 방법을 알아보세요. 이 글은 AI로 번역된 기사입니다. 오역이 있을 수 있으니 댓글로 알려주세요.
Created on September 15|Last edited on September 15
Comment
이미지 분류는 다양한 AI 응용 분야에서 핵심적인 역할을 합니다. 의료 진단 까지 자율 주행그러나 딥러닝 모델을 학습하고 최적화하는 작업은 분류 작업 복잡해질 수 있으며, 실험을 면밀히 추적하고 하이퍼파라미터를 튜닝하며 성능을 모니터링해야 합니다. 이때 도움이 되는 것이 Weights & Biases 이때 W&B가 등장합니다. W&B는 머신러닝 실험을 기록하고 시각화하며 최적화할 수 있는 강력한 플랫폼을 제공합니다.
이 가이드에서는 이미지 분류 모델을 구축하고 W&B Models를 사용해 학습 과정을 추적하는 방법을 살펴봅니다. 예시 활용 사례로 야생동물 보전을 다루며, AI 기반 분류 모델이 카메라 트랩 이미지와 위성 데이터를 분석해 멸종 위기 종을 모니터링하고 환경 변화를 파악하는 데 어떻게 도움을 줄 수 있는지 보여줍니다. Weights & Biases를 활용하면 우리는 모델 성능을 효율적으로 추적하기, 학습 실행 비교하기, 그리고 하이퍼파라미터를 미세 조정하기 더 높은 정확도를 달성하기 위해.
이제 이미지 분류 파이프라인을 구축하고, 실험 추적을 위해 Weights & Biases를 통합하며, 모델 성능을 단계별로 최적화하는 과정을 자세히 살펴보겠습니다.

출처: Author
목차
사용 사례: 야생동물 보전에서의 이미지 분류이미지 분류를 뒷받침하는 핵심 기술CNN이 이미지를 처리하는 방식이미지 분류를 위한 도구와 프레임워크딥러닝 프레임워크객체 감지 APIWeights & Biases첫 번째 이미지 분류기 구축하기1단계: 종속 항목 설치2단계: Weights & Biases 초기화3단계: GPU 사용 가능 여부 확인4단계: 디렉터리 경로와 기타 매개변수 정의5단계: 데이터 준비6단계: 모델 설정7단계: 성능 추적8단계: 학습9단계: 모델 평가10단계: 모델 테스트11단계: 예측 및 결과 출력12단계: 샘플 예측 로깅결론
사용 사례: 야생동물 보전에서의 이미지 분류
이미지 분류의 실제 활용 사례 중 하나는 야생동물 보전으로, 위성 이미지와 카메라 트랩에서 수집된 방대한 이미지 데이터를 분석하는 데 AI 모델이 연구자들을 돕습니다. 이러한 모델은 종을 식별하고, 서식지 변화를 모니터링하며, 산불이나 산림 파괴와 같은 환경 위협을 감지하는 데 기여합니다.
그러나 이러한 응용에서 높은 성능의 분류 모델을 개발하려면 잘 설계된 딥러닝 파이프라인만으로는 충분하지 않습니다. 학습 실험을 효율적으로 추적하여 여러 학습 실행을 비교하고, 모델 개선을 모니터링하며, 하이퍼파라미터를 미세 조정하는 과정이 필요합니다. 실험 추적과 시각화 도구를 활용하면 머신러닝 실무자는 워크플로를 최적화하고 모델 정확도를 향상시킬 수 있습니다.


위의 이미지는 실시간 위성 이미지의 샘플로, 산불 예측 데이터셋(위성 이미지) 왼쪽 이미지는 피해를 입지 않은 토지를 보여주고, 오른쪽 이미지는 확산 중인 활성 산불을 나타냅니다. 이러한 데이터셋은 위성 이미지를 기반으로 산불 발생을 탐지하고 분류하는 AI 모델을 학습시키는 데 매우 중요합니다.
위성 영상뿐만 아니라 연구자와 보전 단체는 야생동물과 서식지를 모니터링하기 위한 비용 효율적이고 효율적인 방법으로 카메라 트랩도 활용하고 있습니다. 머신러닝의 발전으로 AI 모델은 이제 카메라 트랩에서 수집된 영상을 분석하여, 기존 데이터셋을 기반으로 종을 자동으로 식별하고 분류할 수 있습니다.
예를 들어, Conservation AI 는 멸종 위기 종을 추적하기 위해 카메라 트랩과 드론을 배치���습니다. 이들의 시스템은 1,250만 장 이상의 이미지를 처리했으며, 우간다의 멸종 위기 천산갑, 가봉의 고릴라, 말레이시아의 오랑우탄을 포함해 68개 종에서 400만 회가 넘는 개체 출현을 탐지했습니다. 이러한 AI 기반 접근 방식은 보전 활동에 유용한 데이터를 제공하여 종 모니터링과 서식지 보호를 개선합니다.

이미지 분류를 뒷받침하는 핵심 기술

딥러닝 기반 이미지 분류 모델은 다음에 의존합니다 합성곱 신경망(CNN), 시각 데이터를 처리하도록 설계된 신경망의 한 종류입니다. CNN은 다음과 같은 작업에 널리 사용됩니다 객체 인식, 안면 인식, 의료 영상 분석 등에서 활용되며, 야생동물 보전 분야에서도 없어서는 안 될 기술로 자리 잡았습니다.
CNN이 이미지를 처리하는 방식
CNN은 입력 이미지에서 특징을 추출하는 여러 계층으로 구성됩니다:
- 합성곱 계층 – 가장자리, 질감, 패턴을 검출하기 위해 필터를 적용합니다.
- 풀링 계층 – 공간 차원을 줄여 핵심 특징을 유지하면서 계산 효율을 높입니다.
- 완전연결 계층 – 추출된 특징을 각 클래스의 확률로 매핑하여 최종 분류를 결정합니다.
대규모 라벨링된 데이터셋으로 CNN을 학습하면 모델이 높은 정확도로 이미지를 분류할 수 있습니다. 야생동물 보전 분야에서는 동물, 식물, 환경 조건으로 구성된 데이터셋에 CNN을 학습시켜 종 인식을 자동화하고 불법 벌목이나 산불과 같은 이상 징후를 탐지합니다.
모델 정확도를 지속적으로 개선하려면 학습 지표를 추적하고 다양한 아키텍처를 비교하며 하이퍼파라미터를 미세 조정하는 것이 중요합니다. 이러한 과정을 W&B의 실험 추적 도구로 원활하게 수행할 수 있습니다.
이미지 분류를 위한 도구와 프레임워크

이미지 분류 모델을 개발하려면 강력한 도구와 프레임워크가 필요하며, 이들 중 다수는 W&B와 원활하게 통합되어 추적과 최적화를 지원합니다.
딥러닝 프레임워크

- OpenCV – 크기 조정과 특징 추출 등 이미지 전처리를 용이하게 합니다.

객체 감지 API

Weights & Biases

출처: Author
첫 번째 이미지 분류기 구축하기
이제 Weights & Biases를 사용해 실험을 추적하면서 야생동물 이미지 분류기를 구축하는 과정을 단계별로 살펴보겠습니다.
1단계: 종속 항목 설치
먼저 환경과 모델을 설정하기 위해 필수 라이브러리를 임포트합니다. 모델을 위한 TensorFlow, Keras와 실험 추적을 위한 Weights & Biases를 포함합니다.
import numpy as npimport tensorflow as tffrom tensorflow.keras.preprocessing.image import ImageDataGeneratorfrom tensorflow.keras.applications import VGG16from tensorflow.keras.layers import Dense, Flatten, Dropoutfrom tensorflow.keras.models import Modelfrom PIL import ImageFileimport wandbfrom wandb.keras import WandbCallback
2단계: Weights & Biases 초기화
wandb.login()wandb.init(project='wildfire_detection', config={"learning_rate": 0.001,"epochs": 5,"batch_size": 8,"target_size": (350, 350),})config = wandb.config
'wildfire_detection'라는 이름의 프로젝트에서 모델 학습 지표, 구성, 출력물을 기록하고 모니터링하도록 Weights & Biases 실행(run)을 초기화합니다.
3단계: GPU 사용 가능 여부 확인
이후 더 빠른 학습을 위해 GPU 사용 가능 여부를 확인하고, GPU가 있는지에 따라 해당 메시지를 출력합니다.
if tf.test.gpu_device_name():print('GPU device found:', tf.test.gpu_device_name())else:print("No GPU found. Please ensure that GPU is enabled in the runtime settings.")
4단계: 디렉터리 경로와 기타 매개변수 정의
그다음 학습용과 검증용 데이터 디렉터리의 경로를 지정해 데이터 디렉터리를 입력합니다.
train_dir_wildfire = '/kaggle/input/wildfire-prediction-dataset/train'valid_dir = '/kaggle/input/wildfire-prediction-dataset/valid'target_size = config.target_sizebatch_size = config.batch_sizeseed = 42
5단계: 데이터 준비
여기서는 먼저 데이터셋에 포함된 잘린(손상된) 이미지를 처리하기 위해 다음을 사용했습니다 ImageFile 모듈.
잘린(손상된) 이미지 처리하기.
ImageFile.LOAD_TRUNCATED_IMAGES = True
데이터 제너레이터 생성하기
ImageDataGenerator 학습 데이터에 대한 데이터 증강 적용
train_datagen_wildfire = ImageDataGenerator(rescale=1./255,rotation_range=40, # Randomly rotate images in the range (degrees, 0 to 180)width_shift_range=0.2, # Randomly horizontal shift imagesheight_shift_range=0.2, # Randomly vertical shift imagesshear_range=0.2, # Shear Intensity (Shear angle in counter-clockwise direction)zoom_range=0.2, # Randomly zoom imagehorizontal_flip=True, # Randomly flip images horizontallyfill_mode='nearest' # Strategy used for filling in newly created pixels)train_generator_wildfire = train_datagen_wildfire.flow_from_directory(directory=train_dir_wildfire,target_size=target_size,batch_size=batch_size,class_mode='binary',shuffle=True,seed=seed)
ImageDataGenerator 검증 데이터에 대한 데이터 증강 적용
validation_datagen = ImageDataGenerator(rescale=1./255)validation_generator = validation_datagen.flow_from_directory(directory=valid_dir,target_size=target_size,batch_size=batch_size,class_mode='binary',shuffle=False)
그다음에는 ImageDataGenerator 모델이 더 잘 일반화하도록, 학습 중에 학습 데이터를 동적으로 전처리하고 증강하는 데 사용합니다. 이 방식은 모든 이미지를 한꺼번에 메모리에 올리는 대신 배치 단위로 불러오기 때문에 메모리 효율적입니다.
다음으로 training_datagen_wildfire 회전, 뒤집기, 스케일링과 같은 증강을 적용한 이유는 원본 학습 이미지가 촬영된 특정 조건에 한정되지 않은, 더 일반적인 특징을 모델이 학습하도록 돕기 위해서입니다. 검증 데이터는 일반적으로 검증/테스트 데이터에는 데이터 증강을 적용하지 않기 때문에, 추가 증강 없이 리스케일만 수행합니다.
그 flow_from_directory() 그다음 해당 메서드는 데이터 로더를 준비합니다 (train_generator_wildfire 그리고 validation_generator)로, 학습과 검증 과정에서 각각 이미지를 모델에 자동으로 공급합니다.
6단계: 모델 설정
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(target_size[0], target_size[1], 3))x = base_model.outputx = Flatten()(x)x = Dense(256, activation='relu')(x)x = Dropout(0.5)(x)predictions = Dense(1, activation='sigmoid')(x)model = Model(inputs=base_model.input, outputs=predictions)for layer in base_model.layers:layer.trainable = Falsemodel.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
Base_model = VGG16 사전 학습된 합성곱 신경망 모델인 VGG16을 베이스로 로드합니다. The include_top=False 옵션은 최상위(완전 연결) 레이어를 제외하여, 새로운 분류 작업에서 특징 추출에 적합하게 만듭니다.
추가로, VGG16의 상단에 사용자 정의 레이어를 쌓습니다. 구체적으로 Flatten 레이어, Dense 레이어, 과적합을 줄이기 위한 드롭아웃(rate=0.5) 레이어를 추가하고, 이진 분류(산불 여부)에 맞춘 최종 시그모이드 활성화의 Dense 레이어를 둡니다. 마지막으로 모델은 Adam 옵티마이저와 binary cross-entropy 손실로 컴파일하며, 이는 이진 분류 작업에 적합합니다.
7단계: 성능 추적
from tensorflow.keras.callbacks import Callbackclass CustomWandbCallback(Callback):def on_epoch_end(self, epoch, logs=None):logs = logs or {}wandb.log({'epoch': epoch,'loss': logs.get('loss'),'accuracy': logs.get('accuracy'),'val_loss': logs.get('val_loss'),'val_accuracy': logs.get('val_accuracy')})
CustomWandbCallback 각 에포크가 끝날 때 학습 및 검증 지표(손실과 정확도)를 Weights & Biases에 기록하기 위한 맞춤형 Keras 콜백을 정의합니다. 이를 통해 시간에 따른 모델 성능을 추적할 수 있으며, 학습 과정을 실시간으로 모니터링하고 시각화할 수 있습니다.
steps_per_epoch = train_generator_wildfire.samples // batch_size
validation_steps = validation_generator.samples // batch_size
💡
8단계: 학습
이미지에서 모델을 학습하기 위해 “fit” 메서드를 사용합니다. train_generator_wildfire, 별도의 이미지 세트로 검증하며 validation_generator에포크당 스텝 수, 에포크 수, 검증 스텝 수와 같은 학습 파라미터를 지정합니다. 지표를 기록하기 위해 맞춤형 콜백을 포함합니다.
model.fit(train_generator_wildfire,steps_per_epoch=steps_per_epoch,epochs=config.epochs,validation_data=validation_generator,validation_steps=validation_steps,callbacks=[CustomWandbCallback()] # Use the custom callback here)
9단계: 모델 평가
모델 학습이 끝난 후에는 evaluate 메서드를 사용해 검증 데이터셋에서 모델 성능을 평가하고, 모델의 일반화 성능을 가늠할 수 있도록 검증 정확도를 출력합니다.
test_loss, test_acc = model.evaluate(validation_generator, steps=validation_generator.samples // validation_generator.batch_size)print('Validation accuracy:', test_acc)
최종 평가 지표 기록
wandb.log({'Validation Loss': test_loss, 'Validation Accuracy': test_acc})
W&B에 아티팩트로 모델 저장
model.save("wildfire_detection_model.h5")wandb.save("wildfire_detection_model.h5")wandb.Artifact("model", type="model", description="A model to detect wildfires from images")wandb.log_artifact("wildfire_detection_model.h5", type="model", name="wildfire_detection_model")
model.save() 학습된 모델을 로컬에 저장합니다. wandb.log_artifact() Weights & Biases에 모델을 아티팩트로 기록하여 버저닝을 제공하고, 추후 참고나 배포를 위해 학습된 모델에 쉽게 접근할 수 있도록 합니다.
10단계: 모델 테스트
테스트 데이터용 디렉터리 경로 정의
test_dir_wildfire = '/kaggle/input/wildfire-prediction-dataset/test/wildfire'test_dir_nowildfire = '/kaggle/input/wildfire-prediction-dataset/test/nowildfire'
여기에서, the Load_and_preprocess_images(dir_path, target_size) 지정된 디렉터리에서 이미지를 로드하고 전처리하는 함수를 정의합니다 (test_dir_wildfire 그리고 test_dir_nowildfire), 대상 크기(350×350)로 리사이즈하고, 학습 시와 동일한 리스케일링을 적용합니다.
from tensorflow.keras.preprocessing.image import ImageDataGeneratorfrom tensorflow.keras.preprocessing import imageimport numpy as npimport osdef load_and_preprocess_images(dir_path, target_size):datagen = ImageDataGenerator(rescale=1./255)images = []labels = [] # Assuming 1 for wildfire and 0 for nowildfire for binary classificationfile_paths = []for file_name in os.listdir(dir_path):file_path = os.path.join(dir_path, file_name)img = image.load_img(file_path, target_size=target_size)img_array = image.img_to_array(img)img_array = np.expand_dims(img_array, axis=0)img_preprocessed = datagen.flow(img_array, batch_size=1)[0]images.append(img_preprocessed)file_paths.append(file_path)return np.vstack(images), file_pathstarget_size = (350, 350) # The target size used during trainingimages_wildfire, files_wildfire = load_and_preprocess_images(test_dir_wildfire, target_size)images_nowildfire, files_nowildfire = load_and_preprocess_images(test_dir_nowildfire, target_size)
11단계: 예측 및 결과 출력
마지막으로, predict 이미지를 다음과 같이 분류하는 데 사용됩니다 wildfire 또는 nowildfire 모델의 출력 확률에 기반합니다. 확률이 0.5보다 크면 이미지를 다음과 같이 분류합니다 wildfire; 그렇지 않으면, 이는 다음과 같이 분류됩니다 nowildfire. 예측은 이미지에 대해 각각 별도로 수행되며, wildfire 그리고 nowildfire 테스트 디렉터리에서 예측을 수행하고, 결과는 각 파일 경로와 함께 출력됩니다.
predictions_wildfire = model.predict(images_wildfire)for i, pred in enumerate(predictions_wildfire):print(f"{files_wildfire[i]} - {'Wildfire' if pred >= 0.5 else 'No Wildfire'}: {pred[0]}")predictions_nowildfire = model.predict(images_nowildfire)for i, pred in enumerate(predictions_nowildfire):print(f"{files_nowildfire[i]} - {'Wildfire' if pred >= 0.5 else 'No Wildfire'}: {pred[0]}")
12단계: 샘플 예측 로깅
예측값을 임계값 0.5에 따라 이진 레이블로 변환합니다.
binary_predictions_wildfire = [1 if pred >= 0.5 else 0 for pred in predictions_wildfire]binary_predictions_nowildfire = [1 if pred >= 0.5 else 0 for pred in predictions_nowildfire]
정답 레이블 제공하기
true_labels_wildfire = [1] * len(files_wildfire)true_labels_nowildfire = [0] * len(files_nowildfire)
예측값을 해당 이미지와 레이블과 함께 Weights & Biases에 로깅하는 함수를 정의합니다.
def log_predictions_wandb(image_paths, predictions, true_labels, title, num_samples=10):columns = ["Image", "Predicted Label", "True Label"]wandb_table = wandb.Table(columns=columns)for i in range(min(num_samples, len(image_paths))):img = wandb.Image(image.load_img(image_paths[i], target_size=target_size))pred_label = "Wildfire" if predictions[i] >= 0.5 else "No Wildfire"true_label = "Wildfire" if true_labels[i] == 1 else "No Wildfire"wandb_table.add_data(img, pred_label, true_label)wandb.log({title: wandb_table})
둘 다에 대해 샘플 예측을 로깅합니다 wildfire 그리고 nowildfire 이미지
og_predictions_wandb(files_wildfire, binary_predictions_wildfire, true_labels_wildfire, "Wildfire Predictions")log_predictions_wandb(files_nowildfire, binary_predictions_nowildfire, true_labels_nowildfire, "Nowildfire Predictions")
실행을 완료합니다
wandb.finish()
이 코드 부분은 이미지, 예측 레이블, 정답 레이블로 구성된 테이블을 만들어 두 경우 모두에 대해 샘플 예측 10개를 Weights & Biases에 로깅합니다. wildfire 그리고 nowildfire 이미지를 포함해 모델의 예측을 시각적으로 확인하고 평가할 수 있습니다.
“wildfire”에 대한 샘플 10개는 다음과 같습니다:

출처: Author

출처: Author
그리고 “no wildfire”의 경우:

출처: Author

출처: Author
W&B에서 기록되는 중요한 차트 몇 가지:
이 차트에는 손실과 정확도 그래프가 포함되어 있으며, 특정 모델을 학습할 때 항상 확인해야 하는 필수 지표입니다.

출처: Author
이 코드는 이미지 분류 작업을 위한 딥러닝 모델의 학습을 전처리, 모델 학습, 평가, 예측, 그리고 Weights & Biases를 통한 실험 로깅까지 포함한 엔드 투 엔드 워크플로로 보여 줍니다. 또한 사전 학습된 모델을 활용하는 것과 같은 핵심 개념을 설명합니다. 전이 학습, 실험 추적 도구와 연동하기 위한 맞춤형 콜백과 예측을 위한 이미지 처리.
결론
이미지 분류는 현실 세계의 문제를 해결하는 강력한 도구이지만, 높은 모델 성능을 달성하려면 엄격한 실험 추적이 필수입니다. Weights & Biases는 딥러닝 모델을 기록하고 비교하며 최적화할 수 있는 중앙화된 플랫폼을 제공해 이 과정을 간소화합니다.
Weights & Biases를 야생동물 보전 애플리케이션에 통합하면, 연구자들은 실험 추적을 개선해 모델 정확도를 높이는 동시에 종 모니터링과 환경 보호를 강화할 수 있습니다.
보전, 의료, 산업 등 어떤 분야에서 작업하든, Weights & Biases는 모델이 최적화되고 재현 가능하며 지속적으로 개선되도록 보장합니다.
Add a comment