Программно-аппаратная среда
- 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