基于PyTorch+YOLOv5的皮卡丘目标检测结果蓝黄偏色问题求解
问题根因
你遇到的偏色问题是图像通道顺序不匹配导致的:
- YOLOv5内置的
LoadImages工具类底层使用OpenCV加载图像,返回的原始图像im0s是BGR通道顺序的numpy数组 - 你后续用PIL的
Image.fromarray()解析图像时,PIL默认会按照RGB通道顺序处理数组,直接导致红蓝通道反转,就出现了黄色区域变蓝、蓝色区域变黄的现象。
解决方案
只需要在将图像传入PIL处理前,把BGR通道转为RGB即可,有两种修改方式可选:
方式1:修改主逻辑的图像预处理步骤
在主循环中拿到im0后、传入show_pikachu前添加通道转换代码:
for i, det in enumerate(pred): im0 = im0s.copy() # 新增代码:BGR转RGB,反转最后一维的通道顺序 im0 = im0[:, :, ::-1] det[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0.shape).round() result = show_pikachu(im0, det) result.show()
方式2:修改show_pikachu函数内部逻辑
在Image.fromarray调用前添加通道转换代码:
def show_pikachu(img, det): labels = ["pikachu"] # 新增代码:BGR转RGB img = img[:, :, ::-1] img = Image.fromarray(img) # 剩余原有逻辑不变 draw = ImageDraw.Draw(img) # ... 后续代码保持原样
两种方式任选其一即可解决偏色问题。如果后续你需要用OpenCV接口保存推理后的图像,记得再把RGB转回BGR再调用cv2.imwrite,避免存图时再次出现偏色。
内容的提问来源于stack exchange,提问作者cyang
相关产品推荐
相关产品推荐

