本代码已开源于https://gitee.com/zhang_zhi_he/dyna-slam-yolo-v5,上传版本为当初调试通过可运行的版本,如有问题欢迎指出。
这两天接了个小任务,需求是替换Dynaslam里面的动态物体识别模块,将MaskRCNN换为YoloV5,这里记录一下过程中遇见的问题。
Dynaslam本身是一个基于ORBSLAM2的视觉SLAM框架,论文并没有仔细看过,简单来说就是在ORBSLAM的基础上,加了一动态物体的滤除,这里的滤除使用了两种策略:基于MaskRCNN和基于视觉几何。既然要替换使用的过滤网络,那么首先就是要跑起来这个Dyanslam,从代码来看,本身还是基于ORBSLAM的,但是加入了神经网络的模块,所以引入了很多Python相关的内容,这里配置主要参照下面的链接:
Dynaslam环境配置与代码替换
大多数的问题按照链接进行修改即可,这里补充一下几个链接里没有的问题:
这个库主要的问题是明明安装上了但是依然显示找不到库,这里网上查了很多办法,有说换版本的有说更新的,本人用的是下面的指令进行的更新,在两台电脑上都修改成功了。
pip install scikit-image --upgrade --user
在运行Dyanslam的过程中,如果最后两个参数进行了输入,则表明运行时使用了MaskRCNN进行动态物体的过滤,但是在运行时经常会显示不能初始化,这里经过代码的排查,并不是参数或者设备性能的问题,是Dynaslam特征点提取策略的问题。Dynaslam本身是基于ORBSLAM的,在ORBSLAM的初始化时,要求两张图至少要有500对匹配特征点才可以进行初始化,但是在Dynaslam中,由于对场景内的动态物体进行了过滤,导致在提取特征点时原本出现在动态物体上的特征点被遮挡了,所以达不到ORBSLAM初始化的点对数要求,解决方法有两种,一个是修改yaml文件,让提取ORB特征点的时候尽可能提取更多特征点,另一个方法是直接修改初始化的代码,降低点对数要求,两种方法其实都是要让Dynaslam成功初始化。
这一步没有太大的问题,用anaconda创建一个新环境然后配置就可以了,下载yolov5的源码然后用里面的requirement.txt进行配置即可,需要注意的是,很多的环境都需要挂代理去下载,不挂的话要么龟速要么就直接显示查询不到库文件,关于Ubuntu下面如何配置代理文件可以参考下面的链接:Ubuntu环境下配置clash代理
将MaskRCNN替换,其实本来并不是一个很麻烦的内容,从Dynaslam代码来看,只要修改调用的Python文件就可以了,改之前我也是这么想的,但改的过程啥错误都出来了。
在改Dynaslam之前,首先要把Yolov5的代码进行封装,具体来说就是让原本predict.py里面通过主函数调用的方法,转换为通过对象进行的调用,这里主要是涉及一些Python基础语法的问题,并且原本通过命令行读取参数的部分现在也用不上了,需要删除一部分函数,最后为了与Dynaslam的接口相对应,需要将传递的参数进行更换,不再使用文件名进行读取,而是直接传递一个numpy的图像。这里放一下封装好的Yolov5,要改的只有一个predict.py,其余并没有什么变化,使用时初始化一个Mask对象并调用GetDynSeg函数传递一张图像即可。
import argparse
import os
import platform
import sys
from pathlib import Path
import numpy
import numpy as np
import torch
FILE = Path(__file__).resolve()
ROOT = FILE.parents[1] # YOLOv5 root directory
if str(ROOT) not in sys.path:
sys.path.append(str(ROOT)) # add ROOT to PATH
ROOT = Path(os.path.relpath(ROOT, Path.cwd())) # relative
from models.common import DetectMultiBackend
from utils.dataloaders import IMG_FORMATS, VID_FORMATS, LoadImages, LoadScreenshots, LoadStreams
from utils.general import (LOGGER, Profile, check_file, check_img_size, check_imshow, check_requirements, colorstr, cv2,
increment_path, non_max_suppression, print_args, scale_boxes, scale_segments,
strip_optimizer, xyxy2xywh)
from utils.plots import Annotator, colors, save_one_box
from utils.segment.general import masks2segments, process_mask
from utils.torch_utils import select_device, smart_inference_mode
from utils.augmentations import (Albumentations, augment_hsv, classify_albumentations, classify_transforms, copy_paste,
cutout, letterbox, mixup, random_perspective)
class Mask(object):
def __init__(self):
self.weights = ROOT / 'yolov5m-seg.pt' # model.pt path(s)
self.
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删