openxlab

openxlab

wandering developer 2023. 10. 27. 23:18

 

openmmdetection을 보다가 알게된 중국 open source 커뮤티니

 

칭화대와 상하이 대 출신들이 추죽으로 관리하고 발전 시키고 있는것 같다.

 

https://openxlab.org.cn/openplatform?lang=en-US

 

OpenXLab

 

openxlab.org.cn

 

내가 관심있어 하는 분야는

 

OpenMMLab

 

OpenDriveLab

 

그러나 OpenMMLab에 들어가보면 많은 프로젝트가 존재함.

 

개인적으로 OpenMMDetection파트가 정리가 가장 잘되어 있음.

MMEngine도 보면 많이 유익함.

 

내가 이렇게 카테고리를 만든 이유는 그 만큼 좋고 유용하다는 의미임.

 

하나하나 정리하면서 만들어 보자

 

https://github.com/open-mmlab/OpenMMLabCourse/blob/main/articles.md

 

여기 기사 모음도 상당히 좋은 기사만 모아놨음.

 

중국어로 되어 있기때문에 자동 번역을 위해서 크롬으로 꼭 봐야함.

 

예로 하나의 기사를 번역해서 올려 보겠다.

예1) 

출처 :  https://zhuanlan.zhihu.com/p/387484734

 

OpenMMLab 的 cfg 模式和 Registry 机制

文@ 429212本文投稿来自:Yimian Dai OpenMMLab 社区 ID:429212,PhD 在读,研究方向包括图像处理、计算机视觉和遥感。OpenMMLab 社区精选专栏面向社区征稿啦 欢迎社区的小伙伴在使用 OpenMMLab 各个方向算

zhuanlan.zhihu.com

OpenMMLab의 cfg 모드 및 레지스트리 메커니즘

import argparse

# 创建解析对象
parser = argparse.ArgumentParser()

# 添加命令行参数及默认值
parser.add_argument('--model', type=str, default='fcn',
                    help='model name (default: fcn)')

# 完成解析
args = parser.parse_args()

위와 같이 일반적으로 argparse 를 통해서 입력 변수를 받도록 구현하는데.

OpenMMLab 에서는 아래처럼 cfg방식을 채택해서 구현했다는 내용임.

 

위와 대조적으로 OpenMMLab 시리즈의 주요 특징은 cfg 모드를 채택한다는 것입니다. 즉, 모든 매개변수 설정이 구성 파일( 예: mmseg) 에 기록됩니다. 기본 형식의 경우 configs/fcn/fcn_r50-d8_512x512_20k_voc12aug.py특정 py매개변수 설정은 사전 형태로 존재하며, 아래와 같이 사전을 중첩할 수도 있습니다. 즉 dictionary를 사용해서 구현했다는 내용임.

runner = dict(type='IterBasedRunner', max_iters=40000)
model = dict(
    type='EncoderDecoder',
    backbone=dict(
        type='ResNetV1c',
        # ... 省略
        num_stages=4),
    neck=dict(
        type='FPN',
        # ... 省略
        num_outs=4),
    # ... 省略
)

 

이 cfg 모드를 사용하면 다음과 같은 이점이 있습니다.

  1. 가독성 이 좋고, 같은 딕셔너리에 속한 모든 매개변수는 type키가 의 값인 클래스의 매개변수입니다.예를 들어 backbone이 경우 dict, depth, 등은 모두 값의 매개 변수입니다 .num_stagesout_indicestypeResNetV1c
  2. 사전의 중첩 구조를 통해 서로 다른 범주에 속하는 매개변수가 동일한 매개변수 이름을 가질 수 있습니다. 예를 들어 decode_head및 auxiliary_head두 매개변수 모두 이름이 지정된 매개변수를 가질 수 있습니다 in_channels.
  3. 매개변수는 구성 파일에 정의되어 있으므로 train.py파싱(파싱, 즉 클래스 인스턴스로 변환)만 담당하면 됩니다 Config. 이렇게 하면 모델 매개변수의 정의와 파싱이 분리되어 train.py특정 모델에 어떤 매개변수가 포함될지 독립적이게 됩니다. , train.py재사용된 여러 모델을 제공할 수 있도록 합니다.
  4. scripts/segmentation/train.pyGluonCV와 MMSegmentation의 구성 파일을 비교해 보면 후자가 전자에 비해 선택 매개변수가 훨씬 많아 더 많은 옵션이 노출되는 것을 알 수 있는데, 이는 OpenMMLab이 더 유연 IterBasedRunner또는 중에서 선택할 수 EpochBasedRunner있으며 이는 GluonCV에 하드 코딩되어 train.py있으며 선택 사항이 아닙니다.

마지막으로 획득한 것은 속성의 형태로 매개변수 값 획득을 지원하는 클래스 인스턴스인데, 원래 사전의 키는 Config 인스턴스의 속성 이름이 되고, 원래 사전의 값은 Config 인스턴스의 속성 값이 된다 cfg. Config 인스턴스를 사용하고 레이어별 중첩을 지원합니다 .Config

cfg = Config(dict(a=1, b=dict(b1=[0, 1])))

# 可以通过 .属性方式访问,支持嵌套访问
cfg.b.b1 # [0, 1]

 

더 좋은 내용이 많으므로 꼭 읽어 보길 바람.

 

예2) 

 

출처 :  https://zhuanlan.zhihu.com/p/387483425

 

解读 OpenMMLab 的 Hook 机制

文@ 429212本文投稿来自:Yimian Dai,OpenMMLab 社区专属ID:429212,PhD 在读,研究方向包括图像处理、计算机视觉和遥感。OpenMMLab 社区精选专栏面向社区征稿啦 欢迎社区的小伙伴在使用 OpenMMLab 各个

zhuanlan.zhihu.com

OpenMMLab의 후크 메커니즘 해석

 

hook이라는 것은 함수를 가로채는 기능을 의미함.

데코레이터 패턴과 비슷하고 함수를 등록해놓고 가로채는 방식으로 구현 가능함.

 

밑에 있는 댓글을 보자

- 기사에 따르면 후크는 다중 상속 문제를 해결하며 그 기능은 "함수 호출, 메시지 전달, 모듈 간 이벤트 전달을 가로채서 구성 요소의 동작을 수정하거나 확장하는 것"입니다. 관점에서 볼 때 일련의 후크는 실제로 별도로 구현됩니다. 클래스와 메소드는 데코레이터로 러너에 바인딩됩니다. 본질적으로 데코레이터처럼 느껴집니다. 모듈 간의 함수 호출을 가로채는 설명을 잘 이해하지 못합니다.

 

- Hook의 본질은 콜백 함수인데, 이는 미리 등록한 함수가 특정 순간에 호출된다는 뜻입니다. 기사에서 언급한 가로채기 함수는 일반적으로 함수 호출을 실행하는 것을 의미하며 실제로 구체적인 구현 방법에는 제한이 없으며 함수를 통해 직접 구현하거나 데코레이터를 통해 구현할 수 있습니다.

 

 

OpenMMLab이 Hook 메커니즘을 설계한 이유는 무엇입니까?


OpenMMLab 시리즈의 주요 특징은 이것이 사용하는 Hook 메커니즘입니다. 또한 컴퓨터 비전 알고리즘 프레임워크로서 초보자에게 이해하기 쉽고 친숙한 Gluon-CV에 비해 Hook 메커니즘은 의심할 바 없이 초보자가 OpenMMLab 시리즈 도구 상자를 시작하는 것을 더 어렵게 만듭니다. 자연스러운 질문은 왜 Hook 메커니즘을 도입하는가 하는 것입니다.

실제로 OpenMMLab의 Hook 메커니즘은 실제로 AOP(Aspect Oriented Program) 프로그래밍 아이디어 의 표현 입니다. 추상적인 수준에서 Hook 메커니즘을 도입해야 하는 이유를 묻는 것은 실제로 관점 지향 프로그래밍의 디자인 패턴을 소프트웨어 개발에 사용해야 하는 이유를 묻는 것입니다.

개인적인 대략적인 이해는 관점 지향 프로그래밍을 제안하는 이유가 객체 지향 프로그래밍(객체 지향 프로그래밍, OOP)의 코드 중복 문제를 해결하기 위한 것이라고 생각합니다. 객체지향 프로그래밍의 개념은 책임을 할당하고, 기능을 다양한 객체 클래스에 분산시키고, 다양한 클래스에서 다양한 메소드를 설계하는 것입니다. 두 클래스 A와 B가 동일한 메서드를 사용해야 하는 경우 메서드는 독립적인 클래스 C에 작성될 수 있으며 두 클래스는 이 클래스 C를 상속받을 수 있습니다. 그러나 이렇게 하는 데에는 두 가지 문제가 있습니다.

첫 번째 문제점은 자바 등 다중상속 기능이 없는 언어의 경우 클래스 C를 상속하면 다른 클래스를 상속할 수 없다는 점이다. 그런 다음 클래스 C를 상속하면 이를 얻는 방법이 작동하지 않습니다. 간단하고 조잡한 해결책은 클래스 C의 하위 함수를 클래스 A와 B에 각각 구현하는 것인데, 이 경우 완전히 동일한 코드가 두 곳에 존재하게 되어 코드의 중복이 크게 늘어납니다 . 이 방법을 수정하려면 두 위치를 모두 수정해야 합니다. 여전히 두 곳을 처리할 수 있는데, 이런 종류의 경우가 m개 있고 각각 n곳이 반복된다면 어떻게 될까요?

두 번째 문제는 상속이 가능하더라도 클래스 A와 B는 클래스 C와 결합된다는 점이다. 클래스 C와 유사하지만 다른 하위 기능을 갖는 클래스 D가 있다면 클래스 A와 B를 구성할 수 있으면 좋겠다. 옵션은 클래스 C 또는 클래스 D에서 하위 기능을 호출할지 여부를 동적으로 선택하므로 이 직접 상속 솔루션은 이러한 동적 선택의 유연성을 제공할 수 없습니다 .

본질적으로 객체지향 프로그래밍이 추구하는 캡슐화 기능은 상속 외에도 클래스 간의 연결과 공유를 차단 하지만, 코드의 중복을 줄이고 소프트웨어의 모듈화 수준을 향상시키기 위해서는 분산이 필요하다. 클래스 내의 중복된 코드가 통합되면 둘 사이에 모순이 발생합니다.

프로그램이 실행될 때 필요한 코드를 클래스의 지정된 메서드와 지정된 위치에 동적으로 잘라내는 이러한 종류의 프로그래밍 아이디어가 관점 지향 프로그래밍 입니다 . 그 중 여러 클래스에서 호출해야 하는 추출된 코드 조각을 측면(Aspect) 이라고 하며, 프로그램 실행 시 지정된 클래스의 지정된 메소드로 잘라냅니다. . 포인트 . 관점 지향 프로그래밍을 사용하면 현재 비즈니스 로직과 관련이 없는 부분을 별도의 레이어로 추출하여 비침해적인 기능 확장을 달성할 수 있습니다.

OpenMMLab 시리즈는 Hook 메커니즘을 통해 네트워크 구현, 알고리즘 교육 및 테스트 프로세스를 추상화하고 분리하여 매우 높은 수준의 모듈성을 달성합니다. 즉, 중복 코드 수가 크게 줄어듭니다.

 

내용이 어려우므로 그냥 원본을 읽어 보기를 추천함.

반응형