Весь процесс преобразования модели pytorch в onnx, а затем в ncnn в системе Windows с практическим обучением

предисловие

В последнее время я занят проектом, и мне нужно развернуть модель, обученную pytorch, на мобильном терминале. Затем я столкнулся с некоторыми подводными камнями, просто запишите весь процесс, и преобразованная модель использует классическую сетевую модель классификации mobilenet_v2.

Преобразование модели pytorch в модель onnx

Подготовка окружающей среды

Этот шаг относительно прост. Вам нужно только установить pytorch. Здесь автор использует версию pytorch 1.9.1, и вы можете установить ее непосредственно с помощью pip.

шаги конверсии

Кодов для конвертации pytorch в onnx в интернете много, и они относительно просты.Есть несколько моментов, на которые следует обратить внимание: 1) При импорте модели необходимо импортировать структуру сети и параметры модели модели.Некоторые модели pytorch сохраняют только параметры модели, а также необходимо импортировать сетевую структуру модели; 2) при преобразовании pytorch в onnx вам необходимо ввести входной размер модели onnx.Некоторые модели имеют фиксированный размер, а некоторые не фиксируются. Это нужно различать

Для справки код преобразования выглядит следующим образом:

import os
import sys
import torch
import torchvision

def export_onnx():

    onnx_model_name = "mobilenet.onnx"

    print("Loading Model")
    model = torchvision.models.mobilenet_v2(pretrained=True)
    model.eval() # Put in inference mode
    
    # Create dummy input
    dummy_input = torch.randn(1, 3, 224, 224)

    # Export as ONNX
    print(f"Exporting as ONNX: {
      
      onnx_model_name}")
    torch.onnx._export(
        model,
        dummy_input,
        onnx_model_name, # Output name
        opset_version=13, # ONNX Opset Version
        export_params=True, # Store the trained parameters in the model file
        do_constant_folding=True, # Execute constant folding for optimization
        input_names = ['input'],   # the model's input names 
        # output_names = ['pred_logits', 'pred_points'], # the model's output names (see forward in the architecture)
        output_names = ['pred_logits'], # the model's output names (see forward in the architecture)
        # dynamic_axes={
    
    
        #     # Input is an image [batch_size, channels, width, height]
        #     # all of it can be variable so we need to add it in dynamic_axes
        #     'input': {
    
    
        #         0: 'batch_size',
        #         1: 'channels',
        #         2: 'width',
        #         3: 'height'
        #     }, 
        #     'pred_logits': [0, 1, 2]
        # } 
    )



if __name__ == '__main__':

    export_onnx()

Подобно тому, как автор использует torchvision для загрузки модели, скрипт автоматически загружает модель из библиотеки torchvision и сохраняет ее локально, локальный путь сохранения — C:\Users\username.cache\torch\hub\checkpoints.

Преобразование модели onnx в ncnn

Сборка среды

Программное обеспечение, которое необходимо скомпилировать и установить, включает: vs2019/2017, cmake, opencv (необязательно), protobuf 3.11.2, VulkanSDK 1.2.148.0 (необязательно), ncnn.

Помимо opencv и VulkanSDK здесь необходимо установить другое программное обеспечение. Opencv — это библиотека обработки изображений.Если вам нужно запустить преобразованную модель ncnn в системе Windows, вам обычно нужно использовать opencv для выполнения некоторых операций чтения и записи изображений или предварительной обработки. VulkanSDK — это библиотека SDK для ускорения графического процессора, которую можно установить в соответствии со средой вашего компьютера.

Поскольку среда автора уже устанавливала vs2019 и cmake ранее, поэтому установка этих двух программ, vs2019 и cmake здесь подробно не описывается.Также в Интернете есть много руководств для справки. Общая установка vs2019 выполняется онлайн, что относительно просто, просто продолжайте нажимать на следующий шаг. Вы можете загрузить последнюю версию cmake с этого официального сайта, затем распаковать ее локально, а затем настроить среду.Вы можете ввести cmake в командной строке, и вы получите следующие эффекты, что означает, что конфигурация среды прошла успешно :
вставьте сюда описание изображения

Скомпилируйте и установите protobuf 3.11.2

Protobuf — это независимый от платформы и языка, масштабируемый, легкий и эффективный протокол сериализованной структуры данных, который можно использовать для сетевого взаимодействия и хранения данных.
Загрузите сжатый пакет protobuf3.11.2 с этого адреса , распакуйте его и поместите в ранее созданный файл, затем найдите Visual Studio 2019 => x64 Native Tools Command Prompt для VS 2019 в меню «Пуск», щелкните правой кнопкой мыши, нажмите «Дополнительно», от имени администратора Запустите, введите следующую команду для компиляции protobuf3.4.0:

cd <protobuf-root-dir>
mkdir build-vs2019
cd build-vs2019
cmake -A x64 -DCMAKE_INSTALL_PREFIX=%cd%/install -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_MSVC_STATIC_RUNTIME=OFF ../cmake
cmake --build . --config Release -j 2
cmake --build . --config Release --target install

Где protobuf-root-dir — это путь, по которому распаковывается ваш protobuf.
вставьте сюда описание изображения
вставьте сюда описание изображения
вставьте сюда описание изображения
По сути, каталог установленной библиотеки выглядит так:

Скомпилируйте и установите ncnn

Чтобы скомпилировать и установить ncnn, сначала скачайте с официального сайта стабильную версию , то есть версию с номером версии Автор скачал здесь версию ncnn-20230223-full-source. После загрузки сжатого пакета разархивируйте его, а затем, как и при компиляции protobuf, найдите Visual Studio 2019=>x64 Native Tools Command Prompt для VS 2019 в меню «Пуск», щелкните правой кнопкой мыши, выберите «Дополнительно», запустите от имени администратора и введите следующая команда для компиляции:

cd <ncnn-root-dir>
mkdir -p build-vs2019
cd build-vs2019
cmake -A x64 -DCMAKE_INSTALL_PREFIX=%cd%/install -DProtobuf_INCLUDE_DIR=<protobuf-root-dir>/build/install/include -DProtobuf_LIBRARIES=<protobuf-root-dir>/build/install/lib/libprotobuf.lib -DProtobuf_PROTOC_EXECUTABLE=<protobuf-root-dir>/build/install/bin/protoc.exe ..
cmake --build . --config Release -j 8
cmake --build . --config Release --target install

Здесь необходимо пояснить, что ncnn-root-dir — это распакованный путь к локальному установочному пакету ncnn-20230223-full-source, а protobuf-root-dir — это путь к локальному установочному пакету protobuf. Кроме того, сборку за protobuf-root-dir также необходимо заменить на имя скомпилированной папки protobuf.Например, на предыдущем шаге имя папки, которое мы использовали, было build-vs2019, поэтому его необходимо заменить на это имя, и все будет хорошо.

вставьте сюда описание изображения
вставьте сюда описание изображения
вставьте сюда описание изображения
На данный момент ncnn успешно скомпилирован. Кроме того, следует отметить, что если некоторым небольшим партнерам не удается выполнить успешную компиляцию и они сообщают об ошибке, они должны тщательно проверить первую командную строку cmake, чтобы увидеть, есть ли какие-либо ошибки. Когда автор скомпилировал и установил ncnn в первый раз, на последнем шаге cmake возникла следующая ошибка:
Пожалуйста, добавьте описание изображения
«файл не может создать каталог». Соответствующего в интернете не нашел.Ошибки и решения, даже когда-то думал, что эта ошибка вызвана недостаточными правами, а позже обнаружил, что в первом шаге командная строка

cmake -A x64 -DCMAKE_INSTALL_PREFIX=%cd%/install -DProtobuf_INCLUDE_DIR=<protobuf-root-dir>/build/install/include -DProtobuf_LIBRARIES=<protobuf-root-dir>/build/install/lib/libprotobuf.lib -DProtobuf_PROTOC_EXECUTABLE=<protobuf-root-dir>/build/install/bin/protoc.exe ..

Путь сконфигурированного protobuf-root-dir неверен, между -DProtobuf_INCLUDE_DIR и DProtobuf_LIBRARIES отсутствует пробел, и после запуска этой команды возникает явная ошибка, например, libprotobuf.lib или protoc.exe не может быть найден, но это не осторожно. Просмотр ошибок в командной строке привел к тому, что на третьем шаге было сообщено об ошибке, и было найдено неправильное направление для решения проблемы.

Еще один момент, который следует напомнить, это то, что если в процессе компиляции возникает ошибка, рекомендуется удалить каталог сборки, заново создать этот каталог, а затем скомпилировать, иначе легко повторить последнюю ошибку из-за cmakecache .

шаги конверсии

Войдите в скомпилированную папку ncnn-20230223-full-source/build/ на предыдущем шаге, вот установленная директория ncnn, примерно так, затем
вставьте сюда описание изображения
войдите в директорию build\tools\onnx\Release, откройте командную строку cmd, введите следующая команда:

onnx2ncnn.exe mobilenet.onnx mobilenet.bin mobilenet.param

Вы можете сгенерировать две модели в формате ncnn в текущем каталоге.

Кроме того, поскольку операторы, поддерживаемые ncnn, ограничены, при переносе моделей часто сообщается об ошибках. Например, mv2, использованный в этом эксперименте, также сообщал об ошибках. Пока еще не поддерживается Shape! Неизвестный тип данных 0 — это действительно неудачная
попытка
вставьте сюда описание изображения
. ! !

постскриптум

На самом деле, было очень обидно получить результат, что оператор не поддерживает его после попытки скомпилировать и установить все зависимые библиотеки ncnn. Позже автор узнал на официальном сайте ncnn , что на самом деле существует скомпилированная библиотека ncnn, и вы можете скачать ее напрямую, не компилируя самостоятельно. Например, автор скачал версию, скомпилированную в среде windows vs2019.После
вставьте сюда описание изображения
скачивания и распаковки откройте ncnn-20230223-windows-vs2019\x64\bin, и вы увидите инструмент onnx2ncnn.exe.Также попробуйте
вставьте сюда описание изображения
преобразовать модель onnx из mv2 в ncnn, а также получил ту же ошибку
вставьте сюда описание изображения

Наконец, если вы даже не хотите загружать библиотеку, скомпилированную ncnn, вы также можете завершить преобразование модели onnx в модель ncnn.Вам нужно всего лишь открыть страницу преобразования в один клик, загрузить модель onnx и скомпилировать это онлайн модель ncnn

ссылка

ncnn | Сборка Windows (VS2019)
как собрать
win10 под pytorch to ncnn учебник

Supongo que te gusta

Origin blog.csdn.net/weixin_42280271/article/details/130053013
Recomendado
Clasificación