티스토리 뷰

python의 Built-in Functions 중 eval 이라는 함수가 있다.

 

eval 은 문자열을 입력으로 받는다.

 

eval 의 출력은 입력받은 문자열이 Python interpreter로 해독가능하다면 그 문자열을 "코드"로 보고 실행한다. 그렇지 않은 경우는 예외가 발생한다.

 

eval('1+2') # 3
eval("'1'+'2'") # "12"

 

이런것도 가능하다.

class Foo:
    def __init__(self, x):
        self.x = x
        pass

foo = eval("Foo(x=5)")
print(foo.x) # 5

too = eval("Foo")(15)
print(too.x) # 15

 

활용 방법은 무궁무진하다.

 

실제 사용 예

YOLOv8 의 경우 모델 아키텍쳐가 컨피그 파일에 정의돼있다. 아래는 실제 예시로 레이어의 이름(Conv, C2f, ..., nn.Upsample 등)이 작성돼있는 것을 확인할 수 있다.

실제로 위에 적힌 레이어의 이름과 동일한 이름을 갖는 클래스가 그대로 구현돼있다.

https://github.com/ultralytics/ultralytics/blob/main/ultralytics/nn/modules.py

 

GitHub - ultralytics/ultralytics: YOLOv8 🚀 in PyTorch > ONNX > CoreML > TFLite

YOLOv8 🚀 in PyTorch > ONNX > CoreML > TFLite. Contribute to ultralytics/ultralytics development by creating an account on GitHub.

github.com

 

YOLOv8 프로젝트에서는 위 컨피그 파일을 읽고 레이어 이름을 파싱한뒤 그 레이어를 eval()에 넣고 그대로 Class로 변환해버린다. 

https://github.com/ultralytics/ultralytics/blob/main/ultralytics/nn/tasks.py#L427

 

GitHub - ultralytics/ultralytics: YOLOv8 🚀 in PyTorch > ONNX > CoreML > TFLite

YOLOv8 🚀 in PyTorch > ONNX > CoreML > TFLite. Contribute to ultralytics/ultralytics development by creating an account on GitHub.

github.com

eval을 몰랐다면

 

if 파싱된_레이어_이름 == "땡땡 레이어":

   layer = 땡땡 레이어 클래스 이름(args)

나는 일일이 위와 같이 조건문을 써서 한 번더 파싱된 스트링을 클래스로 변환하는 동작을 수행한다거나,

키를 파싱된 스트링, 밸류를 클래스로 저장하는 dictionary를 썼다거나 했을 거 같다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함