Обнаружение объектов YOLOv7 на Ruby за 10 минут

Молодые люди в наше время не занимаются Ruby.

Поэтому я пишу эту заметку о YOLOv7 в Ruby. Поскольку есть ONNX Runtime, почти все работает, если вы просто хотите сделать вывод.

ankane / onnxruntime-ruby

Запуск моделей ONNX в Ruby

ONNX Runtime Ruby

Посмотрите пример

Установка

Добавьте эту строку в Gemfile вашего приложения:

gem "onnxruntime"
Войти в полноэкранный режим Выйти из полноэкранного режима

Начало работы

Загрузите модель и сделайте прогнозы

model = OnnxRuntime::Model.new("model.onnx")
model.predict({x: [1, 2, 3]})
Войти в полноэкранный режим Выход из полноэкранного режима

Загрузите предварительно обученные модели из зоопарка моделей ONNX

Получение входных данных

model.inputs
Войти в полноэкранный режим Выйти из полноэкранного режима

Получить выходные данные

model.outputs
Войти в полноэкранный режим Выйти из полноэкранного режима

Получить метаданные

model.metadata
Войти в полноэкранный режим Выйти из полноэкранного режима

Загрузка модели из строки

byte_str = StringIO.new("...")
model = OnnxRuntime::Model.new(byte_str)
Войти в полноэкранный режим Выйти из полноэкранного режима

Получение определенных выходов

model.predict({x: [1, 2, 3]}, output_names: ["label"])
Войти в полноэкранный режим Выйти из полноэкранного режима

Параметры сеанса

OnnxRuntime::Model.new(path_or_bytes, {
  enable_cpu_mem_arena

Войти в полноэкранный режим Выйти из полноэкранного режима
Просмотр на GitHub

Я написал ↓ три года назад, поэтому буду повторно использовать код.

Обнаружение объектов YOLO с помощью ONNXRuntime с Ruby

kojix2 ・ Sep 2 ’19 ・ 2 min read

#ruby #machinelearning #deeplearning #onnxruntime

Модель YOLOv7 ONNX существует. ↓

ibaiGorordo / ONNX-YOLOv7-Object-Detection

Python-скрипты, выполняющие обнаружение объектов с помощью модели YOLOv7 в ONNX.

ONNX-YOLOv7-Обнаружение объектов

Python-скрипты, выполняющие обнаружение объектов с использованием модели YOLOv7 в ONNX.

Оригинальное изображение: https://www.flickr.com/photos/nicolelee/19041780

Важно

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

Требования

  • Проверьте файл requirements.txt.
  • Для ONNX, если у вас есть GPU NVIDIA, установите onnxruntime-gpu, в противном случае используйте библиотеку onnxruntime.
  • Кроме того, pafy и youtube-dl необходимы для поиска видео на youtube.

Установка

git clone https://github.com/ibaiGorordo/ONNX-YOLOv7-Object-Detection.git
cd ONNX-YOLOv7-Object-Detection
pip install -r requirements.txt

ONNX Runtime

Для компьютеров с графическими процессорами Nvidiapip install onnxruntime-gpu.

В противном случаеpip install onnxruntime

Для поиска видео на youtube

pip install youtube_dl
pip install

Посмотреть на GitHub

Загрузите модель ONNX отсюда ↓ : 307_YOLOv7

PINTO0309 / PINTO_model_zoo

Хранилище для хранения моделей, которые были конвертированы между различными фреймворками. Поддерживаемые фреймворки: TensorFlow, PyTorch, ONNX, OpenVINO, TFJS, TFTRT, TensorFlowLite (Float32/16/INT8), EdgeTPU, CoreML.

PINTO_model_zoo

Пожалуйста, прочитайте содержимое файла LICENSE, расположенного непосредственно под каждой папкой, прежде чем использовать модель. Мои скрипты преобразования моделей выпускаются под лицензией MIT, но лицензия самой исходной модели зависит от лицензии репозитория поставщика.

Репозиторий для хранения моделей, которые были конвертированы между различными фреймворками. Поддерживаемые фреймворки: TensorFlow, PyTorch, ONNX, OpenVINO, TFJS, TFTRT, TensorFlowLite (Float32/16/INT8), EdgeTPU, CoreML.

TensorFlow Lite, OpenVINO, CoreML, TensorFlow.js, TF-TRT, MediaPipe, ONNX [.tflite, .h5, .pb, saved_model, tfjs, tftrt, mlmodel, .xml/.bin, .onnx]

[Примечание Янв 05, 2020] В настоящее время магистральная модель MobileNetV3 и модель полного целочисленного квантования не возвращают…

Посмотреть на GitHub

Ключевым моментом здесь является использование post-process_merged для загрузки модели с реализованным пост-процессом, иначе вам придется реализовывать пост-процесс самостоятельно, что очень хлопотно.

git clone https://github.com/PINTO0309/PINTO_model_zoo
cd PINTO_model_zoo/307_YOLOv7
chmod +x download_single_batch_post-process_merged.sh
./download_single_batch_post-process_merged.sh
Вход в полноэкранный режим Выйдите из полноэкранного режима

Теперь модели загружены. Используйте yolov7_post_640x640.onnx, которая кажется основной.

Установите Ruby-версию onnxruntime.

gem install onnxruntime
Войдите в полноэкранный режим Выйдите из полноэкранного режима

Тем, кто хочет использовать графические процессоры, необходимо настроить их самостоятельно.

Подготовьте Netron для проверки модели ONNX.

lutzroeder / netron

Визуализатор для моделей нейронных сетей, глубокого обучения и машинного обучения

Netron — это визуализатор для моделей нейронных сетей, глубокого обучения и машинного обучения.

Netron поддерживает ONNX, TensorFlow Lite, Caffe, Keras, Darknet, PaddlePaddle, ncnn, MNN, Core ML, RKNN, MXNet, MindSpore Lite, TNN, Barracuda, Tengine, CNTK, TensorFlow.js, Caffe2 и UFF.

Netron имеет экспериментальную поддержку PyTorch, TensorFlow, TorchScript, OpenVINO, Torch, Vitis AI, kmodel, Arm NN, BigDL, Chainer, Deeplearning4j, MediaPipe, ML.NET и scikit-learn.

Установите

macOS: Загрузите файл .dmg или запустите brew install netron.

Linux: Загрузите файл .AppImage или запустите snap install netron.

Windows: Загрузите программу установки .exe или запустите winget install -s winget netron.

Браузер: Запустите версию браузера.

Python Server: Запустите pip install netron и netron [FILE] или netron.start('[FILE]').

Модели

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

  • ONNX: squeezenet [open].
  • TensorFlow Lite: hair_segmentation [open]
  • TensorFlow: chessbot [open]
  • Keras: mobilenet […

Посмотреть на GitHub

Хорошая идея — открыть модель в Netron, чтобы посмотреть, как выглядят входы и выходы.

Очень сложно. Я знаю только форму матриц INPUT и OUTPUT. Давайте напишем бросовый код!

require 'mini_magick'
require 'numo/narray'
require 'onnxruntime'

SFloat = Numo::SFloat

input_path = ARGV[0]
output_path = ARGV[1]

model = OnnxRuntime::Model.new('yolov7_post_640x640.onnx')

labels = ['person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train',
          'truck', 'boat', 'traffic light', 'fire hydrant', 'stop sign', 'parking meter',
          'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant',
          'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie',
          'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball', 'kite',
          'baseball bat', 'baseball glove', 'skateboard', 'surfboard', 'tennis racket',
          'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana',
          'apple', 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza',
          'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed', 'dining table',
          'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone',
          'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock',
          'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush']

# preprocessing
img = MiniMagick::Image.open(input_path)
img.combine_options do |b|
  b.resize '640x640!'
  b.gravity 'center'
  b.background 'transparent'
# b.extent '640x640'
end
img_data = SFloat.cast(img.get_pixels)
img_data /= 255.0
image_data = img_data.transpose(2, 0, 1)
                     .expand_dims(0)
                     .to_a # NArray -> Array

# inference
output = model.predict({ images: image_data })

# postprocessing
scores, indices = output.values

# visualization
img = MiniMagick::Image.open(input_path)
img.colorspace 'gray'
scores.zip(indices).each do |score, i|
  cl = i[1] # cl is class
  hue = cl * 100 / 80.0
  label = labels[cl]
  score = score[0]
  p "draw box"
  y1 = i[2] * img.height / 640
  x1 = i[3] * img.width  / 640
  y2 = i[4] * img.height / 640
  x2 = i[5] * img.width  / 640
  img.combine_options do |c|
    c.draw        "rectangle #{x1}, #{y1}, #{x2}, #{y2}"
    c.fill        "hsla(#{hue}%, 20%, 80%, 0.25)"
    c.stroke      "hsla(#{hue}%, 70%, 60%, 1.0)"
    c.strokewidth (score * 3).to_s
  end
  # draw text
  img.combine_options do |c|
    c.draw "text #{x1}, #{y1 - 5} "#{label}""
    c.fill 'white'
    c.pointsize 18
  end
end

img.write output_path
Вход в полноэкранный режим Выйдите из полноэкранного режима

Затем запустите ruby yolo.rb A.png B.png

Я вижу, что точность даже лучше, чем была в YOLOv3.

mini_magick намного медленнее, чем YOLO.
Я слышал, что rmagick хорошо поддерживается в наши дни, так что вы можете использовать его.

Если привязка к ONNX работает, любой минорный язык должен быть в состоянии сделать то же самое. Я думаю, это означает, что если вы создадите модель машинного обучения на Python, вы сможете преобразовать ее в ONNX, а затем развернуть на любом языке.

Спасибо за прочтение.
Хорошего дня!

Оригинальная японская версия

Оцените статью
devanswers.ru
Добавить комментарий