IMDN: 경량 초해상도 모델

더 가볍고 가벼운 초해상도 모델인 IMDN 모델이 있습니다.
https://github.com/ofsoundof/IMDN
온엑스 사이즈도 있어요.
https://github.com/PINTO0309/PINTO_model_zoo/tree/main/281_IMDN
RTX3070 환경에서 실행하면 256x256의 이미지를 4배로 설정할 때 onnxruntime, Pythorch에서 약 50FPS 동작을 합니다.초해상도 모델에서는 매우 빠른 모델이라고 할 수 있다.
나는 이 모형에 대한 이해를 좀 깊이 있게 하고 싶다.

모형 구조


먼저 모델 구조논문를 대충 읽어 이해한다.

위 저장소에 공개된 모델은 IMDN 모델의 경량화입니다.IMDN 모델의 구조는 위의 그림과 같습니다.
SRGAN, ESRGAN 등과 비슷한 기본 구조로 기본 블록을 쌓아 입력한 이미지와 같은 해상도의 특징량도를 생성한 뒤 샘플링하는 절차다.이 기본 블록은 SRGAN에서 사용하는 SRResnet에서 Residual Block이고 IMDN은 IMD 블록을 사용합니다.
다음은 torchiinfo로 실제 분배된 모델의 구조를 출력한 결과입니다.
====================================================================================================
Layer (type:depth-idx)                             Output Shape              Param #
====================================================================================================
IMDN                                               --                        --
├─Sequential: 1-1                                  [1, 3, 1024, 1024]        --
│    └─Conv2d: 2-1                                 [1, 64, 256, 256]         1,792
│    └─ShortcutBlock: 2-2                          [1, 64, 256, 256]         --
│    │    └─Sequential: 3-1                        [1, 64, 256, 256]         --
│    │    │    └─IMDBlock: 4-1                     [1, 64, 256, 256]         103,440
│    │    │    └─IMDBlock: 4-2                     [1, 64, 256, 256]         103,440
│    │    │    └─IMDBlock: 4-3                     [1, 64, 256, 256]         103,440
│    │    │    └─IMDBlock: 4-4                     [1, 64, 256, 256]         103,440
│    │    │    └─IMDBlock: 4-5                     [1, 64, 256, 256]         103,440
│    │    │    └─IMDBlock: 4-6                     [1, 64, 256, 256]         103,440
│    │    │    └─IMDBlock: 4-7                     [1, 64, 256, 256]         103,440
│    │    │    └─IMDBlock: 4-8                     [1, 64, 256, 256]         103,440
│    │    │    └─Conv2d: 4-9                       [1, 64, 256, 256]         36,928
│    └─Conv2d: 2-3                                 [1, 48, 256, 256]         27,696
│    └─PixelShuffle: 2-4                           [1, 3, 1024, 1024]        --
====================================================================================================
Total params: 893,936
Trainable params: 893,936
Non-trainable params: 0
Total mult-adds (G): 58.58
====================================================================================================
Input size (MB): 0.79
Forward/backward pass size (MB): 1233.13
Params size (MB): 3.58
Estimated Total Size (MB): 1237.49
====================================================================================================
Skip Connection은 ShortuctBlock 이름으로 구현됩니다.논문과 달리 IMDB의 출력 순서는 다음 블록으로 입력됩니다.원래의 논문에서 각 모듈의 출력을 IIC에 조합합니까?이런 구조가 있다.(논문에 명확하게 기재되지 않았음) 그리고 Conv-1도 없는 것 같아요.이러한 변화는 아마도 한층 더 경감된 결과일 것이다.Ablation Study 결과를 보면 IMDB 도입에서 비용이 많이 드는 것에 비해 다른 구성 요소의 효과가 약한 것으로 보인다.

이 IMD 블록은 다음 그림과 같이 각 레이어가 각각 16차원씩 출력되고 피쳐의 양이 조금씩 출력됩니다.또한 나머지 48비트는 아래의 Convolutional Layer에 의해 처리되며, 완전한 시퀀스의 구조와 레이어 간의 출력을 직접 결합하는 방법을 채택한 것 같습니다.이렇게 되면 매개 변수 수를 줄이면서 PSNR과 SSIM이 높아진 것으로 보이지만 왜 높아졌는지는 알 수 없다.

실행 및 성능 측정


이미지 복사를 포함한 실행 속도를 측정한 후pytrch,onxruntime는 256x256의 이미지를 확대한 상태에서 20ms 정도의 속도로 동작합니다.초해상 모형에서 동작이 비교적 빠른 모형이라고 할 수 있다.또 확대된 이미지에 관해서도 화질이 괜찮은 편이다.
화질에 대해서는 소수의 시위 행진를 참조하십시오.
사실적인 이미지는 좋지만 애니메이션 이미지는 그다지 좋지 않다.
그리고 문자의 초해상도도 그다지 좋지 않다.

뭐 할 수 있어요?


실시간성을 유연하게 활용하여 검측 등 식별 시스템 임무와 조합하는 것이 좋을 수 있다.예를 들어 대상 검측 등을 통해 범위를 좁히고 범위를 확대하며 다른 식별 시스템 임무를 수행하는 방법을 고려할 수 있다.더욱 구체적인 예는 사람의 행동을 식별하고 싶을 때 어떤 사이즈보다 작으면 초해상으로 행동 식별을 할 수 있다는 것이다.
또한 컬러 이미지 이외의 이미지로 시야를 넓히는 것이 재미있을 수도 있다.
또한 상술한 순조롭게 진행되지 않는 문자의 초해상도와 애니메이션 이미지에 관해서는 FineTune이 좋은 결과를 얻을 수 있을 것이다.

좋은 웹페이지 즐겨찾기