大家好~

本人主要做目标检测、生成对抗网络和聚类相关方向的工作,平时写一丢丢平时工作遇到的问题,欢迎关注!


带重叠的分割示意图:

本篇主要讲目标检测中为了增加对小目标检测的性能,考虑在检测端即detector上对原图像进行分割 检测。这样做的主要原因是在原图尺寸较大时,输入检测器时都会进行缩小,这样小目标的像素代表数就会严重缩水,导致检测器检测性能下降。

对图像进行拆分、分开检测是为了减少缩小图像时小目标像素的损失。带有重叠的拆分是考虑了硬拆分可能将目标在边界上分割开导致目标无法识别的特殊情况。

分拆与合并代码如下:

    split_height = 1080*3//5split_width = 1920*3//5def split_img(img):img_h, img_w, _ = img.shapedef start_points(size, split_size, overlap=0):points = [0]stride = int(split_size * (1-overlap))counter = 1while True:pt = stride * counterif pt + split_size >= size:points.append(size - split_size)breakelse:points.append(pt)counter += 1return pointsX_points = start_points(img_w, split_width, 0.1)Y_points = start_points(img_h, split_height, 0.1)splitted_images = []for i in Y_points:for j in X_points:split = img[i:i+split_height, j:j+split_width]splitted_images.append(split)return splitted_images,X_points,Y_pointsdef merge_subimg(img,X_points,Y_points,splitted_images):#merge:img 指原图1080*1920final_image = np.zeros_like(img)index = 0for i in Y_points:for j in X_points:final_image[i:i+split_height, j:j+split_width] = splitted_images[index]index += 1return final_image

在检测器中:

for path, img, im0s, vid_cap in dataset:splitted_images,X_points,Y_points = split_img(im0s) ###########*********++++++++++ im0s是原图,再把splitted中的图视为“原图”,pred_splitted_images = [] # save preds of 4 parts of im0s.print("length of splitted_images: ",len(splitted_images))for img0s in splitted_images:print("img0s shape is: ",img0s.shape)############***************++++++++ 整体缩进img = letterbox(img0s)[0]# Convertimg = img[:, :, ::-1].transpose(2, 0, 1)  # BGR to RGB, to 3x416x416img = np.ascontiguousarray(img)print("img shape is: ",img.shape)# return ##############***++++++img = torch.from_numpy(img).to(device)img = img.half() if half else img.float()  # uint8 to fp16/32img /= 255.0  # 0 - 255 to 0.0 - 1.0if img.ndimension() == 3:img = img.unsqueeze(0) # 在0轴增加一个维度# Inferencet1 = time_synchronized()###########*****++++++++++++++++ split img,img0 ----> imgs,img0spred = model(img, augment=opt.augment)[0] # preds for 4 parts of an image.e.g 4 preds.# Apply NMSpred = non_max_suppression(pred, opt.conf_thres, opt.iou_thres, classes=opt.classes, agnostic=opt.agnostic_nms)t2 = time_synchronized()# Apply Classifierif classify:pred = apply_classifier(pred, modelc, img, im0s)# Process detectionsfor i, det in enumerate(pred):  # detections per imageif webcam:  # batch_size >= 1p, s, im0, frame = path[i], '%g: ' % i, im0s[i].copy(), dataset.countelse:p, s, im0, frame = path, '', img0s, getattr(dataset, 'frame', 0)p = Path(p)  # to Pathsave_path = str(save_dir / p.name)  # img.jpg #############******+++++++++ merge 之后再用这个path 存储txt_path = str(save_dir / 'labels' / p.stem) + ('' if dataset.mode == 'image' else f'_{frame}')  # img.txts += '%gx%g ' % img.shape[2:]  # print stringgn = torch.tensor(im0.shape)[[1, 0, 1, 0]]  # normalization gain whwhif len(det):# Rescale boxes from img_size to im0 sizedet[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0.shape).round()# Print results: number of each detected classfor c in det[:, -1].unique():n = (det[:, -1] == c).sum()  # detections per classs += f'{n} {names[int(c)]}s, '  # add to string# Write resultsfor *xyxy, conf, cls in reversed(det):if save_txt:  # Write to filexywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(-1).tolist()  # normalized xywhline = (cls, *xywh, conf) if opt.save_conf else (cls, *xywh)  # label formatwith open(txt_path + '.txt', 'a') as f:f.write(('%g ' * len(line)).rstrip() % line + '\n')if save_img or view_img:  # Add bbox to imagelabel = f'{names[int(cls)]} {conf:.2f}'plot_one_box(xyxy, im0, label=label, color=colors[int(cls)], line_thickness=3)pred_splitted_images.append(im0)print("the length of pred_splitted_images : ",len(pred_splitted_images))
######*********++++++++++++整体缩进+++++++++# Print time (inference + NMS)print(f'{s}Done. ({t2 - t1:.3f}s)')# Stream resultsif view_img:cv2.imshow(str(p), im0)# merge_subimages() as "img0"final_image = merge_subimg(im0s,X_points,Y_points,pred_splitted_images)###########****************++++++++++ merge img0s ----->img0# Save results (image with detections)if save_img:if dataset.mode == 'image':cv2.imwrite(save_path, final_image) ########## save merged final_image.else:  # 'video'if vid_path != save_path:  # new videovid_path = save_pathif isinstance(vid_writer, cv2.VideoWriter):vid_writer.release()  # release previous video writerfourcc = 'mp4v'  # output video codecfps = vid_cap.get(cv2.CAP_PROP_FPS)w = int(vid_cap.get(cv2.CAP_PROP_FRAME_WIDTH))h = int(vid_cap.get(cv2.CAP_PROP_FRAME_HEIGHT))vid_writer = cv2.VideoWriter(save_path, cv2.VideoWriter_fourcc(*fourcc), fps, (w, h))vid_writer.write(im0)if save_txt or save_img:s = f"\n{len(list(save_dir.glob('labels/*.txt')))} labels saved to {save_dir / 'labels'}" if save_txt else ''print(f"Results saved to {save_dir}{s}")print(f'Done. ({time.time() - t0:.3f}s)')

带重叠的图像分割、子图合并相关推荐

  1. LaTeX使用graphicx+subfig实现子图合并+标题+子图标题

    一.应用场景/需求 今天在LaTeX写论文的时候,发现自己需要使用几个图拼凑在一起,然后合到一张大图中去.也就是一张图包含若干张子图,然后若干张子图的大小可以自己设置,子图下面有子标题,而总的大图也有 ...

  2. 2021CVPR顶会冠军带你解密图像分割

    最近全球各大新势力造车公司简直不能再火!小编看着蹭蹭飙升的股价实在是眼红的不要不要的.而懂行的人都知道,以特斯拉为首,各大公司都采用计算机视觉作为自动驾驶的技术底座,而其中正是通过图像分割技术,汽车才 ...

  3. CVPR 2021 顶会冠军带你解密图像分割

    最近全球各大新势力造车公司简直不能再火!小编看着蹭蹭飙升的股价实在是眼红的不要不要的.而懂行的人都知道,以特斯拉为首,各大公司都采用计算机视觉作为自动驾驶的技术底座,而其中正是通过图像分割技术,汽车才 ...

  4. 简单的视频剪辑教程:使用win10自带的工具剪切和合并视频

    剪切视频 右键视频文件以"照片"的方式打开视频,如同 点击右上角的编辑,如下图 选择"剪裁" 进度条会看到绿球和白球,绿球是当前视频播放的位置:进度条两端都有白 ...

  5. 苹果ios超级签名源码包java版带分发页面支持安卓合并部署教程

    果超级签名是什么我就不在赘述了,项目由java+vue开发 功能: 1.支持登录注册,拥有共有池,可上传证书等基本操作,支持用户自行上传证书 2.支持修改分发页面轮播图,简介,安卓合并 3.ipa签名 ...

  6. 苹果ios超级签名源码包java版带分发页面支持安卓合并

    苹果超级签名是什么我就不在赘述了,项目由java+vue开发 功能: 1.支持登录注册,拥有共有池,可上传证书等基本操作,支持用户自行上传证书 2.支持修改分发页面轮播图,简介,安卓合并 3.ipa签 ...

  7. php 如何让两张图片重叠,php多张图片合并方法分享

    本文主要和大家分享php多张图片合并方法,PHP imagecopymerge 函数可以支持两个图像叠加时,设置叠加的透明度,imagecopy 函数则不支持叠加透明,实际上,PHP内部源码里,ima ...

  8. 线段(向量)的计算(判断线段重叠、相交,合并线段,点与线的关系)

    主要内容: 判断两线段是否相交 计算两线段的交叉点 点与直线的位置关系 判断两线段重合并计算其重合部分 判断合并两条线段 说明全都在注释里了,有的方法可能不是最佳,欢迎大家提出建议~~ public ...

  9. 前端vue导出 xlsx 实现带标题 内容居中 自动换行 合并单元格 加边框 合计 字体大小设置等

    1.在src下的libs文件夹下新建一个excel文件夹,里面放入下载好的两个文件(Blob.js和Export2Excel2.js) 2.在所需要导出的vue文件里引入: import { toEx ...

最新文章

  1. 【LeetCode】Palindrome Partitioning 解题报告
  2. git为私有仓库设置密码_dnf仓库密码设置不跳出 dnf仓库密码设置流程
  3. Google API:如何访问Google Analytics(分析)数据?
  4. 怎么创建计算机快捷方式到桌面两种方法,使用脚本主机创建Windows快捷方式 - Windows Client | Microsoft Docs...
  5. linux 硬盘响,完美解决Ubuntu Linux关机异响[SATA硬盘]
  6. android edittext的监听,android editText 监听事件
  7. java求梯形面积程序_Java初级应用,计算关于梯形跟圆形的面积。该程序中有3个类:Lader、Circle和主类Test。...
  8. 获取进程的信息 linux,如何获取进程信息
  9. 《算法图解》第二章笔记与课后练习_选择排序算法
  10. 在工作中常用到的SQL
  11. 日版iphone5 SB 配合REBELiOS卡贴破解电信3G步骤
  12. 专家建议|2022内容运营的5大SEO错误以及如何避免
  13. 计算机网络与应用技术清华答案第二版,计算机网络-原理、技术与应用(第2版)部分习题答案(不外传!).pdf...
  14. coco2d-html5制作弹弓射鸟第一部分---橡皮筋
  15. 华为服务器修改硬盘显示顺序,服务器硬盘顺序
  16. 【Python爬虫】图文教学 爬取并汇总至Excel:高考志愿中的所有专业大类、具体专业的各项信息
  17. 程序人生(一)从“道·法·术·器“”的角度来谈谈程序的境界
  18. 为什么厉害的人(我)都精力那么好?我有四大秘诀
  19. AMA(Ask Me Anything)新型问答社区模式研究
  20. 使用 Python 对股票数据分析预测

热门文章

  1. 中秋节图案 用java代码打出来_以下哪个不是中秋节传说?
  2. Windows 10安装YOLOv5训练及验证狗狗照片
  3. 简单的可视化批量插入pdf页面(将另一份含n页的pdf插入到当前的pdf中的第m页之后)(使用pdf-xchange editor或迅捷pdf/acorbat)
  4. pythonos path模块_Python连载11-Python中os.path模块简介
  5. THINKPHP6.02调用百度H5实名认证接口
  6. 可控制的CSS3D盒子动画
  7. 仓库库存管理系统源码B/S架构带文档
  8. 【git】git拉取远程分支
  9. vue阻止默认_vue中,阻止默认事件
  10. css常用demo练习