Нейронные сети на Repka Pi
Документация по данному репозиторию доступна по ссылке
Предварительная настройка
-
Создайте директорию workspace в любом для вас удобном месте:
mkdir workspace
-
Перейдите в директорию workspace:
cd workspace
-
Далее клонируем репозиторий с нейронными сетями ml-repka:
Необходимые модели для нейросетей находятся по адресу: https://download.repka-pi.ru/ml/
Куда необходимо переместить модели после скачивания? Ответ:
yolov3.weights ==> humandetect_yolo/data
frozen_inference_graph.pb ==> humandetect_tf/data
yolov3-tiny.weights ==> humandetect_yolo_tiny/data
git clone https://gitflic.ru/project/repka_pi/ml-repka.git
-
Скачиваем Golang:
wget https://go.dev/dl/go1.22.3.linux-arm64.tar.gz
-
После скачивания производим распаковку:
tar -C /usr/local -xzf go1.22.3.linux-arm64.tar.gz
-
После закрытия терминала данная переменная среды слетит. Для того, чтобы это не произошло необходимо добавить команду ниже в самый конец файлов ~/.profile или ~/.bashrc
export PATH=$PATH:/usr/local/go/bin
-
После установки Golang необходимо проверить версию:
go version
-
Т.к. для сборки OpenCV необходима дополнительная память, увеличим размер swap и перезагрузимся:
swapoff /swapfile fallocate -l 6G /swapfile mkswap /swapfile swapon /swapfile reboot
-
После перезагрузки необходимо убедиться, что размер swap увеличился до 6G:
swapon --show
-
Увеличим размер директории /tmp
Внимание! Данный пункт актуален для обладателей Repka Pi с 1GB оперативной памяти
Обращаем внимания, что после перезагрузки директория /tmp вернется к исходному размеруmount -o remount,size=1G /tmp
-
Убедимся, что настройка применилась:
df -h /tmp
- Подготовительные работы перед установкой ml_repka завершены!
Установка OpenCV
-
Перейдем в репозиторий ml_repka:
cd workspace/ml_repka
-
В первую очередь необходимо установить OpenCV, для этого переходим в директорию install:
cd install
-
Запускаем установка OpenCV.
В репозитории ml_repka используется OpenCV версии 4.9.0. Но если вы хотите попробовать другую версию OpenCV, то в файле /install/Makefile возможно заменить переменную OPENCV_VERSION
Установка OpenCV весьма долгий процесс, поэтому РЕКОМЕНДУЕТСЯ запускать ее непосредственно на Repka Pi, а не через удаленное подключение по SSH.
В моем случае установка продлилась: 3 часа 40 минутmake install_raspi
-
После того, как установка завершена, проверим версию OpenCV:
opencv_version
Установка ncnn
-
Перейдите в директорию workspace:
cd workspace
-
Склонируем репозиторий ncnn:
git clone https://github.com/Tencent/ncnn.git
-
После клонирования перейдем в директорию с репозиторием:
cd ncnn
-
Обновим все сабмодули репозитория:
git submodule update --init
-
Создадим директорию для сборки и перейдем в нее:
mkdir build cd build
-
Далее подготовим репозиторий к сборке:
cmake -DCMAKE_BUILD_TYPE=Release -DNCNN_BUILD_EXAMPLES=ON -DNCNN_BUILD_TOOLS=OFF ..
-
Приступим к сборке ncnn
Установка ncnn весьма долгий процесс, поэтому РЕКОМЕНДУЕТСЯ запускать ее непосредственно на Repka Pi, а не через удаленное подключение по SSH.make -j2
-
Произведем установку ncnn:
make install
-
После закрытия терминала данная переменная среды слетит. Для того, чтобы это не произошло необходимо добавить команду ниже в самый конец файлов ~/.profile или ~/.bashrc
export ncnn_DIR=/root/workspace/ncnn/build/install/lib/cmake/ncnn
Установка и запуск распознавания лица
Для выполнения данного шага необходимо пройти шаг 1, 2.1
-
Перейдем в репозиторий ml_repka:
cd workspace/ml_repka
-
Собираем распознаватель лица:
make build-facedetect
-
Возможна ситуация, когда распознаватель лица не запустится.
Одним из вариантов решения данной проблемы - замена значения переменной SOURCE на 1 в файле Makefile.make run-facedetect
Установка и запуск распознавания людей
-
Перейдем в репозиторий ml_repka:
cd workspace/ml_repka
-
Собираем распознаватель людей:
make build-humandetect
-
Далее запустим распознаватель людей:
Перед запуском распознавателя людей необходимо заменить переменную THREADS на 1 в Makefile, т.к. с бОльшим количеством ядер распознаватель людей работает нестабильно.
Либо же, вы можете изменить частоту процессора на 1 или 1.2 GHz - с такой конфигурацией распознаватель будет работать.
Возможна ситуация, когда распознаватель лица не запустится.
Одним из вариантов решения данной проблемы - замена значения переменной SOURCE на 1 в файле Makefile.make run-humandetect
Конфигурирование Makefile
В корне репозитория находится файл Makefile. В нем заданы все основные команды для запуска нейронных сетей на Repka Pi. В нем же есть возможность сконфигурировать аргументы с которыми запускаются нейронные сети.
Список аргументов:
SOURCE - аргумент, отвечающий за источник видеопотока (напр. это может быть ваша вебкамера /dev/video0 или же какой-то видеофайл /some/path/video.mp4)
FPS - ограничение кадров в секунду, которые снимаются, обрабатываются и выводятся с видеопотока. В случае установки значения 0, ограничение не будет работать.
HEIGHT - ограничение по высоте (и ширине пропорционально) для обработки видеопотока. В случае установки значения 0, будет использоваться оригинальный размер.
THREADS - кол-во потоков ОС, которые будут заниматься обработкой видеопотока.
Информация:
Для оптимальной работы на Repka Pi 3 необходимо выставить данные параметры: FPS = 0 HEIGHT = 0 THREADS = 0
Также стоит упомянуть, что не для всех нейронных сетей необходимы все четыре аргумента. Ниже представлена таблица соотношения нейронных сетей и используемых в ней аргументов:
Шаг 5. Альтернативный вариант запуска
Также для запуска нейронных сетей вы можете не пользоваться Makefile. Есть альтернативный вариант запуска:
facedetect
go vet ./facedetect/...; go run ./facedetect <Источник видеопотока> <Ограничение FPS>
facedetect-ssd
go vet ./facedetect_ssd/...; go run ./facedetect_ssd <Источник видеопотока> <Ограничение FPS>
facedetect-yn
cd facedetect_yn
cmake -B build .
cmake --build build -j$(nproc)
./build/demo -s=<Источник видеопотока> -H=<Ограничение высоты>
humandetect-tf
go vet ./humandetect_tf/...; go run ./humandetect_tf <Источник видеопотока> <Ограничение FPS> <Ограничение высоты>
humandetect-yolo
go vet ./humandetect_yolo/...; go run ./humandetect_yolo <Источник видеопотока> <Ограничение FPS>
humandetect-yolo-tiny
go vet ./humandetect_yolo_tiny/...; go run ./humandetect_yolo_tiny <Источник видеопотока> <Ограничение FPS>
humandetect-cv-nanodet-plus
cd humandetect_cv_nanodet_plus
rm -rf build
cmake -B build .
cmake --build build -j$(nproc)
./build/opencv_zoo_object_detection_nanodet -s=<Источник видеопотока> -m=object_detection_nanodet_2022nov.onnx
humandetect-ncnn-nanodet-plus
cd humandetect_ncnn_nanodet_plus
rm -rf build
cmake -B build .
cmake --build build -j$(nproc)
./build/nanodet_demo 2 <Источник видеопотока> nanodet-plus-m_320-sim-opt-fp16
humandetect-ncnn-nanodet
cd humandetect_ncnn_nanodet
rm -rf build
cmake -B build .
cmake --build build -j$(nproc)
./build/nanodet_m_demo <Источник видеопотока> <Кол-во потоков ОС для обработки>
humandetect-pytorch-nanodet-plus
cd humandetect_pytorch_nanodet_plus
python3 demo.py video --config data/config/nanodet-plus-m_320.yml --model data/models/nanodet-plus-m_320.pth --path <Источник видеопотока>
humandetect-mp
cd humandetect_mp
cmake -B build .
cmake --build build -j$(nproc)
./build/opencv_zoo_person_detection_mediapipe -d=<Источник видеопотока>
humandetect-ncnn-yolofastest-v2
cd humandetect_ncnn_yolofastest_v2
rm -rf build
cmake -B build .
cmake --build build -j$(nproc)
./build/yolofastest_demo <Источник видеопотока> <Кол-во потоков ОС для обработки>
humanseg
cd humanseg
cmake -B build .
cmake --build build -j$(nproc)
./build/opencv_zoo_human_segmentation -i=<Источник видеопотока>
Об используемый моделях нейронных сетей
Каскады Хаара
Источник модели: https://github.com/hybridgroup/gocv/blob/release/cmd/facedetect/main.go
Детектор лица Виолы-Джонса, предложенный исследователями Полом Виолой и Майклом Джонсом в 2001 году, стал одним из первых крупных прорывов в этой области.
Используя функции обнаружения линий или краев, предложенные в детекторе Виолы-Джонса, компании Haar Cascades удалось обеспечить столь необходимый прорыв в области обнаружения лиц. Хотя он значительно улучшил скорость и точность обнаружения, он имел свои ограничения и не смог обнаружить лица на зашумленных изображениях. За прошедшие годы произошло много улучшений. Алгоритм Хаара Каскад использовался не только для обнаружения лиц, но также для обнаружения глаз, обнаружения номерных знаков и т. д.
Запускаем
make docker-facedetect
Производительность
Наименование устройства | FPS |
---|---|
Intel i5-1135 | 13 |
Repka-pi 3 | X |
SSD Caffe
Источник модели: https://github.com/hybridgroup/gocv/blob/release/cmd/ssd-facedetect/main.go
Детектор Single Shot. Само название модели раскрывает большую часть подробностей о модели. Да, модель SSD обнаруживает объект за один проход по входному изображению, в отличие от других моделей, которые просматривают изображение более одного раза, чтобы получить выходной результат.
Запускаем
make docker-facedetect-ssd
Производительность
Наименование устройства | FPS |
---|---|
Intel i5-1135 | 16 |
Repka-pi 3 | X |
FaceDetectorYN
Источник модели: https://github.com/opencv/opencv_zoo/tree/main/models/face_detection_yunet
Традиционно OpenCV оснащался детекторами лиц, такими как каскады Хаара и детекторы HOG, которые хорошо работали для фронтальных лиц, но в остальном терпели неудачу. В недавнем выпуске OpenCV (4.5.4, октябрь 2021 г.) была добавлена модель распознавания лиц YuNet, которая решает эту проблему.
Это детектор лиц на основе CNN, разработанный Чэнжуем Ваном и Юантао Фэном. Это очень легкая и быстрая модель. При размере модели менее МБ ее можно загрузить практически на любое устройство. В качестве основы он использует mobilenet и содержит в общей сложности 85 000 параметров.
Запускаем
make docker-facedetect-yn
Производительность
Наименование устройства | FPS |
---|---|
Intel i5-1135 | 60 |
Repka-pi 3 | 5 |
Blazeface
Запуск не производился. Но нейросеть перспективная.
Источник: https://github.com/zineos/blazeface
Yolo v3
Источник модели: https://pjreddie.com/darknet/yolo/
YOLOv3 (You Only Look Once, Version 3) — это алгоритм обнаружения объектов в реальном времени, который идентифицирует конкретные объекты в видео, прямых трансляциях или изображениях. Алгоритм машинного обучения YOLO использует функции, изученные глубокой сверточной нейронной сетью, для обнаружения объектов, расположенных на изображении. Джозеф Редмон и Али Фархади — создатели версий YOLO 1–3, причем третья версия алгоритма машинного обучения YOLO является наиболее точной версией исходного алгоритма машинного обучения. Джозеф Редмон и Али Фархади создали первую версию алгоритмов YOLO в 2016 году. Два года спустя, в 2018 году, они выпустили версию 3. YOLOv3 — это улучшенная версия YOLO и YOLOv2. YOLO реализован с использованием библиотек глубокого обучения Keras или OpenCV.
make docker-humandetect-yolo
Производительность
Наименование устройства | FPS |
---|---|
Intel i5-1135 | 2 |
Repka-pi 3 | менее 1 |
Yolo v3 tiny
Источник модели: https://pjreddie.com/darknet/yolo/
Отличается от Yolo v3 меньшим количеством слоев и меньшей точностью. Также кол-во выходных слоев 2 вместо 3 (у YoLo).
make docker-humandetect-yolo-tiny
Производительность
Наименование устройства | FPS |
---|---|
Intel i5-1135 | 14 |
Repka-pi 3 | 1 |
TF MobileNet
Источник модели: https://github.com/hybridgroup/gocv/blob/release/cmd/dnn-detection/main.go
Модель mobilenet-ssd представляет собой сеть однократного мультибоксового обнаружения (SSD), предназначенную для обнаружения объектов. Эта модель реализована с использованием платформы Caffe*. Подробности об этой модели можно найти в репозитории.
Входные данные модели представляют собой большой двоичный объект, состоящий из одного изображения 1, 3, 300, 300 в порядке BGR, также как и модель Densnet-121. Средние значения BGR необходимо вычесть следующим образом: (127,5, 127,5, 127,5) перед передачей объекта изображения в сеть. Кроме того, значения необходимо разделить на 0,007843.
make docker-humandetect-tf
Производительность
Наименование устройства | FPS |
---|---|
Intel i5-1135 | 16 |
Repka-pi 3 | 1 |
Nanodet plus на бекенде pytorch
Источник модели: https://github.com/opencv/opencv_zoo/tree/main/models/object_detection_nanodet
NanoDet — это одноэтапная модель обнаружения объектов без привязки в стиле FCOS, которая использует обобщенную фокальную потерю в качестве потери классификации и регрессии. В NanoDet-Plus предлагается новую стратегию назначения меток с простым модулем управления назначением (AGM) и динамический программный модуль назначения меток (DSLA) для решения проблемы оптимального назначения меток при обучении упрощенной модели.
Примечание:
- Эта версия NanoDet: Nanodet-m-plus-1.5x_416
make docker-humandetect-pytorch-nanodet-plus
Производительность
Наименование устройства | FPS |
---|---|
Intel i5-1135 | 10 |
Repka-pi 3 | - |
Nanodet plus 1.5 416 x 416 на чистом OpenCV
Источник модели: https://github.com/opencv/opencv_zoo/tree/main/models/object_detection_nanodet
make docker-humandetect-cv-nanodet-plus
Производительность
Наименование устройства | FPS |
---|---|
Intel i5-1135 | 18 |
Repka-pi 3 | 2 |
Nanodet m plus на бекенде NCNN
Источник модели: https://github.com/RangiLyu/nanodet/blob/main/demo_ncnn/README.md
make docker-humandetect-ncnn-nanodet-plus
Производительность
Наименование устройства | FPS |
---|---|
Intel i5-1135 | 65 |
Repka-pi 3 | 3 |
Nanodet m на бекенде NCNN
Источник модели: https://github.com/Qengineering/NanoDet-ncnn-Raspberry-Pi-4
make docker-humandetect-ncnn-nanodet
Производительность
Наименование устройства | FPS |
---|---|
Intel i5-1135 | 120 |
Repka-pi 3 | 6 |
MediaPipe Pose
Источник модели: https://github.com/opencv/opencv_zoo/tree/main/models/person_detection_mediapipe
Эта модель определяет ключевые точки верхней части тела и всего тела человека и загружается с сайта https://github.com/PINTO0309/PINTO_model_zoo/blob/main/053_BlazePose/20_densify_pose_detection/download.sh или преобразовано из TFLite в ONNX, используя следующие инструменты:
Модель TFLite для ONNX с пользовательской опцией уплотнения MediaPipe: https://github.com/PINTO0309/tflite2tensorflow упрощено onnx-simplifier Якоря SSD генерируются из GenMediaPipePalmDectionSSDAnchors https://github.com/VimalMollyn/GenMediaPipePalmDectionSSDAnchors
make docker-humandetect-mp
Производительность
Наименование устройства | FPS |
---|---|
Intel i5-1135 | 50 |
Repka-pi 3 | 6 |
Yolo fastest v2 m на бекенде NCNN
Источник модели: https://github.com/dog-qiuqiu/Yolo-FastestV2
На основе сверхлегкого универсального алгоритма обнаружения целей yolo объем вычислений составляет всего 250 мфлопс, размер модели ncnn составляет всего 666 КБ, Raspberry Pi 3b может работать со скоростью до 15 кадров в секунду+
Различные веса потерь для разных выходных слоев масштаба. Основа заменена на более легкую shufflenetV2. Механизм сопоставления привязок и потери заменяются YoloV5, а потеря классификации заменяется перекрестной энтропией softmax из сигмоида.
make docker-humandetect-ncnn-yolofastest-v2
Производительность
Наименование устройства | FPS |
---|---|
Intel i5-1135 | 140 |
Repka-pi 3 | 10 |
PPHumanseg
Источник модели: https://github.com/opencv/opencv_zoo/tree/main/models/human_segmentation_pphumanseg
Задача сегментации для изображений людей.
Эта модель портирована из PaddleHub с использованием этого скрипта из OpenCV.
make docker-humanseg
Производительность
Наименование устройства | FPS |
---|---|
Intel i5-1135 | 48 |
Repka-pi 3 | 5 |
Результаты бенчмарков на фреймворке NCNN
Источник: https://github.com/Tencent/ncnn/blob/master/benchmark/README.md
Benchncnn можно использовать для проверки производительности вывода нейронной сети.
Требуются только файлы параметров сети (.param ncnn).
Двоичные файлы больших моделей (ncnn bin) не загружаются, а генерируются случайным образом для проверки скорости.
Если модель не указана, будет использован список по умолчанию. Дополнительные модели сетей могут быть добавлены позже.
Команда
Копируем все *.param из /ncnn/benchmark/ в /ncnn/build/benchmark/
./benchncnn [loop count] [num threads] [powersave] [gpu device] [cooling down] [(key=value)...]
param=model.param
shape=[227,227,3],..
Параметры
- loop count - Кол-во повторений
- num threads - Кол-во потоков
- powersave - Параметр для энергосберегающих ядер (если есть)
- gpu device - Выбор устройства
- cooling down - Охлаждение
Параметр | Значения | По умолчанию |
---|---|---|
loop count | 1~N | 4 |
num threads | 1~N | max_cpu_count |
powersave | 0=all cores, 1=little cores only, 2=big cores only | 0 |
gpu device | -1=cpu-only, 0=gpu0, 1=gpu1 … | -1 |
cooling down | 0=disable, 1=enable | 1 |
param | ncnn model.param filepath | - |
shape | model input shapes with, whc format | - |
Выполняем команду на запуск бенчмарка
cp /ncnn/benchmark/*.param /ncnn/build/benchmark/ ;\
cd /ncnn/build/benchmark ;\
./benchncnn 4 4 0 -1 1
Intel i5-1135
loop_count = 4
num_threads = 4
powersave = 0
gpu_device = -1
cooling_down = 1
squeezenet min = 5.59 max = 7.34 avg = 6.43
squeezenet_int8 min = 6.59 max = 9.34 avg = 7.43
mobilenet min = 7.46 max = 8.82 avg = 7.94
mobilenet_int8 min = 6.56 max = 8.09 avg = 7.13
mobilenet_v2 min = 8.28 max = 8.91 avg = 8.53
mobilenet_v3 min = 5.92 max = 7.42 avg = 6.44
shufflenet min = 4.04 max = 4.52 avg = 4.26
shufflenet_v2 min = 4.11 max = 4.69 avg = 4.40
mnasnet min = 6.11 max = 6.19 avg = 6.15
proxylessnasnet min = 5.59 max = 8.35 avg = 6.58
efficientnet_b0 min = 8.33 max = 9.30 avg = 8.65
efficientnetv2_b0 min = 10.42 max = 14.00 avg = 11.72
regnety_400m min = 10.16 max = 10.83 avg = 10.40
blazeface min = 1.00 max = 1.13 avg = 1.06
googlenet min = 17.23 max = 20.18 avg = 18.23
googlenet_int8 min = 13.66 max = 16.99 avg = 15.49
resnet18 min = 20.75 max = 21.38 avg = 21.15
resnet18_int8 min = 12.62 max = 12.99 avg = 12.83
alexnet min = 15.90 max = 16.97 avg = 16.34
vgg16 min = 102.71 max = 105.85 avg = 104.34
vgg16_int8 min = 77.57 max = 82.93 avg = 80.38
resnet50 min = 42.14 max = 44.36 avg = 42.76
resnet50_int8 min = 28.72 max = 37.81 avg = 32.65
squeezenet_ssd min = 20.03 max = 21.72 avg = 20.79
squeezenet_ssd_int8 min = 18.77 max = 21.48 avg = 19.86
mobilenet_ssd min = 14.83 max = 19.97 avg = 16.74
mobilenet_ssd_int8 min = 9.36 max = 9.71 avg = 9.59
mobilenet_yolo min = 36.56 max = 40.00 avg = 37.91
mobilenetv2_yolov3 min = 24.87 max = 26.23 avg = 25.52
yolov4-tiny min = 46.84 max = 49.81 avg = 48.16
nanodet_m min = 9.77 max = 10.03 avg = 9.88
yolo-fastest-1.1 min = 3.90 max = 4.12 avg = 4.04
yolo-fastestv2 min = 4.39 max = 4.71 avg = 4.58
vision_transformer min = 261.02 max = 271.67 avg = 265.27
FastestDet min = 5.13 max = 6.70 avg = 6.03
Repka-pi 3 (1.X GHz x 4)
loop_count = 4
num_threads = 4
powersave = 0
gpu_device = -1
cooling_down = 1
squeezenet min = 76.24 max = 120.23 avg = 97.54
squeezenet_int8 min = 63.45 max = 65.50 avg = 64.02
mobilenet min = 101.85 max = 102.03 avg = 101.94
mobilenet_int8 min = 59.11 max = 59.45 avg = 59.25
mobilenet_v2 min = 99.67 max = 100.27 avg = 99.88
mobilenet_v3 min = 78.92 max = 79.71 avg = 79.20
shufflenet min = 54.33 max = 55.11 avg = 54.58
shufflenet_v2 min = 42.43 max = 45.42 avg = 43.31
mnasnet min = 88.61 max = 92.87 avg = 89.85
proxylessnasnet min = 93.97 max = 95.53 avg = 94.73
efficientnet_b0 min = 125.71 max = 129.26 avg = 126.85
efficientnetv2_b0 min = 139.83 max = 141.40 avg = 140.73
regnety_400m min = 103.72 max = 147.50 avg = 117.06
blazeface min = 13.65 max = 13.92 avg = 13.79
googlenet min = 213.94 max = 217.71 avg = 215.13
googlenet_int8 min = 167.84 max = 173.75 avg = 169.48
resnet18 min = 257.77 max = 261.17 avg = 259.22
resnet18_int8 min = 134.86 max = 135.66 avg = 135.27
alexnet min = 152.24 max = 153.27 avg = 152.87
vgg16 min = 1037.71 max = 1063.01 avg = 1047.76
vgg16_int8 min = 661.61 max = 713.52 avg = 688.23
resnet50 min = 558.95 max = 603.01 avg = 570.88
resnet50_int8 min = 355.93 max = 367.14 avg = 358.91
squeezenet_ssd min = 228.83 max = 231.76 avg = 230.74
squeezenet_ssd_int8 min = 162.13 max = 203.04 avg = 172.51
mobilenet_ssd min = 224.50 max = 270.76 avg = 236.26
mobilenet_ssd_int8 min = 125.41 max = 162.50 avg = 134.97
mobilenet_yolo min = 463.72 max = 508.83 avg = 478.34
mobilenetv2_yolov3 min = 322.56 max = 325.75 avg = 323.61
yolov4-tiny min = 389.57 max = 398.84 avg = 393.23
nanodet_m min = 114.32 max = 115.73 avg = 115.03
yolo-fastest-1.1 min = 73.63 max = 74.31 avg = 73.95
yolo-fastestv2 min = 55.28 max = 57.77 avg = 56.04
vision_transformer min = 3687.04 max = 6926.74 avg = 4678.55
FastestDet min = 58.73 max = 60.93 avg = 59.37
Raspberry Pi 3 Model B+ Broadcom BCM2837B0, Cortex-A53 (ARMv8) (1.4GHz x 4)
pi@raspberrypi:~/ncnn/build/benchmark $ ./benchncnn 4 4 0 -1 1
loop_count = 4
num_threads = 4
powersave = 0
gpu_device = -1
cooling_down = 1
squeezenet min = 84.74 max = 85.60 avg = 85.22
squeezenet_int8 min = 74.48 max = 74.80 avg = 74.68
mobilenet min = 107.84 max = 110.13 avg = 108.66
mobilenet_int8 min = 66.91 max = 67.12 avg = 67.03
mobilenet_v2 min = 110.64 max = 112.73 avg = 111.68
mobilenet_v3 min = 85.78 max = 86.74 avg = 86.44
shufflenet min = 58.38 max = 60.32 avg = 59.33
shufflenet_v2 min = 46.76 max = 47.53 avg = 47.19
mnasnet min = 95.53 max = 95.88 avg = 95.78
proxylessnasnet min = 102.24 max = 105.58 avg = 103.38
efficientnet_b0 min = 134.87 max = 136.98 avg = 135.86
efficientnetv2_b0 min = 146.62 max = 148.06 avg = 147.13
regnety_400m min = 118.60 max = 119.51 avg = 119.03
blazeface min = 15.42 max = 15.61 avg = 15.52
googlenet min = 223.78 max = 224.85 avg = 224.22
googlenet_int8 min = 188.23 max = 190.15 avg = 189.21
resnet18 min = 270.86 max = 272.66 avg = 271.93
resnet18_int8 min = 159.57 max = 160.39 avg = 160.07
alexnet min = 157.79 max = 160.77 avg = 159.09
resnet50 min = 583.57 max = 591.41 avg = 587.42
resnet50_int8 min = 383.96 max = 401.37 avg = 391.87
squeezenet_ssd min = 247.90 max = 249.77 avg = 248.98
squeezenet_ssd_int8 min = 191.65 max = 192.81 avg = 192.17
mobilenet_ssd min = 240.11 max = 241.02 avg = 240.62
mobilenet_ssd_int8 min = 136.30 max = 137.26 avg = 136.73
mobilenet_yolo min = 523.59 max = 539.91 avg = 529.98
mobilenetv2_yolov3 min = 356.44 max = 366.85 avg = 362.06
yolov4-tiny min = 410.25 max = 422.18 avg = 417.17
nanodet_m min = 114.98 max = 115.83 avg = 115.40
yolo-fastest-1.1 min = 79.85 max = 80.83 avg = 80.28
yolo-fastestv2 min = 62.36 max = 62.91 avg = 62.60
FastestDet min = 67.11 max = 68.51 avg = 67.98
Raspberry Pi 4 Model B Broadcom BCM2711B0, Cortex-A72 (ARMv8) (1.8GHz x 4)
pi@raspberrypi:~/ncnn/build/benchmark $ ./benchncnn 10 4 0 -1 1
loop_count = 10
num_threads = 4
powersave = 0
gpu_device = -1
cooling_down = 1
squeezenet min = 46.28 max = 46.91 avg = 46.65
squeezenet_int8 min = 42.18 max = 44.98 avg = 42.59
mobilenet min = 60.74 max = 61.79 avg = 61.17
mobilenet_int8 min = 34.19 max = 34.55 avg = 34.37
mobilenet_v2 min = 61.63 max = 62.02 avg = 61.88
mobilenet_v3 min = 47.08 max = 48.40 avg = 47.53
shufflenet min = 32.91 max = 33.30 avg = 33.09
shufflenet_v2 min = 24.37 max = 24.73 avg = 24.56
mnasnet min = 51.80 max = 52.14 avg = 51.98
proxylessnasnet min = 53.02 max = 53.58 avg = 53.32
efficientnet_b0 min = 73.92 max = 74.44 avg = 74.19
efficientnetv2_b0 min = 79.10 max = 79.60 avg = 79.34
regnety_400m min = 65.27 max = 66.12 avg = 65.70
blazeface min = 8.62 max = 8.75 avg = 8.69
googlenet min = 113.74 max = 115.14 avg = 114.35
googlenet_int8 min = 100.87 max = 101.71 avg = 101.25
resnet18 min = 122.27 max = 125.39 avg = 123.12
resnet18_int8 min = 82.19 max = 94.12 avg = 83.92
alexnet min = 75.75 max = 78.08 avg = 76.40
vgg16 min = 541.66 max = 552.56 avg = 547.09
vgg16_int8 min = 391.44 max = 395.73 avg = 394.23
resnet50 min = 261.90 max = 263.91 avg = 262.83
resnet50_int8 min = 195.60 max = 198.08 avg = 196.65
squeezenet_ssd min = 127.01 max = 129.85 avg = 127.61
squeezenet_ssd_int8 min = 104.98 max = 107.67 avg = 105.47
mobilenet_ssd min = 120.43 max = 123.28 avg = 121.46
mobilenet_ssd_int8 min = 70.70 max = 72.85 avg = 71.14
mobilenet_yolo min = 270.89 max = 273.42 avg = 272.33
mobilenetv2_yolov3 min = 183.85 max = 185.73 avg = 184.88
yolov4-tiny min = 205.95 max = 209.90 avg = 207.22
nanodet_m min = 68.08 max = 68.69 avg = 68.38
yolo-fastest-1.1 min = 47.97 max = 48.20 avg = 48.06
yolo-fastestv2 min = 37.17 max = 37.69 avg = 37.47
vision_transformer min = 1872.31 max = 1964.95 avg = 1909.21
FastestDet min = 38.39 max = 39.17 avg = 38.69
Raspberry Pi 5 Broadcom BCM2712, Cortex-A76 (ARMv8) (2.4GHz x 4)
pi@raspberrypi:~/ncnn/benchmark $ ./benchncnn 10 4 0 -1 -1 >> text.out
loop_count = 10
num_threads = 4
powersave = 0
gpu_device = -1
cooling_down = 1
squeezenet min = 6.74 max = 8.16 avg = 7.38
squeezenet_int8 min = 6.97 max = 7.67 avg = 7.21
mobilenet min = 9.00 max = 72.98 avg = 33.88
mobilenet_int8 min = 8.68 max = 8.80 avg = 8.74
mobilenet_v2 min = 10.46 max = 10.63 avg = 10.52
mobilenet_v3 min = 7.30 max = 7.44 avg = 7.35
shufflenet min = 4.14 max = 4.18 avg = 4.16
shufflenet_v2 min = 3.37 max = 3.41 avg = 3.39
mnasnet min = 6.83 max = 8.55 avg = 7.10
proxylessnasnet min = 7.85 max = 7.97 avg = 7.88
efficientnet_b0 min = 12.28 max = 12.37 avg = 12.33
efficientnetv2_b0 min = 13.54 max = 13.84 avg = 13.69
regnety_400m min = 10.93 max = 11.07 avg = 10.99
blazeface min = 1.45 max = 1.48 avg = 1.47
googlenet min = 25.13 max = 25.47 avg = 25.35
googlenet_int8 min = 24.00 max = 24.23 avg = 24.12
resnet18 min = 19.84 max = 20.19 avg = 19.96
resnet18_int8 min = 16.68 max = 16.83 avg = 16.74
alexnet min = 21.21 max = 21.54 avg = 21.36
vgg16 min = 127.75 max = 134.00 avg = 129.24
vgg16_int8 min = 106.39 max = 110.66 avg = 107.01
resnet50 min = 45.94 max = 46.54 avg = 46.21
resnet50_int8 min = 40.16 max = 42.58 avg = 40.75
squeezenet_ssd min = 30.10 max = 30.95 avg = 30.37
squeezenet_ssd_int8 min = 27.71 max = 29.03 avg = 28.15
mobilenet_ssd min = 24.16 max = 24.89 avg = 24.52
mobilenet_ssd_int8 min = 21.79 max = 22.37 avg = 22.05
mobilenet_yolo min = 58.06 max = 58.45 avg = 58.19
mobilenetv2_yolov3 min = 37.49 max = 37.94 avg = 37.68
yolov4-tiny min = 44.45 max = 60.58 avg = 46.29
nanodet_m min = 11.01 max = 11.28 avg = 11.18
yolo-fastest-1.1 min = 5.53 max = 5.97 avg = 5.62
yolo-fastestv2 min = 4.76 max = 4.84 avg = 4.80
vision_transformer min = 600.65 max = 622.47 avg = 611.65
FastestDet min = 4.83 max = 6.94 avg = 5.34
Raspberry Pi 5 Broadcom BCM2712, VideoCore VII Graphics (Vulkan 1.2)
fan@raspberrypi:~/ncnn/benchmark $ ../build/benchmark/benchncnn 10 $(nproc) 0 0
[0 V3D 7.1.7] queueC=0[1] queueG=0[1] queueT=0[1]
[0 V3D 7.1.7] bugsbn1=0 bugbilz=0 bugcopc=0 bugihfa=0
[0 V3D 7.1.7] fp16-p/s/a=1/1/0 int8-p/s/a=1/1/0
[0 V3D 7.1.7] subgroup=16 basic/vote/ballot/shuffle=1/0/0/0
[0 V3D 7.1.7] fp16-matrix-16_8_8/16_8_16/16_16_16=0/0/0
[1 llvmpipe (LLVM 15.0.6, 128 bits)] queueC=0[1] queueG=0[1] queueT=0[1]
[1 llvmpipe (LLVM 15.0.6, 128 bits)] bugsbn1=0 bugbilz=0 bugcopc=0 bugihfa=0
[1 llvmpipe (LLVM 15.0.6, 128 bits)] fp16-p/s/a=1/1/1 int8-p/s/a=1/1/1
[1 llvmpipe (LLVM 15.0.6, 128 bits)] subgroup=4 basic/vote/ballot/shuffle=1/1/1/1
[1 llvmpipe (LLVM 15.0.6, 128 bits)] fp16-matrix-16_8_8/16_8_16/16_16_16=0/0/0
loop_count = 10
num_threads = 4
powersave = 0
gpu_device = 0
cooling_down = 1
squeezenet min = 120.75 max = 121.31 avg = 120.94
squeezenet_int8 min = 9.57 max = 24.49 avg = 11.23
mobilenet min = 160.32 max = 160.75 avg = 160.53
mobilenet_int8 min = 11.29 max = 11.47 avg = 11.37
mobilenet_v2 min = 121.05 max = 121.93 avg = 121.46
mobilenet_v3 min = 117.90 max = 119.20 avg = 118.48
shufflenet min = 70.82 max = 71.55 avg = 71.04
shufflenet_v2 min = 97.74 max = 98.58 avg = 98.00
mnasnet min = 118.21 max = 118.76 avg = 118.44
proxylessnasnet min = 124.28 max = 124.92 avg = 124.52
efficientnet_b0 min = 187.48 max = 188.38 avg = 187.93
efficientnetv2_b0 min = 270.11 max = 280.80 avg = 272.26
regnety_400m min = 142.14 max = 143.25 avg = 142.66
blazeface min = 31.97 max = 32.41 avg = 32.17
googlenet min = 346.30 max = 347.47 avg = 346.81
googlenet_int8 min = 30.77 max = 32.26 avg = 31.52
resnet18 min = 346.96 max = 347.50 avg = 347.26
resnet18_int8 min = 19.95 max = 20.95 avg = 20.48
alexnet min = 181.57 max = 182.03 avg = 181.75
vgg16 min = 1776.00 max = 1776.66 avg = 1776.40
vgg16_int8 min = 134.10 max = 141.76 avg = 136.32
resnet50 min = 841.90 max = 842.50 avg = 842.16
resnet50_int8 min = 54.29 max = 55.22 avg = 54.54
squeezenet_ssd min = 461.71 max = 468.09 avg = 466.97
squeezenet_ssd_int8 min = 38.05 max = 39.00 avg = 38.58
mobilenet_ssd min = 379.50 max = 381.66 avg = 380.14
mobilenet_ssd_int8 min = 29.91 max = 30.77 avg = 30.13
mobilenet_yolo min = 753.61 max = 755.06 avg = 753.97
mobilenetv2_yolov3 min = 382.18 max = 389.90 avg = 386.97
yolov4-tiny min = 673.87 max = 674.71 avg = 674.07
nanodet_m min = 206.55 max = 210.48 avg = 209.69
yolo-fastest-1.1 min = 109.98 max = 111.18 avg = 110.45
yolo-fastestv2 min = 86.07 max = 87.16 avg = 86.51
vision_transformer min = 20594.51 max = 20601.53 avg = 20596.59
FastestDet min = 90.25 max = 91.00 avg = 90.64
Raspberry Pi Zero 2 W Broadcom BCM2710A1, Cortex-A53 (ARMv8) (1.0GHz x 4)
loop_count = 8
num_threads = 4
powersave = 0
gpu_device = -1
cooling_down = 1
squeezenet min = 119.52 max = 120.29 avg = 119.93
squeezenet_int8 min = 96.32 max = 96.96 avg = 96.55
mobilenet min = 162.60 max = 165.49 avg = 163.19
mobilenet_int8 min = 90.78 max = 91.39 avg = 91.03
mobilenet_v2 min = 145.71 max = 148.83 avg = 147.39
mobilenet_v3 min = 113.89 max = 151.95 avg = 119.04
shufflenet min = 72.72 max = 73.27 avg = 72.96
shufflenet_v2 min = 63.64 max = 64.50 avg = 64.13
mnasnet min = 126.07 max = 126.93 avg = 126.53
proxylessnasnet min = 139.90 max = 140.84 avg = 140.35
efficientnet_b0 min = 201.88 max = 202.55 avg = 202.14
efficientnetv2_b0 min = 227.22 max = 228.84 avg = 228.09
regnety_400m min = 156.49 max = 157.47 avg = 156.96
blazeface min = 22.79 max = 23.28 avg = 23.10
googlenet min = 323.74 max = 324.90 avg = 324.45
googlenet_int8 min = 250.86 max = 252.82 avg = 251.63
resnet18 min = 351.37 max = 355.67 avg = 353.45
resnet18_int8 min = 194.83 max = 196.68 avg = 195.51
alexnet min = 271.18 max = 273.53 avg = 272.18
resnet50 min = 777.44 max = 797.47 avg = 782.63
resnet50_int8 min = 496.78 max = 498.86 avg = 497.57
squeezenet_ssd min = 376.10 max = 382.41 avg = 379.13
squeezenet_ssd_int8 min = 255.99 max = 257.57 avg = 256.78
mobilenet_ssd min = 338.64 max = 339.93 avg = 339.50
mobilenet_ssd_int8 min = 190.24 max = 190.68 avg = 190.48
mobilenet_yolo min = 746.83 max = 748.14 avg = 747.53
mobilenetv2_yolov3 min = 487.99 max = 491.18 avg = 489.37
yolov4-tiny min = 644.73 max = 652.24 avg = 646.64
nanodet_m min = 165.27 max = 167.12 avg = 166.27
yolo-fastest-1.1 min = 98.74 max = 100.02 avg = 99.17
yolo-fastestv2 min = 80.52 max = 81.86 avg = 81.29