@@ -300,24 +300,266 @@ jobs:
300300 ACCURACY=$(grep -oE '[0-9]+\.?[0-9]*%' accuracy.txt | head -1 || echo "0%")
301301 echo "$ACCURACY" > accuracy_value.txt
302302
303- - name : Update README (master only)
304- if : github.ref == 'refs/heads/master'
303+ - name : Update README (main only)
305304 run : |
306- ACCURACY=$(cat accuracy_value.txt | sed 's/%//g')
305+ ACCURACY=$(sed 's/%//g' accuracy_value.txt)
306+ CURRENT_ACCURACY=$(sed -nE 's/.*<!--ACCURACY_PLACEHOLDER-->Accuracy: ([0-9]+(\.[0-9]+)?)% \(updated: [0-9-]+\)<!--END_ACCURACY-->.*/\1/p' README.md | head -n1)
307+
308+ if [ -n "$CURRENT_ACCURACY" ] && [ "$CURRENT_ACCURACY" = "$ACCURACY" ]; then
309+ echo "Accuracy unchanged; keeping existing README update date"
310+ exit 0
311+ fi
312+
307313 DATE=$(date '+%Y-%m-%d')
308- sed -i "s/<!--ACCURACY_PLACEHOLDER-->.*<!--END_ACCURACY-->/<!--ACCURACY_PLACEHOLDER-->Accuracy: ${ACCURACY}% (updated: ${DATE})<!--END_ACCURACY-->/" README.md
314+ UPDATE_TEXT="<!--ACCURACY_PLACEHOLDER-->Accuracy: ${ACCURACY}% (updated: ${DATE})<!--END_ACCURACY-->"
315+ ESCAPED_UPDATE_TEXT=$(printf '%s\n' "$UPDATE_TEXT" | sed 's/[&|\\]/\\&/g')
316+ sed -i "s|<!--ACCURACY_PLACEHOLDER-->.*<!--END_ACCURACY-->|${ESCAPED_UPDATE_TEXT}|" README.md
309317
310- - name : Commit and push changes (master only)
311- if : github.ref == 'refs/heads/master '
318+ - name : Commit and push changes (main only)
319+ if : github.ref == 'refs/heads/main' && github.repository == 'embedded-dev-research/itlab_2023 '
312320 run : |
313321 git config --global user.name "GitHub Actions"
314322 git config --global user.email "actions@github.com"
315323 git add README.md
316- if git diff-index --quiet HEAD -- ; then
324+ if git diff --cached --quiet ; then
317325 echo "No changes to commit"
318326 else
319327 git commit -m "[CI] Update accuracy: $(cat accuracy_value.txt)"
320- git push origin master
328+ for attempt in 1 2 3 4 5; do
329+ git pull --rebase origin main && git push origin HEAD:main && break
330+ git rebase --abort || true
331+ [ "$attempt" -eq 5 ] && { echo "Failed to push README update after ${attempt} attempts"; exit 1; }
332+ sleep 5
333+ done
334+ fi
335+
336+ download-dataset :
337+ runs-on : ubuntu-latest
338+ steps :
339+ - uses : actions/checkout@v4
340+ - name : Cache ImageNet-Paste dataset
341+ id : cache-imagenet
342+ uses : actions/cache@v4
343+ with :
344+ path : docs/ImageNet
345+ key : imagenet-paste-v1
346+ restore-keys : |
347+ imagenet-paste-v1-
348+ imagenet-paste-
349+
350+ - name : Setup Python
351+ uses : actions/setup-python@v4
352+ with :
353+ python-version : ' 3.10'
354+
355+ - name : Install Python dependencies from requirements.txt
356+ run : |
357+ cd app/Converters
358+ pip install -r requirements.txt
359+ cd ../..
360+
361+ - name : Download ImageNet-Paste dataset
362+ if : steps.cache-imagenet.outputs.cache-hit != 'true'
363+ env :
364+ HF_TOKEN : ${{ secrets.HF_TOKEN }}
365+ run : |
366+ mkdir -p docs/ImageNet/test
367+ cd app/Converters
368+ python download_imagenet.py
369+ cd ../..
370+ - name : Save ImageNet-Paste dataset
371+ uses : actions/cache/save@v4
372+ with :
373+ path : docs/ImageNet
374+ key : imagenet-paste-v1
375+
376+ evaluate-models-onnx :
377+ runs-on : ubuntu-latest
378+ needs : [build-linux, download-dataset]
379+ permissions :
380+ contents : write
381+ strategy :
382+ fail-fast : false
383+ matrix :
384+ model : [googlenet, densenet, resnet, yolo]
385+ include :
386+ - model : googlenet
387+ parser : parser_onnx.py
388+ model_file : GoogLeNet.onnx
389+ model_path : docs/models/GoogLeNet.onnx
390+ model_url : ' '
391+ extra_args : " --onednn 10000"
392+ - model : densenet
393+ parser : parser_onnx.py
394+ model_file : densenet121_Opset16.onnx
395+ model_url : https://github.com/onnx/models/raw/refs/heads/main/Computer_Vision/densenet121_Opset16_timm/densenet121_Opset16.onnx?download=
396+ extra_args : " --onednn 10000"
397+ - model : resnet
398+ parser : parser_onnx.py
399+ model_file : resnest101e_Opset16.onnx
400+ model_url : https://github.com/onnx/models/raw/refs/heads/main/Computer_Vision/resnest101e_Opset16_timm/resnest101e_Opset16.onnx?download=
401+ extra_args : " --onednn 10000"
402+ - model : yolo
403+ parser : parser_onnx.py
404+ model_file : yolo11x-cls.pt
405+ model_url : https://github.com/ultralytics/assets/releases/download/v8.4.0/yolo11x-cls.pt
406+ extra_args : " --onednn 10000"
407+
408+ steps :
409+ - uses : actions/checkout@v4
410+ with :
411+ fetch-depth : 0
412+
413+ - name : Download binary and libs
414+ uses : actions/download-artifact@v4
415+ with :
416+ name : mnist-RELEASE
417+ path : build/
418+
419+ - name : Set binary path
420+ id : set_eval_binary
421+ run : |
422+ echo "EVAL_BINARY=build/bin/ACC" >> $GITHUB_OUTPUT
423+
424+ - name : Install system dependencies
425+ run : |
426+ sudo apt-get update
427+ sudo apt-get install -y libgtk-3-0 libtbb12 libjpeg-dev libpng-dev libtiff-dev libopenjp2-7 libdnnl3
428+ sudo ldconfig
429+
430+ - name : Download model (if URL provided)
431+ if : matrix.model_url != ''
432+ run : |
433+ mkdir -p docs/models
434+ wget -O docs/models/${{ matrix.model_file }} ${{ matrix.model_url }}
435+
436+ - name : Setup Python
437+ uses : actions/setup-python@v4
438+ with :
439+ python-version : ' 3.10'
440+
441+ - name : Install Python dependencies from requirements.txt
442+ run : |
443+ cd app/Converters
444+ pip install -r requirements.txt
445+ cd ../..
446+
447+ - name : Cache model JSON files
448+ id : cache-model-json
449+ uses : actions/cache@v4
450+ with :
451+ path : docs/jsons
452+ key : model-json-${{ matrix.model }}-${{ hashFiles('app/Converters/parser_onnx.py', 'app/Converters/requirements.txt') }}
453+ restore-keys : |
454+ model-json-${{ matrix.model }}-
455+ model-json-
456+
457+ - name : Generate model JSON
458+ if : steps.cache-model-json.outputs.cache-hit != 'true'
459+ run : |
460+ mkdir -p docs/jsons
461+ cd app/Converters
462+ python ${{ matrix.parser }} ${{ matrix.model }}
463+ cd ../..
464+
465+ - name : Restore ImageNet-Paste dataset
466+ id : cache-imagenet
467+ uses : actions/cache/restore@v4
468+ with :
469+ path : docs/ImageNet
470+ key : imagenet-paste-v1
471+ restore-keys : |
472+ imagenet-paste-v1-
473+ imagenet-paste-
474+
475+ - name : Prepare environment
476+ run : |
477+ chmod +x "${{ steps.set_eval_binary.outputs.EVAL_BINARY }}"
478+ echo "LD_LIBRARY_PATH=$PWD/build/bin/all_libs:/usr/lib/x86_64-linux-gnu" >> $GITHUB_ENV
479+
480+ - name : Run evaluation
481+ run : |
482+ DATASET_PATH="docs/ImageNet/test"
483+ MODEL="${{ matrix.model }}"
484+ EXTRA_ARGS="${{ matrix.extra_args }}"
485+
486+ " ${{ steps.set_eval_binary.outputs.EVAL_BINARY }}" \
487+ --model $MODEL \
488+ $EXTRA_ARGS > accuracy_$MODEL.txt 2>&1
489+
490+ if [ $? -ne 0 ]; then
491+ echo "Ошибка при оценке модели $MODEL"
492+ cat accuracy_$MODEL.txt
493+ exit 1
494+ fi
495+
496+ echo "Результат оценки:"
497+ cat accuracy_$MODEL.txt
498+
499+ - name : Extract accuracy value
500+ run : |
501+ ACCURACY=$(grep -oE '[0-9]+\.?[0-9]*%' accuracy_${{ matrix.model }}.txt | head -1 || echo "0%")
502+ echo "$ACCURACY" > accuracy_value_${{ matrix.model }}.txt
503+ echo "Accuracy for ${{ matrix.model }}: $ACCURACY"
504+
505+ - name : Upload accuracy artifacts
506+ uses : actions/upload-artifact@v4
507+ with :
508+ name : accuracy-${{ matrix.model }}
509+ path : |
510+ accuracy_${{ matrix.model }}.txt
511+ accuracy_value_${{ matrix.model }}.txt
512+
513+ - name : Update README for model
514+ run : |
515+ TOP1_ACC=$(sed -nE 's/^Top-1 Accuracy: ([0-9]+(\.[0-9]+)?)%$/\1/p' accuracy_${{ matrix.model }}.txt | head -n1)
516+ TOP5_ACC=$(sed -nE 's/^Top-5 Accuracy: ([0-9]+(\.[0-9]+)?)%$/\1/p' accuracy_${{ matrix.model }}.txt | head -n1)
517+
518+ if [ -z "$TOP1_ACC" ] || [ -z "$TOP5_ACC" ]; then
519+ echo "Ошибка : Не удалось извлечь точность из файла accuracy_${{ matrix.model }}.txt"
520+ cat accuracy_${{ matrix.model }}.txt
521+ exit 1
522+ fi
523+
524+ CURRENT_TOP1=$(sed -nE "s/.*<!--ACCURACY_${{ matrix.model }}_PLACEHOLDER-->Accuracy : Top-1: ([0-9]+(\\.[0-9]+)?)% \\| Top-5: ([0-9]+(\\.[0-9]+)?)% \\(updated: [0-9-]+\\)<!--END_ACCURACY_${{ matrix.model }}-->.*/\\1/p" README.md | head -n1)
525+ CURRENT_TOP5=$(sed -nE "s/.*<!--ACCURACY_${{ matrix.model }}_PLACEHOLDER-->Accuracy : Top-1: ([0-9]+(\\.[0-9]+)?)% \\| Top-5: ([0-9]+(\\.[0-9]+)?)% \\(updated: [0-9-]+\\)<!--END_ACCURACY_${{ matrix.model }}-->.*/\\3/p" README.md | head -n1)
526+
527+ if [ -n "$CURRENT_TOP1" ] && [ -n "$CURRENT_TOP5" ] && \
528+ [ "$CURRENT_TOP1" = "$TOP1_ACC" ] && [ "$CURRENT_TOP5" = "$TOP5_ACC" ]; then
529+ echo "Accuracy for ${{ matrix.model }} unchanged; keeping existing README update date"
530+ exit 0
531+ fi
532+
533+ DATE=$(date '+%Y-%m-%d')
534+
535+ UPDATE_TEXT="<!--ACCURACY_${{ matrix.model }}_PLACEHOLDER-->Accuracy : Top-1: ${TOP1_ACC}% | Top-5: ${TOP5_ACC}% (updated: ${DATE})<!--END_ACCURACY_${{ matrix.model }}-->"
536+ ESCAPED_UPDATE_TEXT=$(printf '%s\n' "$UPDATE_TEXT" | sed 's/[&|\\]/\\&/g')
537+
538+ if grep -q "<!--ACCURACY_${{ matrix.model }}_PLACEHOLDER-->" README.md; then
539+ sed -i "s|<!--ACCURACY_${{ matrix.model }}_PLACEHOLDER-->.*<!--END_ACCURACY_${{ matrix.model }}-->|${ESCAPED_UPDATE_TEXT}|" README.md
540+ else
541+ echo "Ошибка : Плейсхолдер <!--ACCURACY_${{ matrix.model }}_PLACEHOLDER--> не найден в README.md"
542+ echo "Содержимое README.md:"
543+ cat README.md
544+ exit 1
545+ fi
546+
547+ - name : Commit and push changes (main only)
548+ if : github.ref == 'refs/heads/main' && github.repository == 'embedded-dev-research/ITLabAI'
549+ run : |
550+ git config --global user.name "GitHub Actions"
551+ git config --global user.email "actions@github.com"
552+ git add README.md
553+ if git diff --cached --quiet; then
554+ echo "No changes to commit"
555+ else
556+ git commit -m "[CI] Update accuracy for ${{ matrix.model }}: $(cat accuracy_value_${{ matrix.model }}.txt)"
557+ for attempt in 1 2 3 4 5; do
558+ git pull --rebase origin main && git push origin HEAD:main && break
559+ git rebase --abort || true
560+ [ "$attempt" -eq 5 ] && { echo "Failed to push README update after ${attempt} attempts"; exit 1; }
561+ sleep 5
562+ done
321563 fi
322564
323565 download-dataset :
0 commit comments