Spaces:
Sleeping
Sleeping
| import numpy as np | |
| import cv2 | |
| from PIL import Image | |
| from collections import OrderedDict | |
| import os | |
| from pathlib import Path | |
| def crop_image(ocvimg, bbox_list): | |
| H, W = ocvimg.shape[:2] | |
| res = OrderedDict() | |
| for idx, (x0, y0, x1, y1) in enumerate(bbox_list): | |
| # clamp to image bounds | |
| x0 = max(0, min(W, int(x0))) | |
| y0 = max(0, min(H, int(y0))) | |
| x1 = max(0, min(W, int(x1))) | |
| y1 = max(0, min(H, int(y1))) | |
| # skip invalid/empty crops | |
| if x1 <= x0 or y1 <= y0: | |
| # print(f"Invalid bbox after clamp: {(x0,y0,x1,y1)}") | |
| continue | |
| crop_bgr = ocvimg[y0:y1, x0:x1] | |
| crop_rgb = cv2.cvtColor(crop_bgr, cv2.COLOR_BGR2RGB) | |
| res[idx] = Image.fromarray(crop_rgb) | |
| return res | |
| def draw_bboxes(ocvimg, bbox_list, color=(0, 255, 0), thickness=4, clamp=True): | |
| img = ocvimg.copy() | |
| H, W = img.shape[:2] | |
| for bbox in bbox_list: | |
| x0, y0, x1, y1 = [int(round(v)) for v in bbox] | |
| if clamp: | |
| x0 = max(0, min(W - 1, x0)) | |
| y0 = max(0, min(H - 1, y0)) | |
| x1 = max(0, min(W - 1, x1)) | |
| y1 = max(0, min(H - 1, y1)) | |
| # skip invalid boxes | |
| if x1 <= x0 or y1 <= y0: | |
| continue | |
| cv2.rectangle(img, (x0, y0), (x1, y1), color, thickness) | |
| return img | |
| def save_image(img, save_path): | |
| os.makedirs(os.path.dirname(save_path) or ".", exist_ok=True) | |
| ok = cv2.imwrite(save_path, img) | |
| if not ok: | |
| raise IOError(f"cv2.imwrite failed for: {save_path}") | |
| return save_path | |
| def find_same_class(predict_res, score, visited, index, List_class, List_score, threshold): | |
| target_class = List_class[index] | |
| for i in range(len(score)): | |
| if List_class[i] == target_class: | |
| if score[i] > threshold: | |
| predict_res[i]["score"] = score[i] | |
| visited[i] = 1 | |
| predict_res[i]["category_id"] = 1 | |
| else: | |
| # predict_res[i]["score"] = float(List_score[i])*float(score[i]) | |
| if List_score[index] > 0.8 and List_score[i] > 0.8: | |
| predict_res[i]["score"] = float(score[i]) | |
| visited[i] = 1 | |
| predict_res[i]["category_id"] = 1 | |
| def open_image_follow_symlink(path: str): | |
| p = Path(path) | |
| real = p.resolve(strict=True) | |
| if not real.is_file(): | |
| raise FileNotFoundError(f"Resolved path is not a file: {real}") | |
| return Image.open(real) |