#8 master

Merged
hw2022s1 merged 15 commits from zhanghuiyao/mindyolo_for_yolov5:master into master 1 year ago
  1. +6
    -6
      configs/yolov5/yolov5x.yaml
  2. +4
    -0
      ma-pre-start.sh
  3. +1
    -1
      mindyolo/engine/enginer.py
  4. +2
    -3
      mindyolo/engine/utils.py
  5. +1
    -1
      mindyolo/models/layers/__init__.py
  6. +32
    -10
      mindyolo/models/layers/bottleneck.py
  7. +3
    -3
      mindyolo/models/model_factory.py
  8. +5
    -5
      mindyolo/utils/config.py
  9. +9
    -0
      requirements.txt

+ 6
- 6
configs/yolov5/yolov5x.yaml View File

@@ -3,13 +3,13 @@ __BASE__: [
'./hyp.scratch-high.yaml',
]

per_batch_size: 32 # 32 * 8 = 256
per_batch_size: 16 # 16 * 8 = 128
img_size: 640
sync_bn: False
# backbone/head calculate using fp16, loss fp32
ms_amp_level: O3
keep_loss_fp32: True
sync_bn: True
recompute: False
recompute_layers: 0
ms_amp_level: O0
#keep_loss_fp32: True


network:


+ 4
- 0
ma-pre-start.sh View File

@@ -0,0 +1,4 @@
pip install albumentations==1.0.3 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install opencv-python==4.7.0.68 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install opencv-python-headless==4.7.0.68 -i https://pypi.tuna.tsinghua.edu.cn/simple
echo "ModelArts: pip install albumentations/opencv-python finish."

+ 1
- 1
mindyolo/engine/enginer.py View File

@@ -278,7 +278,7 @@ class Enginer:
if self.ema:
self.ema.update()
self.scaler.adjust(grads_finite)
if not grads_finite:
if not grads_finite and (cur_step % self.cfg.log_interval == 0):
if self.cfg.overflow_still_update:
logger.warning(f"overflow, still update, loss scale adjust to {self.scaler.scale_value.asnumpy()}")
else:


+ 2
- 3
mindyolo/engine/utils.py View File

@@ -1,7 +1,6 @@
import random, os, yaml, glob, re
import random, os, yaml
import numpy as np
from datetime import datetime
from pathlib import Path

import mindspore as ms
from mindspore import context
@@ -84,5 +83,5 @@ def set_default(cfg):
cfg.data.train_set = os.path.join(cfg.data_dir, cfg.data.train_set)
cfg.data.val_set = os.path.join(cfg.data_dir, cfg.data.val_set)
cfg.data.test_set = os.path.join(cfg.data_dir, cfg.data.test_set)
cfg.weight = cfg.ckpt_dir if cfg.ckpt_dir else '' # os.path.join(cfg.ckpt_dir, cfg.weight) if cfg.weight else ''
cfg.weight = cfg.ckpt_dir if cfg.ckpt_dir else ''
cfg.ema_weight = os.path.join(cfg.ckpt_dir, cfg.ema_weight) if cfg.ema_weight else ''

+ 1
- 1
mindyolo/models/layers/__init__.py View File

@@ -11,7 +11,7 @@ from .upsample import *
__all__ = ['Swish',
'Shortcut', 'Concat', 'ReOrg', 'Identity',
'ConvNormAct', 'RepConv', 'DownC',
'Bottleneck', 'C3',
'Bottleneck', 'C3', 'C2f',
'ImplicitA', 'ImplicitM',
'MP', 'SP', 'MaxPool2d',
'SPPCSPC', 'SPPF',


+ 32
- 10
mindyolo/models/layers/bottleneck.py View File

@@ -5,20 +5,18 @@ from .conv import ConvNormAct

class Bottleneck(nn.Cell):
# Standard bottleneck
# ch_in, ch_out, shortcut, groups, expansion
def __init__(self, c1, c2, shortcut=True, e=0.5, momentum=0.97, eps=1e-3, sync_bn=False):
super(Bottleneck, self).__init__()
def __init__(self, c1, c2, shortcut=True, k=(1, 3), g=(1, 1), e=0.5, momentum=0.97, eps=1e-3, sync_bn=False): # ch_in, ch_out, shortcut, groups, kernels, expand
super().__init__()
c_ = int(c2 * e) # hidden channels
self.conv1 = ConvNormAct(c1, c_, 1, 1, momentum=momentum, eps=eps, sync_bn=sync_bn)
self.conv2 = ConvNormAct(c_, c2, 3, 1, momentum=momentum, eps=eps, sync_bn=sync_bn)
self.conv1 = ConvNormAct(c1, c_, k[0], 1, g=g[0], momentum=momentum, eps=eps, sync_bn=sync_bn)
self.conv2 = ConvNormAct(c_, c2, k[1], 1, g=g[1], momentum=momentum, eps=eps, sync_bn=sync_bn)
self.add = shortcut and c1 == c2

def construct(self, x):
c1 = self.conv1(x)
c2 = self.conv2(c1)
out = c2
if self.add:
out = x + out
out = x + self.conv2(self.conv1(x))
else:
out = self.conv2(self.conv1(x))
return out


@@ -31,7 +29,7 @@ class C3(nn.Cell):
self.conv2 = ConvNormAct(c1, c_, 1, 1, momentum=momentum, eps=eps, sync_bn=sync_bn)
self.conv3 = ConvNormAct(2 * c_, c2, 1, momentum=momentum, eps=eps, sync_bn=sync_bn) # act=FReLU(c2)
self.m = nn.SequentialCell(
[Bottleneck(c_, c_, shortcut, e=1.0, momentum=momentum, eps=eps, sync_bn=sync_bn) for _ in range(n)])
[Bottleneck(c_, c_, shortcut, k=(1, 3), e=1.0, momentum=momentum, eps=eps, sync_bn=sync_bn) for _ in range(n)])
self.concat = ops.Concat(axis=1)

def construct(self, x):
@@ -42,3 +40,27 @@ class C3(nn.Cell):
c5 = self.conv3(c4)

return c5


class C2f(nn.Cell):
# CSP Bottleneck with 2 convolutions
def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5, momentum=0.97, eps=1e-3, sync_bn=False): # ch_in, ch_out, number, shortcut, groups, expansion
super().__init__()
_c = int(c2 * e) # hidden channels
self.cv1 = ConvNormAct(c1, 2 * _c, 1, 1, momentum=momentum, eps=eps, sync_bn=sync_bn)
self.cv2 = ConvNormAct((2 + n) * _c, c2, 1, momentum=momentum, eps=eps, sync_bn=sync_bn) # optional act=FReLU(c2)
self.m = nn.CellList([
Bottleneck(_c, _c, shortcut, k=(3, 3), g=(1, g), e=1.0, momentum=momentum, eps=eps, sync_bn=sync_bn) for _ in range(n)
])

def construct(self, x):
y = ()
x = self.cv1(x)
x_tuple = ops.split(x, axis=1, output_num=2)
y += x_tuple
for i in range(len(self.m)):
m = self.m[i]
out = m(y[-1])
y += (out,)

return self.cv2(ops.concat(y, axis=1))

+ 3
- 3
mindyolo/models/model_factory.py View File

@@ -106,15 +106,15 @@ def parse_model(d, ch, nc, sync_bn=False): # model_dict, input_channels(3)
pass

n = max(round(n * gd), 1) if n > 1 else n # depth gain
if m in (nn.Conv2d, ConvNormAct, RepConv, DownC, SPPCSPC, SPPF, C3, Bottleneck):
if m in (nn.Conv2d, ConvNormAct, RepConv, DownC, SPPCSPC, SPPF, C3, C2f, Bottleneck):
c1, c2 = ch[f], args[0]
if c2 != no: # if not output
c2 = math.ceil(c2 * gw / 8) * 8

args = [c1, c2, *args[1:]]
if m in (ConvNormAct, RepConv, DownC, SPPCSPC, SPPF, C3, Bottleneck):
if m in (ConvNormAct, RepConv, DownC, SPPCSPC, SPPF, C3, C2f, Bottleneck):
kwargs["sync_bn"] = sync_bn
if m in (DownC, SPPCSPC, C3):
if m in (DownC, SPPCSPC, C3, C2f):
args.insert(2, n) # number of repeats
n = 1
elif m in (nn.BatchNorm2d, nn.SyncBatchNorm):


+ 5
- 5
mindyolo/utils/config.py View File

@@ -86,7 +86,7 @@ def get_args_train(parents=None):
parser.add_argument('--accumulate', type=int, default=1,
help='grad accumulate step, recommended when batch-size is less than 64')
parser.add_argument('--auto_accumulate', type=ast.literal_eval, default=False, help='auto accumulate')
parser.add_argument('--log_interval', type=int, default=1, help='log interval')
parser.add_argument('--log_interval', type=int, default=100, help='log interval')
parser.add_argument('--multi_scale', type=ast.literal_eval, default=False, help='vary img-size +/- 50%')
parser.add_argument('--single_cls', type=ast.literal_eval, default=False,
help='train multi-class data as single-class')
@@ -127,7 +127,7 @@ def get_args_test(parents=None):
parser.add_argument('--single_cls', type=ast.literal_eval, default=False,
help='train multi-class data as single-class')
parser.add_argument('--rect', type=ast.literal_eval, default=False, help='rectangular training')
parser.add_argument('--nms_time_limit', type=float, default=20.0, help='time limit for NMS')
parser.add_argument('--nms_time_limit', type=float, default=60.0, help='time limit for NMS')
parser.add_argument('--recompute', type=ast.literal_eval, default=False, help='Recompute')
parser.add_argument('--recompute_layers', type=int, default=0)
parser.add_argument('--conf_thres', type=float, default=0.001, help='object confidence threshold')
@@ -151,7 +151,7 @@ def get_args_test(parents=None):
help='Whether to run eval during training')
parser.add_argument('--multi_scale', type=ast.literal_eval, default=False, help='vary img-size +/- 50%')
parser.add_argument('--overflow_still_update', type=ast.literal_eval, default=False, help='overflow still update')
parser.add_argument('--log_interval', type=int, default=1, help='log interval')
parser.add_argument('--log_interval', type=int, default=100, help='log interval')
parser.add_argument('--freeze', type=list, default=[],
help='Freeze layers: backbone of yolov7=50, first3=0 1 2')

@@ -199,7 +199,7 @@ def get_args_infer(parents=None):
help='Whether to run eval during training')
parser.add_argument('--multi_scale', type=ast.literal_eval, default=False, help='vary img-size +/- 50%')
parser.add_argument('--overflow_still_update', type=ast.literal_eval, default=False, help='overflow still update')
parser.add_argument('--log_interval', type=int, default=1, help='log interval')
parser.add_argument('--log_interval', type=int, default=100, help='log interval')
parser.add_argument('--freeze', type=list, default=[],
help='Freeze layers: backbone of yolov7=50, first3=0 1 2')
parser.add_argument('--log_level', type=str, default='INFO', help='save dir')
@@ -207,7 +207,7 @@ def get_args_infer(parents=None):
parser.add_argument('--conf_thres', type=float, default=0.001, help='object confidence threshold')
parser.add_argument('--iou_thres', type=float, default=0.65, help='IOU threshold for NMS')
parser.add_argument('--rect', type=ast.literal_eval, default=False, help='rectangular training')
parser.add_argument('--nms_time_limit', type=float, default=20.0, help='time limit for NMS')
parser.add_argument('--nms_time_limit', type=float, default=60.0, help='time limit for NMS')
parser.add_argument('--single_cls', type=ast.literal_eval, default=False,
help='train multi-class data as single-class')



+ 9
- 0
requirements.txt View File

@@ -0,0 +1,9 @@
# MindYOLO requirements
# Usage: pip install -r requirements.txt

# Base
opencv-python-headless>=4.7.0.68

# Extras
albumentations>=1.0.3
pycocotools>=2.0.2

Loading…
Cancel
Save