从git下载源码https://github.com/fizyr/keras-retinanet,在跑程序/home/liuliu/PycharmProjects/keras-retinanet-master/examples/ResNet50RetinaNet.ipynb的时候,出现问题:“No module named keras_resnet”,解决方法是,从git上面下载keras_resnet,地址如下:https://github.com/broadinstitute/keras-resnet,然后将文件夹 keras-resnet 放在文件夹keras-retinanet-master(/home/liuliu/PycharmProjects/keras-retinanet-master)下,再跑就不出问题啦。
提示:在git上下载的代码,跑的时候如果出现问题,就在该git网址下的issue里搜你问题的关键字,一般都有解答!!
https://zhuanlan.zhihu.com/p/31530023
tx:cx是物体中心点的x坐标,cxa锚点的中心点的x轴坐标,(x2_anc - x1_anc)锚点衍生出的框的宽度;
tw:gta[bbox_num,1]-gta[bbox_num,0] 类物体的宽度,(x2_anc - x1_anc)衍生框的宽度
all_imgs = [] ##图片信息
classes_count = {} ##类别统计
class_mapping = {} ##类别映射(该类别对应几)
visualise = False ##是否要显示
# not using vOC2007, 2012 only
# data_paths = [os.path.join(input_path, s) for s in ['VOC2007', 'VOC2012']]
data_paths = [os.path.join(input_path, s) for s in ['VOC2012']]
print('Parsing annotation files')
设置一些变量存储信息【注:data_paths = [os.path.join(input_path, s) for s in ['VOC2012']]是遍历列表中给的VOC训练集】
for data_path in data_paths:
annot_path = os.path.join(data_path, 'Annotations') #图片的信息基本都在Annotations文件夹的xml文件中
imgs_path = os.path.join(data_path, 'JPEGImages')
imgsets_path_trainval = os.path.join(data_path, 'ImageSets', 'Main', 'trainval.txt')
imgsets_path_test = os.path.join(data_path, 'ImageSets', 'Main', 'test.txt')
trainval_files = []
test_files = []
~~~~~~~~~~~~~~~~~
在训练过程中,rpn网络考虑以下三组数据:预测框(predicted box)坐标[x,y,w,h],anchor坐标[xa,ya,wa,ha],ground truth坐标[x∗,y∗,w∗,h∗];分别计算预测框相对anchor中心位置的偏移量以及宽高的缩放量{t},ground truth相对anchor的偏移量和缩放量{t∗};rpn回归目标就是让{t}尽可能地接近{t∗}。
rpn训练得到的是训练样本中ground truth坐标[x∗,y∗,w∗,h∗]和预测框(predicted box)坐标[x,y,w,h]的映射关系F_rpn;
问题是:测试的时候,测试样本中的ground truth坐标是未知的,上述的映射关系F_rpn是针对训练样本的,感觉没法直接用到测试样本中啊?那么是怎么通过rpn网络得到测试样本的预测框(box)坐标?
就是说,实际世界中,物体位置是完全随机的,rpn网络通过训练可以用于准确预测这种随机位置,感觉不合理啊?
训练过程学习的是是四个变化量,中心的偏移量和缩放量,测试的时候直接根据这四个变化量做前向即可,至于你的困惑应该是这些个偏移量每幅图可能不太一样,我的理解是虽然有那么多anchor,但是真正包含目标的anchor是少数的,再者,我觉得大量训练的过程中,一个是平均的思想,一个是本身从anchor到最后的目标框,是由特征支配的吧,也就是那种位置变化里是与特征有关系的
调整python默认递归深度
python默认的递归深度是很有限的,大概是900多的样子,当递归深度超过这个值的时候,就会引发这样的一个异常。
解决的方式是手工设置递归调用深度,方式为
import sys
sys.setrecursionlimit(1000000) #例如这里设置为一百万