AI/Github

Yolov3 (tf1)를 tensorflow 2버전으로 실행해 보자(2)

아인샴 2021. 3. 3. 23:17

2021/03/03 - [AI/Github] - keras로 Yolov3 (tf1)를 tensorflow 2버전으로 실행해 보자

글이 길어서 나누었다.  그럼 바로 이어서 진행한다.


 

 

stack overflow에서 get_session 을 찾아봤더니 다행히도 있다고 한다. 그런데 다른 위치에 있기때문에 따로 import 해주셨다. 

SHBR은 소화불량이라는 뜻이다 :D
+k.sesssion은 신버전에서 호출하지 못하기 때문에 호출가능한 세션을 입력

 

+) 개발을 하다보면 오류문을 확인하기 위해 맨 아래를 보는 습관이 드는데, 에러가 발생한 위치를 거기서 알려주기 때문이다. 그런데 문법오류가 아닌 것 같다 싶으면 오류 구문을 위에서 부터 보는 것이 좋다. 

이런 느낌

"에러는 이래서 난 것 같다" 부분을 보면 load_model 과정에서 model_path를 입력받아 해당 모델을 호출하려는 과정에서 경로에 모델을 못 찾았다. saved_model 혹은 h5형태를 원하는 듯하다. 

 

해야 할 것 : weight를 h5로 변환하기 

  • github 페이지 quick start에서 변환하는 방법을 알려줬다. (이래서 보통 순서를 잘 지키라고 하는 것이다. 솔직히 안읽고 다른데 좀 찾았다.)
  • 나는 모델이 model/yolov3-tiny.weights 로 있으니 yolov3.weights를 이것으로 바꿔줬다. 그리고 yolov3.cfg로 yolo-tiny.cfg로 바꿧다. 
python convert.py yolov3.cfg yolov3.weights model_data/yolo.h5

모델 변환 완료

  • 방금 뭘 한거냐면, saved_model혹은 h5라는 모델 객체는 구조상 {학습 모델 + 모델 가중치}를 담고 있다. 
  • weights라는 것은 말 그대로 가중치 뿐이다. saved model or h5로 만들려면 학습 모델이 필요하다. 
  • .cfg에 학습모델구조가 들어있다. 
  • convert.py는 cfg의 학습 모델과 yolov3의 가중치를 합쳐서 h5로 만든 것이다. 

 


해야할 것 : h5 입력하기 + tiny 관련 파일 적용하기  

아예 default가 되어있길래 yolo-tiny로 바꿔줬다. 이런걸 하드코딩이라고 하는데 지양해야 한다. 

  • model path 뿐만 아니라 anchors path도 tiny 버전으로 바꿔 줘야 한다.(git에 포함되어있음) 다운로드 시간 아끼려다가 코드 적용하는데 더 시간을 쓰는 것 같다. 
  • 이렇게 실행하면 input 이미지를 입려해줘도 어째서인지 무시하고 다시 이미지를 입력해달라고 한다. 그렇게 하면feed_dict에서 에러가 발생한다. 드디어 sess.run에서 오류가 발생한 것이다. sess.run의 유무는 tf1과 2의 아주 큰 다른 점이다. 

Tensor를 unhash할수가 없다. 연산이 안된다는 뜻이다. (버전이 다르니) 처리함수가 잘못되어서 일 것이라 생각한다. 
오류가 일어난 129라인 

  • 129번 라인 sess.run에서 하는 것은 네트워크(모델구조)와 가중치를 갖고 있는 모델에게 input을 주는 것이다. tf 1에서는 feed dict라는 형식으로 비교적 섬세하게 줬으나 2에서는 input param! output! 으로 심플해졌다. 
더보기

tensorflow 에서 1.0을 2로 바꾸는 방법을 알려줬다. 

loss가 잘렸다. 괜찮다. 아래 출처 링크에서 보면된다.  덧붙이지 않는 이유는 여기까지 흐름을 파악하면 된다. 

tensorflow 에서 1.0을 2로 바꾸는 방법을 알려줬다. 

tf. 1 code
tf. 2 code

loss가 잘렸다. 괜찮다. 아래 출처 링크에서 보면된다.  덧붙이지 않는 이유는 여기까지 흐름을 파악하면 된다. 

tf1관점에서 바라본 tf2 특

input과 output은 해당 yolov3 -tiny 모델을 보고 맞췄다. 
모델을 보니 맞은게 요행인 것 같은 기분이 든다..

이제 모델추론을 진행했으니, 남은 것은 모델 output을 후처리 하여 사용자가 원하는 값을 출력하는 것이다. 

 


현재 상태 : 기존 모델의 아웃풋이 out_boxes, out_scores, out_classes 였는데 지금 모델이 출력한 것은 1, 2 이다. 무언가 2개가 합쳐져 있는 상태라 생각한다. output shape은 아래와 같다.

 

맨처음은 모델 인풋 이미지, afraid 다음은 out_score_classes, box 다음은 out_boxes