Обнаружение объектов YOLOv5 на Android

глубокое обучение

Программно-аппаратная среда

  • yolov5
  • ncnn
  • android studio 4.1.2
  • oneplus 8
  • pytorch 1.6
  • onnx
  • netron

предисловие

В предыдущих статьях мы уже подробно представилиyolov5обнаружение, обучение, визуализация и т.д., продолжение этой статьиyolov5тема, на этот раз давайте посмотрим, какandroidиспользоватьyolov5для обнаружения объектов?

yolov5 ncnn android

что такое нкнн

Следующий абзац является официальным определением

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скомпилируй сам

yolov5 ncnn android

Загрузите и разархивируйте его и скопируйте вncnn-android-yolov5Проектapp/src/main/jniкаталог, структура каталогов такая

yolov5 ncnn android

Затем измените каталог того же уровняCMakeLists.txt, который будетncnn_DIRИзмените значение переменной на

set(ncnn_DIR ${CMAKE_SOURCE_DIR}/${ANDROID_ABI}/lib/cmake/ncnn)

yolov5 ncnn android

После сохранения проект можно компилировать.

Здесь для тестирования используется реальная машина, и вам нужно самостоятельно открыть режим разработчика мобильного телефона, чтобы разрешитьUSBотладка,APPОткройте после установки, домашняя страница выглядит так

yolov5 ncnn android

Компоновка интерфейса очень проста, всего есть три кнопки, одна для выбора изображения и одна для использования.CPUобнаружение, используетсяGPUобнаружение. Обнаружено путем тестированияCPUбыстрее, чемGPUв два раза медленнее, мойOnePlus 8изGPUскорость только5fps.

yolov5 ncnn android

yolov5 ncnn android

Как использовать собственную модель

После того, как мы обучили нашу модель обнаружения, нам нужен посредник, через который мы можем конвертировать между различными фреймворками.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

yolov5 ncnn android

в то же времяbest.ptродственный каталог , также сгенерированныйbest.onnx,best.mlmodelиbest.torchscript.pt

yolov5 ncnn android

Здесь необходимо напомнить, что указанная выше операция экспорта находится в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

yolov5 ncnn android

Начать компиляцию ниже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номер версии

yolov5 ncnn android

Далее необходимо скомпилировать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, сообщил об ошибке

yolov5 ncnn android

Это потому чтоsliceне поддерживается. Чтобы исправить это, нам нужно отредактировать сгенерированныйparamфайл, откройте его текстовым инструментом

yolov5 ncnn android

после редактированияparamтакое, что

yolov5 ncnn android

Первое число во второй строке — это количество слоев, так как мы убрали 8Cropи 1Concat, поэтому его значение равно 201-9=192.

Кроме того, необходимо изменитьReshapeвывод слояgrid, измените соответствующие значения на -1, это для решения проблемы множественного обнаружения кадров на практике

Можно использоватьnetronЭтот инструмент открывается для просмотра структуры сети,windows,linux,macosвыше, адресGitHub.com/R/R директора Лу Роу/…

yolov5 ncnn android

фото, мы хотим удалитьSplit,Concatи 8Cropузел и добавить новый узелYoloV5Focus, это имя узла иandroidв исходном кодеyolov5ncnn_jni.cppсоответствует имени класса в . Здесь вы можете использовать текстовый редактор иnetronИспользуйте их в комбинации и просматривайте их сразу после модификации.

yolov5 ncnn android

yolov5 ncnn android

Тогда вы можете заменить оригиналandroidв разработкеassetsв папкеyolov5s.paramиyolov5s.bin

yolov5 ncnn android

Затем измените исходный файлyolov5ncnn_jni.cpp, изменить 2Permuteузлаoutput

yolov5 ncnn android

yolov5 ncnn android

yolov5 ncnn android

Последний отзывclass names

yolov5 ncnn android

Перекомпилировать проект, подключить к телефону, установитьapkи беги

Окончательный эффект обнаружения выглядит следующим образом

yolov5 ncnn android

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

yolov5 ncnn android

Cause: jcenter.bintray.com:443 failed to respond

Эта проблема может быть связана с прокси, вFile --> Settings --> HTTP Proxy, закройте прокси

yolov5 ncnn android

или отредактируйте файл~.gradle\gradle.properties,будетproxyЗакомментируйте соответствующее утверждение

yolov5 ncnn android

Еще ошибка при компиляцииncnnкогда он появитсяtiffсвязанные сообщения об ошибках

yolov5 ncnn android

В основном здесьanacondaсреде, мой подход заключается в том, чтобы полностью броситьanacondaокрестности

conda deactivate
unset LD_LIBRARY_PATH

Последний вопрос, ошибки, часто возникающие при преобразовании модели

yolov5 ncnn android

Эта ошибкаyolov5ncnn_jni.cppсерединаoutputне соответствует реальной модели

Загрузка исходного кода

Ссылка на сетевой диск Baidu:disk.baidu.com/yes/1U4X FN SEM…Код извлечения:x8oi

использованная литература