728x90
반응형
프로젝트 상세 분석 및 설명
1. 데이터 준비 및 전처리
코드 블록:
root_dir = 'dataset/train'
img_path_list = []
possible_img_extension = ['.jpg', '.jpeg', '.JPG', '.bmp', '.png']
for (root, dirs, files) in os.walk(root_dir):
if len(files) > 0:
for file_name in files:
if os.path.splitext(file_name)[1] in possible_img_extension:
img_path = root + '/' + file_name
img_path = img_path.replace('\\\\', '/')
img_path_list.append(img_path)
사용 기술 설명:
- 데이터 수집:
- os.walk()를 사용하여 지정된 디렉토리 내의 모든 이미지 파일을 재귀적으로 탐색합니다.
- 이는 대량의 데이터를 효율적으로 수집하는 방법으로, 딥러닝 모델의 성능 향상에 중요합니다.
- 파일 필터링:
- 특정 확장자를 가진 파일만 선택하여 데이터의 일관성을 유지합니다.
- 이는 데이터 품질 관리의 첫 단계로, 모델 학습의 안정성을 높입니다.
2. 이미지 전처리 및 특징 추출
코드 블록:
inpBlob = cv2.dnn.blobFromImage(image, 1.0 / 255, (imageWidth, imageHeight), (0, 0, 0), swapRB=False, crop=False)
net.setInput(inpBlob)
output = net.forward()
사용 기술 설명:
- 이미지 정규화:
- cv2.dnn.blobFromImage를 사용하여 이미지를 [0, 1] 범위로 정규화합니다.
- 정규화는 모델의 수렴 속도를 높이고 안정적인 학습을 가능하게 합니다.
- 사전 훈련된 모델 사용:
- net.forward()를 통해 사전 훈련된 포즈 추정 모델을 사용합니다.
- 이는 전이 학습의 한 형태로, 복잡한 특징을 효과적으로 추출할 수 있게 합니다.
3. 포즈 추정 및 시각화
코드 블록:
points = []
for i in range(0, 15):
probMap = output[0, i, :, :]
minVal, prob, minLoc, point = cv2.minMaxLoc(probMap)
x = (imageWidth * point[0]) / W
y = (imageHeight * point[1]) / H
if prob > 0.1:
cv2.circle(image, (int(x), int(y)), 3, (0, 255, 255), thickness=-1, lineType=cv2.FILLED)
points.append((int(x), int(y)))
else:
points.append(None)
사용 기술 설명:
- 키포인트 검출:
- 확률 맵에서 최대값을 찾아 키포인트를 검출합니다.
- 이는 이미지에서 중요한 특징(인체 관절 위치)을 추출하는 과정입니다.
- 임계값 기반 필터링:
- 확률이 0.1보다 큰 키포인트만 선택하여 노이즈를 줄입니다.
- 이는 모델의 robustness를 높이는 기법입니다.
- 데이터 증강:
- 검출된 키포인트를 이미지에 시각화하는 것은 일종의 데이터 증강으로 볼 수 있습니다.
- 이는 모델이 포즈 정보에 더 집중할 수 있게 해주는 기법입니다.
4. 모델 아키텍처 설계
코드 블록:
inputs = tf.keras.Input(shape=input_shape)
x = tf.keras.layers.Lambda(preprocess_input)(inputs)
resnet_model = ResNet50(weights='imagenet', include_top=False, input_shape=input_shape, input_tensor=x)
for layer in resnet_model.layers:
layer.trainable = False
x = tf.keras.layers.GlobalAveragePooling2D()(resnet_model.output)
x = tf.keras.layers.Dense(256, activation='relu')(x)
x = tf.keras.layers.Dropout(0.5)(x)
predictions = tf.keras.layers.Dense(3, activation='softmax')(x)
model = tf.keras.models.Model(inputs=inputs, outputs=predictions)
사용 기술 설명:
- 전이 학습:
- ImageNet에서 사전 훈련된 ResNet50 모델을 기반으로 합니다.
- 이는 적은 양의 데이터로도 높은 성능을 달성할 수 있게 해주는 강력한 기법입니다.
- 특징 추출기 동결:
- ResNet50의 레이어들을 동결(trainable=False)하여 특징 추출기로 사용합니다.
- 이는 과적합을 방지하고 학습 속도를 높이는 기법입니다.
- Global Average Pooling:
- 특징 맵의 공간 정보를 압축하여 파라미터 수를 대폭 줄입니다.
- 이는 모델의 일반화 능력을 높이고 과적합을 방지하는 기법입니다.
- Dropout:
- 학습 중 무작위로 뉴런을 비활성화하여 과적합을 방지합니다.
- 이는 앙상블 효과를 내는 정규화 기법입니다.
- Softmax 활성화:
- 다중 클래스 분류를 위한 출력 층으로 사용됩니다.
- 각 클래스에 대한 확률 분포를 생성합니다.
5. 모델 컴파일 및 학습
코드 블록:
optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)
model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])
checkpoint_path = "models/best_resnet.h5"
model_checkpoint = ModelCheckpoint(checkpoint_path, save_best_only=True, monitor='val_accuracy', mode='max', verbose=1)
early_stopping = EarlyStopping(monitor='val_accuracy', patience=5)
history = model.fit(train_ds, validation_data=val_ds, epochs=5, callbacks=[model_checkpoint, early_stopping])
사용 기술 설명:
- Adam 옵티마이저:
- 적응적 학습률을 사용하여 효율적인 최적화를 수행합니다.
- 이는 빠른 수렴과 안정적인 학습을 가능하게 합니다.
- Categorical Crossentropy 손실 함수:
- 다중 클래스 분류 문제에 적합한 손실 함수입니다.
- 모델의 예측과 실제 레이블 간의 차이를 효과적으로 측정합니다.
- ModelCheckpoint:
- 검증 정확도가 가장 높은 모델을 저장합니다.
- 이는 최적의 모델을 선택하는 기법입니다.
- EarlyStopping:
- 검증 정확도가 개선되지 않으면 학습을 조기에 중단합니다.
- 이는 과적합을 방지하고 컴퓨팅 리소스를 절약하는 기법입니다.
이러한 기술들은 현대 딥러닝에서 널리 사용되는 best practices로, 효율적인 학습과 높은 성능의 모델 개발을 가능하게 합니다.
반응형
'Python > openCV' 카테고리의 다른 글
테서렉트 예제 (0) | 2023.03.17 |
---|---|
테서렉트 설치(사전준비) (0) | 2023.03.16 |
Python OpenCV (영상 필터링, 블러, 가우시안, 미디안, 샤프닝, 케니) (0) | 2023.03.12 |
Python OpenCV (영상의 이진화, 자동 이진화, 지역 이진화, 적응형 이진화, 모폴로지) (0) | 2023.03.10 |
Python openCV (어파인, 크기변환, 영상회전, 보간법, 투시변환) (0) | 2023.03.09 |