CLEAR-EC2026——利用人工智能进行内皮计数的角膜学习与评估挑战赛
今天将分享利用人工智能进行内皮计数的角膜学习与评估挑战赛完整实现版本,为了方便大家学习理解整个流程,将整个流程步骤进行了整理,并给出详细的步骤结果。感兴趣的朋友赶紧动手试一试吧。
一、CLEAR-EC2026介绍
角膜移植是重要的复明手术之一。移植成功的关键之一,是供体角膜内皮足够健康,以维持角膜的透明和正常厚度。目前,美国等国家的眼库对供体角膜的内皮评估主要依赖人工方式:技术员使用镜面显微镜(specular microscope)获取角膜内皮图像;在如 KONAN 等设备上,在较小感兴趣区内人工标记细胞;设备据此计算内皮细胞密度(CD)、细胞面积变异系数(CV)和六边形细胞比例(HEX)等指标。这一流程存在明显瓶颈:耗时、低效:大量图像需要人工标注,在大规模筛查时工作量巨大;标准化程度低:不同技术员、不同设备/眼库之间的评估结果存在差异;评估区域有限:通常只在局部小区域标注细胞,难以反映整片内皮的整体质量;对人员经验依赖强:需要经过专门培训的技术员,人员流动会影响评估一致性。镜面显微镜检查已被广泛用于角膜内皮健康评估和供体角膜质量评价。常用的三项形态学指标为——Cell Density (CD):内皮细胞密度(cells/mm²),是评价供体角膜是否可用的最主要指标;Coefficient of Variation (CV):细胞面积变异系数,衡量细胞大小不均一性(polymegethism),反映内皮“应激”状态;Hexagonality (HEX):六边形细胞比例,即形态为规则六边形的细胞所占比例,反映内皮形态规则程度(pleomorphism)。这些指标在临床和眼库中已被广泛认可,是决定供体角膜是否适合移植的关键参数。根据组织方提供的数据,2023 年美国眼库共完成约 137,697 例角膜组织恢复,来自约 69,637 例患者,而所有这些组织的移植前质量评估几乎完全依赖人工。人工标注不仅耗时,而且对人员经验和训练高度依赖,已成为扩大移植规模和提升评估一致性的重要瓶颈。CLEAR-EC 的目标是构建能够从整张镜面显微镜图像自动预测 CD/CV/HEX 的 AI 模型,以实现——更快:可在短时间内处理大量图像,评估速度显著提升;更标准化:同一算法在不同眼库给出一致输出,减少人为差异;更全面:分析整张内皮图像,而非局部小区域;更可扩展:便于在不同规模的眼库中部署推广。CLEAR-EC 邀请全球开发者共同构建用于角膜内皮质量评估的 AI 模型,优胜模型将在真实眼库环境中试点应用,目标是:提升供体角膜评估的效率与一致性;降低对高度专业人工的依赖;改善移植决策质量,从而提高移植成功率和患者预后。
二、CLEAR-EC2026任务
给定一张角膜内皮镜面显微镜图像需要输出三项临床常用的内皮质量指标:Cell Density (CD):内皮细胞密度(cells/mm²);Coefficient of Variation (CV):细胞面积变异系数;Hexagonality (HEX):六边形细胞比例(%)。所有图像均来自真实眼库环境,模型需要在真实临床数据上进行有效预测。
三、CLEAR-EC2026数据集
图像类型:角膜内皮镜面显微镜图像(specular microscopy);图像格式:mha,单张约 1.5–2 MB;训练集规模:约 9,000 张图像;测试集规模:Phase I:100 张隐藏测试图像;Phase II:扩展至 约 1,000 张图像;数据来源:来自美国多家眼库,包括纽约、佐治亚、肯塔基、特拉华等地的合作机构。训练集中每张图像提供三项真值指标:Cell Density (CD),Coefficient of Variation (CV),Hexagonality (HEX),这些指标由眼库依据当前临床流程计算得到,作为参赛模型训练的监督信号。
数据下载:
https://zenodo.org/records/21270595
四、技术路线
基于Cellpose-SAM的角膜细胞分割与评估
1、环境安装
pip install cellpose
2、分割计算代码
import numpy as np
import SimpleITK as sitk
import os
import time
from cellpose import models, core
INPUT_PATH = r'0001-19.mha'
OUTPUT_DIR = r'output'
def load_mha(sitk_img):
"""读取 .mha 图像, 返回 2D numpy array"""
arr = sitk.GetArrayFromImage(sitk_img) # [H, W] or [D, H, W]
spacing = sitk_img.GetSpacing()
if arr.ndim == 3 and arr.shape[0] == 1:
arr = arr[0] # 单slice 3D → 2D
elif arr.ndim == 3:
print(f"[WARN] 3D image with {arr.shape[0]} slices, "
"will process each slice independently")
print(f" shape={arr.shape}, dtype={arr.dtype}, "
f"range=[{arr.min()}, {arr.max()}], spacing={spacing}")
return arr, spacing, sitk_img
def gray_to_3ch(gray):
"""灰度图转3通道 (Cellpose要求3通道输入)"""
if gray.ndim == 2:
return np.stack([gray, gray, gray], axis=-1)
elif gray.ndim == 3 and gray.shape[-1] == 1:
return np.concatenate([gray, gray, gray], axis=-1)
return gray # 已经是多通道
def save_mask_mha(mask, reference_sitk):
"""保存 mask 为 .mha, 保持原始 spacing/origin/direction"""
mask_sitk = sitk.GetImageFromArray(mask.astype(np.uint16))
mask_sitk.SetSpacing(reference_sitk.GetSpacing())
mask_sitk.SetOrigin(reference_sitk.GetOrigin())
mask_sitk.SetDirection(reference_sitk.GetDirection())
return mask_sitk
def run_cellpose_on_image(img_array, model_name="cpsam_v2", spacing=None):
"""
对单张2D图像运行Cellpose
Parameters
----------
img_array : np.ndarray, 2D grayscale
model_name : str, Cellpose pretrained model name
spacing : tuple, pixel spacing (x, y)
Returns
-------
masks, flows, stats
"""
use_gpu = core.use_gpu()
print(f"\n{'=' * 60}")
print(f" Model: {model_name} | GPU: {use_gpu}")
print(f"{'=' * 60}")
img_3ch = gray_to_3ch(img_array)
print(f"[INFO] Input shape: {img_3ch.shape}")
# 加载模型
t0 = time.time()
model = models.CellposeModel(gpu=use_gpu, pretrained_model=model_name)
print(f"[INFO] Model loaded in {time.time() - t0:.1f}s")
# 推理
t0 = time.time()
masks, flows, styles = model.eval(
img_3ch,
diameter=None,
flow_threshold=0.6,
cellprob_threshold=0.0,
min_size=15,
niter=None,
batch_size=64,
)
infer_time = time.time() - t0
print(f"[INFO] Inference done in {infer_time:.1f}s")
# masks 可能是 2D 或 3D
if masks.ndim == 3:
masks = masks[0]
return masks, flows
def main():
os.makedirs(OUTPUT_DIR, exist_ok=True)
sitk_img = sitk.ReadImage(INPUT_PATH)
# ========== 1. 读取图像 ==========
img_array, spacing, sitk_img = load_mha(sitk_img)
masks, flows, stats = run_cellpose_on_image(img_array, spacing=spacing)
model_dir = OUTPUT_DIR
os.makedirs(model_dir, exist_ok=True)
mask_sitk = save_mask_mha(masks, sitk_img)
sitk.WriteImage(mask_sitk, os.path.join(model_dir, 'mask.mha'))
print(f" Saved: {os.path.join(model_dir, 'mask.mha')}")
if __name__ == '__main__':
main()
3、内皮质量指标计算,将第二步的计算masks输入计算得到结果。
import numpy as np
import pandas as pd
from skimage.draw import polygon
from skimage.measure import regionprops
def calculate_metrics_from_masks(masks, ID=""):
areas = calculate_area(masks)
cell_density = calculate_cell_density(areas)
cv = calculate_cv(areas)
hexagonality = calculate_hexagonality(masks)
std_area = np.std(areas) if len(areas) > 0 else 0
total_area = np.sum(areas)
count = np.max(masks)
predictions = {
"ID": ID,
"CD": cell_density,
"CV": cv,
"HEX": hexagonality,
"SD": std_area,
"Total Area (um^2)": total_area,
"Number of Cells": count,
}
return predictions
# Functions to compute Metrics =========================
def calculate_area(masks):
"""Calculate the area of objects in a mask.
Input: mask (numpy.ndarray): The mask image where objects are segmented
Output: areas_um2 (list): List of areas of objects in um^2."""
pix_to_um = 1000 / 1296 # conversion ratio between real scan and image.
area_obj = regionprops(masks)
areas_pixels = [region.area for region in area_obj]
areas_um2 = [area * (pix_to_um**2) for area in areas_pixels]
return areas_um2
def calculate_cell_density(areas) -> float:
"""Cell density = # of cells / total area
Input: areas (list): List of areas of cells in um^2.
Output: cell_density (float): Cell density in cells per mm^2.
"""
if len(areas) == 0:
return 0
total_area = np.sum(areas)
if total_area == 0:
return 0
cell_density = (len(areas) * 1e6) / total_area
return cell_density
def calculate_cv(areas):
"""Coefficient of Variation = standard deviation / mean
Input: areas (list): List of areas of cells in um^2.
Output: cv (float): Coefficient of Variation.
"""
if len(areas) == 0:
return 0
mean_area = np.mean(areas)
if mean_area == 0:
return 0
std_area = np.std(areas)
cv = std_area / mean_area
return cv
def calculate_hexagonality(masks):
"""Calculate the hexagonality of cell shapes.
Input: masks (numpy.ndarray): The mask image where objects are segmented.
Output: hexagonality (float): Hexagonality of cell shapes.
"""
count = np.max(masks)
hexagonalities = []
stats = regionprops(masks)
# regionprops are 0-indexed, labels start at 1
if count == 0:
return 0
for i in range(count):
cell = stats[i]
min_row, min_col, max_row, max_col = cell.bbox
mask_single_cell = masks[min_row:max_row, min_col:max_col].copy()
mask_single_cell = mask_single_cell.astype(np.float32)
mask_single_cell[mask_single_cell != cell.label] = 0.2
mask_single_cell[mask_single_cell == cell.label] = 1.0
major_axis = cell.axis_major_length * 0.8
minor_axis = cell.axis_minor_length * 0.8
angle = cell.orientation
hex_points = np.array(
[
[major_axis / 2, 0], # right
[major_axis / 4, -minor_axis / 2], # bottom right
[-major_axis / 4, -minor_axis / 2], # bottom left
[-major_axis / 2, 0], # left
[-major_axis / 4, minor_axis / 2], # top left
[major_axis / 4, minor_axis / 2], # top right
]
)
rotation_matrix = np.array(
[[np.cos(angle), np.sin(angle)], [-np.sin(angle), np.cos(angle)]]
)
rotated_hex = hex_points @ rotation_matrix
# Create and fill hexagon mask
height, width = mask_single_cell.shape
hex_mask = np.zeros((height, width))
# Center the hexagon
centroid_y, centroid_x = cell.centroid
center_y, center_x = np.ceil(centroid_y - min_row), np.ceil(
centroid_x - min_col
)
translated_hex = rotated_hex + np.array([center_y, center_x])
# Draw filled polygon
rr, cc = polygon(translated_hex[:, 0], translated_hex[:, 1], hex_mask.shape)
hex_mask[rr, cc] = 1
# Calculate IoU (Intersection over Union)
intersection = np.logical_and(mask_single_cell == 1.0, hex_mask).sum()
union = np.logical_or(mask_single_cell == 1.0, hex_mask).sum()
iou = intersection / union if union > 0 else 0
hexagonalities.append(iou)
hexagonality = np.mean(hexagonalities) if len(hexagonalities) > 0 else 0
return hexagonality
# =========================================================
def evaluate_results(pred_df: pd.DataFrame, gt_df: pd.DataFrame):
"""
Merge predictions and ground-truth by ID, compute per-file percent errors
for a set of numeric labels, and return both the per-file error DataFrame and
a one-row DataFrame containing the average error across files for each label.
Returns:
- error_df: DataFrame with one row per ID and percent error columns
- avg_error_df: single-row DataFrame with the average percent error for each label
"""
def _normalize_ids(df: pd.DataFrame) -> pd.DataFrame:
if "ID" not in df.columns:
return df.copy()
out = df.copy()
out["ID"] = (
out["ID"]
.astype(str)
.apply(lambda x: x if x.endswith(".bmp") else f"{x}.bmp")
)
return out
pred_df_norm = _normalize_ids(pred_df)
gt_df_norm = _normalize_ids(gt_df)
comparison_df = pd.merge(
pred_df_norm, gt_df_norm, on="ID", suffixes=("_pred", "_gt")
)
if comparison_df.empty:
print(
"No overlapping IDs between predictions and ground truth after normalization."
)
return pd.DataFrame(), pd.DataFrame()
labels = ["CD", "CV", "HEX"]
# Build per-file error rows
error_rows = []
for _, row in comparison_df.iterrows():
row_err = {"ID": row["ID"]}
for label in labels:
pred_col = label + "_pred"
gt_col = label + "_gt"
# If columns are missing, mark as NaN
if (
pred_col not in comparison_df.columns
or gt_col not in comparison_df.columns
):
row_err[label + " Error (%)"] = np.nan
continue
gt_val = row[gt_col]
pred_val = row[pred_col]
# Avoid division by zero and treat missing/zero ground-truth as NaN
if pd.isna(gt_val) or gt_val == 0:
row_err[label + " Error (%)"] = np.nan
else:
row_err[label + " Error (%)"] = abs(pred_val - gt_val) / gt_val * 100
error_rows.append(row_err)
error_df = pd.DataFrame(error_rows)
error_df = error_df.round(1)
avg_series = error_df.drop(columns=["ID"], errors="ignore").mean(skipna=True)
avg_percent_error_df = pd.DataFrame([avg_series])
return error_df, avg_percent_error_df




ID,CD,CV,HEX,SD,Total Area (um^2),Number of Cells
0001-19.mha,3981.623177850078,0.4813677593300129,0.6137766046177653,120.89736718629733,173296.15816948636,690
0001-20.mha,4112.991880396959,0.9281009303846535,0.6158022185703609,225.651048524579,27717.049611339735,114
0001-21.mha,4691.913966160023,0.34472945697471874,0.6193526499278574,73.47309849691335,448431.0699588477,2104
0001-22.mha,2543.148708506314,0.3443718605684609,0.6183907350366616,135.4116097956078,205650.5772748057,523
0001-24.mha,3392.3732984983953,0.3884996362682782,0.6166351362814987,114.5214874908502,365525.8106614845,1240
0002-19.mha,3574.2739857356596,0.4656010968162456,0.6153384199939069,130.26452327784136,163949.37890565462,586
0002-21.mha,4343.9549996595015,0.3051236617507232,0.6187959045590328,70.24098126583728,393420.28177869227,1709
0002-24.mha,2817.393315369653,0.33480289646091327,0.6187753131158775,118.83427657561037,367005.91087486665,1034
0003-19.mha,3440.510382016177,0.29538609255080334,0.6189659479771206,85.85531207660644,136026.32982777015,468
0003-20.mha,3420.462372835885,0.5215797178589336,0.6159136860243405,152.4880735426699,195295.23414875782,668
0003-21.mha,7026.381664159352,0.44556994101989533,0.6115448692540457,63.413854002934244,74006.79679164762,520
0003-24.mha,2681.711063353513,0.4561552633476205,0.616470632599345,170.09858727181168,332996.35154702025,893
0004-19.mha,3342.5947484687863,0.294983775911923,0.6194779221596628,88.2499369829539,462215.76836610277,1545
0004-21.mha,4212.729229381042,0.4427064383639308,0.6159084182819821,105.08779801852484,233577.79397195549,984
0004-24.mha,2417.751626530482,0.45279073015420307,0.6165272109168652,187.2776033673757,177437.58097088858,429
0005-19.mha,3675.636602368633,0.5389820516954323,0.6165212828314109,146.63638166735652,206766.90386374027,760
0005-21.mha,2777.8846801956197,0.35516801502405115,0.6176356455263813,127.85556490381022,476981.6434232587,1325
0005-22.mha,5238.431005912022,0.5831712877119282,0.6130124970448522,111.32556428704872,82276.54416247523,431
0006-19.mha,8103.952881783761,0.6380931104353941,0.6101428002663061,78.73850203025162,45286.54168571864,367
0006-20.mha,1417.1674833684895,2.647628526220682,0.6110706191544716,1868.2537930714361,18346.455380277395,26
0006-22.mha,12233.804458296632,1.0767896932099776,0.6055293004718981,88.01756615291724,17574.255067825026,215
0007-19.mha,3468.313871568548,0.3265940075186739,0.6205061967678587,94.16506683432648,382318.33942996495,1326
0007-20.mha,5546.418248968065,0.717041007138415,0.611394107806011,129.28001008070814,13702.536770309402,76
0007-21.mha,4066.034156329037,0.5575621419809788,0.6150466049790901,137.12677280713402,49433.91822892852,201
0007-22.mha,2671.6145348372715,0.33285673307543673,0.6202927005663957,124.59010412432536,409864.51665142504,1095
0007-24.mha,2877.9990763237683,0.3545926037897845,0.6194680452206618,123.20803252054054,266852.06618655694,768
0008-20.mha,11796.82563927719,0.4438811478197022,0.6086699494757674,37.627168646268096,8731.162360920593,103
0008-21.mha,5509.203785759865,0.7818977729144851,0.6108342274081017,141.92573070822442,99832.9380048773,550
0008-24.mha,3232.744370532579,0.3829085035107784,0.6190288376065576,118.44688587229558,172918.0955647005,559
0009-19.mha,3560.9135656243875,0.362859139924064,0.6157274221461855,101.90057501730979,270436.218754763,963
0009-20.mha,7265.944466800803,0.5129546739828165,0.6072209702408646,70.59710906497892,11836.038713610733,86
0010-22.mha,6725.9372636262515,0.5795929333711706,0.6126528755711389,86.17281289636743,2676.206942539247,18
0011-19.mha,2840.030784576895,1.5624470681805622,0.6134434753650643,550.1514549298571,146829.3943377534,417
0011-20.mha,6371.060869565216,0.5880867941614657,0.6105897278125247,92.30594499116735,16637.731481481485,106
0012-19.mha,2256.3717682993347,0.391049042384634,0.6169739818367327,173.30878177020193,294720.9362139918,665
0012-22.mha,5518.35375382956,0.5594365625042307,0.6118438391871063,101.37743744971037,155662.36568358482,859
0013-19.mha,3404.4917133659237,0.5117285730564541,0.6156208514204072,150.3098307002553,49934.03254077122,170
0013-20.mha,2886.6325232873887,0.3733295294977311,0.6187260774654101,129.33046603125348,225175.87353299803,650
0014-19.mha,5178.67214799589,3.7737110974812267,0.6085290199371206,728.7024529910872,29544.252972107908,153
0015-19.mha,4292.8754184384325,0.5219154859466825,0.6138843789940533,121.57713305748186,105290.73311995124,452
0015-21.mha,3150.3038487508434,5.084750886738485,0.6095248327170725,1614.0509394846747,31742.969821673534,100
0015-24.mha,9020.18871756994,0.7778495137717238,0.5931946685792937,86.23428379681157,38690.98651120256,349
0016-19.mha,4944.713931058726,1.018135167896853,0.6135439077229531,205.90375542288598,108398.58634354518,536
0016-20.mha,2829.3927895611537,0.35868959034797177,0.6223255780841557,126.7726388754972,289461.40070111264,819
0016-21.mha,4246.1660091163285,1.037215870773352,0.6134015671578316,244.27115391779216,46630.30121170553,198
0016-24.mha,3495.564380364764,0.42613679879114935,0.6159482716495951,121.90786734892914,186236.02061423563,651
0017-20.mha,2754.8842400016233,0.39698882270711583,0.6221962358145918,144.1036312679628,176050.9545038866,485
0017-21.mha,2345.8121783211054,0.47316252534481124,0.618181160247963,201.7052045843896,276236.94939795765,648
0018-20.mha,5508.980457234337,0.8388531282660394,0.6110861718857347,152.27012235348667,30495.660912970583,168
0018-21.mha,4214.573855741664,0.4240847752560479,0.6158649549503284,100.62340577524867,304657.135916781,1284
0019-19.mha,4046.5439190914817,1.309541304826489,0.610117222167756,323.6196939932147,69936.22351775644,283
0019-21.mha,4895.454870406539,0.5248283173590884,0.6137139857308124,107.20726291068932,157901.56797744246,773
0020-19.mha,1590.6907083641972,0.652313200727758,0.6184566497305418,410.0817319782869,176024.16266575217,280
0020-21.mha,9067.668735539315,0.5092219003370831,0.6077026597853502,56.157973475725605,48634.33070416095,441
0021-20.mha,5292.71467983717,0.4632936247222085,0.6134983915554172,87.53421500069634,92580.08973479652,490
0021-21.mha,3510.0819504913547,0.5516050906538889,0.6185984728350866,157.14877841432534,119655.32597927145,420
0021-22.mha,3494.719590268886,1.7652300652082116,0.6061181731570213,505.1135061375249,3719.897881420515,13
0021-24.mha,2788.517484733795,0.3577931808753551,0.6143286645978698,128.30946294371606,323110.75864959613,901
0022-21.mha,5646.010383189123,0.6675304343825351,0.6135932870064911,118.23046524499723,173396.77640603564,979
0022-22.mha,6811.187732151983,0.5578306940278922,0.611277966710215,81.89918057825233,17471.255334552665,119
0022-24.mha,3075.308431640141,0.6159732568355408,0.6151793110553898,200.29641596209797,122589.32994208201,377
0023-21.mha,3138.3061842576612,0.5630341415814532,0.6181380035074262,179.40701401467427,146257.2397500381,459
0023-22.mha,8005.080575496709,0.6727188539548469,0.6097467340114682,84.03648752943442,19987.306622466087,160
0024-20.mha,4973.64752084853,0.630908620962746,0.6137268962062135,126.85028810708921,150995.82285474776,751
0024-21.mha,2804.8305786492665,0.4362745109010488,0.6181007204200886,155.54397981183848,215699.30269775947,605
0025-19.mha,3280.023903634206,0.5049732771861901,0.614877531519494,153.9541454642111,278961.3816491389,915
0025-20.mha,4055.4412745387194,0.48477674054003367,0.6159678842771498,119.53735924709548,238198.49298887365,966
0025-22.mha,6107.633193036734,0.6813732389873371,0.6102559514642069,111.56092997925376,59270.09506934919,362
0026-21.mha,3574.1580366009357,1.4638939392653814,0.6121943607330578,409.5772834537448,29377.54820149368,105
0026-22.mha,7527.608067138275,0.7632233920220887,0.6028670644225443,101.38989506559666,13550.120980033531,102
0027-24.mha,8711.607110054569,0.48364641365343725,0.6119266669688886,55.51747313021418,55098.9035589087,480
0028-20.mha,3656.9627741920117,0.3606352470885592,0.6192669139993983,98.61605637159919,299975.7087334248,1097
0028-21.mha,2737.2413589440243,0.28855141373006366,0.6237779417556556,105.41686899009203,326606.2004648681,894
0029-20.mha,4114.623139395553,0.6314535543496564,0.6179402311394498,153.46570826955937,89437.10943453741,368
0029-22.mha,15480.331797235023,0.47967458371104243,0.6090418049358004,30.986066060723463,1937.9429583904891,30
0029-24.mha,3609.459755970682,0.5154688324646747,0.6183026057256399,142.81052215972167,165952.81302392928,599
0030-22.mha,10749.542399999998,0.04396362132490906,0.6151102226833909,4.089813285904064,372.10886297820457,4
0031-21.mha,4021.368285702435,0.5921353556062339,0.6135915551283253,147.24723366211217,258369.77023319615,1039
0031-22.mha,3480.972506939543,0.29228034610654563,0.6161784832002412,83.96514063925122,491816.58188538335,1712
0032-20.mha,4969.0155845528025,0.7717095025546172,0.6169162536006174,155.304303120649,11269.837867703094,56
0032-21.mha,3883.5620335411363,0.5431081506069371,0.6160277773764886,139.847940091153,244105.79561042524,948
0033-24.mha,2130.7252005753426,0.40188142361059137,0.6165657172270446,188.6125078457206,438348.40820759034,934
0034-20.mha,2974.0513312105604,0.35021247995919913,0.6208265300337126,117.75603073288192,390040.3425544887,1160
0035-20.mha,4590.14086606544,1.4068112601562859,0.6147249580943982,306.4854219522399,23964.406149977138,110
0035-22.mha,4364.922518484616,0.5392769813577671,0.614986930014947,123.54789324988742,226349.95141746686,988
0036-24.mha,9504.698464025869,0.48962936793893297,0.6140639996155566,51.51445569705559,736.4778616064624,7
0037-19.mha,4689.425952436914,0.44840640709215235,0.6127639989030644,95.62074583118918,83592.32110196617,392
0037-20.mha,5834.852122295486,1.3940412857948226,0.6097354400161296,238.91630097497546,35305.09354519128,206
0037-22.mha,4056.8907059437415,0.5728077137029681,0.617131572560049,141.19377504149887,110675.8925849718,449
0038-19.mha,4582.64079476805,0.5062052689333167,0.6108937369904625,110.4614766034566,159951.4412818168,733
0038-20.mha,7999.2494945410435,0.7971613723090859,0.6132542803817714,99.65452044633632,26502.486282578873,212
0038-24.mha,3634.844320971278,0.4271024862666156,0.6160677487157704,117.50227755352346,399466.9019585429,1452
0039-19.mha,4291.596806728853,0.561893473502946,0.6142252275438124,130.92876586680876,97399.64372809023,418
0039-20.mha,9397.862588603002,4.65420978122646,0.6019450259469353,495.24131017522257,42669.27678707514,401
0039-22.mha,6022.1333265039575,0.5541087204314746,0.6129802608741879,92.01203134988587,92990.30254534369,560
0039-24.mha,3728.7339000737784,0.37227028317166877,0.6148922813191628,99.83825425684114,179149.2817405883,668
0040-22.mha,4788.568863546753,0.48358099890684236,0.6141340907685822,100.98653954590266,157040.6569120561,752
0041-22.mha,3479.285801599356,0.36887111799127686,0.6190824982559712,106.01920595937085,162677.06428135955,566
0042-19.mha,2856.017688916286,0.2967770477714817,0.6186529151826505,103.91288853819864,399857.4674211248,1142
0042-22.mha,3849.2143434888108,0.4650542111361428,0.6181995691473761,120.81795650658201,317986.9684499314,1224
点击阅读原文可以访问参考项目,如果大家觉得这个项目还不错,希望大家给个Star并Fork,可以让更多的人学习。如果有任何问题,随时给我留言我会及时回复的。
更多推荐

所有评论(0)