yolo部分算是顺利地复现了代码,记录一下学习过程中的几个点:
- 全图是被分成7*7个部分,并不是一个格子7*7大小,这里我老是忘记!
- 数据标签中bbox的边框是[x,y,w,h]表示形式,在此基础上随同图像进行一系列的变化。
- 图像因为大小不同,且还不是正方形,所以要预处理到448*448大小。网上代码有两种处理方式:一是先给图像短的一边加上value=0的pad,使图像变成正方形,再缩小或扩大至448,一是直接将图像拉伸成448。这里我选择了第一种方法,觉得不会破坏图像的真实特征。
- 跟随图像的变化,bbox也进行变化,图像先加了边框,对bbox的影响是中心点x,y坐标也要加上pad的值;接下来图像扩大至448,按照比例,中心点变化,宽高也变化。至此边框和图像一致。
- 以bbox中心点来寻找真正用来检测的格子,全图共有7*7个格子,中心点坐标在448图中的位置以比例来表示,即中心xy除以448,得到比例之后乘7则得到了这个点在7*7格网内的哪个格。比如,xy在448中是0.5的位置(中间),乘7后为3.5,看,也是在7*7格网的中间吧,这里娶个整是第几个格子。这是找到了格网,但是在格网中的具体什么位置呢?则是xy*7-int(xy*7),这是在负责检测的那个格子中的比例位置。ok,现在的坐标和宽高值就是真实送入训练的,得到的预测值也是这样的模式
- 预测结束后,得到的bbox并不是可展示的,要按照之前的计算方式反向复原回去。预测结果为7*7*30,[i,j]为7*7中的索引,[i,j]/7得到中心坐标在全图的粗糙位置比例, 预测中的中心坐标/7得到在格子中的精确比例,相加得到真正的比例。再中心坐标和宽高乘以448,恢复到以448为基础的框坐标。
- 如果只是展示的话,展示448的图像和第4步得到的框就行,要是得到对应真正图片的bbox,则中心坐标除以原正方形与448的比例,再加上原图成为正方形所增加的pad