본문 바로가기

Machine Learning 이야기

Darknet detector 여러가지 오류 처리하기

Darknet의 detector 예제를 다른 프로그램에 가져다 쓰고 싶어서 원본 폴더에서 필요한 파일들만 복사를 하니

여러가지 오류가 발생했습니다...

 

열심히 구글검색도 하고, 없는 건 직접 찾아보기도 하면서 처리해 본 오류들을 올려보겠습니다.

부디 Darknet 이용하시는 분들께 도움이 되기를 바랍니다

 

하나 고칠 때 마다 주석 달다보니 길이가 readme 수준이 됐습니다

Darknet의 코드를 분석해 보니 그대로는 다른 코드에 이식이 거의 불가능한 수준이었습니다.

일반적으로 사용한다면 Darknet에서 제공해주는 프로그램을 그대로 사용해서 결과를 출력해 볼 수 있겠습니다만

해당 프레임워크를 이용해 결과를 다른 프로그램에서 처리하도록 만들려다 보니까 문제가 많이 발생하는 코드였습니다.

 

제가 만났던 오류들을 정리해 보려고 합니다

 

1. import darknet as dn 오류

detector.py를 다른 곳으로 옮겨 실행하려고 할 때, 아무 생각 없이 실행하면 제일 먼저 이 오류를 보게 됩니다.

파이썬을 조금 다뤄보신 분이라면 아시겠지만 직접 작성한 코드를 import 하려면 상대경로를 작성해 주어야 하지요

하지만 Darknet에서는 이를 모두 적지 않고 import darknet이라고만 명시하고 있습니다.

대신 sys.path를 이용해서 시스템 경로를 직접 추가해 줍니다

아무 명령어 없이 import를 이용해 패키지를 포함시키는 경우 이 시스템 경로 밑에서 패키지를 가져오기 때문에 경로를 입력해줄 필요가 없는데요

detector.py 코드에서는 darknet.py 파일이 있는 경로를 직접 시스템 경로에 추가해서 추가 명령어 없이 포함시키고 있습니다.

좀 더 깔끔한 방법도 있었을 것 같은데... 이런 방법을 사용하기 때문에 import가 코드 중간에 들어가게 됩니다.

 

detector.py를 다른 프로그램에 이식시키기 위해 이동시켰을 경우

sys.path.append() 를 이용해서 darknet.py 파일이 있는 경로를 포함시켜 줍시다.

os.getcwd()를 이용하면 현재 경로를 그대로 가져올 수 있어 다른 코드로 옮기더라도 작동하는 코드로 작성할 수 있습니다.

 

 

2. OSError: libdarknet.so: cannot open shared object file: No such file or directory 오류

오류 문장을 해석해보시면 아시겠지만, 말 그대로 libdarknet.so 파일을 찾지 못해 생기는 오류입니다.

darknet은 파이썬으로 구동하지만 속도 문제 때문에 분석은 C로 작성된 프로그램으로 진행되는데요

이 때 make의 결과로 생성되는 libdarknet.so 파일을 찾지 못하면 분석을 실행할 수가 없습니다.

 

darknet.py파일(기본경로:darknet/python/) 내부를 보시면

이 친구들이 놀랍게도 기본 경로를 본인들 pc의 경로로 박아 놓았습니다...

각자 자신의 pc의 libdarknet.so 파일의 경로를 추가해주시면 해결할 수 있습니다.

여기에서도 os.getcwd()를 이용해주면 좀 더 범용적인 코드를 작성할 수 있겠습니다.

 

 

3. invalid ELF header 오류

make를 할 때 각 PC마다 입력되는 정보가 달라서 일어나는 오류 같습니다.

다른 PC에서 미리 make된 파일을 가져와서 사용할 경우 이러한 오류를 만나게 됩니다.

 

해결 방법은 간단합니다.

자신의 PC에서 다시 make를 해주면 됩니다.

 

주의하실 점은, 코드에 아무 변화 없이 make를 하게 되면 프로그램이 빌드할 것이 없다고 인식하여 새로 빌드되지 않습니다.

무작정 make만 다시 입력한다고 해서 해결되지 않는 거죠.

 

따로 코드를 수정해야 할 부분이 있는 것은 아니니, 아예 빌드 결과로 생성된 목적 파일들을 삭제해주고 다시 make해주면 됩니다.

여기에서는 darknet 폴더 안에 있는 libdarknet.so, libdarknet.a, darknet 파일과 obj 폴더를 삭제해 줍니다.

그리고 다시 make하게 되면 Darknet을 처음 다운로드 받아 make 했을 때 볼 수 있던 과정을 다시 보게 될 것입니다.

성공적으로 make가 완료되면 정상적인 실행이 가능할 것입니다.

 

저는 다른 PC에서 코드를 실행시킬 때 마다 일일히 다시 make를 하는 게 비효율적이라고 생각하여

try except문을 이용해 오류가 날 경우 자동으로 목적 파일들을 삭제하고 다시 make를 해주도록 코드를 작성해 두었답니다.

 

 

4. Couldn't open file: data/coco.names 오류

 

오류명이 이게 맞았나? 사실 정확히 기억이 잘 안 납니다만...

coco.names를 찾지 못한다는 오류가 생기는 경우가 있습니다.

이럴 땐 coco.data파일(기본경로:darknet/cfg/coco.data)을 열어준 후

names = [경로] 부분을 자신이 갖고 있는 coco.names파일 경로에 맞춰 수정해 주시면 됩니다.

 

간단하게 경로 수정만 해주면 끝

 

5. dn.set_gpu 를 찾지 못할 때

 

사실 이 오류는 원인을 정확히 파악하지 못했습니다..

detector.py 코드 자체를 또다른 코드에서 import 시켜줄 경우 이런 오류가 발생했습니다.

import 과정에서 경로 오류가 생겨 찾지 못하게 되는 것 같기는 한데 정확히 어느 부분이 문제인지 파악을 못 했습니다.

 

다만, 해결방법은 찾았습니다.

detector.py를 따로 모듈화해주지 않고 main 코드 안에서 실행시킬 경우 문제 없이 실행되었습니다.

 

main 코드 안에 class로 만든 후 실행

함수로 만들어서 실행하는 것 자체에는 문제가 없는 것 같아

main 코드 안에서 함수로 만든 뒤 실행시켜 주었습니다.

덕분에 쓰레드 클래스가 좀 더러워지긴 했습니다만... 당시 마감기간이 거의 다 되어서 주먹구구로 해결을 했었네요.

 

혹시나 더 좋은 해결방법을 찾으신 분이 계시다면 공유해주시면 감사하겠습니다!

이 문제는 구글을 열심히 뒤져봐도 해결방법이 안 보이더라구요.

 

 

6. load_net, load_meta 오류

단순한 경로 오류인데, 눈에 잘 안 들어올 때가 있지요.

각각 load_net에서 cfg파일과 weights 파일 경로를,

load_meta에서 coco.data파일의 경로를 실제로 파일이 있는 경로와 맞춰주시면 됩니다.

 

 

 

이상 Darknet의 detector.py 예제를 다른 곳에 이식시켜 사용할 때 발생하는 오류들을 몇가지 살펴 보았습니다.

사실 다른 자잘한 오류들도 많았습니다만, 가장 곯머리를 썩혔던 오류들을 추려 보았습니다.

 

Darknet의 코드를 분석하다보니, 오픈소스를 공개하려면 코드를 정말 신중하게 짜야 한다는 생각이 들었습니다.

설마 자기들 코드라고 자기 PC의 시스템 경로를 절대경로로 써놓을줄 누가 알았을까요...

꼭 오픈소스로 공개하지 않는다 하더라도 여러 대의 PC를 이용해 개발을 한다면 필요한 부분들인 것 같습니다.

 

코드, 유연하게 작성합시다!