Программно-аппаратная среда
- yolov5
- ncnn
- android studio 4.1.2
- oneplus 8
- pytorch 1.6
- onnx
- netron
предисловие
В предыдущих статьях мы уже подробно представилиyolov5
обнаружение, обучение, визуализация и т.д., продолжение этой статьиyolov5
тема, на этот раз давайте посмотрим, какandroid
использоватьyolov5
для обнаружения объектов?
что такое нкнн
Следующий абзац является официальным определением
ncnn
Это высокопроизводительная вычислительная среда для нейронных сетей с открытым исходным кодом от Tencent, специально оптимизированная для мобильных телефонов.ncnn
С самого начала проектирования тщательно продумано развертывание и использование мобильного терминала, без необходимости сторонних зависимостей, кросс-платформенный, мобильный терминалcpu
быстрее, чем все известные фреймворки с открытым исходным кодом. на основеncnn
, разработчики могут легко переносить алгоритмы глубокого обучения на мобильные телефоны для эффективного выполнения и разрабатывать искусственный интеллект.APP
,будетAI
до кончиков пальцев.
В настоящее времяncnn
Большинство из уже поддерживаемыхCNN
сеть, в том числе используемые в этой статьеyolov5
- Classical CNN: VGG AlexNet GoogleNet Inception ...
- Practical CNN: ResNet DenseNet SENet FPN ...
- Light-weight CNN: SqueezeNet MobileNetV1/V2/V3 ShuffleNetV1/V2 MNasNet ...
- Face Detection: MTCNN RetinaFace ...
- Detection: VGG-SSD MobileNet-SSD SqueezeNet-SSD MobileNetV2-SSDLite MobileNetV3-SSDLite ...
- Detection: Faster-RCNN R-FCN ...
- Detection: YOLOV2 YOLOV3 MobileNet-YOLOV3 YOLOV4 YOLOV5 ...
- Segmentation: FCN PSPNet UNet YOLACT ...
- Pose Estimation: SimplePose ...
Практика проектов
Что касается основной части среды, вам нужно использовать ее здесьandroid
среда разработки, напримерandroid studio
,sdk
,ndk
Подождите, эта статья не вводная, если у вас есть какие-либо вопросы, вы можете оставить сообщение в области сообщений.
мы тянем напрямуюyolov5 for android
исходный код
git clone https://github.com/nihui/ncnn-android-yolov5
потом пришелncnn
страница выпуска версии, загрузите скомпилированный пакетGitHub.com/Tencent/Вы можете…, если вам интересно, вы также можете пройтиndk
скомпилируй сам
Загрузите и разархивируйте его и скопируйте вncnn-android-yolov5
Проектapp/src/main/jni
каталог, структура каталогов такая
Затем измените каталог того же уровняCMakeLists.txt
, который будетncnn_DIR
Измените значение переменной на
set(ncnn_DIR ${CMAKE_SOURCE_DIR}/${ANDROID_ABI}/lib/cmake/ncnn)
После сохранения проект можно компилировать.
Здесь для тестирования используется реальная машина, и вам нужно самостоятельно открыть режим разработчика мобильного телефона, чтобы разрешитьUSB
отладка,APP
Откройте после установки, домашняя страница выглядит так
Компоновка интерфейса очень проста, всего есть три кнопки, одна для выбора изображения и одна для использования.CPU
обнаружение, используетсяGPU
обнаружение. Обнаружено путем тестированияCPU
быстрее, чемGPU
в два раза медленнее, мойOnePlus 8
изGPU
скорость только5fps
.
Как использовать собственную модель
После того, как мы обучили нашу модель обнаружения, нам нужен посредник, через который мы можем конвертировать между различными фреймворками.Open Neural Network Exchange
короткое имяONNX
, что означает Open Neural Network Interchange Format, который и является нужным нам посредником.
yolov5
Для обучения модели, пожалуйста, обратитесь к этомуImagination.com/2020/07/02/…, в качестве теста также используем обученную выше модель обнаружения маски
Установить зависимые библиотеки
pip install onnx coremltools onnx-simplifier
Выполнение заказа
python models/export.py --weights runs/exp2/weights/best.pt
в то же времяbest.pt
родственный каталог , также сгенерированныйbest.onnx
,best.mlmodel
иbest.torchscript.pt
Здесь необходимо напомнить, что указанная выше операция экспорта находится вpytorch1.7
иyolov5 v4.0
Версия сообщит об ошибке, моя среда здесьpytorch1.6
,yolov5 3.0
Версия. Сообщение об ошибке выглядит следующим образом
Converting op 143 : listconstruct
Adding op '143' of type const
Converting op 144 : listconstruct
Adding op '144' of type const
Converting op 145 : listconstruct
Adding op '145' of type const
Converting op x.2 : _convolution
Converting Frontend ==> MIL Ops: 3%|██ | 21/620 [00:00<00:00, 1350.49 ops/s]
CoreML export failure: unexpected number of inputs for node x.2 (_convolution): 13
Export complete (12.83s). Visualize with https://github.com/lutzroeder/netron.
Этоcoremltools
один изbug
. См. соответствующие ссылкиGitHub.com/ultra Еще одна ICS…
Далее используйте инструментonnx-simplifier
для упрощенияonnx
,Выполнение заказа
python -m onnxsim runs/exp2/weights/best.onnx runs/exp2/weights/best-sim.onnx
Начать компиляцию нижеncnn
, сначала подготовьте базовую среду
sudo apt install build-essential libopencv-dev cmake
Скомпилируйте и установитеprotobuf
Библиотека зависимостей
git clone https://github.com/protocolbuffers/protobuf.git
cd protobuf
git submodule update --init --recursive
./autogen.sh
./configure
make
make install
sudo ldconfig
После компиляции и установки вы можете просмотретьprotobuf
номер версии
Далее необходимо скомпилироватьncnn
, цель состоит в том, чтобы создатьonnx
изменятьncnn
инструмент командной строки
git clone https://github.com/Tencent/ncnn.git
cd ncnn
git submodule update --init
mkdir build
cd build
cmake ..
make -j8
make install
После компиляции и установки вы можете использоватьonnx2ncnn
инструмент преобразован
cd tools/onnx
./onnx2ncnn ~/Works/weights/best-sim.onnx ~/Works/weights/model.param ~/Works/weights/model.bin
oh, no
, сообщил об ошибке
Это потому чтоslice
не поддерживается. Чтобы исправить это, нам нужно отредактировать сгенерированныйparam
файл, откройте его текстовым инструментом
после редактированияparam
такое, что
Первое число во второй строке — это количество слоев, так как мы убрали 8Crop
и 1Concat
, поэтому его значение равно 201-9=192.
Кроме того, необходимо изменитьReshape
вывод слояgrid
, измените соответствующие значения на -1, это для решения проблемы множественного обнаружения кадров на практике
Можно использоватьnetron
Этот инструмент открывается для просмотра структуры сети,windows
,linux
,macos
выше, адресGitHub.com/R/R директора Лу Роу/…
фото, мы хотим удалитьSplit
,Concat
и 8Crop
узел и добавить новый узелYoloV5Focus
, это имя узла иandroid
в исходном кодеyolov5ncnn_jni.cpp
соответствует имени класса в . Здесь вы можете использовать текстовый редактор иnetron
Используйте их в комбинации и просматривайте их сразу после модификации.
Тогда вы можете заменить оригиналandroid
в разработкеassets
в папкеyolov5s.param
иyolov5s.bin
Затем измените исходный файлyolov5ncnn_jni.cpp
, изменить 2Permute
узлаoutput
Последний отзывclass names
Перекомпилировать проект, подключить к телефону, установитьapk
и беги
Окончательный эффект обнаружения выглядит следующим образом
FAQ
Вот некоторые часто задаваемые вопросы для справки.
Could not install Gradle distribution from 'https://services.gradle.org/distributions/gradle-5.4.1-all.zip'.
закрытиеandroid studio
, вручную с сайтаservices.grad .org/ не говоря уже о третьем дне...Загрузите сжатый пакет и войдите в папкуC:\Users\Administrator.gradle\wrapper\dists\gradle-5.4.1-all\3221gyojl5jsh0helicew7rwx
, удалите все исходное содержимое, скопируйте загруженный сжатый пакет и снова откройте его.android studio
, щелкните в правом верхнем углуSync Project with Gradle Files
Cause: jcenter.bintray.com:443 failed to respond
Эта проблема может быть связана с прокси, вFile
--> Settings
--> HTTP Proxy
, закройте прокси
или отредактируйте файл~.gradle\gradle.properties
,будетproxy
Закомментируйте соответствующее утверждение
Еще ошибка при компиляцииncnn
когда он появитсяtiff
связанные сообщения об ошибках
В основном здесьanaconda
среде, мой подход заключается в том, чтобы полностью броситьanaconda
окрестности
conda deactivate
unset LD_LIBRARY_PATH
Последний вопрос, ошибки, часто возникающие при преобразовании модели
Эта ошибкаyolov5ncnn_jni.cpp
серединаoutput
не соответствует реальной модели
Загрузка исходного кода
Ссылка на сетевой диск Baidu:disk.baidu.com/yes/1U4X FN SEM…Код извлечения:x8oi