欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

tensorflow处理图片格式出现问题总结

程序员文章站 2022-04-09 21:27:43
...

tensorflow处理图片格式出现问题总结

  1. 图片的后缀非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('请输入正确的文件夹路径')
		
  1. 图片后缀为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)