RAG-Diffusion / gen_box_func.py
znchen
Add application file
8fb99cf
import numpy as np
import cv2
def calculate_sr_hw_split_ratio(
HB_m_offset_list, HB_n_offset_list,
HB_m_scale_list, HB_n_scale_list
):
"""
Calculate SR_hw_split_ratio without overlapping regions.
Args:
HB_m_offset_list (List[float]): Offsets of bounding boxes in the horizontal dimension.
HB_n_offset_list (List[float]): Offsets of bounding boxes in the vertical dimension.
HB_m_scale_list (List[float]): Scales of bounding boxes in the horizontal dimension.
HB_n_scale_list (List[float]): Scales of bounding boxes in the vertical dimension.
Returns:
str: SR_hw_split_ratio based on the condition checks.
"""
def has_overlap(offset_list, scale_list):
"""
Check if any boxes in the given dimension overlap.
Args:
offset_list (List[float]): Offsets of bounding boxes in the dimension.
scale_list (List[float]): Scales of bounding boxes in the dimension.
Returns:
bool: True if there is overlap, False otherwise.
"""
for i in range(len(offset_list)):
for j in range(i + 1, len(offset_list)):
if not (offset_list[i] + scale_list[i] <= offset_list[j] or
offset_list[j] + scale_list[j] <= offset_list[i]):
return True
return False
def redistribute_regions(offset_list, scale_list):
"""
Redistribute the regions to ensure no overlap and full coverage.
Args:
offset_list (List[float]): Offsets of bounding boxes.
scale_list (List[float]): Scales of bounding boxes.
Returns:
List[float]: Adjusted proportions for each region.
"""
adjusted_ratios = []
for i in range(len(offset_list)):
if i == 0:
split_ratio = offset_list[i] + scale_list[i] + (offset_list[i + 1] - offset_list[i] - scale_list[i]) / 2
adjusted_ratios.append(split_ratio)
elif i+1 < len(offset_list):
mid_point = offset_list[i] + scale_list[i] + (offset_list[i + 1] - offset_list[i] - scale_list[i]) / 2
region_ratio = mid_point - sum(adjusted_ratios)
adjusted_ratios.append(region_ratio)
else:
final_ratio = 1.0 - sum(adjusted_ratios)
adjusted_ratios.append(final_ratio)
normalized_ratios = [ratio / sum(adjusted_ratios) for ratio in adjusted_ratios]
return normalized_ratios
def generate_regions(adjusted_ratios, separator):
"""
Generate normalized regions as a string.
Args:
adjusted_ratios (List[float]): Adjusted proportions for each region.
separator (str): Separator for the output string.
Returns:
str: Normalized regions as a string.
"""
return separator.join(f"{region:.2f}" for region in adjusted_ratios)
# Check for overlaps
vertical_overlap = has_overlap(HB_m_offset_list, HB_m_scale_list)
horizontal_overlap = has_overlap(HB_n_offset_list, HB_n_scale_list)
# Determine which SR_hw_split_ratio to return
if not vertical_overlap and horizontal_overlap:
adjusted_ratios = redistribute_regions(HB_m_offset_list, HB_m_scale_list)
return generate_regions(adjusted_ratios, ",")
elif vertical_overlap and not horizontal_overlap:
adjusted_ratios = redistribute_regions(HB_n_offset_list, HB_n_scale_list)
return generate_regions(adjusted_ratios, ";")
elif not vertical_overlap and not horizontal_overlap:
adjusted_ratios = redistribute_regions(HB_m_offset_list, HB_m_scale_list)
return generate_regions(adjusted_ratios, ",")
else:
raise ValueError("Invalid condition: Both dimensions either overlap or do not overlap.")
def generate_parameters(bbox_inputs, prompt_width, prompt_height):
"""
Converts bbox_inputs to offset and scale lists for HB format.
Args:
bbox_inputs (List[List[int]]): List of bounding boxes, each defined by [x1, y1, x2, y2].
prompt_width (int): Width of the entire image.
prompt_height (int): Height of the entire image.
Returns:
Tuple[List[float], List[float], List[float], List[float]]:
HB_m_offset_list, HB_n_offset_list, HB_m_scale_list, HB_n_scale_list.
"""
HB_m_offset_list = [box[0] / prompt_width for box in bbox_inputs]
HB_n_offset_list = [box[1] / prompt_height for box in bbox_inputs]
HB_m_scale_list = [(box[2] - box[0]) / prompt_width for box in bbox_inputs]
HB_n_scale_list = [(box[3] - box[1]) / prompt_height for box in bbox_inputs]
SR_hw_split_ratio = calculate_sr_hw_split_ratio(HB_m_offset_list, HB_n_offset_list, HB_m_scale_list, HB_n_scale_list)
return HB_m_offset_list, HB_n_offset_list, HB_m_scale_list, HB_n_scale_list, SR_hw_split_ratio
def visualize(HB_m_offset_list, HB_n_offset_list, HB_m_scale_list, HB_n_scale_list, SR_hw_split_ratio, prompt_width, prompt_height):
# 创建一个白色背景的图像
image = np.ones((prompt_height, prompt_width, 3), dtype=np.uint8) * 255
for m_offset, n_offset, m_scale, n_scale in zip(HB_m_offset_list, HB_n_offset_list, HB_m_scale_list, HB_n_scale_list):
x = int(m_offset * prompt_width)
y = int(n_offset * prompt_height)
width = int(m_scale * prompt_width)
height = int(n_scale * prompt_height)
# 绘制边界框
cv2.rectangle(image, (x, y), (x + width, y + height), (255, 0, 0), 2)
if ',' in SR_hw_split_ratio:
split_ratios = [float(ratio) for ratio in SR_hw_split_ratio.split(',')]
orientation = 'vertical'
elif ';' in SR_hw_split_ratio:
split_ratios = [float(ratio) for ratio in SR_hw_split_ratio.split(';')]
orientation = 'horizontal'
else:
split_ratios = [float(SR_hw_split_ratio)]
orientation = 'horizontal'
colors = [(0, 0, 255), (0, 255, 0), (255, 255, 0), (125, 125, 0), (255, 0, 255),(0, 125, 255), (125, 255, 0), (255, 255, 125), (125, 0, 0), (125, 0, 255)]
current_pos = 0
if orientation == 'vertical':
total_length = prompt_width
for i, ratio in enumerate(split_ratios):
region_width = int(ratio * total_length)
# 绘制分割区域
cv2.rectangle(image, (current_pos, 0), (current_pos + region_width, prompt_height), colors[i % len(colors)], 2)
current_pos += region_width
else:
total_length = prompt_height
for i, ratio in enumerate(split_ratios):
region_height = int(ratio * total_length)
# 绘制分割区域
cv2.rectangle(image, (0, current_pos), (prompt_width, current_pos + region_height), colors[i % len(colors)], 2)
current_pos += region_height
return image
if __name__ == "__main__":
bbox_inputs = [[5, 20, 100, 150], [160, 20, 190, 210], [230,5,290,290]]
# bbox_inputs = [[40, 5, 210, 160], [100, 180, 180, 270]]
prompt_width = 300
prompt_height = 300
HB_m_offset_list, HB_n_offset_list, HB_m_scale_list, HB_n_scale_list,SR_hw_split_ratio = generate_parameters(bbox_inputs, prompt_width, prompt_height)
print("HB_m_offset_list:", HB_m_offset_list)
print("HB_n_offset_list:", HB_n_offset_list)
print("HB_m_scale_list:", HB_m_scale_list)
print("HB_n_scale_list:", HB_n_scale_list)
print("SR_hw_split_ratio:",SR_hw_split_ratio)