- prediction/image/ FastAPI 서버 Docker 환경 구성 - Dockerfile: PyTorch 2.1 + CUDA 12.1 기반 GPU 이미지 - docker-compose.yml: GPU 할당 + 데이터 볼륨 마운트 - requirements.txt: 서버 의존성 목록 - .env.example: 환경변수 템플릿 - DOCKER_USAGE.md: 빌드/실행/API 사용법 문서 - Dockerfile에 .dockerignore 제외 폴더 mkdir -p 추가 - .gitignore: prediction/image 결과물 및 모델 가중치(.pth) 제외 추가 - dbInsert_csv.py, dbInsert_shp.py 삭제 (미사용 DB 로직) - api.py: dbInsert import 및 주석 처리된 DB 호출 코드 제거 - aerialRouter.ts: req.params 타입 오류 수정
68 lines
2.4 KiB
Python
68 lines
2.4 KiB
Python
# Copyright (c) OpenMMLab. All rights reserved.
|
|
import torch.nn as nn
|
|
from mmcv.cnn import build_norm_layer
|
|
|
|
from ..builder import NECKS
|
|
|
|
|
|
@NECKS.register_module()
|
|
class Feature2Pyramid(nn.Module):
|
|
"""Feature2Pyramid.
|
|
|
|
A neck structure connect ViT backbone and decoder_heads.
|
|
|
|
Args:
|
|
embed_dims (int): Embedding dimension.
|
|
rescales (list[float]): Different sampling multiples were
|
|
used to obtain pyramid features. Default: [4, 2, 1, 0.5].
|
|
norm_cfg (dict): Config dict for normalization layer.
|
|
Default: dict(type='SyncBN', requires_grad=True).
|
|
"""
|
|
|
|
def __init__(self,
|
|
embed_dim,
|
|
rescales=[4, 2, 1, 0.5],
|
|
norm_cfg=dict(type='SyncBN', requires_grad=True)):
|
|
super(Feature2Pyramid, self).__init__()
|
|
self.rescales = rescales
|
|
self.upsample_4x = None
|
|
for k in self.rescales:
|
|
if k == 4:
|
|
self.upsample_4x = nn.Sequential(
|
|
nn.ConvTranspose2d(
|
|
embed_dim, embed_dim, kernel_size=2, stride=2),
|
|
build_norm_layer(norm_cfg, embed_dim)[1],
|
|
nn.GELU(),
|
|
nn.ConvTranspose2d(
|
|
embed_dim, embed_dim, kernel_size=2, stride=2),
|
|
)
|
|
elif k == 2:
|
|
self.upsample_2x = nn.Sequential(
|
|
nn.ConvTranspose2d(
|
|
embed_dim, embed_dim, kernel_size=2, stride=2))
|
|
elif k == 1:
|
|
self.identity = nn.Identity()
|
|
elif k == 0.5:
|
|
self.downsample_2x = nn.MaxPool2d(kernel_size=2, stride=2)
|
|
elif k == 0.25:
|
|
self.downsample_4x = nn.MaxPool2d(kernel_size=4, stride=4)
|
|
else:
|
|
raise KeyError(f'invalid {k} for feature2pyramid')
|
|
|
|
def forward(self, inputs):
|
|
assert len(inputs) == len(self.rescales)
|
|
outputs = []
|
|
if self.upsample_4x is not None:
|
|
ops = [
|
|
self.upsample_4x, self.upsample_2x, self.identity,
|
|
self.downsample_2x
|
|
]
|
|
else:
|
|
ops = [
|
|
self.upsample_2x, self.identity, self.downsample_2x,
|
|
self.downsample_4x
|
|
]
|
|
for i in range(len(inputs)):
|
|
outputs.append(ops[i](inputs[i]))
|
|
return tuple(outputs)
|