Skip to content

Commit

Permalink
Merge pull request #93 from mjq2020/main
Browse files Browse the repository at this point in the history
Canonical Code Format
  • Loading branch information
mjq2020 authored Jul 7, 2023
2 parents bc0ec61 + 06e4f30 commit 9045d07
Show file tree
Hide file tree
Showing 33 changed files with 228 additions and 176 deletions.
2 changes: 1 addition & 1 deletion edgelab/engine/apis/mmdet/train.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import torch
import torch.distributed as dist
from mmcv.runner import (DistSamplerSeedHook, EpochBasedRunner,
Fp16OptimizerHook, OptimizerHook, build_runner,builder,
Fp16OptimizerHook, OptimizerHook, build_runner,
get_dist_info)

from mmdet.datasets.utils import replace_ImageToTensor
Expand Down
58 changes: 28 additions & 30 deletions edgelab/engine/hooks/logger/pavi.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,13 @@
import json
import warnings
import os.path as osp
from functools import partial
from typing import Optional, Union, Dict

import mmcv
import torch
from edgelab.registry import HOOKS
from mmengine.dist.utils import master_only
# from mmcv.runner import HOOKS
from mmengine.dist.utils import master_only

# from mmcv.parallel.scatter_gather import scatter
# from mmcv.parallel.utils import is_module_wrapper

Expand Down Expand Up @@ -129,33 +127,33 @@ def _add_ckpt(self, runner, ckpt_path: str, step: int) -> None:
snapshot_file_path=ckpt_path,
iteration=step)

def _add_graph(self, runner, step: int) -> None:
from mmcv.runner.iter_based_runner import IterLoader
if is_module_wrapper(runner.model):
_model = runner.model.module
else:
_model = runner.model
device = next(_model.parameters()).device
# Note that if your sampler indices is generated in init method, your
# dataset may be one less.
if isinstance(runner.data_loader, IterLoader):
data = next(iter(runner.data_loader._dataloader))
else:
data = next(iter(runner.data_loader))
data = scatter(data, [device.index])[0]
img = data[self.img_key]
with torch.no_grad():
origin_forward = _model.forward
if hasattr(_model, 'forward_dummy'):
_model.forward = _model.forward_dummy
if self.dummy_forward_kwargs:
_model.forward = partial(_model.forward,
**self.dummy_forward_kwargs)
self.writer.add_graph(_model,
img,
tag=f'{self.run_name}_{step}',
opset_version=self.opset_version)
_model.forward = origin_forward
# def _add_graph(self, runner, step: int) -> None:
# from mmcv.runner.iter_based_runner import IterLoader
# if is_module_wrapper(runner.model):
# _model = runner.model.module
# else:
# _model = runner.model
# device = next(_model.parameters()).device
# # Note that if your sampler indices is generated in init method, your
# # dataset may be one less.
# if isinstance(runner.data_loader, IterLoader):
# data = next(iter(runner.data_loader._dataloader))
# else:
# data = next(iter(runner.data_loader))
# data = scatter(data, [device.index])[0]
# img = data[self.img_key]
# with torch.no_grad():
# origin_forward = _model.forward
# if hasattr(_model, 'forward_dummy'):
# _model.forward = _model.forward_dummy
# if self.dummy_forward_kwargs:
# _model.forward = partial(_model.forward,
# **self.dummy_forward_kwargs)
# self.writer.add_graph(_model,
# img,
# tag=f'{self.run_name}_{step}',
# opset_version=self.opset_version)
# _model.forward = origin_forward

@master_only
def log(self, runner) -> None:
Expand Down
14 changes: 6 additions & 8 deletions edgelab/engine/hooks/logger/tensorboard.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import os.path as osp
import os
from typing import Optional, Dict, Union

from edgelab.registry import HOOKS
from mmengine.dist.utils import master_only
# from mmcv.runner import HOOKS

# from mmcv.runner.dist_utils import master_only
# from mmcv.utils import TORCH_VERSION, digit_version
from mmengine.utils.dl_utils import TORCH_VERSION
# from mmcv.runner.hooks.logger.text import TextLoggerHook

from .text import TextLoggerHook
Expand Down Expand Up @@ -35,8 +35,9 @@ def __init__(self,
@master_only
def before_run(self, runner) -> None:
super().before_run(runner)
if (TORCH_VERSION == 'parrots'
or digit_version(TORCH_VERSION) < digit_version('1.1')):
if not os.path.exists(self.log_dir):
os.makedirs(self.log_dir, exist_ok=True) # type: ignore
if TORCH_VERSION == 'parrots':
try:
from tensorboardX import SummaryWriter
except ImportError:
Expand All @@ -50,10 +51,7 @@ def before_run(self, runner) -> None:
'Please run "pip install future tensorboard" to install '
'the dependencies to use torch.utils.tensorboard '
'(applicable to PyTorch 1.1 or higher)')

if self.log_dir is None:
self.log_dir = osp.join(runner.work_dir, 'tf_logs')
self.writer = SummaryWriter(self.log_dir)
self._tensorboard = SummaryWriter(self.log_dir)

@master_only
def log(self, runner) -> None:
Expand Down
6 changes: 3 additions & 3 deletions edgelab/engine/hooks/logger/text.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import logging
import datetime
from pathlib import Path
from collections import OrderedDict
from typing import Optional, Union, Dict
from typing import Optional, Union

import torch
import torch.distributed as dist
Expand Down Expand Up @@ -154,7 +153,8 @@ def setloglevel(self,
runner: Runner,
handler: logging.Handler = logging.StreamHandler,
level: int = logging.ERROR):
if handler in self.handltype: return
if handler in self.handltype:
return
for i, hand in enumerate(runner.logger.handlers):
if type(hand) is handler:
hand.setLevel(level)
Expand Down
1 change: 0 additions & 1 deletion edgelab/engine/hooks/visualization_hook.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,6 @@ def after_test_iter(self, runner: Runner, batch_idx: int, data_batch: dict,
])
out_file = f'{out_file_name}_{index}.{postfix}'
out_file = os.path.join(self.out_dir, out_file)
from mmpose.visualization import PoseLocalVisualizer
self._visualizer.add_datasample(
os.path.basename(img_path) if self.show else 'test_img',
img,
Expand Down
19 changes: 11 additions & 8 deletions edgelab/engine/runner/loops.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
from typing import Dict, Sequence, Union, List

import onnx
import torch
from torch.utils.data import DataLoader
from mmengine.runner import Runner
from mmengine.evaluator.evaluator import Evaluator
from mmengine.runner.loops import EpochBasedTrainLoop, BaseLoop
from torch.utils.data import DataLoader

from edgelab.registry import LOOPS
from mmengine.registry import RUNNERS


@LOOPS.register_module()
Expand Down Expand Up @@ -56,29 +57,31 @@ def __init__(
if isinstance(model, list):
try:
import ncnn
except:
except ImportError:
raise ImportError(
'You have not installed ncnn yet, please execute the "pip install ncnn" command to install and run again'
)
net = ncnn.Net()
for p in model:
if p.endswith('param'): param = p
if p.endswith('bin'): bin = p
if p.endswith('param'):
param = p
if p.endswith('bin'):
bin = p
net.load_param(param)
net.load_model(bin)
# net.opt.use_vulkan_compute = True
self.engine = 'ncnn'
elif model.endswith('onnx'):
try:
import onnxruntime
except:
except ImportError:
raise ImportError(
'You have not installed onnxruntime yet, please execute the "pip install onnxruntime" command to install and run again'
)
try:
net = onnx.load(model)
onnx.checker.check_model(net)
except:
except ValueError:
raise ValueError(
'onnx file have error,please check your onnx export code!')
providers = [
Expand All @@ -89,7 +92,7 @@ def __init__(
elif model.endswith('tflite'):
try:
import tensorflow as tf
except:
except ImportError:
raise ImportError(
'You have not installed tensorflow yet, please execute the "pip install tensorflow" command to install and run again'
)
Expand Down
19 changes: 6 additions & 13 deletions edgelab/models/__init__.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,6 @@
from .backbones import *
from .detectors import *
from .classifiers import *
from .heads import *
from .losses import *
from .necks import *

__all__ = [
'SoundNetRaw', 'Speechcommand', 'PFLD', 'Audio_head', 'Audio_classify',
'LabelSmoothCrossEntropyLoss', 'PFLDLoss', 'PFLDhead', 'FastestDet', 'SPP',
'NLLLoss', 'BCEWithLogitsLoss', 'Fomo_Head', 'CustomShuffleNetV2',
'FomoLoss','Fomo', 'AxesNet', 'AccelerometerClassifier','FPN','MobileNetv2'
]
from .backbones import * # noqa
from .detectors import * # noqa
from .classifiers import * # noqa
from .heads import * # noqa
from .losses import * # noqa
from .necks import * # noqa
2 changes: 1 addition & 1 deletion edgelab/models/backbones/AxesNet.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import torch
import torch.nn as nn
import torch.nn.functional as F

from edgelab.registry import MODELS


Expand Down
61 changes: 36 additions & 25 deletions edgelab/models/backbones/EfficientNet.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
from typing import Optional, List, Callable
from functools import partial
import copy
import math
from torch import nn
import torch
from torchvision.ops import StochasticDepth
from edgelab.registry import BACKBONES
from mmdet.models.utils.make_divisible import make_divisible
from mmengine.model import BaseModule
from edgelab.models.base.general import ConvNormActivation, SqueezeExcitation
from edgelab.models.layers.rep import RepConv1x1


class MBConvConfig:
Expand Down Expand Up @@ -36,12 +36,12 @@ def adjust_depth(num_layers: int, depth_mult: float):

class MBConv(nn.Module):

def __init__(
self,
cnf: MBConvConfig,
stochastic_depth_prob: float,
norm_layer: Callable[..., nn.Module],
se_layer: Callable[..., nn.Module] = SqueezeExcitation) -> None:
def __init__(self,
cnf: MBConvConfig,
stochastic_depth_prob: float,
norm_layer: Callable[..., nn.Module],
se_layer: Callable[..., nn.Module] = SqueezeExcitation,
rep: bool = False) -> None:
super().__init__()

if not (1 <= cnf.stride <= 2):
Expand All @@ -50,7 +50,7 @@ def __init__(
self.use_res_connect = cnf.stride == 1 and cnf.input_channels == cnf.out_channels

layers: List[nn.Module] = []
activation_layer = nn.SiLU
activation_layer = nn.ReLU

# expand
expanded_channels = cnf.adjust_channels(cnf.input_channels,
Expand All @@ -64,21 +64,29 @@ def __init__(
activation_layer=activation_layer))

# depthwise
layers.append(
ConvNormActivation(expanded_channels,
expanded_channels,
kernel_size=cnf.kernel,
stride=cnf.stride,
groups=expanded_channels,
norm_layer=norm_layer,
activation_layer=activation_layer))
if rep:
layers.append(
RepConv1x1(expanded_channels,
expanded_channels,
stride=cnf.stride,
act_cfg=activation_layer))

# squeeze and excitation
squeeze_channels = max(1, cnf.input_channels // 4)
layers.append(
se_layer(expanded_channels,
squeeze_channels,
activation=partial(nn.SiLU, inplace=True)))
else:
layers.append(
ConvNormActivation(expanded_channels,
expanded_channels,
kernel_size=cnf.kernel,
stride=cnf.stride,
groups=expanded_channels,
norm_layer=norm_layer,
activation_layer=activation_layer))

# squeeze and excitation
squeeze_channels = max(1, cnf.input_channels // 4)
layers.append(
se_layer(expanded_channels,
squeeze_channels,
activation=partial(nn.ReLU, inplace=True)))

# project
layers.append(
Expand Down Expand Up @@ -114,7 +122,8 @@ class EfficientNet(BaseModule):
]

width_depth_mult = {
'b0': [0.15, 0.35, 0.2],
'bt': [0.35, 0.35, 0.2],
'b0': [1.0, 1.0, 0.2],
'b1': [1.0, 1.1, 0.2],
'b2': [1.1, 1.2, 0.3],
'b3': [1.2, 1.4, 0.3],
Expand All @@ -131,6 +140,7 @@ def __init__(self,
norm_cfg='BN',
frozen_stages=-1,
norm_eval=False,
rep=False,
init_cfg: Optional[dict] = None):
super().__init__(init_cfg)

Expand All @@ -156,7 +166,7 @@ def __init__(self,
3,
2,
norm_layer=norm_cfg,
activation_layer='SiLU')
activation_layer='ReLU')

total_stage_blocks = sum([cnf.num_layers for cnf in arch_param])
stage_block_id = 0
Expand All @@ -170,7 +180,8 @@ def __init__(self,
conf.stride = 1
sd_prob = stochastic_depth_prob * float(
stage_block_id) / total_stage_blocks
layer.append(MBConv(conf, sd_prob, norm_layer=norm_cfg))
layer.append(
MBConv(conf, sd_prob, norm_layer=norm_cfg, rep=rep))
stage_block_id += 1

self.add_module(name, nn.Sequential(*layer))
Expand Down
8 changes: 6 additions & 2 deletions edgelab/models/backbones/MobileNetv2.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from mmengine.model import BaseModule
from edgelab.registry import BACKBONES, MODELS
from torchvision.models._utils import _make_divisible
from edgelab.models.layers.rep import RepBlock
from edgelab.models.layers.rep import RepBlock,RepConv1x1
from ..base.general import InvertedResidual, ConvNormActivation


Expand All @@ -27,7 +27,8 @@ def __init__(self,
if block is None and not rep:
block = InvertedResidual
elif rep:
block = RepBlock
# block = RepBlock
block = RepConv1x1
elif isinstance(block, dict):
block = MODELS.build(rep)

Expand Down Expand Up @@ -76,6 +77,9 @@ def __init__(self,
stride=stride,
groups=in_channels,
norm_layer=norm_layer)

elif block is RepConv1x1:
layer=block(in_channels,out_channels,stride=stride,depth=6)
else:
layer = block(in_channels,
out_channels,
Expand Down
Loading

0 comments on commit 9045d07

Please sign in to comment.