1.研究背景与意义
项目参考AAAI Association for the Advancement of Artificial Intelligence
研究背景与意义
随着计算机视觉技术的不断发展,实例分割和全景分割成为了研究的热点领域。实例分割是指将图像中的每个对象实例都进行分割,即将每个对象的像素点进行标记;而全景分割则是将整个图像分割成多个不同的区域,每个区域都有一个特定的标签。这两个任务在很多领域都有广泛的应用,例如自动驾驶、智能交通系统、机器人导航等。
然而,传统的实例分割和全景分割方法在处理复杂的街景图像时面临一些挑战。首先,街景图像通常具有复杂的背景和多个重叠的对象实例,这使得分割任务更加困难。其次,传统的方法往往需要大量的计算资源和时间,限制了其在实际应用中的效率和实时性。因此,研究如何改进实例分割和全景分割算法,提高其准确性和效率,具有重要的理论和实际意义。
基于此,本研究提出了一种基于融合SAConv的改进YOLOv5的街景实例分割全景分割系统。该系统结合了SAConv(Spatial Attention Convolution)和YOLOv5(You Only Look Once)两种先进的计算机视觉算法,旨在解决街景图像分割中的困难和挑战。
首先,SAConv是一种具有空间注意力机制的卷积神经网络,能够自动学习图像中不同区域的重要性,从而提高分割的准确性。通过引入SAConv,我们可以更好地处理街景图像中的复杂背景和重叠实例,提高分割的精度。
其次,YOLOv5是一种基于单阶段目标检测的算法,具有高效和实时的特点。我们将YOLOv5应用于实例分割和全景分割任务中,可以大大提高算法的速度和效率,满足实际应用的需求。
此外,我们还对YOLOv5进行了改进,使其更适用于街景图像的分割任务。通过融合SAConv和YOLOv5,我们可以充分利用两种算法的优势,提高分割的准确性和效率。
本研究的意义在于:
-
提高街景图像实例分割和全景分割的准确性。通过引入SAConv和改进的YOLOv5,我们可以更好地处理复杂的街景图像,提高分割的精度和鲁棒性。
-
提高分割算法的效率和实时性。传统的分割方法往往需要大量的计算资源和时间,限制了其在实际应用中的效率。而本研究提出的系统结合了YOLOv5的高效特点,可以在保证准确性的同时提高算法的速度和实时性。
-
推动计算机视觉领域的研究和应用。本研究提出的基于融合SAConv的改进YOLOv5的街景实例分割全景分割系统具有一定的创新性和先进性,可以为计算机视觉领域的研究和应用提供新的思路和方法。
综上所述,基于融合SAConv的改进YOLOv5的街景实例分割全景分割系统具有重要的研究背景和意义。通过提高分割的准确性和效率,可以在实际应用中发挥重要的作用,推动计算机视觉技术的发展和应用。
2.图片演示
3.视频演示
4.Cityscapes 城市场景分割数据集
Cityscapesl数据集是1个城市街道场景数据集,用于针对城市街道环境进行场景理解的相关研究,是目前图像语义分割领域最常用的基准数据集之一。数据集包含2种标注形式:语义级别标注和实例级别标注,分别用于图像语义分割和图像实例分割﹖种任务,本文使用的是语义级别的标注以进行图像语义分割技术的研究。语义级别标注的数据集中包含5000张带有精细标注的图片和20000张带有粗糙标注的图片,每张图片的分辨率是1024×2048像素。在带有精细标注的图片中,训练集包含2975张图片,验证集包含500张图片,测试集包含1525张图片。语义级别标注的数据集中一共包含30个类别标签,例如道路、人、车、建筑物、天空等等,在图像语义分割任务中,常将其整合为19个类别标签。Cityscapes城市场景分割数据集的标注实例如图所示。
5.核心代码讲解
5.1 detect.py
下面是我封装的类:
class YOLOv5Detector:
def __init__(self, weights='./best.pt', data='./data/coco128.yaml', device='', half=False, dnn=False):
self.weights = weights
self.data = data
self.device = device
self.half = half
self.dnn = dnn
self.model, self.stride, self.names, self.pt = self.load_model()
def load_model(self):
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
# Load model
device = select_device(self.device)
model = DetectMultiBackend(self.weights, device=device, dnn=self.dnn, data=self.data, fp16=self.half)
stride, names, pt = model.stride, model.names, model.pt
return model, stride, names, pt
def run(self, img, imgsz=(640, 640), conf_thres=0.25, iou_thres=0.45, max_det=1000, classes=None,
agnostic_nms=False, augment=False, retina_masks=True):
imgsz = check_img_size(imgsz, s=self.stride) # check image size
self.model.warmup(imgsz=(1 if self.pt else 1, 3, *imgsz)) # warmup
cal_detect = []
device = select_device(self.device)
names = self.model.module.names if hasattr(self.model, 'module') else self.model.names # get class names
# Set Dataloader
im = letterbox(img, imgsz, self.stride, self.pt)[0]
# Convert
im = im.transpose((2, 0, 1))[::-1] # HWC to CHW, BGR to RGB
im = np.ascontiguousarray(im)
im = torch.from_numpy(im).to(device)
im = im.half() if self.half else im.float() # uint8 to fp16/32
im /= 255 # 0 - 255 to 0.0 - 1.0
if len(im.shape) == 3:
im = im[None] # expand for batch dim
pred, proto = self.model(im, augment=augment)[:2]
pred = non_max_suppression(pred, conf_thres, iou_thres, classes, agnostic_nms, max_det=max_det, nm=32)
# Process detections
for i, det in enumerate(pred): # detections per image
annotator = Annotator(img, line_width=1, example=str(names))
if len(det):
# Rescale boxes from img_size to im0 size
det[:, :4] = scale_boxes(im.shape[2:], det[:, :4], img.shape).round() # rescale boxes to im0 size
masks = process_mask_native(proto[i], det[:, 6:], det[:, :4], img.shape[:2]) # HWC
segments = [
scale_segments(img.shape if retina_masks else im.shape[2:], x, img.shape, normalize=True)
for x in reversed(masks2segments(masks))]
# Write results
id_list = []
for id in range(len(det[:, :6])):
class_name = names[int(det[:, :6][id][5])]
if class_name == 'person':
id_list.append(id)
def del_tensor(arr, id_list):
if len(id_list) == 0:
return arr
elif len(id_list) == 1:
arr1 = arr[:id_list[0]]
arr2 = arr[id_list[0] + 1:]
return torch.cat((arr1, arr2), dim=0)
else:
arr1 = arr[:id_list[0]]
arr2 = arr[id_list[0] + 1:id_list[1]]
arr1 = torch.cat((arr1, arr2), dim=0)
for id_index in range(len(id_list)):
arr2 = arr[id_list[id_index - 1] + 1:id_list[id_index]]
arr1 = torch.cat((arr1, arr2), dim=0)
return arr1
det = del_tensor(det, id_list)
masks = del_tensor(masks, id_list)
for j, (*xyxy, conf, cls) in enumerate(reversed(det[:, :6])):
c = int(cls) # integer class
label = f'{
names[c]}'
contours = segments[j]
cal_detect.append([label, xyxy, float(conf), contours])
return cal_detect
这个类封装了YOLOv5的检测器,可以通过YOLOv5Detector
类的实例来加载模型并运行检测。你可以通过修改weights
和data
参数来指定模型和数据集的路径,然后调用run
方法来进行检测。检测结果将会返回一个包含多个数组的列表,每个数组包含检测结果的类别、坐标、置信度和轮廓。你可以根据需要对检测结果进行后续处理和显示。
该程序文件名为detect.py,主要功能是使用YOLOv5模型进行目标检测。程序的主要流程如下:
- 导入所需的库和模块。
- 定义了一个load_model函数,用于加载模型。
- 定义了一个run函数,用于运行模型进行目标检测。
- 在主函数中,首先加载模型。
- 读取待检测的图像。
- 调用run函数进行目标检测,返回检测结果。
- 遍历检测结果,绘制检测框和标签,并输出检测结果。
- 将结果保存到文件中,并显示在窗口中。
该程序使用了PyQt5库进行图形界面的开发,并使用了YOLOv5模型进行目标检测。程序读取待检测的图像,调用模型进行目标检测,并将结果绘制在图像上,并保存到文件中。
5.2 imgseg.py
class ImageSegmentation:
def __init__(self, config_path, checkpoint_path, device='cuda:0'):
self.model = init_segmentor(config_path, checkpoint_path, device=device)
def segment_image(self, image_path):
result = inference_segmentor(self.model, image_path)
return result
def show_segmentation(self, image_path, result):
img = self.model.show_result(
image_path, result, palette=get_palette('cityscapes'), show=False, opacity=0.5)
cv2.imshow('l', img)
cv2.waitKey(0)
image_path = './images/1.png'
config_path = './configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py'
checkpoint_path = './checkpoints/deeplabv3plus_r101-d8_512x1024_80k_cityscapes_20220303.pth'
segmentation = ImageSegmentation(config_path, checkpoint_path)
result = segmentation.segment_image(image_path)
segmentation.show_segmentation(image_path, result)
这个程序文件名为imgseg.py,它的功能是使用深度学习模型对图像进行语义分割。程序的主要步骤如下:
-
导入所需的库和模块,包括ArgumentParser、cv2、inference_segmentor、init_segmentor、show_result_pyplot和get_palette。
-
定义了一个图像路径image_path,用于指定待分割的图像文件路径。
-
使用init_segmentor函数从配置文件和检查点文件中构建模型。配置文件路径为’./configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py’,检查点文件路径为’./checkpoints/deeplabv3plus_r101-d8_512x1024_80k_cityscapes_20220303.pth’,设备为’cuda:0’。
-
使用inference_segmentor函数对单个图像进行分割,传入模型和图像路径作为参数,得到分割结果。
-
使用show_result函数将分割结果可视化,并设置了一些参数,如调色板和透明度。
-
使用cv2.imshow函数显示可视化结果。
-
使用cv2.waitKey函数等待用户按下键盘任意键后关闭显示窗口。
总体来说,这个程序文件使用了深度学习模型对指定图像进行语义分割,并将分割结果可视化显示出来。
5.3 train.py
class YOLOv5Trainer:
def __init__(self, hyp, opt, device, callbacks):
self.hyp = hyp
self.opt = opt
self.device = device
self.callbacks = callbacks
def train(self):
# code for training
pass
def validate(self):
# code for validation
pass
def save_checkpoint(self):
# code for saving checkpoint
pass