CNN模型评估时遭遇UnidentifiedImageError问题求助
解决UnidentifiedImageError问题
核心问题原因
你错误使用了tf.keras.utils.get_file()函数——这个函数的设计目的是从远程URL下载文件到本地缓存,而非读取本地已存在的文件。当你传入谷歌云盘的本地挂载路径时,它无法正确解析,导致返回的是一个BytesIO对象而非实际文件路径,最终load_img无法识别这个对象。
具体解决步骤
1. 移除多余的get_file调用(最直接的修复)
直接使用本地路径加载图片,不需要通过get_file中转:
sad_face = "/content/drive/MyDrive/Dataset/images/images/validation/sad/10004.jpg" # 直接用本地路径加载,跳过get_file img = tf.keras.utils.load_img( sad_face, target_size=(img_height, img_width) ) img_array = tf.keras.utils.img_to_array(img) img_array = tf.expand_dims(img_array, 0) # Create a batch predictions = model.predict(img_array) score = tf.nn.softmax(predictions[0]) print( "This image most likely belongs to {} with a {:.2f} percent confidence." .format(class_names[np.argmax(score)], 100 * np.max(score)) )
2. 验证图片文件有效性
如果修改后仍报错,检查图片本身是否有问题:
- 检查文件大小:如果文件大小为0,说明文件损坏或未正确上传到谷歌云盘,重新拷贝图片。
- 用PIL手动验证:
from PIL import Image try: img = Image.open(sad_face) img.verify() # 验证图片完整性 print("图片文件正常") except Exception as e: print(f"图片损坏或无效: {e}")
3. 检查路径与格式
- 确认谷歌云盘已正确挂载:运行
!ls /content/drive/MyDrive/Dataset/images/images/validation/sad/查看是否存在目标图片。 - 确认图片后缀名与实际格式一致:比如有些文件后缀是
.jpg但实际是PNG或其他格式,可尝试修改后缀或指定load_img的formats参数,比如formats=["jpg", "jpeg", "png"]。
4. 加载网络图片的正确方式(如果用Unsplash的话)
如果是加载Unsplash的网络图片,才需要用get_file,但要传入完整的图片URL:
# 示例:加载Unsplash的网络图片 sunflower_path = tf.keras.utils.get_file('Sad', origin="https://unsplash.com/xxx/your-image-url.jpg") img = tf.keras.utils.load_img(sunflower_path, target_size=(img_height, img_width))
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

