Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- yolo
- TensorFlow
- ctypes
- python
- 딥러닝
- 텐서플로우
- 프로그래머
- 호흡분석
- C언어
- 설치
- 헬스케어
- 파이썬
- 게임개발
- 논문
- Detectron2
- ChatGPT
- 리뷰
- V3
- 파워셀
- connx
- 개발자
- 논문리뷰
- 언리얼엔진
- CycleGAN
- 이터널리턴
- 언어모델
- NPY
- 욜로
- 딜러닝
- pyqt5
Archives
- Today
- Total
사냥꾼의 IT 노트
[딥러닝]논문에 자주 등장하는 validation이 대체 뭘까? 본문
일반적으로 데이터셋 구조를 생성할 때 train, test 이렇게 두 가지를 만들 것이다.
하지만 좀 더 깊이 들어가서 논문을 읽다보면, validation이라는 단어가 굉장히 자주 등장하고 이게 대체 뭘까 하는 의문이 들 것이다.
사전적 의미
국민 번역 프로그램 파파고에 의하면 validation의 사전적 의미는 '확인'이라고 한다. 여기서 우리는 validation이 뭘 뜻하는지 어느정도 유추가 가능하다.
딥러닝에서의 'validation'
validation은 학습이 완료된 모델을 검증하기 위한 데이터셋이다. 즉, 중간 점검을 위한 것이다.
딥러닝 분야에서 대부분은 train 데이터셋으로 학습을 시키고, 정확한 성능 평가를 위해 중간 피드백을 하고 수정을 거쳐 최종 output이 추출된다. 이를 위해 validation 데이터셋이 필요한 것이다.
def save_validation_result(model, ckpt, validation_summary_writer, num_visualize_image):
total_validation_total_loss = 0.0
total_validation_coord_loss = 0.0
total_validation_object_loss = 0.0
total_validation_noobject_loss = 0.0
total_validation_class_loss = 0.0
for iter, features in enumerate(validation_data):
batch_validation_image = features['image']
batch_validation_bbox = features['objects']['bbox']
batch_validation_labels = features['objects']['label']
batch_validation_image = tf.squeeze(batch_validation_image, axis=1)
batch_validation_bbox = tf.squeeze(batch_validation_bbox, axis=1)
batch_validation_labels = tf.squeeze(batch_validation_labels, axis=1)
validation_total_loss, validation_coord_loss, validation_object_loss, validation_noobject_loss, validation_class_loss = calculate_loss(model, batch_validation_image, batch_validation_bbox, batch_validation_labels)
total_validation_total_loss = total_validation_total_loss + validation_total_loss
total_validation_coord_loss = total_validation_coord_loss + validation_coord_loss
total_validation_object_loss = total_validation_object_loss + validation_object_loss
total_validation_noobject_loss = total_validation_noobject_loss + validation_noobject_loss
total_validation_class_loss = total_validation_class_loss + validation_class_loss
#validation tensorboard log 저장
with validation_summary_writer.as_default():
tf.summary.scalar('total_validation_total_loss', total_validation_total_loss, step=int(ckpt.step))
tf.summary.scalar('total_validation_coord_loss', total_validation_coord_loss, step=int(ckpt.step))
tf.summary.scalar('total_validation_object_loss ', total_validation_object_loss, step=int(ckpt.step))
tf.summary.scalar('total_validation_noobject_loss ', total_validation_noobject_loss, step=int(ckpt.step))
tf.summary.scalar('total_validation_class_loss ', total_validation_class_loss, step=int(ckpt.step))
# validation test image 저장
for validation_image_index in range(num_visualize_image):
random_idx = random.randint(0, batch_validation_image.shape[0] - 1)
image, labels, object_num = process_each_ground_truth(batch_validation_image[random_idx], batch_validation_bbox[random_idx],
batch_validation_labels[random_idx], input_width, input_height)
drawing_image = image
image = tf.expand_dims(image, axis=0)
predict = model(image)
predict = reshape_yolo_preds(predict)
#예측값 parsing
predict_boxes = predict[0, :, :, num_classes + boxes_per_cell:]
predict_boxes = tf.reshape(predict_boxes, [cell_size, cell_size, boxes_per_cell, 4])
confidence_boxes = predict[0, :, :, num_classes:num_classes + boxes_per_cell]
confidence_boxes = tf.reshape(confidence_boxes, [cell_size, cell_size, boxes_per_cell, 1])
class_prediction = predict[0, :, :, 0:num_classes]
class_prediction = tf.argmax(class_prediction, axis=2)
#예측 영역(bounding box) 리스트 생성
bounding_box_info_list = []
for i in range(cell_size):
for j in range(cell_size):
for k in range(boxes_per_cell):
pred_xcenter = predict_boxes[i][j][k][0]
pred_ycenter = predict_boxes[i][j][k][1]
pred_box_w = tf.minimum(input_width * 1.0, tf.maximum(0.0, predict_boxes[i][j][k][2]))
pred_box_h = tf.minimum(input_height * 1.0, tf.maximum(0.0, predict_boxes[i][j][k][3]))
pred_class_name = cat_label_dict[class_prediction[i][j].numpy()]
pred_confidence = confidence_boxes[i][j][k].numpy()[0]
# add bounding box dict list
bounding_box_info_list.append(yolo_format_to_bounding_box_dict(pred_xcenter, pred_ycenter, pred_box_w, pred_box_h, pred_class_name, pred_confidence))
#정답 영역(bounding box) 리스트 생성
ground_truth_bounding_box_info_list = []
for each_object_num in range(object_num):
labels = np.array(labels)
labels = labels.astype('float32')
label = labels[each_object_num, :]
xcenter = label[0]
ycenter = label[1]
box_w = label[2]
box_h = label[3]
class_label = label[4]
# label 7 : cat
# add ground-turth bounding box dict list
if class_label == 7:
ground_truth_bounding_box_info_list.append(
yolo_format_to_bounding_box_dict(xcenter, ycenter, box_w, box_h, 'cat', 1.0))
ground_truth_drawing_image = drawing_image.copy()
#정답 이미지 drawing
for ground_truth_bounding_box_info in ground_truth_bounding_box_info_list:
draw_bounding_box_and_label_info(
ground_truth_drawing_image,
ground_truth_bounding_box_info['left'],
ground_truth_bounding_box_info['top'],
ground_truth_bounding_box_info['right'],
ground_truth_bounding_box_info['bottom'],
ground_truth_bounding_box_info['class_name'],
ground_truth_bounding_box_info['confidence'],
color_list[cat_class_to_label_dict[ground_truth_bounding_box_info['class_name']]]
)
#confidence 값이 최대인 box 찾기
max_confidence_bounding_box = find_max_confidence_bounding_box(bounding_box_info_list)
#예측값 그리기
draw_bounding_box_and_label_info(
drawing_image,
max_confidence_bounding_box['left'],
max_confidence_bounding_box['top'],
max_confidence_bounding_box['right'],
max_confidence_bounding_box['bottom'],
max_confidence_bounding_box['class_name'],
max_confidence_bounding_box['confidence'],
color_list[cat_class_to_label_dict[max_confidence_bounding_box['class_name']]]
)
#왼: 정답 영역/오: 예측 영역으로 box 설정
drawing_image = np.concatenate((ground_truth_drawing_image, drawing_image), axis=1)
drawing_image = drawing_image / 255
drawing_image = tf.expand_dims(drawing_image, axis=0)
#tensorboard log 저장
with validation_summary_writer.as_default():
tf.summary.image('validation_image_'+str(validation_image_index), drawing_image, step=int(ckpt.step))
YOLO v1 모델 구현의 train.py에 쓰인, validation을 구하기 위한 함수 코드이다. 위 코드와 같이 중간 점검을 행하고 추가적으로 학습을 진행해 최종 output이 산출된다.
'딥러닝' 카테고리의 다른 글
[딥러닝]mmWave 센서를 이용한 호흡 분석 - 센서 연결 (0) | 2023.03.06 |
---|---|
[딥러닝]정확한 객체 검출을 위한 NMS (0) | 2022.09.27 |
[딥러닝]Detectron 2에 대해서 알아보자 (0) | 2022.07.15 |
[딥러닝]Object Detection은 대체 무엇인가 (0) | 2022.07.07 |
[딥러닝]IOU에 대해서 이해해보자 (0) | 2022.07.07 |