|  | 
|  | 1 | +import os | 
| 1 | 2 | from typing import List, Tuple | 
| 2 | 3 | 
 | 
| 3 | 4 | from mindspore import Tensor, nn, ops | 
|  | 
| 7 | 8 | from ..utils.attention_cells import SEModule | 
| 8 | 9 | from .asf import AdaptiveScaleFusion | 
| 9 | 10 | 
 | 
|  | 11 | +OFFLINE_MODE = os.getenv("OFFLINE_MODE", None) | 
| 10 | 12 | 
 | 
| 11 |  | -def _resize_nn(x: Tensor, scale: int = 0, shape: Tuple[int] = None): | 
| 12 |  | -    if scale == 1 or shape == x.shape[2:]: | 
| 13 |  | -        return x | 
| 14 | 13 | 
 | 
| 15 |  | -    if scale: | 
| 16 |  | -        shape = (x.shape[2] * scale, x.shape[3] * scale) | 
| 17 |  | -    return ops.ResizeNearestNeighbor(shape)(x) | 
|  | 14 | +if OFFLINE_MODE is None: | 
|  | 15 | +    def _resize_nn(x: Tensor, scale: int = 0, shape: Tuple[int] = None): | 
|  | 16 | +        if scale == 1 or shape == x.shape[2:]: | 
|  | 17 | +            return x | 
|  | 18 | + | 
|  | 19 | +        if scale: | 
|  | 20 | +            shape = (x.shape[2] * scale, x.shape[3] * scale) | 
|  | 21 | +        return ops.ResizeNearestNeighbor(shape)(x) | 
|  | 22 | +else: | 
|  | 23 | +    def _resize_nn(x: Tensor, shape: Tensor): | 
|  | 24 | +        return ops.ResizeNearestNeighborV2()(x, shape) | 
| 18 | 25 | 
 | 
| 19 | 26 | 
 | 
| 20 | 27 | class FPN(nn.Cell): | 
| @@ -64,11 +71,18 @@ def construct(self, features: List[Tensor]) -> Tensor: | 
| 64 | 71 |         for i, uc_op in enumerate(self.unify_channels): | 
| 65 | 72 |             features[i] = uc_op(features[i]) | 
| 66 | 73 | 
 | 
| 67 |  | -        for i in range(2, -1, -1): | 
| 68 |  | -            features[i] += _resize_nn(features[i + 1], shape=features[i].shape[2:]) | 
|  | 74 | +        if OFFLINE_MODE is None: | 
|  | 75 | +            for i in range(2, -1, -1): | 
|  | 76 | +                features[i] += _resize_nn(features[i + 1], shape=features[i].shape[2:]) | 
|  | 77 | + | 
|  | 78 | +            for i, out in enumerate(self.out): | 
|  | 79 | +                features[i] = _resize_nn(out(features[i]), shape=features[0].shape[2:]) | 
|  | 80 | +        else: | 
|  | 81 | +            for i in range(2, -1, -1): | 
|  | 82 | +                features[i] += _resize_nn(features[i + 1], shape=ops.dyn_shape(features[i])[2:]) | 
| 69 | 83 | 
 | 
| 70 |  | -        for i, out in enumerate(self.out): | 
| 71 |  | -            features[i] = _resize_nn(out(features[i]), shape=features[0].shape[2:]) | 
|  | 84 | +            for i, out in enumerate(self.out): | 
|  | 85 | +                features[i] = _resize_nn(out(features[i]), shape=ops.dyn_shape(features[0])[2:]) | 
| 72 | 86 | 
 | 
| 73 | 87 |         return self.fuse(features[::-1])  # matching the reverse order of the original work | 
| 74 | 88 | 
 | 
|  | 
0 commit comments