1. 问题描述
-
问题:制作数据集收集图片时容易存在图片格式不统一的问题。当在进行模型训练时,有的程序报错。本人在训练yolov5(2021年3月版本)时便遇到了,具体报错信息忘了保存。
-
分析:通过错误信息的提示,是由于读取时遇到了
未知文件格式
,导致了读取失败。因此我猜想是因为图片格式不统一带来的问题。 -
背景:最初始的图片存在jpg和png图片两种格式。为了统一,我将所有的图片后缀名改为了jpg格式,在windows系统下正常显示,但是到了ubuntu系统下这些暴力更改的图片便无法显示。
-
试错一:将所有由于暴力更改格式的图片改回png格式。训练时依然读取失败的错误,但是报错信息已经不一致了,因此我断定是由于图片格式导致的错误。
-
解决方法:写了如下程序利用
pillow
将图片从png转为jpg
格式。
2. 代码
import glob
import os
import shutil
from PIL import Image
# 代码健壮性不足,需要注意以下几个假设。
# 假设一:png图片所在文件夹是存在的,并且文件夹下有图片,且均为png格式
img_old_dir = '/home/sky/mytmp/old' # .png图片所在文件夹
img_new_dir = '/home/sky/mytmp/new' # 格式更改后图片所在文件夹
if not os.path.exists(img_new_dir): # 判断保存图片的文件夹是否存在
os.makedirs(img_new_dir) # 若不存在则进行创建
img_old_path_list = glob.glob(img_old_dir+'/*png') # 读取png图片路径
img_old_path_list.sort() # 进行按照文件名排序(可不要)
print(img_old_path_list) # 进行打印
# # # # # # # # # # # # # 暴力更改图片后缀,从jpg改为png格式 # # # # # # # # # # # # # #
# for img_old_path in img_old_path_list: #
# img_name = img_old_path.split('/')[-1] #
# print(img_name) #
# img_name_first = img_name.split('.')[0] #
# img_new_path = os.path.join(img_new_dir, img_name_first+'.png') #
# shutil.copyfile(img_old_path, img_new_path) # 文件复制 #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
'''
利用pillow更改图片格式,从png图片更改为jpg图片
'''
for img_old_path in img_old_path_list: # 对于每张图片
img = Image.open(img_old_path) # 利用pillow打开图片
img_name = img_old_path.split('/')[-1] # 图片名
img_name_first = img_name.split('.')[0] # 不带后缀的图片名
img_new_path = os.path.join(img_new_dir, img_name_first+'.jpg') # 新的图片路径
if img.mode=='RGBA': # 判断时候存在RGBA格式的图片
img = img.convert('RGB')# 如果存在,因为jpg图片不支持Alpha透明通道,需要进行格式删减
img.save(img_new_path, 'JPEG') # 保存图片
小镇拾光:如需转载请写明转载地址,如果有问题也欢迎提问,有空的时候我会尽力进行回复。