Молодые люди в наше время не занимаются Ruby.
Поэтому я пишу эту заметку о YOLOv7 в Ruby. Поскольку есть ONNX Runtime, почти все работает, если вы просто хотите сделать вывод.
- ankane / onnxruntime-ruby
- Запуск моделей ONNX в Ruby
- ONNX Runtime Ruby
- Установка
- Начало работы
- Параметры сеанса
- Обнаружение объектов YOLO с помощью ONNXRuntime с Ruby
- kojix2 ・ Sep 2 ’19 ・ 2 min read
- ibaiGorordo / ONNX-YOLOv7-Object-Detection
- Python-скрипты, выполняющие обнаружение объектов с помощью модели YOLOv7 в ONNX.
- ONNX-YOLOv7-Обнаружение объектов
- Важно
- Требования
- Установка
- ONNX Runtime
- Для поиска видео на youtube
- PINTO0309 / PINTO_model_zoo
- Хранилище для хранения моделей, которые были конвертированы между различными фреймворками. Поддерживаемые фреймворки: TensorFlow, PyTorch, ONNX, OpenVINO, TFJS, TFTRT, TensorFlowLite (Float32/16/INT8), EdgeTPU, CoreML.
- PINTO_model_zoo
- lutzroeder / netron
- Визуализатор для моделей нейронных сетей, глубокого обучения и машинного обучения
- Установите
- Модели
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
…
Я написал ↓ три года назад, поэтому буду повторно использовать код.

Обнаружение объектов YOLO с помощью ONNXRuntime с Ruby
kojix2 ・ Sep 2 ’19 ・ 2 min read
Модель 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
…
Загрузите модель 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 и модель полного целочисленного квантования не возвращают…
Ключевым моментом здесь является использование 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 […
Хорошая идея — открыть модель в 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, а затем развернуть на любом языке.
Спасибо за прочтение.
Хорошего дня!
Оригинальная японская версия