개발 관련/SW, App 관련

Darknet을 통한 Yolov3-tiny 훈련

소서리스25 2024. 10. 7. 11:39
반응형

Darknet을 통한 Yolo v3 tiny훈련

 

지난번에 Darknet을 이용하여 Yolov2-tiny로 커스텀데이터셋을 결국에는 Unity에 인식하는데 어느 정도 성공을 해서 이번에는 Yolov3-tiny를 시도해 보았다.

 

참고적으로 Unity의 Barracuda는 Yolov3을 지원한다. 지원하는 Barracuda의 버전은 살펴봐야 하겠지만 상위버전이면 지원할 것이다. Barracuda 매뉴얼에 나와 있다. 다만, Yolov3-tiny는 확인이 필요하다. 

 

따라서 이번에는 이전보다 성능? 좋은 Yolov3-tiny로 훈련하여 인식해 보기로 했다. 이게 더 좋으면 이걸 써야되지 않겠는가..

 

기본적인 cfg 설정은 기존의 Yolov3-tiny를 알맞게 수정해 준다.

특히 filters부분이 이전 버전과 다르다

Yolov2-tiny
filters=30  (5 + class 수) * 5
classes = 1


Yolov3-tiny
filters=18  (5 + class 수) * 3
classes = 1

 

이제 이것을 기준으로 Darknet 훈련을 통해 weight 파일을 6시간만에 끝냈다.

 

그리고 기존의 컨버팅 도구인 coreml 로 기존 셋팅으로 컨버팅 했으나 바로 오류가 났다.

 

오류의 원인은 생각보다 쉽게 찾았다.

이전에 keras로 컨버팅 했던 yolov3-tiny 파일을 살펴보면 output이 2개로 출력된다. 기존 yolov2-tiny의 셋팅은 1개로 출력된다.

 

따라서 coreml도 2개로 출력하면 되는 것이다.

그러면 convert2CoreML.py에서 주석으로 달아두었던 output 부분을 2개의 출력으로 변경해 주면 된다.

    coreml_model = coremltools.converters.keras.convert(
        model,
        input_names='input1', image_input_names='input1', output_names=['output1', 'output2'], image_scale=1/255.,
        add_custom_layers=True,custom_conversion_functions={ "Mish": convert_mish })
    coreml_model.input_description['input1'] = 'Input image'
    coreml_model.output_description['output1'] = 'The 13x13 grid (Scale1)'
    coreml_model.output_description['output2'] = 'The 26x26 grid (Scale2)'
#me    coreml_model.output_description['output3'] = 'The 52x52 grid (Scale3)'
    coreml_model.save(output_path)

 

 

그러면 정상적으로 모델이 출력된다.

 

이제 Yolov3-tiny를 Unity에서 돌려서 확인할 차례이다. (다음 포스팅 예정)

 

반응형