본문 바로가기

tensorflow-machine learning

Tensorflow model training & mAP , Tensorboard

앞서 pipeline 의 작성법을 학습하였고  

tensorflow 2 환경은 tensorflow1 환경과 약간 차이가 있기 때문에

이번에는 tensorflow 2 환경의 model training을 진행하겠습니다

tf 1 버전에서는 하나의 프로세서로 학습과 검증이 모두 가능하며
tf 2 버전에서는 두개의 프로세서로 학습 1개 검증 1개 수행해야합니다

 

/home/user_directory/tensorflow/models/research/object_detection/model_lib_v2.py   파일 내부

:558로 558번째 줄로 이동해서 확인해 보면

with tf.compat.v2.summary.record_if (    안 람다문이 존재할 것입니다

해당 람다문은 검증 빈도를 나타내는 것인데 

기존 lambda: global_step % (num_steps_per_iteration * 100) == 0): 이고
num_steps_per_iteration 가 1로 설정되어 있으니 총 100번에 한번 학습 로그를 작성한다는 내용입니다
너무 많으면 로그파일 용량이 너무 커지니 적당히 조절해야 합니다

 

검증 프로세서를 켜 두려면 크게 3개의 옵션이 필요하며
checkpoint_dir / model_dir / pipeline_config_path 
checkpoint_dir옵션을 주면 eval_only 모드로 동작합니다

 

검증 파일만 수행해도 거의 모든 그래픽 메모리를 소모하기 때문에 학습에 메모리를 투자하기 위하여

CUDA_VISIBLE_DEVICES="" 옵션을 주어 그래픽 사용량을 없에 검증은 cpu로 동작하도록 설정해 주도록 합니다

옵션들을 고려한 tf1환경의 검증 동작 명령은 

CUDA_VISIBLE_DEVICES="" python model_main_tf2.py --checkpoint_dir /home/hhnam/tensorflow/train/210927_ssd_resnet --model_dir /home/hhnam/tensorflow/train/210927_ssd_resnet --pipeline_config_path /home/hhnam/tensorflow/train/210927_ssd_resnet/pipeline.config 

이며 돌린 직후에는 학습 명령이 돌아가지 않기 때문에 checkpoint를 기다리는 명령이 출력 될 것이며

 

CUDA_VISIBLE_DEVICES=0 python model_main_tf2.py --model_dir /home/hhnam/tensorflow/train/210927_ssd_resnet --pipeline_config_path /home/hhnam/tensorflow/train/210927_ssd_resnet/pipeline.config --checkpoint_every_n=2500 로 학습 프로세서를 동작시키면

2500step에 한번씩 checkpoint를 기록하며 그걸 읽어와 검증하는 부분이 보일 것입니다

만일 검증 집합이 너무 많은 경우에는 sample_1_of_n_eval_example  옵션을 주어 전체 검증집합의 1/n을 해 줍니다

 

다음으로는 tensorboard를 동작하는 방법에 대하여 알아보겠습니다

우선 tensorboard는 우리가 학습시킨 모델에 대하여

모델의 구조와 mAP등 학습과 검증의 결과들을 그래프화 시켜 나타냅니다

우선 우리가 저장해 두었던 checkpoint의 위치로 이동하여

tensorboard --help를 입력하여 필요 옵션들에 대하여 알아보겠습니다

 

logdir,host,bind_all,port 가 우선 중요한 옵션들이며
logdir-log가 기록된 곳의 경로를 입력하는 옵션이며 해당 위치의 로그들을 확인할수 있습니다
host - tensorboard를 띄우고자 하는 host 주소 defalt값은 localhost가들어간다
bind_all  --옵션을 줄 경우 host 외부에서 접속이 가능하다 만일 주지 않는다면 호스트 내부에서만 접속이 가능하다
port 기본적으로 6006번을 사용합니다 하지만 여러개의 텐서 보드를 띄울경우 직접 포트 번호를 지정할 수 있습니다

 

필자의 경우 tensorboard 를 동작시키는 명령을

tensorboard --logdir ./ --bind_all로 주었으며 ./는 현재 디렉토리라는 의미이기 때문에

현재 체크포인트가 존재하는 디렉토리 내부에 있기 때문에

현재 디렉토리를 logdir로 주고 테스트 서버에서 작업을 진행하였기 떄문에 

./옵션으로 host외부에서도 접속이 가능하게 하였습니다

 

tnesorboard를 들어가보면 여러 측면에서 평가를 진행하여 그래프화 시킨 것을 볼 수 있는데

그중에서

 

모델이 true를 true라 판단한것-TP
      false를 true라 판단한것-FP   ---true라 예측
      true를 false라 판단한것-FN
      false를 false라 판단한것-TN  ----false라 예측
      모델이 true라 예측한것=TP+FP
      모델이 False라 예측한것=FN+TN
      실제 true인것=TP+FN
      실제 False인것=FP+FP
      
정밀도 (precision)
      정밀도란 모델이 전체 true라 판단한 것 중 실제 true의 비율 즉 TP/(TP+FP)
      예를 들면 모델이 A란 답을 낸것중 그게 맞는 비율을 말한다
      
재현율(recall)
      실제 true 인것들중 모델이 true라 예측한 것의 비율 즉 TP/(TP+FN)
      예를 들면 실제 A란 정답인것중 모델이 A라고 말한 비율을 말한다
      
F1 score(조화 평균)
      정밀도와 재현율을 보고 모델의 성능을 판단하기 위한 지표 
      모델의 성능을 확인하기 위해서는 그냥 정밀도와 재현율의 평균을 구하는 것으로는 부족하다
      왜냐하면 만일 거의 모든 데이터들을 true라고 판단하는 모델이 있다고 가정하자
      이러한 경우 true인 것들은 거의 true라 답할 것이기 때문에 재현율은 거의 1 가까이 나올수도 있을 것이다
      하지만 정밀도로 보았을때 거의 모든 false마저도 true라고 답할 것이기 때문에 false가 압도적으로 많은 데이터로 
      가정하였을때 정밀도는 아주 낮은 값을 가질수도 있을 것이다 예를 들어 0.01이라 가정하자
      이 경우 모델에 대해서는 출력값이 거의 다 true로만 표기된다는 큰 문제점이 있음에도 불구하고 재현율과 정밀도의 평균은
      0.505라는 높은 값을 가진다 
      이를 확인하기 위하여 조화 평균을 사용하며 수식은   (2*정확도*재현율)/(정확도+재현율) 이다
      이는 만일 재현율과 정밀도 둘중 하나라도 아주 낮은 값을 가진다면 조화 평균에 영향을 끼치게 만드는 것이며
      위와 같은 경우로 계산해 보았을 경우 0.019라는 아주 작은 값을 가지는 것을 볼 수 있다
    
mAP (mean average precision)
      우선 confidence 에 대한 이해가 먼저여야 합니다 신뢰성이란 결과에 대한 확신으로 정밀도와 비슷하게 생각하시면 됩니다
      confidence가 1인경우 내가 말 한 것에 대해서는 전부다 맞는 정답인 것으로 정밀도 또한 1이 나올 것이나
      재현율은 부진할 가능성이 높습니다 만일 confidence가 낮은 값을 가질 경우
      모델이 말한 결과에 대해서는 오답을 말할 가능성이 높아지지만 그만큼 정답이라고 말 하는 비율이 높아질 것이기 때문에 recall 
      값은 증가하는 추세를 가질 것입니다 이러한 confidence 값을 기준으로 내림차순 정렬을 진행하고 
      올바른 측정 범위에 사용할 기준인 threshold를 confidence에 적용시킵니다 이 임계값을 차차 줄여나가며 precision/recall
      그래프를 그린뒤 x축은 recall y 축은 precision으로 잡고 그린 그래프를 PR그래프라 칭합니다 
      곡선 형태를 직사각형 형태로 수정 해 준 뒤 그래프의 범위면적을 구해줍니다 이 면적값을 AP라 칭합니다
      mAP는 물체의 클래스가 여러 가지인 경우 각 클래스당 구한 AP를 평균 낸 것을 말합니다

 

해당 부분들이 그래프 해석에 큰 역활을 한다고 말할 수 있습니다