opencv/labelimg图片处理尺寸问题踩坑-相机EXIF方向信息带来的旋转问题与opencv和labelimag对其相应的处理
背景介绍:想用yolo训练一个目标检测的模型,因为原始图片很大而目标很小,所以用opencv切成4*4再训练,结果训练结果很诡异,查看数据集后发现切割后的图片有些被旋转了90°,反复检查代码还是找不出问题。
解决
后终于发现,如果图片是相机拍摄的原始图片,会有一个exif信息的方向值(Orientation tag),图片查看软件查看时往往都会根据这个值旋转一下图片再展示,labelimg也不例外。
然后查询方法,使用exiftool工具旋转图片后再切片处理,再训练,
exif使用方法教程:https://github.com/puxiao/notes/blob/master/Exiftool学习笔记.md
旋转步骤:
旋转工作原理:
运行该命令后,会发生以下事情:
读取图片的 EXIF 数据:
工具会检查每张图片的 Orientation 标签,确定图片需要如何旋转或翻转。
自动调整图片方向:
根据 Orientation 标签的值,工具会将图片旋转或翻转到正确的方向。
移除 Orientation 标签:
在调整图片方向后,工具通常会删除 Orientation 标签,因为图片的方向已经被永久性地修正,不再需要这个标签。
覆盖原始文件:
由于使用了 -overwrite original 参数,调整后的图片会直接覆盖原始文件。
思考与尝试
但这就涉及到一个问题,labelimg的标注数据是以旋转前的图像为基准还是旋转后的?
然后我进行了尝试
使用exiftool将所有图片根据exif的方向信息旋转一下,然后清除掉exif信息
再用labelimg打开,发现标注框是正常的。
这说明labelimag的标注数据坐标信息是根据exif方向旋转后的图像进行的。
所以已有的标注信息,应该应用在按方向信息旋转之后的图片。
但为什么切割后有问题?
因为opencv的读取图片函数读exif信息只旋转图像不旋转标注的参考系,所以标注数据不一致。
yolo训练时使用的图像会考虑这个exif方向信息吗?yolov5和yolov8的train命令都用的opencv读取图像,所以也会出现这个问题。