File size: 7,195 Bytes
92894b3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# YOLOv5 🚀 by Ultralytics, AGPL-3.0 license
# YOLOv5 Continuous Integration (CI) GitHub Actions tests

name: YOLOv5 CI

on:
  push:
    branches: [master]
  pull_request:
    branches: [master]
  schedule:
    - cron: "0 0 * * *" # runs at 00:00 UTC every day

jobs:
  Benchmarks:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest]
        python-version: ["3.11"] # requires python<=3.10
        model: [yolov5n]
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}
          cache: "pip" # caching pip dependencies
      - name: Install requirements
        run: |
          python -m pip install --upgrade pip wheel
          pip install -r requirements.txt coremltools openvino-dev tensorflow-cpu --extra-index-url https://download.pytorch.org/whl/cpu
          yolo checks
          pip list
      - name: Benchmark DetectionModel
        run: |
          python benchmarks.py --data coco128.yaml --weights ${{ matrix.model }}.pt --img 320 --hard-fail 0.29
      - name: Benchmark SegmentationModel
        run: |
          python benchmarks.py --data coco128-seg.yaml --weights ${{ matrix.model }}-seg.pt --img 320 --hard-fail 0.22
      - name: Test predictions
        run: |
          python export.py --weights ${{ matrix.model }}-cls.pt --include onnx --img 224
          python detect.py --weights ${{ matrix.model }}.onnx --img 320
          python segment/predict.py --weights ${{ matrix.model }}-seg.onnx --img 320
          python classify/predict.py --weights ${{ matrix.model }}-cls.onnx --img 224

  Tests:
    timeout-minutes: 60
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, windows-latest] # macos-latest bug https://github.com/ultralytics/yolov5/pull/9049
        python-version: ["3.11"]
        model: [yolov5n]
        include:
          - os: ubuntu-latest
            python-version: "3.8" # '3.6.8' min
            model: yolov5n
          - os: ubuntu-latest
            python-version: "3.9"
            model: yolov5n
          - os: ubuntu-latest
            python-version: "3.8" # torch 1.8.0 requires python >=3.6, <=3.8
            model: yolov5n
            torch: "1.8.0" # min torch version CI https://pypi.org/project/torchvision/
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}
          cache: "pip" # caching pip dependencies
      - name: Install requirements
        run: |
          python -m pip install --upgrade pip wheel
          if [ "${{ matrix.torch }}" == "1.8.0" ]; then
              pip install -r requirements.txt torch==1.8.0 torchvision==0.9.0 --extra-index-url https://download.pytorch.org/whl/cpu
          else
              pip install -r requirements.txt --extra-index-url https://download.pytorch.org/whl/cpu
          fi
        shell: bash # for Windows compatibility
      - name: Check environment
        run: |
          yolo checks
          pip list
      - name: Test detection
        shell: bash # for Windows compatibility
        run: |
          # export PYTHONPATH="$PWD"  # to run '$ python *.py' files in subdirectories
          m=${{ matrix.model }}  # official weights
          b=runs/train/exp/weights/best  # best.pt checkpoint
          python train.py --imgsz 64 --batch 32 --weights $m.pt --cfg $m.yaml --epochs 1 --device cpu  # train
          for d in cpu; do  # devices
            for w in $m $b; do  # weights
              python val.py --imgsz 64 --batch 32 --weights $w.pt --device $d  # val
              python detect.py --imgsz 64 --weights $w.pt --device $d  # detect
            done
          done
          python hubconf.py --model $m  # hub
          # python models/tf.py --weights $m.pt  # build TF model
          python models/yolo.py --cfg $m.yaml  # build PyTorch model
          python export.py --weights $m.pt --img 64 --include torchscript  # export
          python - <<EOF
          import torch
          im = torch.zeros([1, 3, 64, 64])
          for path in '$m', '$b':
              model = torch.hub.load('.', 'custom', path=path, source='local')
              print(model('data/images/bus.jpg'))
              model(im)  # warmup, build grids for trace
              torch.jit.trace(model, [im])
          EOF
      - name: Test segmentation
        shell: bash # for Windows compatibility
        run: |
          m=${{ matrix.model }}-seg  # official weights
          b=runs/train-seg/exp/weights/best  # best.pt checkpoint
          python segment/train.py --imgsz 64 --batch 32 --weights $m.pt --cfg $m.yaml --epochs 1 --device cpu  # train
          python segment/train.py --imgsz 64 --batch 32 --weights '' --cfg $m.yaml --epochs 1 --device cpu  # train
          for d in cpu; do  # devices
            for w in $m $b; do  # weights
              python segment/val.py --imgsz 64 --batch 32 --weights $w.pt --device $d  # val
              python segment/predict.py --imgsz 64 --weights $w.pt --device $d  # predict
              python export.py --weights $w.pt --img 64 --include torchscript --device $d  # export
            done
          done
      - name: Test classification
        shell: bash # for Windows compatibility
        run: |
          m=${{ matrix.model }}-cls.pt  # official weights
          b=runs/train-cls/exp/weights/best.pt  # best.pt checkpoint
          python classify/train.py --imgsz 32 --model $m --data mnist160 --epochs 1  # train
          python classify/val.py --imgsz 32 --weights $b --data ../datasets/mnist160  # val
          python classify/predict.py --imgsz 32 --weights $b --source ../datasets/mnist160/test/7/60.png  # predict
          python classify/predict.py --imgsz 32 --weights $m --source data/images/bus.jpg  # predict
          python export.py --weights $b --img 64 --include torchscript  # export
          python - <<EOF
          import torch
          for path in '$m', '$b':
              model = torch.hub.load('.', 'custom', path=path, source='local')
          EOF

  Summary:
    runs-on: ubuntu-latest
    needs: [Benchmarks, Tests] # Add job names that you want to check for failure
    if: always() # This ensures the job runs even if previous jobs fail
    steps:
      - name: Check for failure and notify
        if: (needs.Benchmarks.result == 'failure' || needs.Tests.result == 'failure' || needs.Benchmarks.result == 'cancelled' || needs.Tests.result == 'cancelled') && github.repository == 'ultralytics/yolov5' && (github.event_name == 'schedule' || github.event_name == 'push')
        uses: slackapi/[email protected]
        with:
          payload: |
            {"text": "<!channel> GitHub Actions error for ${{ github.workflow }} ❌\n\n\n*Repository:* https://github.com/${{ github.repository }}\n*Action:* https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}\n*Author:* ${{ github.actor }}\n*Event:* ${{ github.event_name }}\n"}
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL_YOLO }}