tensorflow处理图片格式出现问题总结
程序员文章站
2022-04-09 21:27:43
...
tensorflow处理图片格式出现问题总结
- 图片的后缀非jpg格式
通过批量读取数据的后缀名,判断文件是否为所需要的后缀为jpg的格式的文件有了两种方法,一种通过代码脚本判断遍历文件的后缀修改文件,遍历文件脚本如下:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import shutil
import sys
'''
##############################################
根据图片对应的xml分离出来
rootdir 图片所在的文件夹
xmlpath 与图片对应的xml所在的文件夹
newxmlpath 分离出来的xml要存放的路径
##############################################
'''
rootdir = ""
xmlpath = ""
newxmlpath = ""
def run(path,path1,path2):
if os.path.isdir(path):
list = os.listdir(path)
for i in range(0,len(list)):
pathe = os.path.join(path,list[i])
print(pathe)
if os.path.isdir(pathe):
run(pathe)
else:
(newpath,assension) = os.path.splitext(pathe)
(newpath1,filename) = os.path.split(pathe)
if assension == ".jpg":
index = filename.rfind('.')
name = filename[:index]
if not os.path.exists(path1):
os.mkdir(path1)
xmlname = os.path.join(path1,name+'.xml')
if not os.path.exists(xmlname):
continue
print('xml的原路径为:'+xmlname)
if not os.path.exists(path2):
os.mkdir(path2)
newxmlname = os.path.join(path2,name+'.xml')
print('xml的新路径为:'+newxmlname)
shutil.move(xmlname,newxmlname)
print('移动文件:'+name+'.xml')
else:
(newpath,assension) = os.path.splitext(path)
(newpath1,filename) = os.path.split(path)
if assension == ".jpg":
index = filename.rfind('.')
name = filename[:index]
if not os.path.exists(path1):
os.mkdir(path1)
xmlname = os.path.join(path1,name+'.xml')
print('xml的原路径为:'+xmlname)
if not os.path.exists(path2):
os.mkdir(path2)
newxmlname = os.path.join(path2,name+'.xml')
print('xml的新路径为:'+newxmlname)
shutil.move(xmlname,newxmlname)
print('移动文件:'+name+'.xml')
if __name__ == "__main__":
if os.path.isdir(rootdir):
run(rootdir,xmlpath,newxmlpath)
else:
print('请输入正确的文件夹路径')
- 图片后缀为jpg格式非jpg对应编码格式
图片中用后缀名判断文件的格式会出现不对应的问题。例如png的图片修改后缀为jpg文件,查看图片正常。所以利用Python读取文件用二进制读取文件的形式,对应的二进制的文件头如下图所示:
图片文件格式 | 二进制文件头 |
---|---|
JPEG(jpg) | FFD8FF |
PNG (png) | 89504E47 |
GIF (gif) | 47494638 |
TIFF (tif) | 49492A00 |
Windows Bitmap (bmp) | 424D |
CAD (dwg) | 41433130 |
Adobe Photoshop (psd) | 38425053 |
Rich Text Format (rtf) | 7B5C727466 |
XML (xml) | 3C3F786D6C |
HTML (html) | 68746D6C3E |
Email [thorough only] (eml) | 44656C69766572792D646174653A |
Outlook Express (dbx) | CFAD12FEC5FD746F |
Outlook (pst) | 2142444E |
MS Word/Excel (xls.or.doc) | D0CF11E0 |
MS Access (mdb) | 5374616E64617264204A |
WordPerfect (wpd) | FF575043 |
Postscript (eps.or.ps) | 252150532D41646F6265 |
Adobe Acrobat (pdf) | 255044462D312E |
Quicken (qdf) | AC9EBD8F |
Windows Password (pwl) | E3828596 |
ZIP Archive (zip) | 504B0304 |
RAR Archive (rar) | 52617221 |
Wave (wav) | 57415645 |
AVI (avi) | 41564920 |
Real Audio (ram) | 2E7261FD |
Real Media (rm) | 2E524D46 |
MPEG (mpg) | 000001BA |
MPEG (mpg) | 000001B3 |
Quicktime (mov) | 6D6F6F76 |
Windows Media (asf) | 3026B2758E66CF11 |
MIDI (mid) | 4D546864 |
通过对文件的二进制的数据的读取判断数据的格式并判断。
3. 如果上述问题依旧没有解决,可能是出现以下问题
图片的格式和后缀全部正确,但是tensorflow报错读取图片格式出现异常,此时可能是因为图片解析的二进制的最后几个字节出现了问题(具体是什么原因造成的,我也不知很清楚)
图片的二进制结尾处为“xff/xd9”,出现问题的原因是图片结尾处的这两个字节发生了变化,判断图片最后二进制的这两个字节就可以,以下是我判断的一个简单的代码段,只是判断了xff是否发生了变化:
import logging
import os
import shutil
path = "D:/赵凯月/images - 副本"
srcpath = 'D:/赵凯月/annotations'
detpath = 'D:/赵凯月/xmldet'
logging.basicConfig(filename='example.log', filemode="w", level=logging.INFO)
def is_jpg(path1):
files = os.listdir(path1)
for filename in files:
print(filename)
pathdata = os.path.join(path,filename)
data = open(pathdata,'rb').read()
print(data[-2:-1])
if data[-2:-1] != b'\xff':
print('错误')
logging.info(filename)
filesrcpath = os.path.join(srcpath,filename)
filedetpath = os.path.join(detpath,filename)
shutil.move(filesrcpath,filedetpath)
if data[:4] != b'\xff\xd8\xff\xe0':
logging.info(filename)
continue
if data[6:] != b'JFIF\x00':
continue
is_jpg(path)
下一篇: jQuery实现滚动效果