opencv-python загружает модель линейной регрессии формата onnx, обученную pytorch

    opencv — это графическая библиотека с открытым исходным кодом, которая имеет зависимости от библиотек для Java, C++ и Python. Она плохо поддерживает обучение моделей, но может загружать модели, обученные другими платформами для прогнозирования.

    Вот простейший пример линейной регрессии с использованием платформы глубокого обучения pytorch для обучения модели и, наконец, сохранением модели в формате onnx. Наконец, библиотека opencv-python используется для прогнозирования нагрузки.

    Подготовленные здесь данные модели линейной регрессии следующие:

x_data y_data
1 2
2 4
3 6
4

?

8 ?
10 ?
15 ?

    Интуитивно понятно, что на самом деле это линейное уравнение y = 2x. Но в машинном обучении получение окончательных коэффициентов, значений w и b происходит путем непрерывной итерации. 

    Версия библиотеки Python, используемая в этой статье:

  •     факел: 1.13.0
  •     opencv-питон: 4.5.5
  •     число 1.24.2
  •     питон: 3.10

    покажи мне код:

import torch

x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[2.0], [4.0], [6.0]])


class LinearModel(torch.nn.Module):
    def __init__(self):
        super(LinearModel, self).__init__()
        self.linear = torch.nn.Linear(1, 1)

    def forward(self, x):
        return self.linear(x)


model = LinearModel()
criterion = torch.nn.MSELoss(reduction='sum')
optimizer = torch.optim.SGD(model.parameters(), lr=0.02)

for epoch in range(1000):
    y_pred = model(x_data)
    loss = criterion(y_pred, y_data)
    if epoch % 100 == 0:
        print(epoch + 1, loss)

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

print('w = {}'.format(model.linear.weight.item()))
print('b = {}'.format(model.linear.bias.item()))

x_test = torch.Tensor([[4.0]])
y_test = model(x_test)
print('y_pred(4.0) = ', y_test.data)

x_test = torch.Tensor([[8.0]])
y_test = model(x_test)
print('y_pred(8.0) = ', y_test.data)

x_test = torch.Tensor([[10.0]])
y_test = model(x_test)
print('y_pred(10.0) = ', y_test.data)

x_test = torch.Tensor([[15.0]])
y_test = model(x_test)
print('y_pred(15.0) = ', y_test.data)

model.eval()
dummy_input = torch.randn(1, 1)
input_name = ["input"]
output_name = ["output"]
onnx_name = "test.onnx"
torch.onnx.export(
    model,
    dummy_input,
    onnx_name,
    verbose=True,
    input_names=input_name,
    output_names=output_name
)

    Запускаем, напечатанная информация следующая:

 

    Основное внимание здесь уделяется коэффициентам линейной регрессии, w = 1,99, b = 1,31. Здесь w на самом деле очень близко к 2. Ведь оно рассчитывается компьютером. Алгоритм градиентного спуска здесь явно не указан, но на самом деле в обучающей части действительно используется метод градиентного спуска.

for epoch in range(1000):
    y_pred = model(x_data)
    loss = criterion(y_pred, y_data)
    if epoch % 100 == 0:
        print(epoch + 1, loss)

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    Наконец, прогноз с помощью этого коэффициента регрессии соответствует ожиданиям. 

    Алгоритм в конечном итоге сохранит модель в файле test.onnx по локальному пути проекта.

  //

    Вышеупомянутое считается готовым, далее загружаем модель через opencv-python и прогнозируем:

from cv2 import dnn
import numpy as np

net = dnn.readNetFromONNX("test.onnx")
matblob = np.full((1, 1), 1024, dtype=np.int32)
net.setInput(matblob)
print('input = {}'.format(matblob))
output = net.forward()
print('output = {}'.format(output))

    Здесь matblob на самом деле является Mat, но в opencv-python его можно создать через numpy. Здесь, в Интернете, объекты matblob генерируются путем чтения изображения. Лично я чувствую, что здесь все очень понятно, то есть нам нужно чтобы указать число 1024, мы устанавливаем столбцы, строки, тип и значение с помощью np.full(), чтобы успешно создать этот входной объект Mat.

    Запустив этот код, мы ожидаем получить 2048, фактический результат следующий:

    На самом деле оно очень близко к 2048. Это результат работы кода Python. Если вы используете opencv-c++ для написания кода, код в основном аналогичен. Я не пробовал C++, главным образом потому, что эта модель была реализована и сгенерирована с помощью кода Python, а у opencv есть библиотека зависимостей Python, поэтому я подумал о реализации ее непосредственно на Python. Нет необходимости изучать реализацию opencv-c++.

Supongo que te gusta

Origin blog.csdn.net/feinifi/article/details/130434660
Recomendado
Clasificación