过程
构建26层网络
作者采用GoogLeNet作为网络结构,但是并不使用inception模块,而是采用1x1和3x3大小的滤波器进行替代。具体的网络结构请参考博客:深度学习之物体检测——YOLO(一)_介绍。
计算损失
YOLO模型的损失函数比较复杂,包含三种损失:box损失、置信度损失、类别损失。具体的表达式也请查看上面指定的博客。
首先应该根据标记信息计算grid_mask矩阵:即损失函数表达式中的1obji,size=(7*7*1)。计算图片中的物体中心位置,然后令中心所在的格子对应的grid_mask为1,其余的都为0。
负责类别误差。然后计算box_mask矩阵:即损失函数表达式中的1objij,size=(7*7*2)。计算责任格子中的两个box与真实box之间的IOU,IOU大的box对应的box_mask为1。
负责box坐标误差和部分置信度误差。- noobj:即损失函数表达式中的1noobjij,为1−boxmask
负责剩下的置信度误差。
用训练好的模型检测物体
对一张图片的输出需要进行置信度阈值过滤和NMS操作,最终剩下的box作为预测结果。
实现时遇到的问题
实现过程中对于标记中的box表示和网络输出的box表示混乱,最终确定以下原则:
- 所有box表示均用(x_center, y_center, width, height)。
- 标记中的box表示和输出box表示一致,都是在448*448图片中的相对值
另外在还有两个特殊情况:确定责任box的时候会用到box在448*448图片中的绝对位值表示以计算IOU;在将检测结果绘制到原图像中时需要用到box在原图中的绝对位置。
代码
请见Github。
版权声明:本文为VictoriaW原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。