mask生成平行框
在Mask Rcnn中传给模型训练的是物体的mask图,但训练中会利用到包含物体的平行框,查看代码后发现gt_box是由mask生成的,其主要思路是找出平行框左上角和右下角的坐标。mask图是一个二值图,利用numpy库的where()和any()函数就可以找出和以及和。
例如:
mask是一个4x4的矩阵,其值如下图所示:
第一步:先通过any(mask, axis=0)函数返回mask每列中元素是否全为零,再由where()函数返回其对应的下标,其第一个和最后一个值就是和的值。
第二步:通过any(mask, axis=1)函数返回mask每行中元素是否全为零,同理通过where()返回对应的下标,第一个和最后一个即为和。
第三步:返回和即为平行框的左上角和右下角点坐标。
mask转平行框源代码如下,其中对计算出来的坐标进行了边界判断。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | def extract_bboxes(mask): """Compute bounding boxes from masks. mask: [height, width, num_instances]. Mask pixels are either 1 or 0. Returns: bbox array [num_instances, (y1, x1, y2, x2)]. """ boxes = np.zeros([mask.shape[ - 1 ], 4 ], dtype = np.int32) for i in range (mask.shape[ - 1 ]): m = mask[:, :, i] # Bounding box. horizontal_indicies = np.where(np. any (m, axis = 0 ))[ 0 ] vertical_indicies = np.where(np. any (m, axis = 1 ))[ 0 ] if horizontal_indicies.shape[ 0 ]: x1, x2 = horizontal_indicies[[ 0 , - 1 ]] y1, y2 = vertical_indicies[[ 0 , - 1 ]] # x2 and y2 should not be part of the box. Increment by 1. x2 + = 1 y2 + = 1 else : # No mask for this instance. Might happen due to # resizing or cropping. Set bbox to zeros x1, x2, y1, y2 = 0 , 0 , 0 , 0 x1 = 0 if x1< 0 else x1 y1 = 0 if y1< 0 else y1 y2 = mask.shape[ 0 ] - 1 if y2> = mask.shape[ 0 ] else y2 x2 = mask.shape[ 1 ] - 1 if x2 > = mask.shape[ 1 ] else x2 boxes[i] = np.array([y1, x1, y2, x2]) return boxes.astype(np.int32) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端