initial commit
This commit is contained in:
265
README.md
Normal file
265
README.md
Normal file
@@ -0,0 +1,265 @@
|
|||||||
|
基于 AI 的集成电路版图识别:RoRD 模型
|
||||||
|
描述
|
||||||
|
本项目实现了 RoRD(Rotation-Robust Descriptors)模型,用于集成电路(IC)版图识别。RoRD 是一种先进的局部特征匹配方法,具有旋转鲁棒性,特别适合于 IC 版图,因为它们可能以各种方向出现(0°、90°、180°、270°及其镜像)。项目通过自监督学习和随机旋转增强,解决了数据稀缺性、几何多变性、动态扩展性和结构复杂性等挑战。
|
||||||
|
项目包括:
|
||||||
|
|
||||||
|
模型实现:适用于 IC 版图的 RoRD 模型,使用 PyTorch,基于 D2-Net 架构。
|
||||||
|
数据加载:自定义数据集类 ICLayoutDataset,用于加载光栅化的 IC 版图图像。
|
||||||
|
训练脚本:通过随机旋转进行自监督训练,确保模型对旋转鲁棒。
|
||||||
|
评估脚本:在验证集上评估模型性能,计算精确率、召回率和 F1 分数。
|
||||||
|
匹配工具:使用训练好的模型进行模板匹配,支持多实例匹配和可视化。
|
||||||
|
|
||||||
|
安装
|
||||||
|
环境要求
|
||||||
|
|
||||||
|
Python 3.8 或更高版本
|
||||||
|
CUDA(可选,用于 GPU 加速)
|
||||||
|
|
||||||
|
依赖安装
|
||||||
|
使用 uv 安装依赖库:
|
||||||
|
uv add torch torchvision opencv-python numpy Pillow
|
||||||
|
uv lock
|
||||||
|
uv sync
|
||||||
|
|
||||||
|
或者使用 pip:
|
||||||
|
pip install torch torchvision opencv-python numpy Pillow
|
||||||
|
|
||||||
|
使用方法
|
||||||
|
项目结构
|
||||||
|
ic_layout_recognition/
|
||||||
|
├── data/
|
||||||
|
│ ├── ic_dataset.py
|
||||||
|
├── utils/
|
||||||
|
│ ├── transforms.py
|
||||||
|
├── models/
|
||||||
|
│ ├── rord.py
|
||||||
|
├── train.py
|
||||||
|
├── evaluate.py
|
||||||
|
├── match.py
|
||||||
|
├── requirements.txt
|
||||||
|
└── README.md
|
||||||
|
|
||||||
|
训练
|
||||||
|
运行以下命令训练模型:
|
||||||
|
python train.py --data_dir path/to/layouts --save_dir path/to/save
|
||||||
|
|
||||||
|
|
||||||
|
--data_dir:包含 PNG 格式 IC 版图图像的目录。
|
||||||
|
--save_dir:模型权重保存目录。训练过程使用自监督学习,通过随机旋转生成训练对,优化关键点检测和描述子生成。
|
||||||
|
|
||||||
|
评估
|
||||||
|
运行以下命令评估模型性能:
|
||||||
|
python evaluate.py --model_path path/to/model.pth --val_dir path/to/val/images --annotations_dir path/to/val/annotations --templates path/to/templates
|
||||||
|
|
||||||
|
|
||||||
|
--model_path:训练好的模型权重路径。
|
||||||
|
--val_dir:验证集图像目录。
|
||||||
|
--annotations_dir:JSON 格式的真实标注目录。
|
||||||
|
--templates:模板图像路径列表。评估结果包括精确率、召回率和 F1 分数,基于 IoU(Intersection over Union)阈值。
|
||||||
|
|
||||||
|
模板匹配
|
||||||
|
运行以下命令进行模板匹配:
|
||||||
|
python match.py --model_path path/to/model.pth --layout_path path/to/layout.png --template_path path/to/template.png --output_path path/to/output.png
|
||||||
|
|
||||||
|
|
||||||
|
--layout_path:版图图像路径。
|
||||||
|
--template_path:模板图像路径。
|
||||||
|
--output_path:可视化结果保存路径(可选)。匹配过程使用 RoRD 模型提取关键点和描述子,通过互最近邻(MNN)匹配和 RANSAC 几何验证,生成边界框并支持多实例匹配。
|
||||||
|
|
||||||
|
数据准备
|
||||||
|
训练数据
|
||||||
|
|
||||||
|
格式:PNG 格式的 IC 版图图像,从 GDSII 或 OASIS 文件光栅化。
|
||||||
|
要求:数据集应包含多个版图图像,建议分辨率适中(如 1024x1024)。
|
||||||
|
路径:存储在 path/to/layouts 目录中。
|
||||||
|
|
||||||
|
验证数据
|
||||||
|
|
||||||
|
图像:PNG 格式的验证集图像,存储在 path/to/val/images。
|
||||||
|
注释:JSON 格式的真实标注,存储在 path/to/val/annotations,示例:{
|
||||||
|
"boxes": [
|
||||||
|
{"template": "template1.png", "x": 100, "y": 200, "width": 50, "height": 50},
|
||||||
|
{"template": "template2.png", "x": 300, "y": 400, "width": 60, "height": 60}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
模板:模板图像存储在 path/to/templates,文件名需与注释中的 template 字段一致。
|
||||||
|
|
||||||
|
模型
|
||||||
|
RoRD 模型基于 D2-Net 架构,使用 VGG-16 作为骨干网络。它包括:
|
||||||
|
|
||||||
|
检测头:用于关键点检测,输出概率图。
|
||||||
|
描述子头:生成旋转鲁棒的 128 维描述子,适配 IC 版图的 8 个离散旋转方向。模型通过自监督学习训练,使用随机旋转(0°~360°)生成训练对,优化检测重复性和描述子相似性。gi
|
||||||
|
|
||||||
|
|
||||||
|
结果
|
||||||
|
[待补充:如果有预训练模型或基准测试结果,请在此列出。例如:]
|
||||||
|
|
||||||
|
预训练模型:[链接](待补充)
|
||||||
|
验证集评估指标:精确率:X,召回率:Y,F1 分数:Z
|
||||||
|
|
||||||
|
贡献
|
||||||
|
欢迎贡献代码或提出建议!请遵循以下步骤:
|
||||||
|
|
||||||
|
Fork 本仓库。
|
||||||
|
创建新分支(git checkout -b feature/your-feature)。
|
||||||
|
提交更改(git commit -m "Add your feature")。
|
||||||
|
推送到分支(git push origin feature/your-feature)。
|
||||||
|
提交 Pull Request。
|
||||||
|
|
||||||
|
许可证
|
||||||
|
本项目采用 MIT 许可证。
|
||||||
|
联系
|
||||||
|
如有问题或建议,请通过 [您的电子邮件] 联系或在 GitHub 上提交 issue。
|
||||||
|
|
||||||
|
AI-based Integrated Circuit Layout Recognition with RoRD
|
||||||
|
Description
|
||||||
|
This project implements the RoRD (Rotation-Robust Descriptors) model for integrated circuit (IC) layout recognition. RoRD is a state-of-the-art method for local feature matching that is robust to rotations, making it particularly suitable for IC layouts which can be oriented in various directions (0°, 90°, 180°, 270°, and their mirrors). The project addresses challenges such as data scarcity, geometric variability, dynamic scalability, and structural complexity through self-supervised learning and random rotation augmentation.
|
||||||
|
The project includes:
|
||||||
|
|
||||||
|
Model Implementation: The RoRD model adapted for IC layouts, using PyTorch, based on the D2-Net architecture.
|
||||||
|
Data Loading: Custom dataset class ICLayoutDataset for loading rasterized IC layout images.
|
||||||
|
Training Script: Self-supervised training with random rotations to ensure rotation robustness.
|
||||||
|
Evaluation Script: Evaluates model performance on a validation set, computing precision, recall, and F1 score.
|
||||||
|
Matching Utility: Performs template matching with the trained model, supporting multi-instance matching and visualization.
|
||||||
|
|
||||||
|
Installation
|
||||||
|
Requirements
|
||||||
|
|
||||||
|
Python 3.8 or higher
|
||||||
|
CUDA (optional, for GPU acceleration)
|
||||||
|
|
||||||
|
Dependency Installation
|
||||||
|
Install dependencies using uv:
|
||||||
|
uv add torch torchvision opencv-python numpy Pillow
|
||||||
|
uv lock
|
||||||
|
uv sync
|
||||||
|
|
||||||
|
Alternatively, use pip:
|
||||||
|
pip install torch torchvision opencv-python numpy Pillow
|
||||||
|
|
||||||
|
Usage
|
||||||
|
Project Structure
|
||||||
|
ic_layout_recognition/
|
||||||
|
├── data/
|
||||||
|
│ ├── ic_dataset.py
|
||||||
|
├── utils/
|
||||||
|
│ ├── transforms.py
|
||||||
|
├── models/
|
||||||
|
│ ├── rord.py
|
||||||
|
├── train.py
|
||||||
|
├── evaluate.py
|
||||||
|
├── match.py
|
||||||
|
├── requirements.txt
|
||||||
|
└── README.md
|
||||||
|
|
||||||
|
Training
|
||||||
|
Run the following command to train the model:
|
||||||
|
python train.py --data_dir path/to/layouts --save_dir path/to/save
|
||||||
|
|
||||||
|
|
||||||
|
--data_dir: Directory containing PNG format IC layout images.
|
||||||
|
--save_dir: Directory to save model weights.The training process uses self-supervised learning, generating training pairs with random rotations to optimize keypoint detection and descriptor generation.
|
||||||
|
|
||||||
|
Evaluation
|
||||||
|
Run the following command to evaluate model performance:
|
||||||
|
python evaluate.py --model_path path/to/model.pth --val_dir path/to/val/images --annotations_dir path/to/val/annotations --templates path/to/templates
|
||||||
|
|
||||||
|
|
||||||
|
--model_path: Path to the trained model weights.
|
||||||
|
--val_dir: Directory containing validation images.
|
||||||
|
--annotations_dir: Directory containing JSON format ground truth annotations.
|
||||||
|
--templates: List of template image paths.Evaluation metrics include precision, recall, and F1 score, based on IoU (Intersection over Union) thresholds.
|
||||||
|
|
||||||
|
Template Matching
|
||||||
|
Run the following command to perform template matching:
|
||||||
|
python match.py --model_path path/to/model.pth --layout_path path/to/layout.png --template_path path/to/template.png --output_path path/to/output.png
|
||||||
|
|
||||||
|
|
||||||
|
--layout_path: Path to the layout image.
|
||||||
|
--template_path: Path to the template image.
|
||||||
|
--output_path: Path to save visualization results (optional).The matching process extracts keypoints and descriptors using the RoRD model, performs mutual nearest neighbor (MNN) matching, and applies RANSAC for geometric verification, generating bounding boxes for multiple instances.
|
||||||
|
|
||||||
|
Data Preparation
|
||||||
|
Training Data
|
||||||
|
|
||||||
|
Format: PNG format IC layout images, rasterized from GDSII or OASIS files.
|
||||||
|
Requirements: The dataset should include multiple layout images, preferably with moderate resolution (e.g., 1024x1024).
|
||||||
|
Path: Stored in path/to/layouts.
|
||||||
|
|
||||||
|
Validation Data
|
||||||
|
|
||||||
|
Images: PNG format validation images, stored in path/to/val/images.
|
||||||
|
Annotations: JSON format ground truth annotations, stored in path/to/val/annotations, example:{
|
||||||
|
"boxes": [
|
||||||
|
{"template": "template1.png", "x": 100, "y": 200, "width": 50, "height": 50},
|
||||||
|
{"template": "template2.png", "x": 300, "y": 400, "width": 60, "height": 60}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Templates: Template images stored in path/to/templates, with filenames matching the template field in annotations.
|
||||||
|
|
||||||
|
Model
|
||||||
|
The RoRD model is based on the D2-Net architecture, using VGG-16 as the backbone. It includes:
|
||||||
|
|
||||||
|
Detection Head: Outputs a probability map for keypoint detection.
|
||||||
|
Descriptor Head: Generates 128-dimensional rotation-robust descriptors, tailored for the 8 discrete rotation directions in IC layouts.The model is trained using self-supervised learning with random rotations (0°~360°), optimizing for detection repeatability and descriptor similarity.
|
||||||
|
|
||||||
|
Technical Comparison
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Feature
|
||||||
|
U-Net
|
||||||
|
YOLO
|
||||||
|
Transformer (ViT)
|
||||||
|
SuperPoint
|
||||||
|
RoRD
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Core Principle
|
||||||
|
Semantic Segmentation
|
||||||
|
Object Detection
|
||||||
|
Global Self-Attention
|
||||||
|
Self-Supervised Features
|
||||||
|
Rotation-Robust Features
|
||||||
|
|
||||||
|
|
||||||
|
Data Requirement
|
||||||
|
Large Pixel-Level Labels
|
||||||
|
Large Bounding Box Labels
|
||||||
|
Massive Pretraining Data
|
||||||
|
Synthetic Data
|
||||||
|
Synthetic Rotation Data
|
||||||
|
|
||||||
|
|
||||||
|
Rotation Robustness
|
||||||
|
Low
|
||||||
|
Low-Medium
|
||||||
|
Medium
|
||||||
|
Medium-High
|
||||||
|
Very High
|
||||||
|
|
||||||
|
|
||||||
|
Results
|
||||||
|
[To be added: If pre-trained models or benchmarks are available, list them here. For example:]
|
||||||
|
|
||||||
|
Pre-trained model: [link]
|
||||||
|
Validation set metrics: Precision: X, Recall: Y, F1 Score: Z
|
||||||
|
|
||||||
|
Contributing
|
||||||
|
Contributions are welcome! Please follow these steps:
|
||||||
|
|
||||||
|
Fork the repository.
|
||||||
|
Create a new branch (git checkout -b feature/your-feature).
|
||||||
|
Commit your changes (git commit -m "Add your feature").
|
||||||
|
Push to the branch (git push origin feature/your-feature).
|
||||||
|
Submit a Pull Request.
|
||||||
|
|
||||||
|
License
|
||||||
|
This project is licensed under the MIT License.
|
||||||
|
Contact
|
||||||
|
For questions or issues, please contact [your email] or open an issue on GitHub.
|
||||||
56
data/ic_dataset.py
Normal file
56
data/ic_dataset.py
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
import os
|
||||||
|
from PIL import Image
|
||||||
|
from torch.utils.data import Dataset
|
||||||
|
import json
|
||||||
|
|
||||||
|
class ICLayoutDataset(Dataset):
|
||||||
|
def __init__(self, image_dir, annotation_dir=None, transform=None):
|
||||||
|
"""
|
||||||
|
初始化 IC 版图数据集。
|
||||||
|
|
||||||
|
参数:
|
||||||
|
image_dir (str): 存储 PNG 格式 IC 版图图像的目录路径。
|
||||||
|
annotation_dir (str, optional): 存储 JSON 格式注释文件的目录路径。
|
||||||
|
transform (callable, optional): 应用于图像的可选变换(如 Sobel 边缘检测)。
|
||||||
|
"""
|
||||||
|
self.image_dir = image_dir
|
||||||
|
self.annotation_dir = annotation_dir
|
||||||
|
self.transform = transform
|
||||||
|
self.images = [f for f in os.listdir(image_dir) if f.endswith('.png')]
|
||||||
|
if annotation_dir:
|
||||||
|
self.annotations = [f.replace('.png', '.json') for f in self.images]
|
||||||
|
else:
|
||||||
|
self.annotations = [None] * len(self.images)
|
||||||
|
|
||||||
|
def __len__(self):
|
||||||
|
"""
|
||||||
|
返回数据集中的图像数量。
|
||||||
|
|
||||||
|
返回:
|
||||||
|
int: 数据集大小。
|
||||||
|
"""
|
||||||
|
return len(self.images)
|
||||||
|
|
||||||
|
def __getitem__(self, idx):
|
||||||
|
"""
|
||||||
|
获取指定索引的图像和注释。
|
||||||
|
|
||||||
|
参数:
|
||||||
|
idx (int): 图像索引。
|
||||||
|
|
||||||
|
返回:
|
||||||
|
tuple: (image, annotation),image 为处理后的图像,annotation 为注释字典或空字典。
|
||||||
|
"""
|
||||||
|
img_path = os.path.join(self.image_dir, self.images[idx])
|
||||||
|
image = Image.open(img_path).convert('L') # 转换为灰度图
|
||||||
|
if self.transform:
|
||||||
|
image = self.transform(image)
|
||||||
|
|
||||||
|
annotation = {}
|
||||||
|
if self.annotation_dir and self.annotations[idx]:
|
||||||
|
ann_path = os.path.join(self.annotation_dir, self.annotations[idx])
|
||||||
|
if os.path.exists(ann_path):
|
||||||
|
with open(ann_path, 'r') as f:
|
||||||
|
annotation = json.load(f)
|
||||||
|
|
||||||
|
return image, annotation
|
||||||
123
evaluate.py
Normal file
123
evaluate.py
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
from models.rord import RoRD
|
||||||
|
from data.ic_dataset import ICLayoutDataset
|
||||||
|
from utils.transforms import SobelTransform
|
||||||
|
from match import match_template_to_layout
|
||||||
|
import torch
|
||||||
|
from torchvision import transforms
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
from PIL import Image
|
||||||
|
|
||||||
|
def compute_iou(box1, box2):
|
||||||
|
x1, y1, w1, h1 = box1['x'], box1['y'], box1['width'], box1['height']
|
||||||
|
x2, y2, w2, h2 = box2['x'], box2['y'], box2['width'], box2['height']
|
||||||
|
|
||||||
|
inter_x1 = max(x1, x2)
|
||||||
|
inter_y1 = max(y1, y2)
|
||||||
|
inter_x2 = min(x1 + w1, x2 + w2)
|
||||||
|
inter_y2 = min(y1 + h1, y2 + h2)
|
||||||
|
|
||||||
|
inter_area = max(0, inter_x2 - inter_x1) * max(0, inter_y2 - inter_y1)
|
||||||
|
|
||||||
|
box1_area = w1 * h1
|
||||||
|
box2_area = w2 * h2
|
||||||
|
union_area = box1_area + box2_area - inter_area
|
||||||
|
|
||||||
|
iou = inter_area / union_area if union_area > 0 else 0
|
||||||
|
return iou
|
||||||
|
|
||||||
|
def evaluate(model, val_dataset, templates, iou_threshold=0.5):
|
||||||
|
model.eval()
|
||||||
|
all_true_positives = 0
|
||||||
|
all_false_positives = 0
|
||||||
|
all_false_negatives = 0
|
||||||
|
|
||||||
|
for layout_idx in range(len(val_dataset)):
|
||||||
|
layout_image, annotation = val_dataset[layout_idx]
|
||||||
|
# layout_image is [3, H, W]
|
||||||
|
layout_tensor = layout_image.unsqueeze(0).cuda() # [1, 3, H, W]
|
||||||
|
|
||||||
|
# 假设 annotation 是 {"boxes": [{"template": "template1.png", "x": x, "y": y, "width": w, "height": h}, ...]}
|
||||||
|
gt_boxes_by_template = {}
|
||||||
|
for box in annotation.get('boxes', []):
|
||||||
|
template_name = box['template']
|
||||||
|
if template_name not in gt_boxes_by_template:
|
||||||
|
gt_boxes_by_template[template_name] = []
|
||||||
|
gt_boxes_by_template[template_name].append(box)
|
||||||
|
|
||||||
|
for template_path in templates:
|
||||||
|
template_name = os.path.basename(template_path)
|
||||||
|
template_image = Image.open(template_path).convert('L')
|
||||||
|
template_tensor = transform(template_image).unsqueeze(0).cuda() # [1, 3, H, W]
|
||||||
|
|
||||||
|
# 执行匹配
|
||||||
|
detected_bboxes = match_template_to_layout(model, layout_tensor, template_tensor)
|
||||||
|
|
||||||
|
# 获取当前模板的 gt_boxes
|
||||||
|
gt_boxes = gt_boxes_by_template.get(template_name, [])
|
||||||
|
|
||||||
|
# 初始化已分配的 gt_box 索引
|
||||||
|
assigned_gt = set()
|
||||||
|
|
||||||
|
for det_box in detected_bboxes:
|
||||||
|
best_iou = 0
|
||||||
|
best_gt_idx = -1
|
||||||
|
for idx, gt_box in enumerate(gt_boxes):
|
||||||
|
if idx in assigned_gt:
|
||||||
|
continue
|
||||||
|
iou = compute_iou(det_box, gt_box)
|
||||||
|
if iou > best_iou:
|
||||||
|
best_iou = iou
|
||||||
|
best_gt_idx = idx
|
||||||
|
if best_iou > iou_threshold and best_gt_idx != -1:
|
||||||
|
all_true_positives += 1
|
||||||
|
assigned_gt.add(best_gt_idx)
|
||||||
|
else:
|
||||||
|
all_false_positives += 1
|
||||||
|
|
||||||
|
# 计算 FN:未分配的 gt_box
|
||||||
|
for idx in range(len(gt_boxes)):
|
||||||
|
if idx not in assigned_gt:
|
||||||
|
all_false_negatives += 1
|
||||||
|
|
||||||
|
# 计算评估指标
|
||||||
|
precision = all_true_positives / (all_true_positives + all_false_positives) if (all_true_positives + all_false_positives) > 0 else 0
|
||||||
|
recall = all_true_positives / (all_true_positives + all_false_negatives) if (all_true_positives + all_false_negatives) > 0 else 0
|
||||||
|
f1 = 2 * (precision * recall) / (precision + recall) if (precision + recall) > 0 else 0
|
||||||
|
|
||||||
|
return {
|
||||||
|
'precision': precision,
|
||||||
|
'recall': recall,
|
||||||
|
'f1': f1
|
||||||
|
}
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# 设置变换
|
||||||
|
transform = transforms.Compose([
|
||||||
|
SobelTransform(),
|
||||||
|
transforms.ToTensor(),
|
||||||
|
transforms.Lambda(lambda x: x.repeat(3, 1, 1)), # [1, H, W] -> [3, H, W]
|
||||||
|
transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5])
|
||||||
|
])
|
||||||
|
|
||||||
|
# 加载模型
|
||||||
|
model = RoRD().cuda()
|
||||||
|
model.load_state_dict(torch.load('path/to/weights.pth'))
|
||||||
|
model.eval()
|
||||||
|
|
||||||
|
# 定义验证数据集
|
||||||
|
val_dataset = ICLayoutDataset(
|
||||||
|
image_dir='path/to/val/images',
|
||||||
|
annotation_dir='path/to/val/annotations',
|
||||||
|
transform=transform
|
||||||
|
)
|
||||||
|
|
||||||
|
# 定义模板列表
|
||||||
|
templates = ['path/to/templates/template1.png', 'path/to/templates/template2.png'] # 替换为实际模板路径
|
||||||
|
|
||||||
|
# 评估模型
|
||||||
|
results = evaluate(model, val_dataset, templates)
|
||||||
|
print("评估结果:")
|
||||||
|
print(f"精确率: {results['precision']:.4f}")
|
||||||
|
print(f"召回率: {results['recall']:.4f}")
|
||||||
|
print(f"F1 分数: {results['f1']:.4f}")
|
||||||
6
main.py
Normal file
6
main.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
def main():
|
||||||
|
print("Hello from rord-layout-recognation!")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
199
match.py
Normal file
199
match.py
Normal file
@@ -0,0 +1,199 @@
|
|||||||
|
import torch
|
||||||
|
import torch.nn.functional as F
|
||||||
|
from models.rord import RoRD
|
||||||
|
from torchvision import transforms
|
||||||
|
from utils.transforms import SobelTransform
|
||||||
|
import numpy as np
|
||||||
|
import cv2
|
||||||
|
from PIL import Image
|
||||||
|
|
||||||
|
def extract_keypoints_and_descriptors(model, image):
|
||||||
|
"""
|
||||||
|
从 RoRD 模型中提取关键点和描述子。
|
||||||
|
|
||||||
|
参数:
|
||||||
|
model (RoRD): RoRD 模型。
|
||||||
|
image (torch.Tensor): 输入图像张量,形状为 [1, 1, H, W]。
|
||||||
|
|
||||||
|
返回:
|
||||||
|
tuple: (keypoints_input, descriptors)
|
||||||
|
- keypoints_input: [N, 2] float tensor,关键点在输入图像中的坐标。
|
||||||
|
- descriptors: [N, 128] float tensor,L2 归一化的描述子。
|
||||||
|
"""
|
||||||
|
with torch.no_grad():
|
||||||
|
detection_map, _, desc_rord = model(image)
|
||||||
|
desc = desc_rord # 使用 RoRD 描述子头
|
||||||
|
|
||||||
|
# 从检测图中提取关键点
|
||||||
|
thresh = 0.5
|
||||||
|
binary_map = (detection_map > thresh).float()
|
||||||
|
coords = torch.nonzero(binary_map[0, 0] > thresh).float() # [N, 2],每个行是 (i_d, j_d)
|
||||||
|
keypoints_input = coords * 16.0 # 将特征图坐标映射到输入图像坐标(stride=16)
|
||||||
|
|
||||||
|
# 从描述子图中提取描述子
|
||||||
|
# detection_map 的形状为 [1, 1, H/16, W/16],desc 的形状为 [1, 128, H/8, W/8]
|
||||||
|
# 将 detection_map 的坐标映射到 desc 的坐标:(i_d * 2, j_d * 2)
|
||||||
|
keypoints_desc = (coords * 2).long() # [N, 2],整数坐标
|
||||||
|
H_desc, W_desc = desc.shape[2], desc.shape[3]
|
||||||
|
mask = (keypoints_desc[:, 0] < H_desc) & (keypoints_desc[:, 1] < W_desc)
|
||||||
|
keypoints_desc = keypoints_desc[mask]
|
||||||
|
keypoints_input = keypoints_input[mask]
|
||||||
|
|
||||||
|
# 提取描述子
|
||||||
|
descriptors = desc[0, :, keypoints_desc[:, 0], keypoints_desc[:, 1]].T # [N, 128]
|
||||||
|
|
||||||
|
# L2 归一化描述子
|
||||||
|
descriptors = F.normalize(descriptors, p=2, dim=1)
|
||||||
|
|
||||||
|
return keypoints_input, descriptors
|
||||||
|
|
||||||
|
def mutual_nearest_neighbor(template_descs, layout_descs):
|
||||||
|
"""
|
||||||
|
使用互最近邻(MNN)找到模板和版图之间的匹配。
|
||||||
|
|
||||||
|
参数:
|
||||||
|
template_descs (torch.Tensor): 模板描述子,形状为 [M, 128]。
|
||||||
|
layout_descs (torch.Tensor): 版图描述子,形状为 [N, 128]。
|
||||||
|
|
||||||
|
返回:
|
||||||
|
list: [(i_template, i_layout)],互最近邻匹配对的列表。
|
||||||
|
"""
|
||||||
|
M, N = template_descs.size(0), layout_descs.size(0)
|
||||||
|
if M == 0 or N == 0:
|
||||||
|
return []
|
||||||
|
similarity_matrix = template_descs @ layout_descs.T # [M, N],点积矩阵
|
||||||
|
|
||||||
|
# 找到每个模板描述子的最近邻
|
||||||
|
nn_template_to_layout = torch.argmax(similarity_matrix, dim=1) # [M]
|
||||||
|
|
||||||
|
# 找到每个版图描述子的最近邻
|
||||||
|
nn_layout_to_template = torch.argmax(similarity_matrix, dim=0) # [N]
|
||||||
|
|
||||||
|
# 找到互最近邻
|
||||||
|
mutual_matches = []
|
||||||
|
for i in range(M):
|
||||||
|
j = nn_template_to_layout[i]
|
||||||
|
if nn_layout_to_template[j] == i:
|
||||||
|
mutual_matches.append((i.item(), j.item()))
|
||||||
|
|
||||||
|
return mutual_matches
|
||||||
|
|
||||||
|
def ransac_filter(matches, template_kps, layout_kps):
|
||||||
|
"""
|
||||||
|
使用 RANSAC 对匹配进行几何验证,并返回内点。
|
||||||
|
|
||||||
|
参数:
|
||||||
|
matches (list): [(i_template, i_layout)],匹配对列表。
|
||||||
|
template_kps (torch.Tensor): 模板关键点,形状为 [M, 2]。
|
||||||
|
layout_kps (torch.Tensor): 版图关键点,形状为 [N, 2]。
|
||||||
|
|
||||||
|
返回:
|
||||||
|
tuple: (inlier_matches, num_inliers)
|
||||||
|
- inlier_matches: [(i_template, i_layout)],内点匹配对。
|
||||||
|
- num_inliers: int,内点数量。
|
||||||
|
"""
|
||||||
|
src_pts = np.array([template_kps[i].cpu().numpy() for i, _ in matches])
|
||||||
|
dst_pts = np.array([layout_kps[j].cpu().numpy() for _, j in matches])
|
||||||
|
|
||||||
|
if len(src_pts) < 4:
|
||||||
|
return [], 0
|
||||||
|
|
||||||
|
try:
|
||||||
|
H, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, ransacReprojThreshold=5.0)
|
||||||
|
if H is None:
|
||||||
|
return [], 0
|
||||||
|
inliers = mask.ravel() > 0
|
||||||
|
num_inliers = np.sum(inliers)
|
||||||
|
inlier_matches = [matches[k] for k in range(len(matches)) if inliers[k]]
|
||||||
|
return inlier_matches, num_inliers
|
||||||
|
except cv2.error:
|
||||||
|
return [], 0
|
||||||
|
|
||||||
|
def match_template_to_layout(model, layout_image, template_image):
|
||||||
|
"""
|
||||||
|
使用 RoRD 模型执行模板匹配,迭代找到所有匹配并屏蔽已匹配区域。
|
||||||
|
|
||||||
|
参数:
|
||||||
|
model (RoRD): RoRD 模型。
|
||||||
|
layout_image (torch.Tensor): 版图图像张量,形状为 [1, 1, H_layout, W_layout]。
|
||||||
|
template_image (torch.Tensor): 模板图像张量,形状为 [1, 1, H_template, W_template]。
|
||||||
|
|
||||||
|
返回:
|
||||||
|
list: [{'x': x_min, 'y': y_min, 'width': w, 'height': h}],所有检测到的边框。
|
||||||
|
"""
|
||||||
|
# 提取版图和模板的关键点和描述子
|
||||||
|
layout_kps, layout_descs = extract_keypoints_and_descriptors(model, layout_image)
|
||||||
|
template_kps, template_descs = extract_keypoints_and_descriptors(model, template_image)
|
||||||
|
|
||||||
|
# 初始化活动版图关键点掩码
|
||||||
|
active_layout = torch.ones(len(layout_kps), dtype=bool)
|
||||||
|
|
||||||
|
bboxes = []
|
||||||
|
while True:
|
||||||
|
# 获取当前活动的版图关键点和描述子
|
||||||
|
current_layout_kps = layout_kps[active_layout]
|
||||||
|
current_layout_descs = layout_descs[active_layout]
|
||||||
|
|
||||||
|
if len(current_layout_descs) == 0:
|
||||||
|
break
|
||||||
|
|
||||||
|
# MNN 匹配
|
||||||
|
matches = mutual_nearest_neighbor(template_descs, current_layout_descs)
|
||||||
|
|
||||||
|
if len(matches) == 0:
|
||||||
|
break
|
||||||
|
|
||||||
|
# 将当前版图索引映射回原始版图索引
|
||||||
|
active_indices = torch.nonzero(active_layout).squeeze(1)
|
||||||
|
matches_original = [(i_template, active_indices[i_layout].item()) for i_template, i_layout in matches]
|
||||||
|
|
||||||
|
# RANSAC 过滤
|
||||||
|
inlier_matches, num_inliers = ransac_filter(matches_original, template_kps, layout_kps)
|
||||||
|
|
||||||
|
if num_inliers > 10: # 设置内点阈值
|
||||||
|
# 获取内点在版图中的关键点
|
||||||
|
inlier_layout_kps = [layout_kps[j].cpu().numpy() for _, j in inlier_matches]
|
||||||
|
inlier_layout_kps = np.array(inlier_layout_kps)
|
||||||
|
|
||||||
|
# 计算边框
|
||||||
|
x_min = int(inlier_layout_kps[:, 0].min())
|
||||||
|
y_min = int(inlier_layout_kps[:, 1].min())
|
||||||
|
x_max = int(inlier_layout_kps[:, 0].max())
|
||||||
|
y_max = int(inlier_layout_kps[:, 1].max())
|
||||||
|
bboxes.append({'x': x_min, 'y': y_min, 'width': x_max - x_min, 'height': y_max - y_min})
|
||||||
|
|
||||||
|
# 屏蔽内点
|
||||||
|
for _, j in inlier_matches:
|
||||||
|
active_layout[j] = False
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
|
||||||
|
return bboxes
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# 设置变换
|
||||||
|
transform = transforms.Compose([
|
||||||
|
SobelTransform(),
|
||||||
|
transforms.ToTensor(),
|
||||||
|
transforms.Normalize(mean=[0.5], std=[0.5])
|
||||||
|
])
|
||||||
|
|
||||||
|
# 加载模型
|
||||||
|
model = RoRD().cuda()
|
||||||
|
model.load_state_dict(torch.load('path/to/weights.pth'))
|
||||||
|
model.eval()
|
||||||
|
|
||||||
|
# 加载版图和模板图像
|
||||||
|
layout_image = Image.open('path/to/layout.png').convert('L')
|
||||||
|
layout_tensor = transform(layout_image).unsqueeze(0).cuda()
|
||||||
|
|
||||||
|
template_image = Image.open('path/to/template.png').convert('L')
|
||||||
|
template_tensor = transform(template_image).unsqueeze(0).cuda()
|
||||||
|
|
||||||
|
# 执行匹配
|
||||||
|
detected_bboxes = match_template_to_layout(model, layout_tensor, template_tensor)
|
||||||
|
|
||||||
|
# 打印检测到的边框
|
||||||
|
print("检测到的边框:")
|
||||||
|
for bbox in detected_bboxes:
|
||||||
|
print(bbox)
|
||||||
47
models/rord.py
Normal file
47
models/rord.py
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
import torch
|
||||||
|
import torch.nn as nn
|
||||||
|
from torchvision import models
|
||||||
|
|
||||||
|
class RoRD(nn.Module):
|
||||||
|
def __init__(self):
|
||||||
|
super(RoRD, self).__init__()
|
||||||
|
# 检测骨干网络:VGG-16 直到 relu5_3(层 0 到 29)
|
||||||
|
self.backbone_det = models.vgg16(pretrained=True).features[:30]
|
||||||
|
# 描述骨干网络:VGG-16 直到 relu4_3(层 0 到 22)
|
||||||
|
self.backbone_desc = models.vgg16(pretrained=True).features[:23]
|
||||||
|
|
||||||
|
# 检测头:输出关键点概率图
|
||||||
|
self.detection_head = nn.Sequential(
|
||||||
|
nn.Conv2d(512, 256, kernel_size=3, padding=1),
|
||||||
|
nn.ReLU(inplace=True),
|
||||||
|
nn.Conv2d(256, 1, kernel_size=1),
|
||||||
|
nn.Sigmoid()
|
||||||
|
)
|
||||||
|
|
||||||
|
# 普通描述子头(D2-Net 风格)
|
||||||
|
self.descriptor_head_vanilla = nn.Sequential(
|
||||||
|
nn.Conv2d(512, 256, kernel_size=3, padding=1),
|
||||||
|
nn.ReLU(inplace=True),
|
||||||
|
nn.Conv2d(256, 128, kernel_size=1),
|
||||||
|
nn.InstanceNorm2d(128)
|
||||||
|
)
|
||||||
|
|
||||||
|
# RoRD 描述子头(旋转鲁棒)
|
||||||
|
self.descriptor_head_rord = nn.Sequential(
|
||||||
|
nn.Conv2d(512, 256, kernel_size=3, padding=1),
|
||||||
|
nn.ReLU(inplace=True),
|
||||||
|
nn.Conv2d(256, 128, kernel_size=1),
|
||||||
|
nn.InstanceNorm2d(128)
|
||||||
|
)
|
||||||
|
|
||||||
|
def forward(self, x):
|
||||||
|
# 检测分支
|
||||||
|
features_det = self.backbone_det(x)
|
||||||
|
detection = self.detection_head(features_det)
|
||||||
|
|
||||||
|
# 描述分支
|
||||||
|
features_desc = self.backbone_desc(x)
|
||||||
|
desc_vanilla = self.descriptor_head_vanilla(features_desc)
|
||||||
|
desc_rord = self.descriptor_head_rord(features_desc)
|
||||||
|
|
||||||
|
return detection, desc_vanilla, desc_rord
|
||||||
17
pyproject.toml
Normal file
17
pyproject.toml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
[project]
|
||||||
|
name = "rord-layout-recognation"
|
||||||
|
version = "0.1.0"
|
||||||
|
description = "Add your description here"
|
||||||
|
readme = "README.md"
|
||||||
|
requires-python = ">=3.12"
|
||||||
|
dependencies = [
|
||||||
|
"numpy>=2.3.0",
|
||||||
|
"opencv-python>=4.11.0.86",
|
||||||
|
"pillow>=11.2.1",
|
||||||
|
"torch>=2.7.1",
|
||||||
|
"torchvision>=0.22.1",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[tool.uv.index]]
|
||||||
|
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
|
||||||
|
default = true
|
||||||
236
train.py
Normal file
236
train.py
Normal file
@@ -0,0 +1,236 @@
|
|||||||
|
import torch
|
||||||
|
import torch.nn as nn
|
||||||
|
import torch.nn.functional as F
|
||||||
|
from torch.utils.data import Dataset, DataLoader
|
||||||
|
from torchvision import transforms
|
||||||
|
from PIL import Image
|
||||||
|
import numpy as np
|
||||||
|
import cv2
|
||||||
|
import os
|
||||||
|
from models.rord import RoRD
|
||||||
|
|
||||||
|
# 数据集类:生成随机旋转的训练对
|
||||||
|
class ICLayoutTrainingDataset(Dataset):
|
||||||
|
def __init__(self, image_dir, patch_size=256, transform=None):
|
||||||
|
"""
|
||||||
|
初始化 IC 版图训练数据集。
|
||||||
|
|
||||||
|
参数:
|
||||||
|
image_dir (str): 存储 PNG 格式 IC 版图图像的目录路径。
|
||||||
|
patch_size (int): 裁剪的 patch 大小(默认 256x256)。
|
||||||
|
transform (callable, optional): 应用于图像的变换。
|
||||||
|
"""
|
||||||
|
self.image_dir = image_dir
|
||||||
|
self.image_paths = [os.path.join(image_dir, f) for f in os.listdir(image_dir) if f.endswith('.png')]
|
||||||
|
self.patch_size = patch_size
|
||||||
|
self.transform = transform
|
||||||
|
|
||||||
|
def __len__(self):
|
||||||
|
"""
|
||||||
|
返回数据集中的图像数量。
|
||||||
|
|
||||||
|
返回:
|
||||||
|
int: 数据集大小。
|
||||||
|
"""
|
||||||
|
return len(self.image_paths)
|
||||||
|
|
||||||
|
def __getitem__(self, index):
|
||||||
|
"""
|
||||||
|
获取指定索引的训练对(原始 patch、旋转 patch、Homography 矩阵)。
|
||||||
|
|
||||||
|
参数:
|
||||||
|
index (int): 图像索引。
|
||||||
|
|
||||||
|
返回:
|
||||||
|
tuple: (patch, rotated_patch, H_tensor)
|
||||||
|
- patch: 原始 patch 张量。
|
||||||
|
- rotated_patch: 旋转后的 patch 张量。
|
||||||
|
- H_tensor: Homography 矩阵张量。
|
||||||
|
"""
|
||||||
|
img_path = self.image_paths[index]
|
||||||
|
image = Image.open(img_path).convert('L') # 灰度图像
|
||||||
|
|
||||||
|
# 获取图像大小
|
||||||
|
W, H = image.size
|
||||||
|
|
||||||
|
# 随机选择裁剪的左上角坐标
|
||||||
|
x = np.random.randint(0, W - self.patch_size + 1)
|
||||||
|
y = np.random.randint(0, H - self.patch_size + 1)
|
||||||
|
patch = image.crop((x, y, x + self.patch_size, y + self.patch_size))
|
||||||
|
|
||||||
|
# 转换为 NumPy 数组
|
||||||
|
patch_np = np.array(patch)
|
||||||
|
|
||||||
|
# 随机旋转角度(0°~360°)
|
||||||
|
theta = np.random.uniform(0, 360)
|
||||||
|
theta_rad = np.deg2rad(theta)
|
||||||
|
cos_theta = np.cos(theta_rad)
|
||||||
|
sin_theta = np.sin(theta_rad)
|
||||||
|
|
||||||
|
# 计算旋转中心(patch 的中心)
|
||||||
|
cx = self.patch_size / 2.0
|
||||||
|
cy = self.patch_size / 2.0
|
||||||
|
|
||||||
|
# 计算旋转的齐次矩阵(Homography)
|
||||||
|
H = np.array([
|
||||||
|
[cos_theta, -sin_theta, cx * (1 - cos_theta) + cy * sin_theta],
|
||||||
|
[sin_theta, cos_theta, cy * (1 - cos_theta) - cx * sin_theta],
|
||||||
|
[0, 0, 1]
|
||||||
|
], dtype=np.float32)
|
||||||
|
|
||||||
|
# 应用旋转到 patch
|
||||||
|
rotated_patch_np = cv2.warpPerspective(patch_np, H, (self.patch_size, self.patch_size))
|
||||||
|
|
||||||
|
# 转换回 PIL Image
|
||||||
|
rotated_patch = Image.fromarray(rotated_patch_np)
|
||||||
|
|
||||||
|
# 应用变换
|
||||||
|
if self.transform:
|
||||||
|
patch = self.transform(patch)
|
||||||
|
rotated_patch = self.transform(rotated_patch)
|
||||||
|
|
||||||
|
# 转换 H 为张量
|
||||||
|
H_tensor = torch.from_numpy(H).float()
|
||||||
|
|
||||||
|
return patch, rotated_patch, H_tensor
|
||||||
|
|
||||||
|
# 特征图变换函数
|
||||||
|
def warp_feature_map(feature_map, H_inv):
|
||||||
|
"""
|
||||||
|
使用逆 Homography 矩阵变换特征图。
|
||||||
|
|
||||||
|
参数:
|
||||||
|
feature_map (torch.Tensor): 输入特征图,形状为 [B, C, H, W]。
|
||||||
|
H_inv (torch.Tensor): 逆 Homography 矩阵,形状为 [B, 3, 3]。
|
||||||
|
|
||||||
|
返回:
|
||||||
|
torch.Tensor: 变换后的特征图,形状为 [B, C, H, W]。
|
||||||
|
"""
|
||||||
|
B, C, H, W = feature_map.size()
|
||||||
|
# 生成网格
|
||||||
|
grid_y, grid_x = torch.meshgrid(
|
||||||
|
torch.linspace(-1, 1, H, device=feature_map.device),
|
||||||
|
torch.linspace(-1, 1, W, device=feature_map.device),
|
||||||
|
indexing='ij'
|
||||||
|
)
|
||||||
|
grid = torch.stack((grid_x, grid_y, torch.ones_like(grid_x)), dim=-1) # [H, W, 3]
|
||||||
|
grid = grid.unsqueeze(0).expand(B, H, W, 3) # [B, H, W, 3]
|
||||||
|
|
||||||
|
# 将网格转换为齐次坐标并应用 H_inv
|
||||||
|
grid_flat = grid.view(B, -1, 3) # [B, H*W, 3]
|
||||||
|
grid_transformed = torch.bmm(grid_flat, H_inv.transpose(1, 2)) # [B, H*W, 3]
|
||||||
|
grid_transformed = grid_transformed.view(B, H, W, 3) # [B, H, W, 3]
|
||||||
|
grid_transformed = grid_transformed[..., :2] / (grid_transformed[..., 2:3] + 1e-8) # [B, H, W, 2]
|
||||||
|
|
||||||
|
# 使用 grid_sample 进行变换
|
||||||
|
warped_feature = F.grid_sample(feature_map, grid_transformed, align_corners=True)
|
||||||
|
return warped_feature
|
||||||
|
|
||||||
|
# 检测损失函数
|
||||||
|
def compute_detection_loss(det_original, det_rotated, H):
|
||||||
|
"""
|
||||||
|
计算检测损失(MSE),比较原始检测图与旋转检测图(逆变换后)。
|
||||||
|
|
||||||
|
参数:
|
||||||
|
det_original (torch.Tensor): 原始图像的检测图,形状为 [B, 1, H, W]。
|
||||||
|
det_rotated (torch.Tensor): 旋转图像的检测图,形状为 [B, 1, H, W]。
|
||||||
|
H (torch.Tensor): Homography 矩阵,形状为 [B, 3, 3]。
|
||||||
|
|
||||||
|
返回:
|
||||||
|
torch.Tensor: 检测损失。
|
||||||
|
"""
|
||||||
|
H_inv = torch.inverse(H) # 计算逆 Homography
|
||||||
|
warped_det_rotated = warp_feature_map(det_rotated, H_inv)
|
||||||
|
return F.mse_loss(det_original, warped_det_rotated)
|
||||||
|
|
||||||
|
# 描述子损失函数
|
||||||
|
def compute_description_loss(desc_original, desc_rotated, H, margin=1.0):
|
||||||
|
"""
|
||||||
|
计算描述子损失(三元组损失),基于对应点的描述子。
|
||||||
|
|
||||||
|
参数:
|
||||||
|
desc_original (torch.Tensor): 原始图像的描述子图,形状为 [B, 128, H, W]。
|
||||||
|
desc_rotated (torch.Tensor): 旋转图像的描述子图,形状为 [B, 128, H, W]。
|
||||||
|
H (torch.Tensor): Homography 矩阵,形状为 [B, 3, 3]。
|
||||||
|
margin (float): 三元组损失的边距。
|
||||||
|
|
||||||
|
返回:
|
||||||
|
torch.Tensor: 描述子损失。
|
||||||
|
"""
|
||||||
|
B, C, H, W = desc_original.size()
|
||||||
|
# 随机选择锚点(anchor)
|
||||||
|
num_samples = min(100, H * W) # 每张图像采样 100 个点
|
||||||
|
idx = torch.randint(0, H * W, (B, num_samples), device=desc_original.device)
|
||||||
|
idx_y = idx // W
|
||||||
|
idx_x = idx % W
|
||||||
|
coords = torch.stack((idx_x.float(), idx_y.float()), dim=-1) # [B, num_samples, 2]
|
||||||
|
|
||||||
|
# 转换为齐次坐标
|
||||||
|
coords_hom = torch.cat((coords, torch.ones(B, num_samples, 1, device=coords.device)), dim=-1) # [B, num_samples, 3]
|
||||||
|
coords_transformed = torch.bmm(coords_hom, H.transpose(1, 2)) # [B, num_samples, 3]
|
||||||
|
coords_transformed = coords_transformed[..., :2] / (coords_transformed[..., 2:3] + 1e-8) # [B, num_samples, 2]
|
||||||
|
|
||||||
|
# 归一化到 [-1, 1] 用于 grid_sample
|
||||||
|
coords_transformed = coords_transformed / torch.tensor([W/2, H/2], device=coords.device) - 1
|
||||||
|
|
||||||
|
# 提取锚点和正样本描述子
|
||||||
|
anchor = desc_original.view(B, C, -1)[:, :, idx.view(-1)] # [B, 128, num_samples]
|
||||||
|
positive = F.grid_sample(desc_rotated, coords_transformed.unsqueeze(2), align_corners=True).squeeze(3) # [B, 128, num_samples]
|
||||||
|
|
||||||
|
# 随机选择负样本
|
||||||
|
neg_idx = torch.randint(0, H * W, (B, num_samples), device=desc_original.device)
|
||||||
|
negative = desc_rotated.view(B, C, -1)[:, :, neg_idx.view(-1)] # [B, 128, num_samples]
|
||||||
|
|
||||||
|
# 三元组损失
|
||||||
|
triplet_loss = nn.TripletMarginLoss(margin=margin, p=2)
|
||||||
|
loss = triplet_loss(anchor.transpose(1, 2), positive.transpose(1, 2), negative.transpose(1, 2))
|
||||||
|
return loss
|
||||||
|
|
||||||
|
# 定义变换
|
||||||
|
transform = transforms.Compose([
|
||||||
|
transforms.ToTensor(), # (1, 256, 256)
|
||||||
|
transforms.Lambda(lambda x: x.repeat(3, 1, 1)), # (3, 256, 256)
|
||||||
|
transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5])
|
||||||
|
])
|
||||||
|
|
||||||
|
# 创建数据集和 DataLoader
|
||||||
|
dataset = ICLayoutTrainingDataset('path/to/layouts', patch_size=256, transform=transform)
|
||||||
|
dataloader = DataLoader(dataset, batch_size=4, shuffle=True, num_workers=4)
|
||||||
|
|
||||||
|
# 定义模型
|
||||||
|
model = RoRD().cuda()
|
||||||
|
|
||||||
|
# 定义优化器
|
||||||
|
optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)
|
||||||
|
|
||||||
|
# 训练循环
|
||||||
|
num_epochs = 10
|
||||||
|
for epoch in range(num_epochs):
|
||||||
|
model.train()
|
||||||
|
total_loss = 0
|
||||||
|
for batch in dataloader:
|
||||||
|
original, rotated, H = batch
|
||||||
|
original = original.cuda()
|
||||||
|
rotated = rotated.cuda()
|
||||||
|
H = H.cuda()
|
||||||
|
|
||||||
|
# 前向传播
|
||||||
|
det_original, _, desc_rord_original = model(original)
|
||||||
|
det_rotated, _, desc_rord_rotated = model(rotated)
|
||||||
|
|
||||||
|
# 计算损失
|
||||||
|
detection_loss = compute_detection_loss(det_original, det_rotated, H)
|
||||||
|
description_loss = compute_description_loss(desc_rord_original, desc_rord_rotated, H)
|
||||||
|
total_loss_batch = detection_loss + description_loss
|
||||||
|
|
||||||
|
# 反向传播
|
||||||
|
optimizer.zero_grad()
|
||||||
|
total_loss_batch.backward()
|
||||||
|
optimizer.step()
|
||||||
|
|
||||||
|
total_loss += total_loss_batch.item()
|
||||||
|
|
||||||
|
print(f"Epoch {epoch+1}/{num_epochs}, Loss: {total_loss / len(dataloader):.4f}")
|
||||||
|
|
||||||
|
# 保存模型
|
||||||
|
torch.save(model.state_dict(), 'path/to/save/model.pth')
|
||||||
21
utils/transforms.py
Normal file
21
utils/transforms.py
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
import cv2
|
||||||
|
import numpy as np
|
||||||
|
from PIL import Image
|
||||||
|
|
||||||
|
class SobelTransform:
|
||||||
|
def __call__(self, image):
|
||||||
|
"""
|
||||||
|
应用 Sobel 边缘检测,增强 IC 版图的几何边界。
|
||||||
|
|
||||||
|
参数:
|
||||||
|
image (PIL.Image): 输入图像(灰度图)。
|
||||||
|
|
||||||
|
返回:
|
||||||
|
PIL.Image: 边缘增强后的图像。
|
||||||
|
"""
|
||||||
|
img_np = np.array(image)
|
||||||
|
sobelx = cv2.Sobel(img_np, cv2.CV_64F, 1, 0, ksize=3)
|
||||||
|
sobely = cv2.Sobel(img_np, cv2.CV_64F, 0, 1, ksize=3)
|
||||||
|
sobel = np.hypot(sobelx, sobely)
|
||||||
|
sobel = np.clip(sobel, 0, 255).astype(np.uint8)
|
||||||
|
return Image.fromarray(sobel)
|
||||||
457
uv.lock
generated
Normal file
457
uv.lock
generated
Normal file
@@ -0,0 +1,457 @@
|
|||||||
|
version = 1
|
||||||
|
revision = 2
|
||||||
|
requires-python = ">=3.12"
|
||||||
|
resolution-markers = [
|
||||||
|
"sys_platform == 'darwin'",
|
||||||
|
"platform_machine == 'aarch64' and sys_platform == 'linux'",
|
||||||
|
"(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "filelock"
|
||||||
|
version = "3.18.0"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075, upload-time = "2025-03-14T07:11:40.47Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215, upload-time = "2025-03-14T07:11:39.145Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "fsspec"
|
||||||
|
version = "2025.5.1"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/00/f7/27f15d41f0ed38e8fcc488584b57e902b331da7f7c6dcda53721b15838fc/fsspec-2025.5.1.tar.gz", hash = "sha256:2e55e47a540b91843b755e83ded97c6e897fa0942b11490113f09e9c443c2475", size = 303033, upload-time = "2025-05-24T12:03:23.792Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/bb/61/78c7b3851add1481b048b5fdc29067397a1784e2910592bc81bb3f608635/fsspec-2025.5.1-py3-none-any.whl", hash = "sha256:24d3a2e663d5fc735ab256263c4075f374a174c3410c0b25e5bd1970bceaa462", size = 199052, upload-time = "2025-05-24T12:03:21.66Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "jinja2"
|
||||||
|
version = "3.1.6"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "markupsafe" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "markupsafe"
|
||||||
|
version = "3.0.2"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload-time = "2024-10-18T15:21:54.129Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274, upload-time = "2024-10-18T15:21:13.777Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348, upload-time = "2024-10-18T15:21:14.822Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149, upload-time = "2024-10-18T15:21:15.642Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118, upload-time = "2024-10-18T15:21:17.133Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993, upload-time = "2024-10-18T15:21:18.064Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178, upload-time = "2024-10-18T15:21:18.859Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319, upload-time = "2024-10-18T15:21:19.671Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352, upload-time = "2024-10-18T15:21:20.971Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097, upload-time = "2024-10-18T15:21:22.646Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601, upload-time = "2024-10-18T15:21:23.499Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload-time = "2024-10-18T15:21:24.577Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload-time = "2024-10-18T15:21:25.382Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload-time = "2024-10-18T15:21:26.199Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload-time = "2024-10-18T15:21:27.029Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload-time = "2024-10-18T15:21:27.846Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload-time = "2024-10-18T15:21:28.744Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload-time = "2024-10-18T15:21:29.545Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload-time = "2024-10-18T15:21:30.366Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload-time = "2024-10-18T15:21:31.207Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload-time = "2024-10-18T15:21:32.032Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload-time = "2024-10-18T15:21:33.625Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload-time = "2024-10-18T15:21:34.611Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload-time = "2024-10-18T15:21:35.398Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload-time = "2024-10-18T15:21:36.231Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload-time = "2024-10-18T15:21:37.073Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload-time = "2024-10-18T15:21:37.932Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload-time = "2024-10-18T15:21:39.799Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload-time = "2024-10-18T15:21:40.813Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload-time = "2024-10-18T15:21:41.814Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload-time = "2024-10-18T15:21:42.784Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "mpmath"
|
||||||
|
version = "1.3.0"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106, upload-time = "2023-03-07T16:47:11.061Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "networkx"
|
||||||
|
version = "3.5"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6c/4f/ccdb8ad3a38e583f214547fd2f7ff1fc160c43a75af88e6aec213404b96a/networkx-3.5.tar.gz", hash = "sha256:d4c6f9cf81f52d69230866796b82afbccdec3db7ae4fbd1b65ea750feed50037", size = 2471065, upload-time = "2025-05-29T11:35:07.804Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/eb/8d/776adee7bbf76365fdd7f2552710282c79a4ead5d2a46408c9043a2b70ba/networkx-3.5-py3-none-any.whl", hash = "sha256:0030d386a9a06dee3565298b4a734b68589749a544acbb6c412dc9e2489ec6ec", size = 2034406, upload-time = "2025-05-29T11:35:04.961Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "numpy"
|
||||||
|
version = "2.3.0"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f3/db/8e12381333aea300890829a0a36bfa738cac95475d88982d538725143fd9/numpy-2.3.0.tar.gz", hash = "sha256:581f87f9e9e9db2cba2141400e160e9dd644ee248788d6f90636eeb8fd9260a6", size = 20382813, upload-time = "2025-06-07T14:54:32.608Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/89/59/9df493df81ac6f76e9f05cdbe013cdb0c9a37b434f6e594f5bd25e278908/numpy-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:389b85335838155a9076e9ad7f8fdba0827496ec2d2dc32ce69ce7898bde03ba", size = 20897025, upload-time = "2025-06-07T14:40:33.558Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/2f/86/4ff04335901d6cf3a6bb9c748b0097546ae5af35e455ae9b962ebff4ecd7/numpy-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9498f60cd6bb8238d8eaf468a3d5bb031d34cd12556af53510f05fcf581c1b7e", size = 14129882, upload-time = "2025-06-07T14:40:55.034Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/71/8d/a942cd4f959de7f08a79ab0c7e6cecb7431d5403dce78959a726f0f57aa1/numpy-2.3.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:622a65d40d8eb427d8e722fd410ac3ad4958002f109230bc714fa551044ebae2", size = 5110181, upload-time = "2025-06-07T14:41:04.4Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/86/5d/45850982efc7b2c839c5626fb67fbbc520d5b0d7c1ba1ae3651f2f74c296/numpy-2.3.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:b9446d9d8505aadadb686d51d838f2b6688c9e85636a0c3abaeb55ed54756459", size = 6647581, upload-time = "2025-06-07T14:41:14.695Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/1a/c0/c871d4a83f93b00373d3eebe4b01525eee8ef10b623a335ec262b58f4dc1/numpy-2.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:50080245365d75137a2bf46151e975de63146ae6d79f7e6bd5c0e85c9931d06a", size = 14262317, upload-time = "2025-06-07T14:41:35.862Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/b7/f6/bc47f5fa666d5ff4145254f9e618d56e6a4ef9b874654ca74c19113bb538/numpy-2.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:c24bb4113c66936eeaa0dc1e47c74770453d34f46ee07ae4efd853a2ed1ad10a", size = 16633919, upload-time = "2025-06-07T14:42:00.622Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/f5/b4/65f48009ca0c9b76df5f404fccdea5a985a1bb2e34e97f21a17d9ad1a4ba/numpy-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4d8d294287fdf685281e671886c6dcdf0291a7c19db3e5cb4178d07ccf6ecc67", size = 15567651, upload-time = "2025-06-07T14:42:24.429Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/f1/62/5367855a2018578e9334ed08252ef67cc302e53edc869666f71641cad40b/numpy-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6295f81f093b7f5769d1728a6bd8bf7466de2adfa771ede944ce6711382b89dc", size = 18361723, upload-time = "2025-06-07T14:42:51.167Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/d4/75/5baed8cd867eabee8aad1e74d7197d73971d6a3d40c821f1848b8fab8b84/numpy-2.3.0-cp312-cp312-win32.whl", hash = "sha256:e6648078bdd974ef5d15cecc31b0c410e2e24178a6e10bf511e0557eed0f2570", size = 6318285, upload-time = "2025-06-07T14:43:02.052Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/bc/49/d5781eaa1a15acb3b3a3f49dc9e2ff18d92d0ce5c2976f4ab5c0a7360250/numpy-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:0898c67a58cdaaf29994bc0e2c65230fd4de0ac40afaf1584ed0b02cd74c6fdd", size = 12732594, upload-time = "2025-06-07T14:43:21.071Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/c2/1c/6d343e030815c7c97a1f9fbad00211b47717c7fe446834c224bd5311e6f1/numpy-2.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:bd8df082b6c4695753ad6193018c05aac465d634834dca47a3ae06d4bb22d9ea", size = 9891498, upload-time = "2025-06-07T14:43:36.332Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/73/fc/1d67f751fd4dbafc5780244fe699bc4084268bad44b7c5deb0492473127b/numpy-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5754ab5595bfa2c2387d241296e0381c21f44a4b90a776c3c1d39eede13a746a", size = 20889633, upload-time = "2025-06-07T14:44:06.839Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/e8/95/73ffdb69e5c3f19ec4530f8924c4386e7ba097efc94b9c0aff607178ad94/numpy-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d11fa02f77752d8099573d64e5fe33de3229b6632036ec08f7080f46b6649959", size = 14151683, upload-time = "2025-06-07T14:44:28.847Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/64/d5/06d4bb31bb65a1d9c419eb5676173a2f90fd8da3c59f816cc54c640ce265/numpy-2.3.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:aba48d17e87688a765ab1cd557882052f238e2f36545dfa8e29e6a91aef77afe", size = 5102683, upload-time = "2025-06-07T14:44:38.417Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/12/8b/6c2cef44f8ccdc231f6b56013dff1d71138c48124334aded36b1a1b30c5a/numpy-2.3.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4dc58865623023b63b10d52f18abaac3729346a7a46a778381e0e3af4b7f3beb", size = 6640253, upload-time = "2025-06-07T14:44:49.359Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/62/aa/fca4bf8de3396ddb59544df9b75ffe5b73096174de97a9492d426f5cd4aa/numpy-2.3.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:df470d376f54e052c76517393fa443758fefcdd634645bc9c1f84eafc67087f0", size = 14258658, upload-time = "2025-06-07T14:45:10.156Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/1c/12/734dce1087eed1875f2297f687e671cfe53a091b6f2f55f0c7241aad041b/numpy-2.3.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:87717eb24d4a8a64683b7a4e91ace04e2f5c7c77872f823f02a94feee186168f", size = 16628765, upload-time = "2025-06-07T14:45:35.076Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/48/03/ffa41ade0e825cbcd5606a5669962419528212a16082763fc051a7247d76/numpy-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d8fa264d56882b59dcb5ea4d6ab6f31d0c58a57b41aec605848b6eb2ef4a43e8", size = 15564335, upload-time = "2025-06-07T14:45:58.797Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/07/58/869398a11863310aee0ff85a3e13b4c12f20d032b90c4b3ee93c3b728393/numpy-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e651756066a0eaf900916497e20e02fe1ae544187cb0fe88de981671ee7f6270", size = 18360608, upload-time = "2025-06-07T14:46:25.687Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/2f/8a/5756935752ad278c17e8a061eb2127c9a3edf4ba2c31779548b336f23c8d/numpy-2.3.0-cp313-cp313-win32.whl", hash = "sha256:e43c3cce3b6ae5f94696669ff2a6eafd9a6b9332008bafa4117af70f4b88be6f", size = 6310005, upload-time = "2025-06-07T14:50:13.138Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/08/60/61d60cf0dfc0bf15381eaef46366ebc0c1a787856d1db0c80b006092af84/numpy-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:81ae0bf2564cf475f94be4a27ef7bcf8af0c3e28da46770fc904da9abd5279b5", size = 12729093, upload-time = "2025-06-07T14:50:31.82Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/66/31/2f2f2d2b3e3c32d5753d01437240feaa32220b73258c9eef2e42a0832866/numpy-2.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:c8738baa52505fa6e82778580b23f945e3578412554d937093eac9205e845e6e", size = 9885689, upload-time = "2025-06-07T14:50:47.888Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/f1/89/c7828f23cc50f607ceb912774bb4cff225ccae7131c431398ad8400e2c98/numpy-2.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:39b27d8b38942a647f048b675f134dd5a567f95bfff481f9109ec308515c51d8", size = 20986612, upload-time = "2025-06-07T14:46:56.077Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/dd/46/79ecf47da34c4c50eedec7511e53d57ffdfd31c742c00be7dc1d5ffdb917/numpy-2.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0eba4a1ea88f9a6f30f56fdafdeb8da3774349eacddab9581a21234b8535d3d3", size = 14298953, upload-time = "2025-06-07T14:47:18.053Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/59/44/f6caf50713d6ff4480640bccb2a534ce1d8e6e0960c8f864947439f0ee95/numpy-2.3.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:b0f1f11d0a1da54927436505a5a7670b154eac27f5672afc389661013dfe3d4f", size = 5225806, upload-time = "2025-06-07T14:47:27.524Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/a6/43/e1fd1aca7c97e234dd05e66de4ab7a5be54548257efcdd1bc33637e72102/numpy-2.3.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:690d0a5b60a47e1f9dcec7b77750a4854c0d690e9058b7bef3106e3ae9117808", size = 6735169, upload-time = "2025-06-07T14:47:38.057Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/84/89/f76f93b06a03177c0faa7ca94d0856c4e5c4bcaf3c5f77640c9ed0303e1c/numpy-2.3.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:8b51ead2b258284458e570942137155978583e407babc22e3d0ed7af33ce06f8", size = 14330701, upload-time = "2025-06-07T14:47:59.113Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/aa/f5/4858c3e9ff7a7d64561b20580cf7cc5d085794bd465a19604945d6501f6c/numpy-2.3.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:aaf81c7b82c73bd9b45e79cfb9476cb9c29e937494bfe9092c26aece812818ad", size = 16692983, upload-time = "2025-06-07T14:48:24.196Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/08/17/0e3b4182e691a10e9483bcc62b4bb8693dbf9ea5dc9ba0b77a60435074bb/numpy-2.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f420033a20b4f6a2a11f585f93c843ac40686a7c3fa514060a97d9de93e5e72b", size = 15641435, upload-time = "2025-06-07T14:48:47.712Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/4e/d5/463279fda028d3c1efa74e7e8d507605ae87f33dbd0543cf4c4527c8b882/numpy-2.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d344ca32ab482bcf8735d8f95091ad081f97120546f3d250240868430ce52555", size = 18433798, upload-time = "2025-06-07T14:49:14.866Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/0e/1e/7a9d98c886d4c39a2b4d3a7c026bffcf8fbcaf518782132d12a301cfc47a/numpy-2.3.0-cp313-cp313t-win32.whl", hash = "sha256:48a2e8eaf76364c32a1feaa60d6925eaf32ed7a040183b807e02674305beef61", size = 6438632, upload-time = "2025-06-07T14:49:25.67Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/fe/ab/66fc909931d5eb230107d016861824f335ae2c0533f422e654e5ff556784/numpy-2.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ba17f93a94e503551f154de210e4d50c5e3ee20f7e7a1b5f6ce3f22d419b93bb", size = 12868491, upload-time = "2025-06-07T14:49:44.898Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/ee/e8/2c8a1c9e34d6f6d600c83d5ce5b71646c32a13f34ca5c518cc060639841c/numpy-2.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:f14e016d9409680959691c109be98c436c6249eaf7f118b424679793607b5944", size = 9935345, upload-time = "2025-06-07T14:50:02.311Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nvidia-cublas-cu12"
|
||||||
|
version = "12.6.4.1"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/af/eb/ff4b8c503fa1f1796679dce648854d58751982426e4e4b37d6fce49d259c/nvidia_cublas_cu12-12.6.4.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:08ed2686e9875d01b58e3cb379c6896df8e76c75e0d4a7f7dace3d7b6d9ef8eb", size = 393138322, upload-time = "2024-11-20T17:40:25.65Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nvidia-cuda-cupti-cu12"
|
||||||
|
version = "12.6.80"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/49/60/7b6497946d74bcf1de852a21824d63baad12cd417db4195fc1bfe59db953/nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6768bad6cab4f19e8292125e5f1ac8aa7d1718704012a0e3272a6f61c4bce132", size = 8917980, upload-time = "2024-11-20T17:36:04.019Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/a5/24/120ee57b218d9952c379d1e026c4479c9ece9997a4fb46303611ee48f038/nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a3eff6cdfcc6a4c35db968a06fcadb061cbc7d6dde548609a941ff8701b98b73", size = 8917972, upload-time = "2024-10-01T16:58:06.036Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nvidia-cuda-nvrtc-cu12"
|
||||||
|
version = "12.6.77"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/75/2e/46030320b5a80661e88039f59060d1790298b4718944a65a7f2aeda3d9e9/nvidia_cuda_nvrtc_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:35b0cc6ee3a9636d5409133e79273ce1f3fd087abb0532d2d2e8fff1fe9efc53", size = 23650380, upload-time = "2024-10-01T17:00:14.643Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nvidia-cuda-runtime-cu12"
|
||||||
|
version = "12.6.77"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/e1/23/e717c5ac26d26cf39a27fbc076240fad2e3b817e5889d671b67f4f9f49c5/nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ba3b56a4f896141e25e19ab287cd71e52a6a0f4b29d0d31609f60e3b4d5219b7", size = 897690, upload-time = "2024-11-20T17:35:30.697Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/f0/62/65c05e161eeddbafeca24dc461f47de550d9fa8a7e04eb213e32b55cfd99/nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a84d15d5e1da416dd4774cb42edf5e954a3e60cc945698dc1d5be02321c44dc8", size = 897678, upload-time = "2024-10-01T16:57:33.821Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nvidia-cudnn-cu12"
|
||||||
|
version = "9.5.1.17"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "nvidia-cublas-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" },
|
||||||
|
]
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/2a/78/4535c9c7f859a64781e43c969a3a7e84c54634e319a996d43ef32ce46f83/nvidia_cudnn_cu12-9.5.1.17-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:30ac3869f6db17d170e0e556dd6cc5eee02647abc31ca856634d5a40f82c15b2", size = 570988386, upload-time = "2024-10-25T19:54:26.39Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nvidia-cufft-cu12"
|
||||||
|
version = "11.3.0.4"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" },
|
||||||
|
]
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/8f/16/73727675941ab8e6ffd86ca3a4b7b47065edcca7a997920b831f8147c99d/nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ccba62eb9cef5559abd5e0d54ceed2d9934030f51163df018532142a8ec533e5", size = 200221632, upload-time = "2024-11-20T17:41:32.357Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/60/de/99ec247a07ea40c969d904fc14f3a356b3e2a704121675b75c366b694ee1/nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_x86_64.whl", hash = "sha256:768160ac89f6f7b459bee747e8d175dbf53619cfe74b2a5636264163138013ca", size = 200221622, upload-time = "2024-10-01T17:03:58.79Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nvidia-cufile-cu12"
|
||||||
|
version = "1.11.1.6"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/b2/66/cc9876340ac68ae71b15c743ddb13f8b30d5244af344ec8322b449e35426/nvidia_cufile_cu12-1.11.1.6-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc23469d1c7e52ce6c1d55253273d32c565dd22068647f3aa59b3c6b005bf159", size = 1142103, upload-time = "2024-11-20T17:42:11.83Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nvidia-curand-cu12"
|
||||||
|
version = "10.3.7.77"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/73/1b/44a01c4e70933637c93e6e1a8063d1e998b50213a6b65ac5a9169c47e98e/nvidia_curand_cu12-10.3.7.77-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a42cd1344297f70b9e39a1e4f467a4e1c10f1da54ff7a85c12197f6c652c8bdf", size = 56279010, upload-time = "2024-11-20T17:42:50.958Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/4a/aa/2c7ff0b5ee02eaef890c0ce7d4f74bc30901871c5e45dee1ae6d0083cd80/nvidia_curand_cu12-10.3.7.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:99f1a32f1ac2bd134897fc7a203f779303261268a65762a623bf30cc9fe79117", size = 56279000, upload-time = "2024-10-01T17:04:45.274Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nvidia-cusolver-cu12"
|
||||||
|
version = "11.7.1.2"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "nvidia-cublas-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" },
|
||||||
|
{ name = "nvidia-cusparse-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" },
|
||||||
|
{ name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" },
|
||||||
|
]
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/f0/6e/c2cf12c9ff8b872e92b4a5740701e51ff17689c4d726fca91875b07f655d/nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e9e49843a7707e42022babb9bcfa33c29857a93b88020c4e4434656a655b698c", size = 158229790, upload-time = "2024-11-20T17:43:43.211Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/9f/81/baba53585da791d043c10084cf9553e074548408e04ae884cfe9193bd484/nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6cf28f17f64107a0c4d7802be5ff5537b2130bfc112f25d5a30df227058ca0e6", size = 158229780, upload-time = "2024-10-01T17:05:39.875Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nvidia-cusparse-cu12"
|
||||||
|
version = "12.5.4.2"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" },
|
||||||
|
]
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/06/1e/b8b7c2f4099a37b96af5c9bb158632ea9e5d9d27d7391d7eb8fc45236674/nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7556d9eca156e18184b94947ade0fba5bb47d69cec46bf8660fd2c71a4b48b73", size = 216561367, upload-time = "2024-11-20T17:44:54.824Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/43/ac/64c4316ba163e8217a99680c7605f779accffc6a4bcd0c778c12948d3707/nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:23749a6571191a215cb74d1cdbff4a86e7b19f1200c071b3fcf844a5bea23a2f", size = 216561357, upload-time = "2024-10-01T17:06:29.861Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nvidia-cusparselt-cu12"
|
||||||
|
version = "0.6.3"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/3b/9a/72ef35b399b0e183bc2e8f6f558036922d453c4d8237dab26c666a04244b/nvidia_cusparselt_cu12-0.6.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e5c8a26c36445dd2e6812f1177978a24e2d37cacce7e090f297a688d1ec44f46", size = 156785796, upload-time = "2024-10-15T21:29:17.709Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nvidia-nccl-cu12"
|
||||||
|
version = "2.26.2"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/67/ca/f42388aed0fddd64ade7493dbba36e1f534d4e6fdbdd355c6a90030ae028/nvidia_nccl_cu12-2.26.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:694cf3879a206553cc9d7dbda76b13efaf610fdb70a50cba303de1b0d1530ac6", size = 201319755, upload-time = "2025-03-13T00:29:55.296Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nvidia-nvjitlink-cu12"
|
||||||
|
version = "12.6.85"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/9d/d7/c5383e47c7e9bf1c99d5bd2a8c935af2b6d705ad831a7ec5c97db4d82f4f/nvidia_nvjitlink_cu12-12.6.85-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:eedc36df9e88b682efe4309aa16b5b4e78c2407eac59e8c10a6a47535164369a", size = 19744971, upload-time = "2024-11-20T17:46:53.366Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nvidia-nvtx-cu12"
|
||||||
|
version = "12.6.77"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/56/9a/fff8376f8e3d084cd1530e1ef7b879bb7d6d265620c95c1b322725c694f4/nvidia_nvtx_cu12-12.6.77-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b90bed3df379fa79afbd21be8e04a0314336b8ae16768b58f2d34cb1d04cd7d2", size = 89276, upload-time = "2024-11-20T17:38:27.621Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/9e/4e/0d0c945463719429b7bd21dece907ad0bde437a2ff12b9b12fee94722ab0/nvidia_nvtx_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6574241a3ec5fdc9334353ab8c479fe75841dbe8f4532a8fc97ce63503330ba1", size = 89265, upload-time = "2024-10-01T17:00:38.172Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "opencv-python"
|
||||||
|
version = "4.11.0.86"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "numpy" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/17/06/68c27a523103dad5837dc5b87e71285280c4f098c60e4fe8a8db6486ab09/opencv-python-4.11.0.86.tar.gz", hash = "sha256:03d60ccae62304860d232272e4a4fda93c39d595780cb40b161b310244b736a4", size = 95171956, upload-time = "2025-01-16T13:52:24.737Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/05/4d/53b30a2a3ac1f75f65a59eb29cf2ee7207ce64867db47036ad61743d5a23/opencv_python-4.11.0.86-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:432f67c223f1dc2824f5e73cdfcd9db0efc8710647d4e813012195dc9122a52a", size = 37326322, upload-time = "2025-01-16T13:52:25.887Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/3b/84/0a67490741867eacdfa37bc18df96e08a9d579583b419010d7f3da8ff503/opencv_python-4.11.0.86-cp37-abi3-macosx_13_0_x86_64.whl", hash = "sha256:9d05ef13d23fe97f575153558653e2d6e87103995d54e6a35db3f282fe1f9c66", size = 56723197, upload-time = "2025-01-16T13:55:21.222Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/f3/bd/29c126788da65c1fb2b5fb621b7fed0ed5f9122aa22a0868c5e2c15c6d23/opencv_python-4.11.0.86-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b92ae2c8852208817e6776ba1ea0d6b1e0a1b5431e971a2a0ddd2a8cc398202", size = 42230439, upload-time = "2025-01-16T13:51:35.822Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/2c/8b/90eb44a40476fa0e71e05a0283947cfd74a5d36121a11d926ad6f3193cc4/opencv_python-4.11.0.86-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b02611523803495003bd87362db3e1d2a0454a6a63025dc6658a9830570aa0d", size = 62986597, upload-time = "2025-01-16T13:52:08.836Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/fb/d7/1d5941a9dde095468b288d989ff6539dd69cd429dbf1b9e839013d21b6f0/opencv_python-4.11.0.86-cp37-abi3-win32.whl", hash = "sha256:810549cb2a4aedaa84ad9a1c92fbfdfc14090e2749cedf2c1589ad8359aa169b", size = 29384337, upload-time = "2025-01-16T13:52:13.549Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/a4/7d/f1c30a92854540bf789e9cd5dde7ef49bbe63f855b85a2e6b3db8135c591/opencv_python-4.11.0.86-cp37-abi3-win_amd64.whl", hash = "sha256:085ad9b77c18853ea66283e98affefe2de8cc4c1f43eda4c100cf9b2721142ec", size = 39488044, upload-time = "2025-01-16T13:52:21.928Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pillow"
|
||||||
|
version = "11.2.1"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/af/cb/bb5c01fcd2a69335b86c22142b2bccfc3464087efb7fd382eee5ffc7fdf7/pillow-11.2.1.tar.gz", hash = "sha256:a64dd61998416367b7ef979b73d3a85853ba9bec4c2925f74e588879a58716b6", size = 47026707, upload-time = "2025-04-12T17:50:03.289Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/c7/40/052610b15a1b8961f52537cc8326ca6a881408bc2bdad0d852edeb6ed33b/pillow-11.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:78afba22027b4accef10dbd5eed84425930ba41b3ea0a86fa8d20baaf19d807f", size = 3190185, upload-time = "2025-04-12T17:48:00.417Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/e5/7e/b86dbd35a5f938632093dc40d1682874c33dcfe832558fc80ca56bfcb774/pillow-11.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78092232a4ab376a35d68c4e6d5e00dfd73454bd12b230420025fbe178ee3b0b", size = 3030306, upload-time = "2025-04-12T17:48:02.391Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/a4/5c/467a161f9ed53e5eab51a42923c33051bf8d1a2af4626ac04f5166e58e0c/pillow-11.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a5f306095c6780c52e6bbb6109624b95c5b18e40aab1c3041da3e9e0cd3e2d", size = 4416121, upload-time = "2025-04-12T17:48:04.554Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/62/73/972b7742e38ae0e2ac76ab137ca6005dcf877480da0d9d61d93b613065b4/pillow-11.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c7b29dbd4281923a2bfe562acb734cee96bbb129e96e6972d315ed9f232bef4", size = 4501707, upload-time = "2025-04-12T17:48:06.831Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/e4/3a/427e4cb0b9e177efbc1a84798ed20498c4f233abde003c06d2650a6d60cb/pillow-11.2.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3e645b020f3209a0181a418bffe7b4a93171eef6c4ef6cc20980b30bebf17b7d", size = 4522921, upload-time = "2025-04-12T17:48:09.229Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/fe/7c/d8b1330458e4d2f3f45d9508796d7caf0c0d3764c00c823d10f6f1a3b76d/pillow-11.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b2dbea1012ccb784a65349f57bbc93730b96e85b42e9bf7b01ef40443db720b4", size = 4612523, upload-time = "2025-04-12T17:48:11.631Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/b3/2f/65738384e0b1acf451de5a573d8153fe84103772d139e1e0bdf1596be2ea/pillow-11.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:da3104c57bbd72948d75f6a9389e6727d2ab6333c3617f0a89d72d4940aa0443", size = 4587836, upload-time = "2025-04-12T17:48:13.592Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/6a/c5/e795c9f2ddf3debb2dedd0df889f2fe4b053308bb59a3cc02a0cd144d641/pillow-11.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:598174aef4589af795f66f9caab87ba4ff860ce08cd5bb447c6fc553ffee603c", size = 4669390, upload-time = "2025-04-12T17:48:15.938Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/96/ae/ca0099a3995976a9fce2f423166f7bff9b12244afdc7520f6ed38911539a/pillow-11.2.1-cp312-cp312-win32.whl", hash = "sha256:1d535df14716e7f8776b9e7fee118576d65572b4aad3ed639be9e4fa88a1cad3", size = 2332309, upload-time = "2025-04-12T17:48:17.885Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/7c/18/24bff2ad716257fc03da964c5e8f05d9790a779a8895d6566e493ccf0189/pillow-11.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:14e33b28bf17c7a38eede290f77db7c664e4eb01f7869e37fa98a5aa95978941", size = 2676768, upload-time = "2025-04-12T17:48:19.655Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/da/bb/e8d656c9543276517ee40184aaa39dcb41e683bca121022f9323ae11b39d/pillow-11.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:21e1470ac9e5739ff880c211fc3af01e3ae505859392bf65458c224d0bf283eb", size = 2415087, upload-time = "2025-04-12T17:48:21.991Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/36/9c/447528ee3776e7ab8897fe33697a7ff3f0475bb490c5ac1456a03dc57956/pillow-11.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fdec757fea0b793056419bca3e9932eb2b0ceec90ef4813ea4c1e072c389eb28", size = 3190098, upload-time = "2025-04-12T17:48:23.915Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/b5/09/29d5cd052f7566a63e5b506fac9c60526e9ecc553825551333e1e18a4858/pillow-11.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0e130705d568e2f43a17bcbe74d90958e8a16263868a12c3e0d9c8162690830", size = 3030166, upload-time = "2025-04-12T17:48:25.738Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/71/5d/446ee132ad35e7600652133f9c2840b4799bbd8e4adba881284860da0a36/pillow-11.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bdb5e09068332578214cadd9c05e3d64d99e0e87591be22a324bdbc18925be0", size = 4408674, upload-time = "2025-04-12T17:48:27.908Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/69/5f/cbe509c0ddf91cc3a03bbacf40e5c2339c4912d16458fcb797bb47bcb269/pillow-11.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d189ba1bebfbc0c0e529159631ec72bb9e9bc041f01ec6d3233d6d82eb823bc1", size = 4496005, upload-time = "2025-04-12T17:48:29.888Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/f9/b3/dd4338d8fb8a5f312021f2977fb8198a1184893f9b00b02b75d565c33b51/pillow-11.2.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:191955c55d8a712fab8934a42bfefbf99dd0b5875078240943f913bb66d46d9f", size = 4518707, upload-time = "2025-04-12T17:48:31.874Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/13/eb/2552ecebc0b887f539111c2cd241f538b8ff5891b8903dfe672e997529be/pillow-11.2.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:ad275964d52e2243430472fc5d2c2334b4fc3ff9c16cb0a19254e25efa03a155", size = 4610008, upload-time = "2025-04-12T17:48:34.422Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/72/d1/924ce51bea494cb6e7959522d69d7b1c7e74f6821d84c63c3dc430cbbf3b/pillow-11.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:750f96efe0597382660d8b53e90dd1dd44568a8edb51cb7f9d5d918b80d4de14", size = 4585420, upload-time = "2025-04-12T17:48:37.641Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/43/ab/8f81312d255d713b99ca37479a4cb4b0f48195e530cdc1611990eb8fd04b/pillow-11.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fe15238d3798788d00716637b3d4e7bb6bde18b26e5d08335a96e88564a36b6b", size = 4667655, upload-time = "2025-04-12T17:48:39.652Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/94/86/8f2e9d2dc3d308dfd137a07fe1cc478df0a23d42a6c4093b087e738e4827/pillow-11.2.1-cp313-cp313-win32.whl", hash = "sha256:3fe735ced9a607fee4f481423a9c36701a39719252a9bb251679635f99d0f7d2", size = 2332329, upload-time = "2025-04-12T17:48:41.765Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/6d/ec/1179083b8d6067a613e4d595359b5fdea65d0a3b7ad623fee906e1b3c4d2/pillow-11.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:74ee3d7ecb3f3c05459ba95eed5efa28d6092d751ce9bf20e3e253a4e497e691", size = 2676388, upload-time = "2025-04-12T17:48:43.625Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/23/f1/2fc1e1e294de897df39fa8622d829b8828ddad938b0eaea256d65b84dd72/pillow-11.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:5119225c622403afb4b44bad4c1ca6c1f98eed79db8d3bc6e4e160fc6339d66c", size = 2414950, upload-time = "2025-04-12T17:48:45.475Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/c4/3e/c328c48b3f0ead7bab765a84b4977acb29f101d10e4ef57a5e3400447c03/pillow-11.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8ce2e8411c7aaef53e6bb29fe98f28cd4fbd9a1d9be2eeea434331aac0536b22", size = 3192759, upload-time = "2025-04-12T17:48:47.866Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/18/0e/1c68532d833fc8b9f404d3a642991441d9058eccd5606eab31617f29b6d4/pillow-11.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9ee66787e095127116d91dea2143db65c7bb1e232f617aa5957c0d9d2a3f23a7", size = 3033284, upload-time = "2025-04-12T17:48:50.189Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/b7/cb/6faf3fb1e7705fd2db74e070f3bf6f88693601b0ed8e81049a8266de4754/pillow-11.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9622e3b6c1d8b551b6e6f21873bdcc55762b4b2126633014cea1803368a9aa16", size = 4445826, upload-time = "2025-04-12T17:48:52.346Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/07/94/8be03d50b70ca47fb434a358919d6a8d6580f282bbb7af7e4aa40103461d/pillow-11.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63b5dff3a68f371ea06025a1a6966c9a1e1ee452fc8020c2cd0ea41b83e9037b", size = 4527329, upload-time = "2025-04-12T17:48:54.403Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/fd/a4/bfe78777076dc405e3bd2080bc32da5ab3945b5a25dc5d8acaa9de64a162/pillow-11.2.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:31df6e2d3d8fc99f993fd253e97fae451a8db2e7207acf97859732273e108406", size = 4549049, upload-time = "2025-04-12T17:48:56.383Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/65/4d/eaf9068dc687c24979e977ce5677e253624bd8b616b286f543f0c1b91662/pillow-11.2.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:062b7a42d672c45a70fa1f8b43d1d38ff76b63421cbbe7f88146b39e8a558d91", size = 4635408, upload-time = "2025-04-12T17:48:58.782Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/1d/26/0fd443365d9c63bc79feb219f97d935cd4b93af28353cba78d8e77b61719/pillow-11.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4eb92eca2711ef8be42fd3f67533765d9fd043b8c80db204f16c8ea62ee1a751", size = 4614863, upload-time = "2025-04-12T17:49:00.709Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/49/65/dca4d2506be482c2c6641cacdba5c602bc76d8ceb618fd37de855653a419/pillow-11.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f91ebf30830a48c825590aede79376cb40f110b387c17ee9bd59932c961044f9", size = 4692938, upload-time = "2025-04-12T17:49:02.946Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/b3/92/1ca0c3f09233bd7decf8f7105a1c4e3162fb9142128c74adad0fb361b7eb/pillow-11.2.1-cp313-cp313t-win32.whl", hash = "sha256:e0b55f27f584ed623221cfe995c912c61606be8513bfa0e07d2c674b4516d9dd", size = 2335774, upload-time = "2025-04-12T17:49:04.889Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/a5/ac/77525347cb43b83ae905ffe257bbe2cc6fd23acb9796639a1f56aa59d191/pillow-11.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:36d6b82164c39ce5482f649b437382c0fb2395eabc1e2b1702a6deb8ad647d6e", size = 2681895, upload-time = "2025-04-12T17:49:06.635Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/67/32/32dc030cfa91ca0fc52baebbba2e009bb001122a1daa8b6a79ad830b38d3/pillow-11.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:225c832a13326e34f212d2072982bb1adb210e0cc0b153e688743018c94a2681", size = 2417234, upload-time = "2025-04-12T17:49:08.399Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rord-layout-recognation"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = { virtual = "." }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "numpy" },
|
||||||
|
{ name = "opencv-python" },
|
||||||
|
{ name = "pillow" },
|
||||||
|
{ name = "torch" },
|
||||||
|
{ name = "torchvision" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.metadata]
|
||||||
|
requires-dist = [
|
||||||
|
{ name = "numpy", specifier = ">=2.3.0" },
|
||||||
|
{ name = "opencv-python", specifier = ">=4.11.0.86" },
|
||||||
|
{ name = "pillow", specifier = ">=11.2.1" },
|
||||||
|
{ name = "torch", specifier = ">=2.7.1" },
|
||||||
|
{ name = "torchvision", specifier = ">=0.22.1" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "setuptools"
|
||||||
|
version = "80.9.0"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "sympy"
|
||||||
|
version = "1.14.0"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "mpmath" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921, upload-time = "2025-04-27T18:05:01.611Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "torch"
|
||||||
|
version = "2.7.1"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "filelock" },
|
||||||
|
{ name = "fsspec" },
|
||||||
|
{ name = "jinja2" },
|
||||||
|
{ name = "networkx" },
|
||||||
|
{ name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
|
||||||
|
{ name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
|
||||||
|
{ name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
|
||||||
|
{ name = "nvidia-cuda-runtime-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
|
||||||
|
{ name = "nvidia-cudnn-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
|
||||||
|
{ name = "nvidia-cufft-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
|
||||||
|
{ name = "nvidia-cufile-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
|
||||||
|
{ name = "nvidia-curand-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
|
||||||
|
{ name = "nvidia-cusolver-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
|
||||||
|
{ name = "nvidia-cusparse-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
|
||||||
|
{ name = "nvidia-cusparselt-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
|
||||||
|
{ name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
|
||||||
|
{ name = "nvidia-nvjitlink-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
|
||||||
|
{ name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
|
||||||
|
{ name = "setuptools" },
|
||||||
|
{ name = "sympy" },
|
||||||
|
{ name = "triton", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
|
||||||
|
{ name = "typing-extensions" },
|
||||||
|
]
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/87/93/fb505a5022a2e908d81fe9a5e0aa84c86c0d5f408173be71c6018836f34e/torch-2.7.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:27ea1e518df4c9de73af7e8a720770f3628e7f667280bce2be7a16292697e3fa", size = 98948276, upload-time = "2025-06-04T17:39:12.852Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/56/7e/67c3fe2b8c33f40af06326a3d6ae7776b3e3a01daa8f71d125d78594d874/torch-2.7.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:c33360cfc2edd976c2633b3b66c769bdcbbf0e0b6550606d188431c81e7dd1fc", size = 821025792, upload-time = "2025-06-04T17:34:58.747Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/a1/37/a37495502bc7a23bf34f89584fa5a78e25bae7b8da513bc1b8f97afb7009/torch-2.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:d8bf6e1856ddd1807e79dc57e54d3335f2b62e6f316ed13ed3ecfe1fc1df3d8b", size = 216050349, upload-time = "2025-06-04T17:38:59.709Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/3a/60/04b77281c730bb13460628e518c52721257814ac6c298acd25757f6a175c/torch-2.7.1-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:787687087412c4bd68d315e39bc1223f08aae1d16a9e9771d95eabbb04ae98fb", size = 68645146, upload-time = "2025-06-04T17:38:52.97Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/66/81/e48c9edb655ee8eb8c2a6026abdb6f8d2146abd1f150979ede807bb75dcb/torch-2.7.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:03563603d931e70722dce0e11999d53aa80a375a3d78e6b39b9f6805ea0a8d28", size = 98946649, upload-time = "2025-06-04T17:38:43.031Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/3a/24/efe2f520d75274fc06b695c616415a1e8a1021d87a13c68ff9dce733d088/torch-2.7.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:d632f5417b6980f61404a125b999ca6ebd0b8b4bbdbb5fbbba44374ab619a412", size = 821033192, upload-time = "2025-06-04T17:38:09.146Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/dd/d9/9c24d230333ff4e9b6807274f6f8d52a864210b52ec794c5def7925f4495/torch-2.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:23660443e13995ee93e3d844786701ea4ca69f337027b05182f5ba053ce43b38", size = 216055668, upload-time = "2025-06-04T17:38:36.253Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/95/bf/e086ee36ddcef9299f6e708d3b6c8487c1651787bb9ee2939eb2a7f74911/torch-2.7.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:0da4f4dba9f65d0d203794e619fe7ca3247a55ffdcbd17ae8fb83c8b2dc9b585", size = 68925988, upload-time = "2025-06-04T17:38:29.273Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/69/6a/67090dcfe1cf9048448b31555af6efb149f7afa0a310a366adbdada32105/torch-2.7.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:e08d7e6f21a617fe38eeb46dd2213ded43f27c072e9165dc27300c9ef9570934", size = 99028857, upload-time = "2025-06-04T17:37:50.956Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/90/1c/48b988870823d1cc381f15ec4e70ed3d65e043f43f919329b0045ae83529/torch-2.7.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:30207f672328a42df4f2174b8f426f354b2baa0b7cca3a0adb3d6ab5daf00dc8", size = 821098066, upload-time = "2025-06-04T17:37:33.939Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/7b/eb/10050d61c9d5140c5dc04a89ed3257ef1a6b93e49dd91b95363d757071e0/torch-2.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:79042feca1c634aaf6603fe6feea8c6b30dfa140a6bbc0b973e2260c7e79a22e", size = 216336310, upload-time = "2025-06-04T17:36:09.862Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/b1/29/beb45cdf5c4fc3ebe282bf5eafc8dfd925ead7299b3c97491900fe5ed844/torch-2.7.1-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:988b0cbc4333618a1056d2ebad9eb10089637b659eb645434d0809d8d937b946", size = 68645708, upload-time = "2025-06-04T17:34:39.852Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "torchvision"
|
||||||
|
version = "0.22.1"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "numpy" },
|
||||||
|
{ name = "pillow" },
|
||||||
|
{ name = "torch" },
|
||||||
|
]
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/02/90/f4e99a5112dc221cf68a485e853cc3d9f3f1787cb950b895f3ea26d1ea98/torchvision-0.22.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:153f1790e505bd6da123e21eee6e83e2e155df05c0fe7d56347303067d8543c5", size = 1947827, upload-time = "2025-06-04T17:43:11.945Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/25/f6/53e65384cdbbe732cc2106bb04f7fb908487e4fb02ae4a1613ce6904a122/torchvision-0.22.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:964414eef19459d55a10e886e2fca50677550e243586d1678f65e3f6f6bac47a", size = 2514576, upload-time = "2025-06-04T17:43:02.707Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/17/8b/155f99042f9319bd7759536779b2a5b67cbd4f89c380854670850f89a2f4/torchvision-0.22.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:699c2d70d33951187f6ed910ea05720b9b4aaac1dcc1135f53162ce7d42481d3", size = 7485962, upload-time = "2025-06-04T17:42:43.606Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/05/17/e45d5cd3627efdb47587a0634179a3533593436219de3f20c743672d2a79/torchvision-0.22.1-cp312-cp312-win_amd64.whl", hash = "sha256:75e0897da7a8e43d78632f66f2bdc4f6e26da8d3f021a7c0fa83746073c2597b", size = 1707992, upload-time = "2025-06-04T17:42:53.207Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/7a/30/fecdd09fb973e963da68207fe9f3d03ec6f39a935516dc2a98397bf495c6/torchvision-0.22.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c3ae3319624c43cc8127020f46c14aa878406781f0899bb6283ae474afeafbf", size = 1947818, upload-time = "2025-06-04T17:42:51.954Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/55/f4/b45f6cd92fa0acfac5e31b8e9258232f25bcdb0709a604e8b8a39d76e411/torchvision-0.22.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:4a614a6a408d2ed74208d0ea6c28a2fbb68290e9a7df206c5fef3f0b6865d307", size = 2471597, upload-time = "2025-06-04T17:42:48.838Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/8d/b0/3cffd6a285b5ffee3fe4a31caff49e350c98c5963854474d1c4f7a51dea5/torchvision-0.22.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:7ee682be589bb1a002b7704f06b8ec0b89e4b9068f48e79307d2c6e937a9fdf4", size = 7485894, upload-time = "2025-06-04T17:43:01.371Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/fd/1d/0ede596fedc2080d18108149921278b59f220fbb398f29619495337b0f86/torchvision-0.22.1-cp313-cp313-win_amd64.whl", hash = "sha256:2566cafcfa47ecfdbeed04bab8cef1307c8d4ef75046f7624b9e55f384880dfe", size = 1708020, upload-time = "2025-06-04T17:43:06.085Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/0f/ca/e9a06bd61ee8e04fb4962a3fb524fe6ee4051662db07840b702a9f339b24/torchvision-0.22.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:043d9e35ed69c2e586aff6eb9e2887382e7863707115668ac9d140da58f42cba", size = 2137623, upload-time = "2025-06-04T17:43:05.028Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/ab/c8/2ebe90f18e7ffa2120f5c3eab62aa86923185f78d2d051a455ea91461608/torchvision-0.22.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:27142bcc8a984227a6dcf560985e83f52b82a7d3f5fe9051af586a2ccc46ef26", size = 2476561, upload-time = "2025-06-04T17:42:59.691Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/94/8b/04c6b15f8c29b39f0679589753091cec8b192ab296d4fdaf9055544c4ec9/torchvision-0.22.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:ef46e065502f7300ad6abc98554131c35dc4c837b978d91306658f1a65c00baa", size = 7658543, upload-time = "2025-06-04T17:42:46.064Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/ab/c0/131628e6d42682b0502c63fd7f647b8b5ca4bd94088f6c85ca7225db8ac4/torchvision-0.22.1-cp313-cp313t-win_amd64.whl", hash = "sha256:7414eeacfb941fa21acddcd725f1617da5630ec822e498660a4b864d7d998075", size = 1629892, upload-time = "2025-06-04T17:42:57.156Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "triton"
|
||||||
|
version = "3.3.1"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "setuptools", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" },
|
||||||
|
]
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/24/5f/950fb373bf9c01ad4eb5a8cd5eaf32cdf9e238c02f9293557a2129b9c4ac/triton-3.3.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9999e83aba21e1a78c1f36f21bce621b77bcaa530277a50484a7cb4a822f6e43", size = 155669138, upload-time = "2025-05-29T23:39:51.771Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/74/1f/dfb531f90a2d367d914adfee771babbd3f1a5b26c3f5fbc458dee21daa78/triton-3.3.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b89d846b5a4198317fec27a5d3a609ea96b6d557ff44b56c23176546023c4240", size = 155673035, upload-time = "2025-05-29T23:40:02.468Z" },
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/28/71/bd20ffcb7a64c753dc2463489a61bf69d531f308e390ad06390268c4ea04/triton-3.3.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3198adb9d78b77818a5388bff89fa72ff36f9da0bc689db2f0a651a67ce6a42", size = 155735832, upload-time = "2025-05-29T23:40:10.522Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "typing-extensions"
|
||||||
|
version = "4.14.0"
|
||||||
|
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
|
||||||
|
sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d1/bc/51647cd02527e87d05cb083ccc402f93e441606ff1f01739a62c8ad09ba5/typing_extensions-4.14.0.tar.gz", hash = "sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4", size = 107423, upload-time = "2025-06-02T14:52:11.399Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/69/e0/552843e0d356fbb5256d21449fa957fa4eff3bbc135a74a691ee70c7c5da/typing_extensions-4.14.0-py3-none-any.whl", hash = "sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af", size = 43839, upload-time = "2025-06-02T14:52:10.026Z" },
|
||||||
|
]
|
||||||
Reference in New Issue
Block a user