окрестности
- 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)
После того, как модификация завершена, можно выполнить преобразование
(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
Вниз
Внимательно следить,app
В этой папке также хранятся встроенные тестовые изображения.classes.txt
имя цели. Если вы хотите заменить модель, которую вы обучили сами, не забудьте изменить этот файл.
Инструмент подготовки готов, далее будем использоватьandroid studio
скомпилировать и установить наandroid
Подойдите к телефону и протестируйте 3 картинки, которые прилагаются к нему.
Конечно, этоapp
Вы также можете выбрать изображение в мобильном телефоне для обнаружения
Кроме того, вы также можете использовать камеру мобильного телефона для обнаружения объектов.
использовать свою собственную модель
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
это то же самое.
Наконец, перекомпилируйте проект и установите его на телефон для тестирования.