语义分割选择使用多边形框标注,相对于物体检测它多了一项计算mask掩膜的需求。
一个图片,可能会进行多项标注。每项标注里面都会在物体检测的格式基础上增加mask属性,mask解释为图像掩膜,里面存与图像宽高对应大小的二维数组。
此二维数组可理解为将图片每个像素分成行列,每行为一个子数组。图像上的每个像素点对应二维数组中一个元素。
使用多边形框对图像进行语义分割类型的标注。
若像素点位置落在标注框内,框内的像素点位置坐标的值为1,框外的值为0。
安排此项内容由前端直接统一计算得出。
实现基础思路
- 在AILabel标注插件之上,能知道图片本身的宽高,能知道图片标注区域所在的范围
- 根据宽高能初始化对应一个二维数组,从左上角起始每个像素对应其中一个元素
0 0 0
0 0 0
0 0 0
可以看到每个像素都是有对应坐标的。没有标注的时候这些像素位置对应的值都是0
- 根据标注框,能计算出在标注框范围内的像素点对应哪些坐标。将这些位置的坐标替换为1
掩膜计算
上述思路在实现过程中难点在于最后一条,怎么将多边形框起来的区域每个像素的位置在二维数组中置为1。
在GIS领域,判断点是否在多边形范围内是一个基础方法,这里主要说下实现原理。
原理比较简单,就是有一个GIS理论,一个点向一个方向发送射线,射线与多边形各个边相交的交点如果是奇数说明点在多边形范围内。
用工具画框时是有顺序的,先后画的两个点是挨着的,所以确定挨着的两个元素能够构成一条边。
可能会遇到的问题是:如果多边形的边比较多,图片比较大,那可能会很卡。
因此针对这个问题可以再考虑一些优化方案。
基础方案
作横向射线,如果交点数为0,那么当前行所有像素都不必再判断,可直接断定不会在多边形内。
优化方案
根据已有多边形的点,计算出多边形的外矩形框边界,这样判断的范围就更小了。
这种思路,不需要遍历所有,只要关注这个矩形区域内像素点坐标的判断即可。
- 以图片宽高初始化二维数组
- 以标注区域的外围矩形框的左上角开始遍历、右下角终止,逐一判断每个像素点是否落在矩形框内。如果是则相应位置置为1,否则为0