Обнаружение цели yolov5 на Android, способом torchscript

глубокое обучение

окрестности

  • windows 10 64bit
  • android studio 4.1.2
  • yolov5 3.0
  • pytorch 1.6+cu101

предисловие

ПреамбулаЗапуск обнаружения объектов YOLOv5 на AndroidМы ввели использованиеncnnпуть вandroidна устройствеyolov5обнаружение цели. В этой статье представлен еще один способ, а именноtorchscript.

Кодекс Практика

этоdemoотpytorchОфициально адрес:GitHub.com/py факел/Валиум…скачать и использоватьandroid studioОткрытый режим ожидания.

Далее нужно подготовитьtorchscriptмодель, использованная здесьyolov5Преобразуйте версию 3.0, перейдите в каталог исходного кода, изменитеmodel/export.pyдокумент

model.model[-1].export = True

изменить на

model.model[-1].export = False

Затем, еще в этом файле, в блоке кода

ts = torch.jit.trace(model, img)
ts.save(f)

В середине добавьте следующие два предложения

from torch.utils.mobile_optimizer import optimize_for_mobile
ts = optimize_for_mobile(ts)

yolov5 android torchscript

После того, как модификация завершена, можно выполнить преобразование

(pytorch1.6) xugaoxiang@1070Ti:~/workshop/yolov5-3.0$ python models/export.py --weights weights/yolov5s.pt
Namespace(batch_size=1, img_size=[640, 640], weights='weights/yolov5s.pt')
Fusing layers...
Model Summary: 224 layers, 7266973 parameters, 0 gradients

Starting TorchScript export with torch 1.6.0+cu101...
/home/xugaoxiang/workshop/yolov5-3.0/models/yolo.py:49: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs!
  if self.grid[i].shape[2:4] != x[i].shape[2:4]:
/home/xugaoxiang/anaconda3/envs/pytorch1.6/lib/python3.7/site-packages/torch/jit/_trace.py:940: TracerWarning: Encountering a list at the output of the tracer might cause the trace to be incorrect, this is only valid if the container structure does not change based on the module's inputs. Consider using a constant container instead (e.g. for `list`, use a `tuple` instead. for `dict`, use a `NamedTuple` instead). If you absolutely need this and know the side effects, pass strict=False to trace() to allow this behavior.
  _force_outplace,
TorchScript export success, saved as weights/yolov5s.torchscript.pt

Starting ONNX export with onnx 1.8.1...
ONNX export success, saved as weights/yolov5s.onnx

Starting CoreML export with coremltools 4.1...
CoreML export failure: Unknown type __torch__.torch.classes.xnnpack.Conv2dOpContext encountered in graph lowering. This type is not supported in ONNX export.

Export complete (13.42s). Visualize with https://github.com/lutzroeder/netron.

Конец команды - экспортonnxошибка, так как мы используемtorchscriptбез использованияonnx, поэтому эту ошибку можно игнорировать. будетweights/yolov5s.torchscript.ptкопироватьandroidдиректория в проектеapp/src/main/assetsВниз

yolov5 android torchscript

Внимательно следить,appВ этой папке также хранятся встроенные тестовые изображения.classes.txtимя цели. Если вы хотите заменить модель, которую вы обучили сами, не забудьте изменить этот файл.

Инструмент подготовки готов, далее будем использоватьandroid studioскомпилировать и установить наandroidПодойдите к телефону и протестируйте 3 картинки, которые прилагаются к нему.

yolov5 android torchscript

yolov5 android torchscript

yolov5 android torchscript

Конечно, этоappВы также можете выбрать изображение в мобильном телефоне для обнаружения

yolov5 android torchscript

Кроме того, вы также можете использовать камеру мобильного телефона для обнаружения объектов.

yolov5 android torchscript

использовать свою собственную модель

yolov5Для обучения модели, пожалуйста, обратитесь к этомуImagination.com/2020/07/02/…, в качестве теста также используем обученную выше модель обнаружения маски

torchscriptШаги преобразования такие же, как и выше, которые здесь опущены, а сгенерированныйtorchscript.ptставитьassetsкаталог, переименуйте его вyolov5s.torchscript.pt

Затем изменитеclasses.txt

mask
no-mask

Значение здесь должно быть таким же, как при обучении

затем измените файлapp/src/main/java/org/pytorch/demo/objectdetection/MainActivity.java

mModule = PyTorchAndroid.loadModuleFromAsset(getAssets(), "best.torchscript.pt");
BufferedReader br = new BufferedReader(new InputStreamReader(getAssets().open("classes.txt")));

Измените эти два имени файла в соответствии с вашей ситуацией.

Затем измените файлObjectDetectionActivity.java

private static int mOutputColumn = 7; // left, top, right, bottom, score and 80 class probability

Это число 5+классов.Для масок это 5+2=7.Это тоже один и тот же файл.Потяните вниз.

Result result = new Result(cls, outputs[i*7+4], rect);

Исправлятьi*последнее значение, сmOutputColumnэто то же самое.

Наконец, перекомпилируйте проект и установите его на телефон для тестирования.

yolov5 android torchscript

yolov5 android torchscript

yolov5 android torchscript

yolov5 android torchscript

использованная литература