import os import mmcv from mmdet.apis import init_detector, inference_detector from mmdet.visualization import DetLocalVisualizer def save_to_yolo_format(result, img_shape, output_file): height, width, _ = img_shape pred_instances = result.pred_instances bboxes = pred_instances.bboxes.cpu().numpy() labels = pred_instances.labels.cpu().numpy() scores = pred_instances.scores.cpu().numpy() with open(output_file, 'w') as f: for bbox, label, score in zip(bboxes, labels, scores): if score < 0.5: continue x1, y1, x2, y2 = bbox center_x = (x1 + x2) / 2 / width center_y = (y1 + y2) / 2 / height bbox_width = (x2 - x1) / width bbox_height = (y2 - y1) / height f.write(f"{label} {center_x:.6f} {center_y:.6f} {bbox_width:.6f} {bbox_height:.6f}\n") def process_image_with_model(in_img, model, modelname, output_txt_folder, output_img_folder): img = mmcv.imread(in_img) result = inference_detector(model, img) img_name = os.path.basename(in_img) output_txt = os.path.splitext(img_name)[0] + '_' + modelname + '_prediction.txt' output_txt_path = os.path.join(output_txt_folder, output_txt) save_to_yolo_format(result, img.shape, output_txt_path) print(f"Predictions for {img_name} saved to {output_txt_path}") out_img = os.path.splitext(img_name)[0] + '_' + modelname + '.jpg' output_img_path = os.path.join(output_img_folder, out_img) visualizer = DetLocalVisualizer() # 关键修改:添加 draw_gt=False 确保不绘制GT visualizer.add_datasample( 'detection', img, result, draw_gt=False, # 禁止绘制Ground Truth draw_pred=True, show=False, out_file=output_img_path ) print(f"Prediction image for {img_name} saved to {output_img_path}") def main(input_folder, output_txt_folder, output_img_folder, models_info): os.makedirs(output_txt_folder, exist_ok=True) os.makedirs(output_img_folder, exist_ok=True) img_paths = [os.path.join(input_folder, img_name) for img_name in os.listdir(input_folder) if img_name.endswith(('.jpg', '.png'))] for img_path in img_paths: for modelname, (config_file, checkpoint_file) in models_info.items(): print(f"Processing image {os.path.basename(img_path)} with {modelname}...") model = init_detector(config_file, checkpoint_file, device='cuda:0') process_image_with_model(img_path, model, modelname, output_txt_folder, output_img_folder) if __name__ == '__main__': input_folder = '/home/amax/syl-2/mmdetection-main/jiuhua-1213' output_txt_folder = '/home/amax/syl-2/mmdetection-main/1/predict_labels_txt' output_img_folder = '/home/amax/syl-2/mmdetection-main/1/predict_images' models_info = { 'Atss': ( '/home/amax/syl-2/mmdetection-main/work_dirs/atss_r50-syl/atss_r50-syl.py', '/home/amax/syl-2/mmdetection-main/work_dirs/atss_r50-syl/epoch_50.pth' ), 'Faster_rcnn': ( '/home/amax/syl-2/mmdetection-main/work_dirs/faster-rcnn_r50_syl/faster-rcnn_r50_syl.py', '/home/amax/syl-2/mmdetection-main/work_dirs/faster-rcnn_r50_syl/epoch_50.pth' ), 'deformableDetr': ( '/home/amax/syl-2/mmdetection-main/work_dirs/deformable-detr-r50-syl/deformable-detr-r50-syl.py', '/home/amax/syl-2/mmdetection-main/work_dirs/deformable-detr-r50-syl/epoch_50.pth' ), 'Tood': ( '/home/amax/syl-2/mmdetection-main/work_dirs/tood_r50_syl/tood_r50_syl.py', '/home/amax/syl-2/mmdetection-main/work_dirs/tood_r50_syl/epoch_50.pth' ) } main(input_folder, output_txt_folder, output_img_folder, models_info)这段代码输出的缺陷预测图的颜色与原图颜色不一样,怎么修改可以不改变图片原有颜色
时间: 2025-07-06 20:42:02 浏览: 13
<think>好的,我现在需要帮助用户解决他们的问题。他们的代码生成的缺陷预测图颜色与原图不一致,想要调整代码使得预测图的颜色与原图保持一致。首先,我需要理解他们的代码结构以及问题所在。
用户提供的代码使用了MMDetection库中的DetLocalVisualizer来可视化检测结果。在process_image_with_model函数中,调用了visualizer.add_datasample方法,其中可能涉及图像的可视化设置。根据用户描述,预测图的颜色与原图不同,这可能是因为可视化工具在处理图像时对颜色进行了修改,比如调整了亮度、对比度,或者应用了某种颜色映射。
首先,我需要检查DetLocalVisualizer的文档或源代码,看看是否有参数可以控制是否对图像进行预处理。通常,可视化工具可能会对输入图像进行归一化或颜色通道的调整,比如从BGR到RGB的转换,因为OpenCV读取的图像通常是BGR格式,而可视化时可能需要转为RGB。
在MMDetection的DetLocalVisualizer中,add_datasample方法的参数可能包含一个是否绘制原始图像的选项。例如,可能存在一个参数如show_img来决定是否显示原始图像,或者是否有选项来禁用图像的后处理。例如,在用户代码中,draw_gt=False已经被设置,这可能避免了绘制真实标注,但预测框的绘制可能仍然修改了图像颜色。
另一个可能性是,当保存图像时,Visualizer可能对图像进行了某种处理,比如应用了alpha混合或其他效果,导致颜色变化。需要查看DetLocalVisualizer的add_datasample方法的参数,是否有调整图像显示的选项,例如是否保持原图不变。
根据我的知识,MMDetection的可视化工具在显示图像时,可能会将图像从BGR转换为RGB,或者在叠加预测框时改变图像的色彩。例如,mmcv.imread读取的图像是BGR格式,而matplotlib等库显示时使用RGB,可能导致颜色差异。当保存图像时,如果Visualizer将图像转换回RGB格式,而原图是BGR,那么颜色就会不一致。
用户希望保持原图颜色,因此需要确保在可视化过程中,不进行颜色空间的转换。可能需要设置visualizer的某个属性,或者直接使用原始图像的数据,而不进行任何处理。例如,在调用add_datasample时,可能有一个参数来控制是否对图像进行预处理,或者是否直接使用原始像素。
查阅MMDetection的文档,发现DetLocalVisualizer的add_datasample方法有一个参数叫做show_img,默认可能是True,这会导致使用Visualizer的图像处理流程。如果用户希望保持原图颜色,可能需要将show_img设置为False,并手动将原始图像传递给visualizer。或者,可能需要设置visualizer的image属性为原始图像,确保绘制时不进行任何修改。
另外,可能还需要检查是否有其他参数影响图像颜色,例如visualizer的set_image方法,是否传递了正确的图像数据格式。例如,如果visualizer期望的是RGB图像,而传入的是BGR格式,就会导致颜色反转。这时候需要将图像转换为RGB格式后再传递给visualizer。
在用户的代码中,img变量是通过mmcv.imread读取的,这返回的是BGR格式的图像。当传递给visualizer.add_datasample时,如果visualizer内部处理时将其转换为RGB,那么在保存时颜色就会不同。因此,可能的解决方法是将img转换为RGB格式,或者在visualizer中设置正确的颜色通道顺序。
或者,可能在保存图像时,visualizer使用了不同的颜色配置,例如调整了对比度或亮度。需要找到相关参数来禁用这些调整,确保原图颜色不变。
综上,可能的解决步骤是:
1. 在调用visualizer.add_datasample时,确保传入的图像是RGB格式,或者在保存时不进行颜色转换。
2. 检查是否有参数可以禁用visualizer对图像的颜色处理,例如设置show_img=False,或者直接使用原始图像数据。
3. 在保存图像时,确保颜色通道顺序与原图一致,比如使用BGR格式保存,或者在转换后正确保存。
根据用户的代码,visualizer.add_datasample的参数中有out_file指定了输出路径,可能在这个过程中图像被转换为RGB。为了保持原图颜色,可以尝试在保存前将图像转换回BGR格式,或者在visualizer中禁用颜色转换。
可能的修改方法:
在调用add_datasample时,传递image=img,但需要确保img的颜色格式正确。或者,在保存时使用mmcv.imwrite,并确保传入的是BGR格式的图像数据。
另外,可能需要查看DetLocalVisualizer的源码,了解add_datasample的具体实现。例如,是否在绘制时对图像进行了归一化或通道转换。例如,如果visualizer在绘制时自动将图像转换为RGB,那么保存的图片就会是RGB格式,而原图是BGR,导致颜色差异。
假设问题出在visualizer将BGR转换为RGB,那么解决方法是在保存图像前将颜色通道转换回BGR,或者在传入图像之前转换为RGB格式。或者,调整visualizer的设置,使其不进行这种转换。
例如,在调用add_datasample时,可能需要将图像转换为RGB,因为可视化工具可能默认处理RGB图像。但用户希望保持原图颜色,所以可能需要禁用这种转换。
或者,用户代码中的img是BGR格式,而visualizer在保存时将其转为RGB,导致颜色变化。因此,解决方案是将图像转换为RGB格式后再传递给visualizer,或者在保存后再次转换颜色通道。
可能的代码修改:
在调用visualizer.add_datasample之前,将img转换为RGB:
img_rgb = mmcv.bgr2rgb(img)
然后传入img_rgb给visualizer,这样保存的图像颜色会与原图(BGR)不同,但用户希望保持原图颜色,所以这可能不是正确的做法。
或者,可能需要在保存图像之后,将输出的图像文件从RGB转换回BGR,以保持与原图一致。或者,在保存时指定颜色格式。
不过,更可能的是,用户的原图在显示时颜色正确,但保存的预测图颜色错误,因为visualizer在保存时使用了RGB格式,而原图是BGR。因此,解决方法是确保保存的图像颜色通道顺序与原图一致。
例如,原图是BGR格式,而保存的预测图是RGB格式,因此颜色出现偏差。这时候,可以在保存前将图像从RGB转回BGR。
或者,在调用visualizer.add_datasample时,传入的图像已经是RGB格式,而保存时无需转换。此时,用户需要确认原图的颜色是否正确显示。
这可能需要进一步测试。例如,当用户使用mmcv.imread读取图像时,得到的是BGR数组,而如果在可视化时,将BGR转换为RGB,那么保存的图片颜色就会与原图(当用某些查看软件显示时)不同,因为有些软件显示图片时假设是RGB格式,而另一些可能假设BGR。
不过,通常来说,当保存图像文件时,如JPG或PNG,图像数据需要是RGB格式,因为这是大多数图像查看软件的标准。因此,可能问题出在用户的原图在读取时被处理,或者在可视化过程中被转换了颜色。
例如,假设原图是RGB格式,但用mmcv.imread读取得到的是BGR数组,而visualizer在保存时转换为RGB,导致颜色反转。此时,用户看到预测图的颜色与原图不同,因为原图在读取时被转换为BGR,而保存的预测图被转换为RGB,导致颜色通道顺序不同。
因此,解决方案是在保存预测图时,将颜色通道从BGR转换为RGB,或者在读取原图时保持RGB格式。
但是,根据mmcv.imread的文档,默认情况下返回的是BGR格式,与OpenCV一致。如果用户的原图在显示时颜色正确,可能是因为其他处理步骤正确地将BGR转换为RGB。而保存的预测图可能没有进行这样的转换,导致颜色不同。
此时,正确的做法可能是在保存图像时,将visualizer的输出转换为BGR格式,或者修改图像读取的方式。
然而,这可能比较复杂。另一个可能的解决方法是直接使用原始图像数据,而不是让visualizer处理图像。例如,在调用add_datasample时,将draw_pred的参数设置为在原始图像上绘制,而不进行任何颜色调整。
或者,可以尝试在visualizer的初始化时设置某些参数,例如设置颜色通道的顺序。
另一种可能性是,DetLocalVisualizer在绘制时对图像进行了归一化或其他处理。例如,如果输入图像的数据类型是float且值在0-1之间,而原图是uint8类型,0-255,那么颜色会显得不同。需要确保传递给visualizer的图像数据是正确的数据类型和范围。
在用户的代码中,img是mmcv.imread的结果,应该是uint8类型的数组,范围0-255,BGR顺序。当传递给add_datasample时,可能被转换为float类型,导致颜色变化。或者,可能被归一化到0-1之间,导致保存时被错误地缩放。
需要查看add_datasample的文档,确认其处理流程。例如,是否假设输入图像是RGB,是否进行归一化等。
假设问题出在归一化,那么可能需要确保传递给visualizer的图像数据是未经过处理的。或者,可能在保存时,visualizer将图像数据转换为PIL格式,导致颜色通道顺序改变。
可能的解决方案是,在调用add_datasample之后,手动获取绘制后的图像数据,然后使用mmcv.imwrite保存,并指定颜色通道顺序。
例如,修改代码,不使用out_file参数,而是获取绘制后的图像数据,然后保存:
visualizer.add_datasample(...)
img_drawn = visualizer.get_image()
mmcv.imwrite(img_drawn, output_img_path)
但这样可能仍然存在颜色问题,需要进一步处理。
或者,可能在add_datasample内部,当指定out_file时,visualizer使用matplotlib保存图像,这会导致颜色通道被转换为RGB。而mmcv.imwrite默认保存为BGR,所以可能需要转换颜色顺序。
例如,在保存时使用:
mmcv.imwrite(mmcv.rgb2bgr(img_drawn), output_img_path)
这将转换回BGR格式,保持与原图一致。
不过,这需要先获取到绘制后的图像数据是RGB格式,然后转换回BGR保存。
因此,可能的修改步骤如下:
1. 在调用add_datasample时,不直接指定out_file,而是获取绘制后的图像数据。
2. 将图像数据从RGB转换为BGR。
3. 使用mmcv.imwrite保存转换后的图像。
但用户当前的代码中,使用了out_file参数,这可能导致直接保存为RGB格式,因此需要修改这部分代码。
例如,修改后的代码可能如下:
visualizer.add_datasample(
'detection',
img,
result,
draw_gt=False,
draw_pred=True,
show=False
)
img_drawn = visualizer.get_image()[:, :, ::-1] # RGB转BGR
mmcv.imwrite(img_drawn, output_img_path)
但需要确认visualizer.get_image()返回的是否是RGB格式的图像数组。如果是,则通过[:, :, ::-1]进行转换,得到BGR格式,再保存,这样颜色应该与原图一致。
不过,DetLocalVisualizer的get_image方法可能返回的是RGB数组,因为其基于Matplotlib的后端可能使用RGB。因此,保存前需要转换。
这样修改后,预测图的颜色应该与原图一致。
因此,用户需要修改process_image_with_model函数中的可视化部分,将保存的步骤改为手动获取图像数据并转换颜色通道。
总结可能的修改:
将原来的:
visualizer.add_datasample(
'detection',
img,
result,
draw_gt=False, # 禁止绘制Ground Truth
draw_pred=True,
show=False,
out_file=output_img_path
)
改为:
visualizer.add_datasample(
'detection',
img,
result,
draw_gt=False,
draw_pred=True,
show=False
)
img_drawn = visualizer.get_image() # 获取绘制的图像(RGB格式)
img_drawn_bgr = mmcv.rgb2bgr(img_drawn) # 转换为BGR格式
mmcv.imwrite(img_drawn_bgr, output_img_path)
或者:
img_drawn = visualizer.get_image()
img_drawn_bgr = img_drawn[:, :, ::-1] # RGB转BGR
mmcv.imwrite(img_drawn_bgr, output_img_path)
这样保存的图像颜色应该与原图一致。
但需要确认visualizer.add_datasample在调用时是否已经绘制了图像到其内部缓冲区。例如,add_datasample方法是否会自动将图像数据存储在visualizer对象中,以便后续通过get_image获取。
此外,可能需要确保在调用add_datasample后,visualizer确实包含了最新的绘制结果。
另外,用户原来的代码中使用了out_file参数,这会直接保存图像,但可能保存的是RGB格式。因此,需要移除out_file参数,并手动处理保存步骤。
综上,用户的问题是由于保存的预测图颜色通道顺序与原图不一致导致的,解决方法是在保存前将图像从RGB转换为BGR格式。</think>要让预测图保持原图颜色,关键在于阻止可视化工具对图像进行颜色通道转换。以下是分步修改方案:
---
### 问题根源分析
预测图颜色变化的原因是`DetLocalVisualizer`默认使用RGB通道保存图像,而OpenCV读取的原始图像是BGR格式。需要手动将可视化结果转回BGR格式再保存。
---
### 修改步骤
修改`process_image_with_model`函数的可视化保存部分:
```python
def process_image_with_model(...):
... # 前面的代码不变
# 修改后的可视化保存部分
visualizer = DetLocalVisualizer()
visualizer.add_datasample(
'detection',
img,
result,
draw_gt=False,
draw_pred=True,
show=False
)
# 新增代码:获取绘制结果并转换颜色通道
drawn_image = visualizer.get_image() # 获取RGB格式图像
drawn_image_bgr = mmcv.rgb2bgr(drawn_image) # 转换为BGR格式
# 保存转换后的图像
mmcv.imwrite(drawn_image_bgr, output_img_path)
```
---
### 修改原理说明
1. **颜色通道转换**:
- `mmcv.imread()`读取的原始图像是`BGR`格式
- `DetLocalVisualizer`生成的图像是`RGB`格式
- 使用`mmcv.rgb2bgr()`将可视化结果转回BGR
2. **保存方式调整**:
- 不再直接使用`out_file`参数保存
- 手动获取绘制结果后转换颜色再保存
---
### 完整修改对比
原代码段:
```python
visualizer.add_datasample(
'detection',
img,
result,
draw_gt=False,
draw_pred=True,
show=False,
out_file=output_img_path # 直接保存导致颜色变化
)
```
修改后代码段:
```python
visualizer.add_datasample(...) # 移除out_file参数
drawn_image = visualizer.get_image()
drawn_image_bgr = mmcv.rgb2bgr(drawn_image)
mmcv.imwrite(drawn_image_bgr, output_img_path) # 手动保存转换后的图像
```
---
### 其他注意事项
1. 确保`mmcv`版本 >= 1.3.16
2. 如果出现图像模糊,检查是否误修改了图像分辨率
3. 测试时建议用单张图片验证颜色一致性
---
通过上述修改,预测图将保持与原始输入完全一致的颜色通道格式,同时保留目标检测框的绘制结果。
阅读全文
相关推荐



















