предисловие
В последнее время я занят проектом, и мне нужно развернуть модель, обученную 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 учебник