diff --git a/.gitattributes b/.gitattributes index a6344aac8c09253b3b630fb776ae94478aa0275b..cf6d8580ce41fe9034f5d350d23b3dafda3eb99f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -33,3 +33,5 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text *.zip filter=lfs diff=lfs merge=lfs -text *.zst filter=lfs diff=lfs merge=lfs -text *tfevents* filter=lfs diff=lfs merge=lfs -text +KMVE_RG/modules/pycocoevalcap/meteor/meteor-1.5.jar filter=lfs diff=lfs merge=lfs -text +KMVE_RG/modules/pycocoevalcap/tokenizer/stanford-corenlp-3.4.1.jar filter=lfs diff=lfs merge=lfs -text diff --git a/Data_demo/Breast.json b/Data_demo/Breast.json new file mode 100644 index 0000000000000000000000000000000000000000..4b058927c1794a29589fa79d89420216aaa9564c --- /dev/null +++ b/Data_demo/Breast.json @@ -0,0 +1 @@ +{"uid_0": {"report": "双侧乳腺腺体结构稍紊乱,乳导管不扩张,双侧乳腺未见明确占位性病变。双侧腋下未见明显肿大淋巴结。", "img_paths": ["174983_1.jpeg", "174983_2.jpeg"]}, "uid_1": {"report": "双侧乳腺腺体结构稍紊乱,于左侧乳腺_Loc_区距乳头约_SCM_处可见一低回声结节,大小约_2DS_,边界清晰,形态规整,CDFI示未见明确血流信号。双侧腋下可见乳腺腺体样结构,未见明显肿大淋巴结。", "img_paths": ["183157_1.jpeg", "183157_2.jpeg"]}, "uid_2": {"report": "乳腺:软组织各层次显示清晰,皮肤和皮下脂肪层未见明显异常回声。双侧腺体结构紊乱,内回声不均匀,未见明确占位性病变,CDFI未见异常血流信号。双侧腋下隆起处见脂肪组织及少许腺体。双侧腋下扫查未见肿大淋巴结。", "img_paths": ["137955_1.jpeg", "137955_2.jpeg"]}, "uid_3": {"report": "双侧乳腺腺体结构稍紊乱,乳导管不扩张,双侧乳腺未见明确占位性病变。双侧腋下未见明显肿大淋巴结。", "img_paths": ["184339_1.jpeg", "184339_2.jpeg"]}, "uid_4": {"report": "双侧乳腺腺体结构稍紊乱,乳导管不扩张,双侧乳腺未见明确占位性病变。双侧腋下未见明显肿大淋巴结。", "img_paths": ["226893_1.jpeg", "226893_2.jpeg"]}, "uid_5": {"report": "双侧乳腺腺体结构稍紊乱,乳导管不扩张,双侧乳腺未见明确占位性病变。双侧腋下未见明显肿大淋巴结。", "img_paths": ["149093_1.jpeg", "149093_2.jpeg"]}, "uid_6": {"report": "乳腺:软组织各层次显示清晰,皮肤和皮下脂肪层未见明显异常回声。双侧腺体结构紊乱,内回声不均匀,未见明确占位性病变,CDFI未见异常血流信号。双侧腋下扫查未见肿大淋巴结。", "img_paths": ["129667_1.jpeg", "129667_2.jpeg"]}, "uid_7": {"report": "乳腺:软组织各层次显示清晰,皮肤和皮下脂肪层未见明显异常回声。左乳腺体层厚_SCM_,右乳腺体层厚_SCM_,腺体结构紊乱,回声欠均匀,未见导管扩张,未见明确占位性病变,CDFI未见异常血流信号。腋下:双腋下均见一低回声结节,左侧大小为_2DS_,右侧大小为_2DS_,边界清晰,形态规整,内见“淋巴门”结构,CDFI示结节周边未记录到血流信号。", "img_paths": ["168978_1.jpeg", "168978_2.jpeg"]}, "uid_8": {"report": "双侧乳腺腺体结构稍紊乱,于左侧乳腺_Loc_区腺体边缘可见一无回声结节,大小约_3DS_,边界尚清晰,形态尚规整,内透声可,CDFI示未探及明显血流信号。双侧腋下未见明显肿大淋巴结。", "img_paths": ["161331_1.jpeg", "161331_2.jpeg"]}, "uid_9": {"report": "双侧乳腺腺体结构稍紊乱,乳导管不扩张,于左侧乳腺_Loc_区乳头旁可见一无回声结节,大小约_2DS_,边界清晰,形态规整,内透声欠佳,CDFI示未探及明确血流信号;于右侧乳腺_Loc_区乳头旁可见一无回声结节,大小约_2DS_,边界尚清晰,形态欠规整,内透声欠佳,内可见分隔,CDFI示未探及血流信号。双侧腋下未见明显肿大淋巴结。", "img_paths": ["221452_1.jpeg", "221452_2.jpeg"]}, "uid_10": {"report": "双侧乳腺腺体结构稍紊乱,乳导管不扩张,于左侧乳腺外上乳头旁可见一低回声结节,大小约_2DS_,边界清晰,呈大分叶状,CDFI示周边及内部可探及血流信号。于右侧乳腺可见多个低回声结节,大者位于_Loc_区距乳头_SCM_处,大小约_2DS_,边界清晰,呈大分叶状,CDFI示周边及内部可探及血流信号。双侧腋下未见明显肿大淋巴结。", "img_paths": ["195870_1.jpeg", "195870_2.jpeg"]}, "uid_11": {"report": "双侧乳腺腺体结构稍紊乱,右侧乳导管增宽,约_SCM_,左侧乳导管增宽,约_SCM_。于右侧乳腺_Loc_区距乳头_SCM_处可见一低回声结节,大小约_2DS_,边界清晰,形态规整,CDFI示可探及扁状少许血流信号;于左侧乳腺内见多个低回声结节,大者位于_Loc_区距乳头_SCM_处,大小约_2DS_,边界清晰,形态规整,CDFI示未探及血流信号。双侧腋下可见淋巴结,形态结构未见异常。", "img_paths": ["194484_1.jpeg", "194484_2.jpeg"]}, "uid_12": {"report": "右侧乳腺保乳术后。双侧腺体结构紊乱,内回声不均匀,于左侧乳腺_Loc_区距乳头_SCM_处可见一低回声结节,大小约_2DS_,边界清晰,形态规整,CDFI示未探及血流信号。双侧腋下扫查未见肿大淋巴结。", "img_paths": ["195952_1.jpeg", "195952_2.jpeg"]}, "uid_13": {"report": "双侧乳腺腺体结构稍紊乱,乳导管不扩张,于左侧乳腺_Loc_区距乳头_SCM_处可见一低回声结节,大小约_2DS_,边界清晰,形态规整,CDFI示未探及血流信号。双侧腋下未见明显肿大淋巴结。", "img_paths": ["206163_1.jpeg", "206163_2.jpeg"]}, "uid_14": {"report": "双侧乳腺腺体结构稍紊乱,乳导管不扩张,于左侧乳腺_Loc_区距乳头_SCM_处可见一无回声结节,大小约_2DS_,边界清晰,形态规整,CDFI示未探及血流信号。双侧腋下未见明显肿大淋巴结。", "img_paths": ["190241_1.jpeg", "190241_2.jpeg"]}, "uid_15": {"report": "双侧乳腺腺体结构稍紊乱,乳导管不扩张,双侧乳腺可见数个低回声结节,大者均位于_Loc_区距乳头约_SCM_处,左侧大者约_2DS_,右侧大者约_2DS_,上述结节均边界清晰,形态规整,CDFI示未见明显血流信号。双侧腋下未见明显肿大淋巴结。", "img_paths": ["168171_1.jpeg", "168171_2.jpeg"]}, "uid_16": {"report": "双侧乳腺腺体结构稍紊乱,乳导管不扩张,于左侧乳腺_Loc_区乳头旁可见一低回声结节,大小约_2DS_,边界清晰,形态规整,CDFI示未探及血流信号。双侧腋下未见明显肿大淋巴结。", "img_paths": ["153989_1.jpeg", "153989_2.jpeg"]}, "uid_17": {"report": "双侧乳腺腺体结构稍紊乱,乳导管不扩张,于双侧乳腺可见多发低回声结节,其中右乳_Loc_距乳头约_SCM_处,大小约_2DS_,右乳_Loc_距乳头约_SCM_处,大小约_2DS_;左乳_Loc_距乳头约_SCM_及_SCM_处,大小分别约_2DS_、_2DS_;上述结节边界清楚,CDFI示其内未见异常血流信号。双侧腋下未见明显肿大淋巴结。", "img_paths": ["172571_1.jpeg", "172571_2.jpeg"]}, "uid_18": {"report": "双侧乳腺腺体结构稍紊乱,乳导管不扩张,于左侧乳腺_Loc_区距乳头_SCM_处可见一低回声结节,大小约_3DS_,边界尚清晰,形态尚规整,CDFI示可探及血流信号,PW示可探及动脉血流频谱。双侧腋下未见明显肿大淋巴结。", "img_paths": ["201318_1.jpeg", "201318_2.jpeg"]}, "uid_19": {"report": "双侧乳腺腺体结构稍紊乱,乳导管不扩张,于左侧乳腺_Loc_区距乳头_SCM_处可见一低回声结节,大小约_2DS_,边界清晰,形态规整,CDFI示未探及血流信号。双侧腋下未见明显肿大淋巴结。", "img_paths": ["145640_1.jpeg", "145640_2.jpeg"]}} \ No newline at end of file diff --git a/Data_demo/Images/129667_1.jpeg b/Data_demo/Images/129667_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..ec9a72a62fbd91d73f2ec3b5ae3e07b012bdee7e Binary files /dev/null and b/Data_demo/Images/129667_1.jpeg differ diff --git a/Data_demo/Images/129667_2.jpeg b/Data_demo/Images/129667_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..ae7cd7033267513656201eb00280db826fa142bf Binary files /dev/null and b/Data_demo/Images/129667_2.jpeg differ diff --git a/Data_demo/Images/137955_1.jpeg b/Data_demo/Images/137955_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..900cacdf3c71dd281f439d862da488c83ee45242 Binary files /dev/null and b/Data_demo/Images/137955_1.jpeg differ diff --git a/Data_demo/Images/137955_2.jpeg b/Data_demo/Images/137955_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..6c499c3e2329ad738f1e1da58de26e50432de1a1 Binary files /dev/null and b/Data_demo/Images/137955_2.jpeg differ diff --git a/Data_demo/Images/145640_1.jpeg b/Data_demo/Images/145640_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..4395bfcd991173294704210fdf13ef4fcc292c67 Binary files /dev/null and b/Data_demo/Images/145640_1.jpeg differ diff --git a/Data_demo/Images/145640_2.jpeg b/Data_demo/Images/145640_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..1d0c3c36feef92b87c303173b7a02744c2611df1 Binary files /dev/null and b/Data_demo/Images/145640_2.jpeg differ diff --git a/Data_demo/Images/149093_1.jpeg b/Data_demo/Images/149093_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..694607f33e61b94a6631b90e31b782a540a28a5c Binary files /dev/null and b/Data_demo/Images/149093_1.jpeg differ diff --git a/Data_demo/Images/149093_2.jpeg b/Data_demo/Images/149093_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..28c5928ffd6e8fa51c1093fc6880934a1d2da4c2 Binary files /dev/null and b/Data_demo/Images/149093_2.jpeg differ diff --git a/Data_demo/Images/153989_1.jpeg b/Data_demo/Images/153989_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..8e40ac88cef058e92880525b6086b8f800278de0 Binary files /dev/null and b/Data_demo/Images/153989_1.jpeg differ diff --git a/Data_demo/Images/153989_2.jpeg b/Data_demo/Images/153989_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..c6f24adf7dc4426f5a56e7809adfccd57b22130f Binary files /dev/null and b/Data_demo/Images/153989_2.jpeg differ diff --git a/Data_demo/Images/161331_1.jpeg b/Data_demo/Images/161331_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..ff7a2b6e22e99ae20e7217efb6d9394b508ed3f9 Binary files /dev/null and b/Data_demo/Images/161331_1.jpeg differ diff --git a/Data_demo/Images/161331_2.jpeg b/Data_demo/Images/161331_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..ac1180ad2712382cf3d9aa3963a8d0ca01ede971 Binary files /dev/null and b/Data_demo/Images/161331_2.jpeg differ diff --git a/Data_demo/Images/168171_1.jpeg b/Data_demo/Images/168171_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..a9305bcfcbdf010091f9607dbfe9534544a5b916 Binary files /dev/null and b/Data_demo/Images/168171_1.jpeg differ diff --git a/Data_demo/Images/168171_2.jpeg b/Data_demo/Images/168171_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..a2360032d157eb6dcbbb314f3475ae26611ffd79 Binary files /dev/null and b/Data_demo/Images/168171_2.jpeg differ diff --git a/Data_demo/Images/168978_1.jpeg b/Data_demo/Images/168978_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..15f0febb3b0169b143a4f007b9dde877a4b9a5f8 Binary files /dev/null and b/Data_demo/Images/168978_1.jpeg differ diff --git a/Data_demo/Images/168978_2.jpeg b/Data_demo/Images/168978_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..4a37fefb7e4b52328b363b3c1930915fb8fa5318 Binary files /dev/null and b/Data_demo/Images/168978_2.jpeg differ diff --git a/Data_demo/Images/172571_1.jpeg b/Data_demo/Images/172571_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..bf533f19a71c22bb1d37da9f995bdc56425f4b97 Binary files /dev/null and b/Data_demo/Images/172571_1.jpeg differ diff --git a/Data_demo/Images/172571_2.jpeg b/Data_demo/Images/172571_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..2a04956bc46b92585302580c1be4bba0ad4a33db Binary files /dev/null and b/Data_demo/Images/172571_2.jpeg differ diff --git a/Data_demo/Images/174983_1.jpeg b/Data_demo/Images/174983_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..4322d7afce58c7fc00a1d7c7ebe385004e63fcc7 Binary files /dev/null and b/Data_demo/Images/174983_1.jpeg differ diff --git a/Data_demo/Images/174983_2.jpeg b/Data_demo/Images/174983_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..37054070fa69ee11994defe238ce7c7cb02999f6 Binary files /dev/null and b/Data_demo/Images/174983_2.jpeg differ diff --git a/Data_demo/Images/176515_1.jpeg b/Data_demo/Images/176515_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..d29f98fdc2376ce211dae540a405daa59909bfd8 Binary files /dev/null and b/Data_demo/Images/176515_1.jpeg differ diff --git a/Data_demo/Images/176515_2.jpeg b/Data_demo/Images/176515_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..e224a031b28931ee66ac302036dd7da134eabdc1 Binary files /dev/null and b/Data_demo/Images/176515_2.jpeg differ diff --git a/Data_demo/Images/177022_1.jpeg b/Data_demo/Images/177022_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..c20113ff97b38c312dab1200fc92b057777928d9 Binary files /dev/null and b/Data_demo/Images/177022_1.jpeg differ diff --git a/Data_demo/Images/177022_2.jpeg b/Data_demo/Images/177022_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..93fb6904d4d5700a1a39a672e2945d3c9e3c7b1d Binary files /dev/null and b/Data_demo/Images/177022_2.jpeg differ diff --git a/Data_demo/Images/178175_1.jpeg b/Data_demo/Images/178175_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..f3d3f55dcdeff7ed878bc1751af5d2f87534f6e5 Binary files /dev/null and b/Data_demo/Images/178175_1.jpeg differ diff --git a/Data_demo/Images/178175_2.jpeg b/Data_demo/Images/178175_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..f52ce239c09afe33233c9d401d01eda041894395 Binary files /dev/null and b/Data_demo/Images/178175_2.jpeg differ diff --git a/Data_demo/Images/178262_1.jpeg b/Data_demo/Images/178262_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..7d945cb484e129e3777fcfc45ab81984c7678671 Binary files /dev/null and b/Data_demo/Images/178262_1.jpeg differ diff --git a/Data_demo/Images/178262_2.jpeg b/Data_demo/Images/178262_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..ce69357a7250ce11781988e19e2f8f598c343a0e Binary files /dev/null and b/Data_demo/Images/178262_2.jpeg differ diff --git a/Data_demo/Images/179192_1.jpeg b/Data_demo/Images/179192_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..a8afb8a34d6e209e4ec1291dcb6039bb660294b2 Binary files /dev/null and b/Data_demo/Images/179192_1.jpeg differ diff --git a/Data_demo/Images/179192_2.jpeg b/Data_demo/Images/179192_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..4c04a74920c0c7bc4ad2a37d9f32ea2a60626129 Binary files /dev/null and b/Data_demo/Images/179192_2.jpeg differ diff --git a/Data_demo/Images/179926_1.jpeg b/Data_demo/Images/179926_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..56bdbd8f112c68bb227664373649e70867f88e09 Binary files /dev/null and b/Data_demo/Images/179926_1.jpeg differ diff --git a/Data_demo/Images/179926_2.jpeg b/Data_demo/Images/179926_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..ebf103cc14bb7bb3036228aa75ac64c3d4b341ae Binary files /dev/null and b/Data_demo/Images/179926_2.jpeg differ diff --git a/Data_demo/Images/180503_1.jpeg b/Data_demo/Images/180503_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..af066ecd3dd145815760bc2dcf4f964f479121f1 Binary files /dev/null and b/Data_demo/Images/180503_1.jpeg differ diff --git a/Data_demo/Images/180503_2.jpeg b/Data_demo/Images/180503_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..312055004eca5a14dd6fbd6d72c9aee648f09762 Binary files /dev/null and b/Data_demo/Images/180503_2.jpeg differ diff --git a/Data_demo/Images/181227_1.jpeg b/Data_demo/Images/181227_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..37f5480ee768bd309e4be331f4791c52dca7a153 Binary files /dev/null and b/Data_demo/Images/181227_1.jpeg differ diff --git a/Data_demo/Images/181227_2.jpeg b/Data_demo/Images/181227_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..ea2eb841fbc5bebe0d0ed4e386388ade81d08d71 Binary files /dev/null and b/Data_demo/Images/181227_2.jpeg differ diff --git a/Data_demo/Images/181997_1.jpeg b/Data_demo/Images/181997_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..2fc173a6fa1fba4419c001b79fa84f8a8392169a Binary files /dev/null and b/Data_demo/Images/181997_1.jpeg differ diff --git a/Data_demo/Images/181997_2.jpeg b/Data_demo/Images/181997_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..c2bfa6a68cc400e83e74360b8bb7a45e17154316 Binary files /dev/null and b/Data_demo/Images/181997_2.jpeg differ diff --git a/Data_demo/Images/182006_1.jpeg b/Data_demo/Images/182006_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..c262a015947df68b79d7bf845076cb8443632269 Binary files /dev/null and b/Data_demo/Images/182006_1.jpeg differ diff --git a/Data_demo/Images/182006_2.jpeg b/Data_demo/Images/182006_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..d67187f44220106f4d2b47332b3cff63b3443c18 Binary files /dev/null and b/Data_demo/Images/182006_2.jpeg differ diff --git a/Data_demo/Images/183157_1.jpeg b/Data_demo/Images/183157_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..0a997d61e2efe7b9bc45760c5b8ef65bbde27a7f Binary files /dev/null and b/Data_demo/Images/183157_1.jpeg differ diff --git a/Data_demo/Images/183157_2.jpeg b/Data_demo/Images/183157_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..e1eead3b524d0d78a254ea6b97ddc8ea89db29b0 Binary files /dev/null and b/Data_demo/Images/183157_2.jpeg differ diff --git a/Data_demo/Images/184019_1.jpeg b/Data_demo/Images/184019_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..13f67e9a1813b6db19ed250f582ff68fc51a9391 Binary files /dev/null and b/Data_demo/Images/184019_1.jpeg differ diff --git a/Data_demo/Images/184019_2.jpeg b/Data_demo/Images/184019_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..cc6a8e271f61795c0fb61aef03a4d36861f5b906 Binary files /dev/null and b/Data_demo/Images/184019_2.jpeg differ diff --git a/Data_demo/Images/184339_1.jpeg b/Data_demo/Images/184339_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..e3ebf3877a53bdea2823160f25cd9fa987b557c4 Binary files /dev/null and b/Data_demo/Images/184339_1.jpeg differ diff --git a/Data_demo/Images/184339_2.jpeg b/Data_demo/Images/184339_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..92b904261d0ad960166e29b2914229611aa919af Binary files /dev/null and b/Data_demo/Images/184339_2.jpeg differ diff --git a/Data_demo/Images/185950_1.jpeg b/Data_demo/Images/185950_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..0240c3260cb452991d809e35b6b1e2bba1473ee1 Binary files /dev/null and b/Data_demo/Images/185950_1.jpeg differ diff --git a/Data_demo/Images/185950_2.jpeg b/Data_demo/Images/185950_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..5cda1182b24033fb044adfe3e4a3f988552e2ebf Binary files /dev/null and b/Data_demo/Images/185950_2.jpeg differ diff --git a/Data_demo/Images/186873_1.jpeg b/Data_demo/Images/186873_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..4f7ff7b932e3ace851e6e4de1d38f2cb00c6b8f3 Binary files /dev/null and b/Data_demo/Images/186873_1.jpeg differ diff --git a/Data_demo/Images/186873_2.jpeg b/Data_demo/Images/186873_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..9263216602e3b0393f088a820d3deed8fea9ace9 Binary files /dev/null and b/Data_demo/Images/186873_2.jpeg differ diff --git a/Data_demo/Images/188113_1.jpeg b/Data_demo/Images/188113_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..29875dfb13a9991bd87040ae2bed24450b41dae4 Binary files /dev/null and b/Data_demo/Images/188113_1.jpeg differ diff --git a/Data_demo/Images/188113_2.jpeg b/Data_demo/Images/188113_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..b261fdee476a0ea8f572b598ac07a55334116366 Binary files /dev/null and b/Data_demo/Images/188113_2.jpeg differ diff --git a/Data_demo/Images/188408_1.jpeg b/Data_demo/Images/188408_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..49badbc8400d7e32dd5fb070c4147ea5bbf1fcee Binary files /dev/null and b/Data_demo/Images/188408_1.jpeg differ diff --git a/Data_demo/Images/188408_2.jpeg b/Data_demo/Images/188408_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..edd608839e5e82fce0ea65e8d6459300ad205c3b Binary files /dev/null and b/Data_demo/Images/188408_2.jpeg differ diff --git a/Data_demo/Images/188697_1.jpeg b/Data_demo/Images/188697_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..ecd5329c64aa6c4ccfbdd2ad81adb03b7c1a9f3d Binary files /dev/null and b/Data_demo/Images/188697_1.jpeg differ diff --git a/Data_demo/Images/188697_2.jpeg b/Data_demo/Images/188697_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..f02dad595bc3ca67bfa0f68b12ba8ba66bd44898 Binary files /dev/null and b/Data_demo/Images/188697_2.jpeg differ diff --git a/Data_demo/Images/189826_1.jpeg b/Data_demo/Images/189826_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..75df185671bcae08f03791a171c6890e5f985699 Binary files /dev/null and b/Data_demo/Images/189826_1.jpeg differ diff --git a/Data_demo/Images/189826_2.jpeg b/Data_demo/Images/189826_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..6843b7276d034c2feb393c4097c55d36a5c4a8c1 Binary files /dev/null and b/Data_demo/Images/189826_2.jpeg differ diff --git a/Data_demo/Images/190241_1.jpeg b/Data_demo/Images/190241_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..70d039d72349351662129b71e6099ece8ee72a52 Binary files /dev/null and b/Data_demo/Images/190241_1.jpeg differ diff --git a/Data_demo/Images/190241_2.jpeg b/Data_demo/Images/190241_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..cab764845afae62f3b2b8a736e83d4831fe17d73 Binary files /dev/null and b/Data_demo/Images/190241_2.jpeg differ diff --git a/Data_demo/Images/192976_1.jpeg b/Data_demo/Images/192976_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..a96a2fe82335d127e3155693cbb640aaa24eb8c9 Binary files /dev/null and b/Data_demo/Images/192976_1.jpeg differ diff --git a/Data_demo/Images/192976_2.jpeg b/Data_demo/Images/192976_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..a0194bc283b5bcf7015c551b5c23696fc10d6a48 Binary files /dev/null and b/Data_demo/Images/192976_2.jpeg differ diff --git a/Data_demo/Images/194484_1.jpeg b/Data_demo/Images/194484_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..75a73f134e578c1ae6d06e1bc9a7baeb150070ca Binary files /dev/null and b/Data_demo/Images/194484_1.jpeg differ diff --git a/Data_demo/Images/194484_2.jpeg b/Data_demo/Images/194484_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..c5e0e743b816d467d16736d4356508289a996057 Binary files /dev/null and b/Data_demo/Images/194484_2.jpeg differ diff --git a/Data_demo/Images/195340_1.jpeg b/Data_demo/Images/195340_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..cd5849e5d7b58da7a4cb75a6e5e46c14e32eda1e Binary files /dev/null and b/Data_demo/Images/195340_1.jpeg differ diff --git a/Data_demo/Images/195340_2.jpeg b/Data_demo/Images/195340_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..42d5fcf017c3faad6e485d1e575f9822532367dd Binary files /dev/null and b/Data_demo/Images/195340_2.jpeg differ diff --git a/Data_demo/Images/195870_1.jpeg b/Data_demo/Images/195870_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..62aefa9e4109a5ecf5c1028df239dc92cc4407ad Binary files /dev/null and b/Data_demo/Images/195870_1.jpeg differ diff --git a/Data_demo/Images/195870_2.jpeg b/Data_demo/Images/195870_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..249e26afcd1826172686949e9c4b09c0b3cb8f99 Binary files /dev/null and b/Data_demo/Images/195870_2.jpeg differ diff --git a/Data_demo/Images/195952_1.jpeg b/Data_demo/Images/195952_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..1e1d1758d62d9b53c904dcc64c1b2134124e3429 Binary files /dev/null and b/Data_demo/Images/195952_1.jpeg differ diff --git a/Data_demo/Images/195952_2.jpeg b/Data_demo/Images/195952_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..66b6af2ebe76ffc044234d20c48b39a03d48b355 Binary files /dev/null and b/Data_demo/Images/195952_2.jpeg differ diff --git a/Data_demo/Images/198217_1.jpeg b/Data_demo/Images/198217_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..c0467dbadf008fd4d6eaaf3ff3b1f21b07da9f5a Binary files /dev/null and b/Data_demo/Images/198217_1.jpeg differ diff --git a/Data_demo/Images/198217_2.jpeg b/Data_demo/Images/198217_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..53e78842352b71fba518805139adebfffd2eef63 Binary files /dev/null and b/Data_demo/Images/198217_2.jpeg differ diff --git a/Data_demo/Images/201318_1.jpeg b/Data_demo/Images/201318_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..92577b0cfaf982f4a7d0898922abca9eeb630597 Binary files /dev/null and b/Data_demo/Images/201318_1.jpeg differ diff --git a/Data_demo/Images/201318_2.jpeg b/Data_demo/Images/201318_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..1ac6395ff46dc5f12886815d08ced09a9024ca8a Binary files /dev/null and b/Data_demo/Images/201318_2.jpeg differ diff --git a/Data_demo/Images/206163_1.jpeg b/Data_demo/Images/206163_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..f76ef88b171dd57962fa70975ca98dce43dd7e47 Binary files /dev/null and b/Data_demo/Images/206163_1.jpeg differ diff --git a/Data_demo/Images/206163_2.jpeg b/Data_demo/Images/206163_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..edb39f884a9fbd5c885de9790db345bf0e74753c Binary files /dev/null and b/Data_demo/Images/206163_2.jpeg differ diff --git a/Data_demo/Images/216718_1.jpeg b/Data_demo/Images/216718_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..c3e9676905481450f87b555e82bde89e5d8a07ca Binary files /dev/null and b/Data_demo/Images/216718_1.jpeg differ diff --git a/Data_demo/Images/216718_2.jpeg b/Data_demo/Images/216718_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..819522040980b16c1542c52b561eeeb5eeb39a75 Binary files /dev/null and b/Data_demo/Images/216718_2.jpeg differ diff --git a/Data_demo/Images/217058_1.jpeg b/Data_demo/Images/217058_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..b004dd9f181b0528256316723254ff656f7d2ebc Binary files /dev/null and b/Data_demo/Images/217058_1.jpeg differ diff --git a/Data_demo/Images/217058_2.jpeg b/Data_demo/Images/217058_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..86e81ecfb13f0d29a484c13fdca761334db7fa19 Binary files /dev/null and b/Data_demo/Images/217058_2.jpeg differ diff --git a/Data_demo/Images/217115_1.jpeg b/Data_demo/Images/217115_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..5479f4ee48864cea423e6899bab9ae38e775105d Binary files /dev/null and b/Data_demo/Images/217115_1.jpeg differ diff --git a/Data_demo/Images/217115_2.jpeg b/Data_demo/Images/217115_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..dc9d413274d309b88d51cfb6a1e83889bc6c0398 Binary files /dev/null and b/Data_demo/Images/217115_2.jpeg differ diff --git a/Data_demo/Images/217246_1.jpeg b/Data_demo/Images/217246_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..c2b3ade718600183b40010d11a3f5d10236da255 Binary files /dev/null and b/Data_demo/Images/217246_1.jpeg differ diff --git a/Data_demo/Images/217246_2.jpeg b/Data_demo/Images/217246_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..802473e82de27830fc929a701a7be2f9647c8fc8 Binary files /dev/null and b/Data_demo/Images/217246_2.jpeg differ diff --git a/Data_demo/Images/218395_1.jpeg b/Data_demo/Images/218395_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..86a23e13c2a41aadb1e01deb60ed8422137e2e46 Binary files /dev/null and b/Data_demo/Images/218395_1.jpeg differ diff --git a/Data_demo/Images/218395_2.jpeg b/Data_demo/Images/218395_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..acdb34e61b216adc0f24c8e02608cfa165e3e83d Binary files /dev/null and b/Data_demo/Images/218395_2.jpeg differ diff --git a/Data_demo/Images/219190_1.jpeg b/Data_demo/Images/219190_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..7199230f328e58a2dfc05d9f2f10fde09513067f Binary files /dev/null and b/Data_demo/Images/219190_1.jpeg differ diff --git a/Data_demo/Images/219190_2.jpeg b/Data_demo/Images/219190_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..e9f36482a2d613d541574862136513f49fbfb771 Binary files /dev/null and b/Data_demo/Images/219190_2.jpeg differ diff --git a/Data_demo/Images/221452_1.jpeg b/Data_demo/Images/221452_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..785a020f5187a13d6c66a7518c13aaa17186dd2f Binary files /dev/null and b/Data_demo/Images/221452_1.jpeg differ diff --git a/Data_demo/Images/221452_2.jpeg b/Data_demo/Images/221452_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..356dd1f45aabb3bef85fe4581288a8676e03ad40 Binary files /dev/null and b/Data_demo/Images/221452_2.jpeg differ diff --git a/Data_demo/Images/223736_1.jpeg b/Data_demo/Images/223736_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..b29f0b749dd4066f8b23d7719955ca08da3a1cf0 Binary files /dev/null and b/Data_demo/Images/223736_1.jpeg differ diff --git a/Data_demo/Images/223736_2.jpeg b/Data_demo/Images/223736_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..5717b2f9c9c737d7dba309f0f9b26b4122cce177 Binary files /dev/null and b/Data_demo/Images/223736_2.jpeg differ diff --git a/Data_demo/Images/225000_1.jpeg b/Data_demo/Images/225000_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..92a8d8bb341baa34d7d52917506243d5bc1ca4b2 Binary files /dev/null and b/Data_demo/Images/225000_1.jpeg differ diff --git a/Data_demo/Images/225000_2.jpeg b/Data_demo/Images/225000_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..96b5da4d3fb6618fc7735dfe8c7ba061c9f172f7 Binary files /dev/null and b/Data_demo/Images/225000_2.jpeg differ diff --git a/Data_demo/Images/225772_1.jpeg b/Data_demo/Images/225772_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..eb08e6afbbc11c53c3e73ea81740af4377e6f31f Binary files /dev/null and b/Data_demo/Images/225772_1.jpeg differ diff --git a/Data_demo/Images/225772_2.jpeg b/Data_demo/Images/225772_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..a0e7dfaed683b42db1b042e9759d43d8ae0c1cda Binary files /dev/null and b/Data_demo/Images/225772_2.jpeg differ diff --git a/Data_demo/Images/226872_1.jpeg b/Data_demo/Images/226872_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..37feda2527ab2798a959e9d42de827ebcf0adf58 Binary files /dev/null and b/Data_demo/Images/226872_1.jpeg differ diff --git a/Data_demo/Images/226872_2.jpeg b/Data_demo/Images/226872_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..90485c2ddf39de5aed93a6d4f4c3caf272a5ea3f Binary files /dev/null and b/Data_demo/Images/226872_2.jpeg differ diff --git a/Data_demo/Images/226893_1.jpeg b/Data_demo/Images/226893_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..6ddda1861edbb0f6432db9abc097082d3d308eeb Binary files /dev/null and b/Data_demo/Images/226893_1.jpeg differ diff --git a/Data_demo/Images/226893_2.jpeg b/Data_demo/Images/226893_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..100267a64820047af66810ff1b4699e2b71bd4ae Binary files /dev/null and b/Data_demo/Images/226893_2.jpeg differ diff --git a/Data_demo/Liver.json b/Data_demo/Liver.json new file mode 100644 index 0000000000000000000000000000000000000000..91fe7dbef6276b43130af0d5c30cd3ee642f1b94 --- /dev/null +++ b/Data_demo/Liver.json @@ -0,0 +1 @@ +{"uid_0": {"report": "肝脏大小形态如常,包膜光滑,实质回声细密增强,门静脉系统显示欠清晰,肝肾回声对比增强。肝内外胆管未见扩张。门静脉主干内径正常范围。胆囊大小形态如常,壁毛糙,欠光滑,腔内未见明显异常回声。胰腺大小形态如常,实质回声均匀,胰管不宽,内未见明确占位性病变。脾脏大小形态如常,实质回声均匀,内未见明显占位性病变。", "img_paths": ["217246_1.jpeg", "217246_2.jpeg"]}, "uid_1": {"report": "肝脏大小形态如常,实质回声细密增强,欠均匀,肝内外胆管不扩张,门静脉主干不宽,肝内未见明确占位性病变。胆囊大小形态如常,壁不厚,光滑,腔内未见明显异常回声。胰腺大小形态如常,实质回声均匀,胰管不宽,内未见明确占位性病变。脾脏大小形态如常,实质回声均匀,内未见明显占位性病变。", "img_paths": ["217058_1.jpeg", "217058_2.jpeg"]}, "uid_2": {"report": "肝脏形态饱满,包膜光滑,实质回声细密增强,欠均匀,后方回声衰减,肝肾回声对比增强,门静脉系统显示欠清晰。肝内外胆管未见扩张。门静脉主干内径正常范围。胆囊大小形态如常,壁不厚,光滑,腔内未见明显异常回声。胰腺大小形态如常,实质回声均匀,胰管不宽,内未见明确占位性病变。脾脏大小形态如常,实质回声均匀,内未见明显占位性病变。", "img_paths": ["219190_1.jpeg", "219190_2.jpeg"]}, "uid_3": {"report": "肝脏大小形态如常,实质回声细密增强,欠均匀,肝内外胆管不扩张,门静脉主干不宽,肝内未见明确占位性病变。胆囊大小形态如常,壁不厚,光滑,腔内未见明显异常回声。胰腺大小形态如常,实质回声均匀,胰管不宽,内未见明确占位性病变。脾脏大小形态如常,实质回声均匀,内未见明显占位性病变。", "img_paths": ["218395_1.jpeg", "218395_2.jpeg"]}, "uid_4": {"report": "肝脏形态饱满,包膜光滑,肝左叶可见一低回声结节,大小约_2DS_,边界清晰,形态规整,CDFI示周边可见血流信号;余实质回声细密增强,门静脉系统显示欠清晰,肝肾回声对比增强。肝内外胆管未见扩张。门静脉主干内径正常范围。胆囊大小形态如常,壁不厚,光滑,腔内未见明显异常回声。胰腺大小形态如常,实质回声均匀,胰管不宽,内未见明确占位性病变。脾脏大小形态如常,实质回声均匀,内未见明显占位性病变。", "img_paths": ["227843_1.jpeg", "227843_2.jpeg"]}, "uid_5": {"report": "肝脏形态饱满,包膜光滑,实质回声细密增强,门静脉系统显示欠清晰,肝肾回声对比增强。肝内外胆管未见扩张。门静脉主干内径正常范围。胆囊大小形态如常,壁不厚,光滑,腔内未见明显异常回声。胰腺大小形态如常,实质回声均匀,胰管不宽,内未见明确占位性病变。脾脏大小形态如常,实质回声均匀,内未见明显占位性病变。", "img_paths": ["236492_1.jpeg", "236492_2.jpeg"]}, "uid_6": {"report": "肝脏形态饱满,包膜光滑,于肝左叶可见一囊性结构,大小约_2DS_,边界清楚,后方回声增强,CDFI示其内未见血流信号;余实质回声细密增强,门静脉系统显示欠清晰,肝肾回声对比增强。肝内外胆管未见扩张。门静脉主干内径正常范围。胆囊大小形态如常,壁不厚,光滑,腔内未见明显异常回声。胰腺大小形态如常,实质回声均匀,胰管不宽,内未见明确占位性病变。脾脏大小形态如常,实质回声均匀,内未见明显占位性病变。", "img_paths": ["225772_1.jpeg", "225772_2.jpeg"]}, "uid_7": {"report": "肝脏形态饱满,包膜光滑,实质回声细密增强,门静脉系统显示欠清晰,肝肾回声对比增强。肝内外胆管未见扩张。门静脉主干内径正常范围。胆囊大小形态如常,壁不厚,欠光滑,壁上可见多个稍强回声结节,大者约_2DS_,无声影,不随体位改变移动。胰腺大小形态正常,实质回声均匀,胰管不宽,内未见明确占位性病变。脾脏大小形态如常,实质回声均匀,内未见明显占位性病变。", "img_paths": ["236221_1.jpeg", "236221_2.jpeg"]}, "uid_8": {"report": "肝脏形态饱满,包膜光滑,于肝左内叶可见一囊性结构,大小约_2DS_,边界清楚,后方回声增强,CDFI示其内未见血流信号;余肝实质回声细密增强,门静脉系统显示欠清晰,肝肾回声对比增强。肝内外胆管未见扩张。门静脉主干内径正常范围。胆囊大小形态如常,壁不厚,光滑,腔内未见明显异常回声。胰腺大小形态如常,实质回声均匀,胰管不宽,内未见明确占位性病变。脾脏大小形态如常,实质回声均匀,内未见明显占位性病变。", "img_paths": ["232759_1.jpeg", "232759_2.jpeg"]}, "uid_9": {"report": "肝脏形态稍饱满,包膜光滑,实质回声细密增强,肝肾回声对比增强,门静脉系统显示欠清晰。肝内外胆管未见扩张。门静脉主干内径正常范围。胆囊大小形态如常,壁不厚,欠光滑,囊壁上可见多发偏高回声凸起,大者大小约_2DS_,后无声影,不随体位改变而移动。胰腺大小形态如常,实质回声均匀,胰管不宽,内未见明确占位性病变。脾脏大小形态如常,实质回声均匀,内未见明显占位性病变。", "img_paths": ["225000_1.jpeg", "225000_2.jpeg"]}, "uid_10": {"report": "肝脏形态饱满,包膜光滑,于肝左叶可见一囊性结构,大小约_2DS_,边界清楚,后方回声增强,CDFI示其内未见血流信号;余实质回声细密增强,欠均匀,门静脉系统显示欠清晰,肝肾回声对比增强。肝内外胆管未见扩张。门静脉主干内径正常范围。胆囊大小形态如常,壁不厚,光滑,腔内未见明显异常回声。胰腺大小形态如常,实质回声均匀,胰管不宽,内未见明确占位性病变。脾脏大小形态如常,实质回声均匀,内未见明显占位性病变。", "img_paths": ["239238_1.jpeg", "239238_2.jpeg"]}, "uid_11": {"report": "肝脏形态饱满,包膜光滑,肝左叶可见一囊性结构,大小约_2DS_,边界清晰,后壁回声增强;余实质回声细密增强,门静脉系统显示欠清晰,肝肾回声对比增强。肝内外胆管未见扩张。门静脉主干内径正常范围。胆囊大小形态如常,壁不厚,光滑,腔内未见明显异常回声。胰腺大小形态如常,实质回声均匀,胰管不宽,内未见明确占位性病变。脾脏大小形态如常,实质回声均匀,内未见明显占位性病变。", "img_paths": ["232669_1.jpeg", "232669_2.jpeg"]}, "uid_12": {"report": "肝脏形态饱满,包膜光滑,实质回声细密增强,门静脉系统显示欠清晰,肝肾回声对比增强。肝内外胆管未见扩张。门静脉主干内径正常范围。胆囊大小形态如常,壁不厚,光滑,腔内未见明显异常回声。胰腺大小形态如常,实质回声均匀,胰管不宽,内未见明确占位性病变。脾脏大小形态如常,实质回声均匀,内未见明显占位性病变。", "img_paths": ["226872_1.jpeg", "226872_2.jpeg"]}, "uid_13": {"report": "肝脏形态饱满,包膜光滑,实质回声细密增强,门静脉系统显示欠清晰,肝肾回声对比增强。肝内外胆管未见扩张。门静脉主干内径正常范围。胆囊大小形态如常,壁不厚,光滑,腔内未见明显异常回声。胰腺大小形态如常,实质回声均匀,胰管不宽,内未见明确占位性病变。脾脏大小形态如常,实质回声均匀,内未见明显占位性病变。", "img_paths": ["236624_1.jpeg", "236624_2.jpeg"]}, "uid_14": {"report": "肝脏形态饱满,包膜光滑,实质回声细密增强,欠均匀,门静脉系统显示欠清晰,肝肾回声对比增强。肝内外胆管未见扩张。门静脉主干内径正常范围。胆囊大小形态如常,壁不厚,光滑,腔内未见明显异常回声。胰腺大小形态如常,实质回声均匀,胰管不宽,内未见明确占位性病变。脾脏大小形态如常,实质回声均匀,内未见明显占位性病变。", "img_paths": ["234811_1.jpeg", "234811_2.jpeg"]}, "uid_15": {"report": "肝脏形态饱满,包膜光滑,实质回声细密增强,门静脉系统显示欠清晰,肝肾回声对比增强。肝内外胆管未见扩张。门静脉主干内径正常范围。胆囊大小形态如常,壁不厚,光滑,腔内未见明显异常回声。胰腺大小形态如常,实质回声均匀,胰管不宽,内未见明确占位性病变。脾脏大小形态如常,实质回声均匀,内未见明显占位性病变。", "img_paths": ["234317_1.jpeg", "234317_2.jpeg"]}, "uid_16": {"report": "肝脏形态饱满,包膜光滑,实质回声细密增强,后场回声衰减,门静脉系统显示欠清晰,肝肾回声对比增强。肝内外胆管未见扩张。门静脉主干内径正常范围。胆囊大小形态如常,壁不厚,光滑,腔内未见明显异常回声。胰腺大小形态如常,实质回声均匀,胰管不宽,内未见明确占位性病变。脾脏大小形态如常,实质回声均匀,内未见明显占位性病变。", "img_paths": ["216718_1.jpeg", "216718_2.jpeg"]}, "uid_17": {"report": "肝脏形态饱满,包膜光滑,实质回声细密增强,门静脉系统显示欠清晰,肝肾回声对比增强。肝内外胆管未见扩张。门静脉主干内径正常范围。胆囊大小形态如常,壁不厚,毛糙、欠光滑,腔内未见明显异常回声。胰腺大小形态如常,实质回声均匀,胰管不宽,内未见明确占位性病变。脾脏大小形态如常,实质回声均匀,内未见明显占位性病变。", "img_paths": ["223736_1.jpeg", "223736_2.jpeg"]}, "uid_18": {"report": "肝脏形态饱满,包膜光滑,实质回声细密增强,门静脉系统显示欠清晰,肝肾回声对比增强。肝内外胆管未见扩张。门静脉主干内径正常范围。胆囊大小形态如常,壁不厚,光滑,腔内未见明显异常回声。胰腺大小形态如常,实质回声均匀,胰管不宽,内未见明确占位性病变。脾脏大小形态如常,实质回声均匀,内未见明显占位性病变。", "img_paths": ["217115_1.jpeg", "217115_2.jpeg"]}} \ No newline at end of file diff --git a/Data_demo/Thyroid.json b/Data_demo/Thyroid.json new file mode 100644 index 0000000000000000000000000000000000000000..1c7ac993130cb5fb2dfe0d5f2627fc1228c4ea44 --- /dev/null +++ b/Data_demo/Thyroid.json @@ -0,0 +1 @@ +{"uid_0": {"report": "甲状腺大小形态如常,腺体回声均匀,未见明确占位性病变,CDFI示腺体内未见异常血流信号。双侧颈部未见明显肿大淋巴结。", "img_paths": ["177022_1.jpeg", "177022_2.jpeg"]}, "uid_1": {"report": "甲状腺大小形态如常,双叶腺体内可见多发混合回声结节,左叶大者位于下极,大小约_2DS_,边界清晰,形态规整,CDFI示周边可探及血流信号;右叶大者位于上极,大小约_2DS_,边界清晰,形态规整,CDFI示未见明确血流信号;余腺体回声均匀,CDFI示腺体内未见异常血流信号。双侧颈部未见明显肿大淋巴结。", "img_paths": ["179192_1.jpeg", "179192_2.jpeg"]}, "uid_2": {"report": "甲状腺大小形态如常,于腺体内可见多个结节,右叶大者位于下极,呈低回声,大小约_2DS_,左叶大者位于中下部,呈囊实混合回声,大小约_2DS_,边界清晰,形态规整,CDFI示未见血流信号;余腺体回声欠均匀,CDFI示腺体内未见异常血流信号。双侧颈部未见明显肿大淋巴结。", "img_paths": ["188113_1.jpeg", "188113_2.jpeg"]}, "uid_3": {"report": "甲状腺大小形态如常,右叶中部可见一无回声结节,大小约_2DS_,边界清晰,形态规整,CDFI示未探及血流信号;余腺体回声均匀,CDFI示腺体内未见异常血流信号。双侧颈部未见明显肿大淋巴结。", "img_paths": ["178175_1.jpeg", "178175_2.jpeg"]}, "uid_4": {"report": "甲状腺大小形态如常,腺体回声均匀,未见明确占位性病变,CDFI示腺体内未见异常血流信号。双侧颈部未见明显肿大淋巴结。", "img_paths": ["195340_1.jpeg", "195340_2.jpeg"]}, "uid_5": {"report": "甲状腺大小形态如常,于右叶腺体内可见多个结节,大者位于中部,呈稍高回声,大小约_2DS_,边界清晰,形态规整,CDFI示可见血流信号;余腺体回声均匀,CDFI示腺体内未见异常血流信号。双侧颈部未见明显肿大淋巴结。", "img_paths": ["184019_1.jpeg", "184019_2.jpeg"]}, "uid_6": {"report": "甲状腺大小形态如常,于腺体内可见多个结节,右叶大者位于中部,呈低回声,大小约_2DS_,边界清晰,形态规整,CDFI示其内及周边可见丰富血流信号;左叶大者位于中部,呈囊实混合回声,大小约_2DS_,边界清晰,形态规整,CDFI示其实性部分可见血流信号;余腺体回声均匀,CDFI示腺体内未见异常血流信号。双侧颈部未见明显肿大淋巴结。", "img_paths": ["181997_1.jpeg", "181997_2.jpeg"]}, "uid_7": {"report": "甲状腺大小形态如常,双叶可见多发结节,左叶大者位于中上部,呈以实性为主的囊实混合回声,大小约_2DS_,边界清晰,形态规整,CDFI示周边及其内可见血流信号;右叶大者位于中部,呈以实性为主的囊实混合回声,大小约_2DS_,边界清晰,形态规整,CDFI示周边可见血流信号;余腺体回声均匀,未见明确占位性病变,CDFI示腺体内未见异常血流信号。双侧颈部未见明显肿大淋巴结。", "img_paths": ["180503_1.jpeg", "180503_2.jpeg"]}, "uid_8": {"report": "甲状腺大小形态如常,腺体回声均匀,未见明确占位性病变,CDFI示腺体内未见异常血流信号。双侧颈部未见明显肿大淋巴结。", "img_paths": ["186873_1.jpeg", "186873_2.jpeg"]}, "uid_9": {"report": "甲状腺大小形态如常,腺体回声均匀,未见明确占位性病变,CDFI示腺体内未见异常血流信号。双侧颈部未见明显肿大淋巴结。", "img_paths": ["182006_1.jpeg", "182006_2.jpeg"]}, "uid_10": {"report": "甲状腺全切术后,原区域未见明确占位性病变。双侧颈部未见异常肿大淋巴结。", "img_paths": ["179926_1.jpeg", "179926_2.jpeg"]}, "uid_11": {"report": "甲状腺大小形态尚可,于腺体内可见多发结节,左叶大者位于中下部腹侧,呈低回声,大小约_2DS_,右叶大者位于下极,呈无回声,大小约_2DS_,边界清楚,形态规则,CDFI示其内可见血流信号;余腺体回声均匀,CDFI示腺体内未见异常血流信号。双侧颈部未见明显肿大淋巴结。", "img_paths": ["181227_1.jpeg", "181227_2.jpeg"]}, "uid_12": {"report": "甲状腺大小形态如常,左叶中部可见一低回声结节,大小约_2DS_,边界不清晰,形态不规整,纵横比大于1,与包膜分界不清,略向包膜外凸出,CDFI示可探及血流信号;右叶中部可见一低回声结节,大小约_2DS_,边界清晰,形态规整,CDFI示可探及血流信号;余腺体回声均匀,CDFI示腺体内未见异常血流信号。双侧颈部未见明显肿大淋巴结。", "img_paths": ["192976_1.jpeg", "192976_2.jpeg"]}, "uid_13": {"report": "甲状腺大小形态如常,左叶中部可见一囊性结节,大小约_2DS_,边界清晰,形态规整,内可见点状强回声,CDFI示未见明确血流信号;右叶可见多发囊性及囊实混合回声结节,大者位于中部,呈囊实混合回声,大小约_2DS_,边界清晰,形态规整,CDFI示周边可见血流信号;余腺体回声均匀,CDFI示腺体内未见异常血流信号。双侧颈部未见明显肿大淋巴结。", "img_paths": ["198217_1.jpeg", "198217_2.jpeg"]}, "uid_14": {"report": "甲状腺:左叶大小为_3DS_,峡部_SCM_,右叶大小为_3DS_,腺体回声欠均匀,左叶中段见一低回声结节,大小为_2DS_,边界清晰,形态规整,CDFI示结节周边记录到少许血流信号;右叶中段见两个低回声结节,大小分别为_2DS_、_2DS_,边界清晰,形态规整,CDFI示结节周边未记录到血流信号。甲状腺周围未见肿大淋巴结。", "img_paths": ["189826_1.jpeg", "189826_2.jpeg"]}, "uid_15": {"report": "甲状腺右叶厚径_SCM_,左叶厚径_SCM_,峡部_SCM_,腺体回声欠均匀,未见明确占位性病变,CDFI示腺体内未见异常血流信号。双侧颈部未见明显肿大淋巴结。", "img_paths": ["188697_1.jpeg", "188697_2.jpeg"]}, "uid_16": {"report": "甲状腺大小形态如常,腺体回声不均匀。左叶中部可见一低回声结节,大小约_2DS_,边界欠清晰,形态失常,内可见散在强回声,纵横比大于1,CDFI示结节周边可探及血流信号。双侧颈部未见明显肿大淋巴结。", "img_paths": ["178262_1.jpeg", "178262_2.jpeg"]}, "uid_17": {"report": "甲状腺大小形态如常,于腺体内可见多个结节,右叶大者位于中下部,呈以实性为主的囊实混合回声,大小约_2DS_,边界清晰,形态规整,CDFI示周边可见较丰富血流信号;左叶大者位于中部,呈以实性为主的囊实混合回声,大小约_2DS_,边界清晰,形态规整,CDFI示周边可探及血流信号。余腺体回声均匀,CDFI示腺体内未见异常血流信号。双侧颈部未见明显肿大淋巴结。", "img_paths": ["188408_1.jpeg", "188408_2.jpeg"]}, "uid_18": {"report": "甲状腺大小形态如常,右叶中下部可见一混合回声结节,大小约_2DS_,边界清晰,形态规整,CDFI示未探及血流信号;余腺体回声均匀,CDFI示腺体内未见异常血流信号。双侧颈部未见明显肿大淋巴结。", "img_paths": ["185950_1.jpeg", "185950_2.jpeg"]}, "uid_19": {"report": "甲状腺大小形态如常,双叶中下段各见一囊实混合回声结节,左叶大小约_3DS_,右叶大小约_3DS_,上述结节边界清晰,形态规整,CDFI示可探及血流信号。余腺体回声均匀,CDFI示腺体内未见异常血流信号。双侧颈部未见明显肿大淋巴结。", "img_paths": ["176515_1.jpeg", "176515_2.jpeg"]}} \ No newline at end of file diff --git a/KMVE_RG/__init__.py b/KMVE_RG/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/KMVE_RG/__pycache__/__init__.cpython-310.pyc b/KMVE_RG/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..375c7d1c1c63820e08f72fc6b267bed3346ae1c2 Binary files /dev/null and b/KMVE_RG/__pycache__/__init__.cpython-310.pyc differ diff --git a/KMVE_RG/models/SGF_model.py b/KMVE_RG/models/SGF_model.py new file mode 100644 index 0000000000000000000000000000000000000000..9a3c2168d93dfcbe98b6e80bc688e6aee03b9482 --- /dev/null +++ b/KMVE_RG/models/SGF_model.py @@ -0,0 +1,49 @@ +import torch +import torch.nn as nn +import numpy as np + +import sys + +sys.path.append('../') +from KMVE_RG.modules.visual_extractor import VisualExtractor +from KMVE_RG.modules.encoder_decoder import EncoderDecoder +from KMVE_RG.modules.new_model_utils import classfication + + +class SGF(nn.Module): + def __init__(self, args, tokenizer): + super(SGF, self).__init__() + self.args = args + self.tokenizer = tokenizer + self.visual_extractor = VisualExtractor(args) + self.encoder_decoder = EncoderDecoder(args, tokenizer) + self.classfication_layers = classfication(distiller_num = self.args.distiller_num) + print('vocabulary size:', self.tokenizer.get_vocab_size()) + # self.forward = self._forward_inference + + def __str__(self): + model_parameters = filter(lambda p: p.requires_grad, self.parameters()) + params = sum([np.prod(p.size()) for p in model_parameters]) + return super().__str__() + '\nTrainable parameters: {}'.format(params) + + def forward(self, images, targets=None, mode='train'): + att_feats_0, fc_feats_0, _, kmve_0 = self.visual_extractor(images[:, 0]) + att_feats_1, fc_feats_1, _, kmve_1 = self.visual_extractor(images[:, 1]) + fc_feats = torch.cat((fc_feats_0, fc_feats_1), dim=1) + att_feats = torch.cat((att_feats_0, att_feats_1), dim=1) + kmve = torch.cat((kmve_0, kmve_1), dim=1) + if mode == 'train': + output, _ = self.encoder_decoder(fc_feats, att_feats, targets, mode='forward') + kmve_output = self.classfication_layers(kmve) + return output, kmve_output + elif mode == 'sample': + output, _ = self.encoder_decoder(fc_feats, att_feats, mode='sample') + kmve_output = self.classfication_layers(kmve) + elif mode == 'evaluate': + output, first_sentence, first_attmap, first_sentence_probs = \ + self.encoder_decoder(fc_feats, att_feats, mode='evaluate') + kmve_output = self.classfication_layers(kmve) + return output, kmve_output, first_sentence, first_attmap, first_sentence_probs + else: + raise ValueError + return output, kmve_output \ No newline at end of file diff --git a/KMVE_RG/models/__pycache__/SGF_model.cpython-310.pyc b/KMVE_RG/models/__pycache__/SGF_model.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c087ed9457a4679316a3e81d5ce01ba8887f379c Binary files /dev/null and b/KMVE_RG/models/__pycache__/SGF_model.cpython-310.pyc differ diff --git a/KMVE_RG/models/__pycache__/SGF_model.cpython-38.pyc b/KMVE_RG/models/__pycache__/SGF_model.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..442a9b63e0e7b7fea86231db2b1eb96147a2f09c Binary files /dev/null and b/KMVE_RG/models/__pycache__/SGF_model.cpython-38.pyc differ diff --git a/KMVE_RG/modules/Caption.py b/KMVE_RG/modules/Caption.py new file mode 100644 index 0000000000000000000000000000000000000000..6b5305a4af41733feaefc9a9c8391c8313f78065 --- /dev/null +++ b/KMVE_RG/modules/Caption.py @@ -0,0 +1,23 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import torch +import torch.nn as nn + + +class MyCaption(nn.Module): + def __init__(self): + super(MyCaption, self).__init__() + self.mode = None + + def forward(self, *args, **kwargs): + mode = kwargs.get('mode', 'forward') + if 'mode' in kwargs: + del kwargs['mode'] + return getattr(self, '_' + mode)(*args, **kwargs) + + def sample_next_word(self, logprobs): + sampleLogprobs, it = torch.max(logprobs.data, 1) + it = it.view(-1).long() + return it, sampleLogprobs diff --git a/KMVE_RG/modules/Generator.py b/KMVE_RG/modules/Generator.py new file mode 100644 index 0000000000000000000000000000000000000000..0157f1c46f92191c0fdfc7927ce7898d991f211a --- /dev/null +++ b/KMVE_RG/modules/Generator.py @@ -0,0 +1,187 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import torch +import torch.nn as nn +import torch.nn.functional as F +from torch.nn.utils.rnn import PackedSequence, pack_padded_sequence, pad_packed_sequence +import numpy as np +from KMVE_RG.modules.Caption import MyCaption + + +def sort_pack_padded_sequence(input, lengths): + sorted_lengths, indices = torch.sort(lengths, descending=True) + tmp = pack_padded_sequence(input[indices], sorted_lengths, batch_first=True) + inv_ix = indices.clone() + inv_ix[indices] = torch.arange(0, len(indices)).type_as(inv_ix) + return tmp, inv_ix + + +def pad_unsort_packed_sequence(input, inv_ix): + tmp, _ = pad_packed_sequence(input, batch_first=True) + tmp = tmp[inv_ix] + return tmp + + +def pack_wrapper(module, att_feats, att_masks): + if att_masks is not None: + packed, inv_ix = sort_pack_padded_sequence(att_feats, att_masks.data.long().sum(1)) + return pad_unsort_packed_sequence(PackedSequence(module(packed[0]), packed[1]), inv_ix) + else: + return module(att_feats) + + +class GenModel(MyCaption): + def __init__(self, args, tokenizer): + super(GenModel, self).__init__() + self.args = args + self.tokenizer = tokenizer + self.vocab_size = len(tokenizer.idx2token) + self.input_encoding_size = args.d_model + self.rnn_size = args.d_ff + self.num_layers = args.num_layers + self.drop_prob_lm = args.drop_prob_lm + self.max_seq_length = args.max_seq_length + self.att_feat_size = args.d_vf + self.att_hid_size = args.d_model + + self.bos_idx = args.bos_idx + self.eos_idx = args.eos_idx + self.pad_idx = args.pad_idx + + self.use_bn = args.use_bn + + self.embed = lambda x: x + self.fc_embed = lambda x: x + self.att_embed = nn.Sequential(*( + ((nn.BatchNorm1d(self.att_feat_size),) if self.use_bn else ()) + + (nn.Linear(self.att_feat_size, self.input_encoding_size), + nn.ReLU(), + nn.Dropout(self.drop_prob_lm)) + + ((nn.BatchNorm1d(self.input_encoding_size),) if self.use_bn == 2 else ()))) + + def clip_att(self, att_feats, att_masks): + if att_masks is not None: + max_len = att_masks.data.long().sum(1).max() + att_feats = att_feats[:, :max_len].contiguous() + att_masks = att_masks[:, :max_len].contiguous() + return att_feats, att_masks + + def _prepare_feature(self, fc_feats, att_feats, att_masks): + att_feats, att_masks = self.clip_att(att_feats, att_masks) + + # embed fc and att feats + fc_feats = self.fc_embed(fc_feats) + att_feats = pack_wrapper(self.att_embed, att_feats, att_masks) + p_att_feats = self.ctx2att(att_feats) + + return fc_feats, att_feats, p_att_feats, att_masks + + def get_logprobs_state(self, it, fc_feats, att_feats, p_att_feats, att_masks, state, output_logsoftmax=1): + xt = self.embed(it) + output, state = self.core(xt, p_att_feats, state, att_masks) + if output_logsoftmax: + logprobs = F.log_softmax(self.logit(output), dim=1) + else: + logprobs = self.logit(output) + + output_weight = output.unsqueeze(-1) + attn_map = torch.matmul(p_att_feats, output_weight) + return logprobs, state, attn_map + + def _sample(self, fc_feats, att_feats, att_masks=None): + opt = self.args.__dict__ + sample_n = int(opt.get('sample_n', 1)) + output_logsoftmax = opt.get('output_logsoftmax', 1) + decoding_constraint = opt.get('decoding_constraint', 0) + # import pdb + # pdb.set_trace() + + batch_size = fc_feats.size(0) + + state = [] + p_fc_feats, p_att_feats, pp_att_feats, p_att_masks = self._prepare_feature(fc_feats, att_feats, att_masks) + + seq = fc_feats.new_full((batch_size * sample_n, self.max_seq_length), self.pad_idx, dtype=torch.long) + seqLogprobs = fc_feats.new_zeros(batch_size * sample_n, self.max_seq_length, self.vocab_size + 1) + + for t in range(self.max_seq_length + 1): + if t == 0: # input + it = fc_feats.new_full([batch_size * sample_n], self.bos_idx, dtype=torch.long) + + logprobs, state, attn_map = self.get_logprobs_state(it, p_fc_feats, p_att_feats, pp_att_feats, p_att_masks, state, + output_logsoftmax=output_logsoftmax) + if decoding_constraint and t > 0: + tmp = logprobs.new_zeros(logprobs.size()) + tmp.scatter_(1, seq[:, t - 1].data.unsqueeze(1), float('-inf')) + logprobs = logprobs + tmp + + if t == self.max_seq_length: + break + it, sampleLogprobs = self.sample_next_word(logprobs) + + if t == 0: + unfinished = it != self.eos_idx + else: + it[~unfinished] = self.pad_idx + logprobs = logprobs * unfinished.unsqueeze(1).float() + unfinished = unfinished * (it != self.eos_idx) + seq[:, t] = it + seqLogprobs[:, t] = logprobs + + return seq, seqLogprobs + + def _evaluate(self, fc_feats, att_feats, att_masks=None): + opt = self.args.__dict__ + sample_n = int(opt.get('sample_n', 1)) + output_logsoftmax = opt.get('output_logsoftmax', 1) + decoding_constraint = opt.get('decoding_constraint', 0) + + batch_size = fc_feats.size(0) + state = [] + p_fc_feats, p_att_feats, pp_att_feats, p_att_masks = self._prepare_feature(fc_feats, att_feats, att_masks) + + seq = fc_feats.new_full((batch_size * sample_n, self.max_seq_length), self.pad_idx, dtype=torch.long) + seqLogprobs = fc_feats.new_zeros(batch_size * sample_n, self.max_seq_length, self.vocab_size + 1) + + first_sentence = [] + first_attmap = [] + first_sentence_probs = [] + for t in range(self.max_seq_length + 1): + if t == 0: # input + it = fc_feats.new_full([batch_size * sample_n], self.bos_idx, dtype=torch.long) + + logprobs, state, attn_map = self.get_logprobs_state(it, p_fc_feats, p_att_feats, pp_att_feats, p_att_masks, + state, + output_logsoftmax=output_logsoftmax) + if decoding_constraint and t > 0: + tmp = logprobs.new_zeros(logprobs.size()) + tmp.scatter_(1, seq[:, t - 1].data.unsqueeze(1), float('-inf')) + logprobs = logprobs + tmp + + if t == self.max_seq_length: + break + it, sampleLogprobs = self.sample_next_word(logprobs) + + if t == 0: + unfinished = it != self.eos_idx + else: + it[~unfinished] = self.pad_idx + logprobs = logprobs * unfinished.unsqueeze(1).float() + unfinished = unfinished * (it != self.eos_idx) + seq[:, t] = it + seqLogprobs[:, t] = logprobs + + log_probs = logprobs[0].cpu() + probabilities = np.exp(log_probs) + index = int(it[0].cpu()) + + prob = probabilities[index] + first_attmap.append(attn_map[0]) + first_sentence.append(index) + first_sentence_probs.append(prob) + + if unfinished.sum() == 0: + break + return seq, first_sentence, first_attmap, first_sentence_probs diff --git a/KMVE_RG/modules/Generator_beam.py b/KMVE_RG/modules/Generator_beam.py new file mode 100644 index 0000000000000000000000000000000000000000..af894a1614cb57ff2c48d79e587423f4c2172823 --- /dev/null +++ b/KMVE_RG/modules/Generator_beam.py @@ -0,0 +1,327 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import torch +import torch.nn as nn +import torch.nn.functional as F + + +class CaptionModel(nn.Module): + def __init__(self): + super(CaptionModel, self).__init__() + + def forward(self, *args, **kwargs): + mode = kwargs.get('mode', 'forward') + if 'mode' in kwargs: + del kwargs['mode'] + return getattr(self, '_' + mode)(*args, **kwargs) + + def beam_search(self, init_state, init_logprobs, *args, **kwargs): + + def add_diversity(beam_seq_table, logprobs, t, divm, diversity_lambda, bdash): + local_time = t - divm + unaug_logprobs = logprobs.clone() + batch_size = beam_seq_table[0].shape[0] + + if divm > 0: + change = logprobs.new_zeros(batch_size, logprobs.shape[-1]) + for prev_choice in range(divm): + prev_decisions = beam_seq_table[prev_choice][:, :, local_time] # Nxb + for prev_labels in range(bdash): + change.scatter_add_(1, prev_decisions[:, prev_labels].unsqueeze(-1), + change.new_ones(batch_size, 1)) + + if local_time == 0: + logprobs = logprobs - change * diversity_lambda + else: + logprobs = logprobs - self.repeat_tensor(bdash, change) * diversity_lambda + + return logprobs, unaug_logprobs + + def beam_step(logprobs, unaug_logprobs, beam_size, t, beam_seq, beam_seq_logprobs, beam_logprobs_sum, state): + + batch_size = beam_logprobs_sum.shape[0] + vocab_size = logprobs.shape[-1] + logprobs = logprobs.reshape(batch_size, -1, vocab_size) + if t == 0: + assert logprobs.shape[1] == 1 + beam_logprobs_sum = beam_logprobs_sum[:, :1] + candidate_logprobs = beam_logprobs_sum.unsqueeze(-1) + logprobs + ys, ix = torch.sort(candidate_logprobs.reshape(candidate_logprobs.shape[0], -1), -1, True) + ys, ix = ys[:, :beam_size], ix[:, :beam_size] + beam_ix = ix // vocab_size + selected_ix = ix % vocab_size + state_ix = (beam_ix + torch.arange(batch_size).type_as(beam_ix).unsqueeze(-1) * logprobs.shape[1]).reshape( + -1) + + if t > 0: + assert (beam_seq.gather(1, beam_ix.unsqueeze(-1).expand_as(beam_seq)) == + beam_seq.reshape(-1, beam_seq.shape[-1])[state_ix].view_as(beam_seq)).all() + beam_seq = beam_seq.gather(1, beam_ix.unsqueeze(-1).expand_as(beam_seq)) + + beam_seq_logprobs = beam_seq_logprobs.gather(1, beam_ix.unsqueeze(-1).unsqueeze(-1).expand_as( + beam_seq_logprobs)) + + beam_seq = torch.cat([beam_seq, selected_ix.unsqueeze(-1)], -1) + beam_logprobs_sum = beam_logprobs_sum.gather(1, beam_ix) + \ + logprobs.reshape(batch_size, -1).gather(1, ix) + assert (beam_logprobs_sum == ys).all() + _tmp_beam_logprobs = unaug_logprobs[state_ix].reshape(batch_size, -1, vocab_size) + beam_logprobs = unaug_logprobs.reshape(batch_size, -1, vocab_size).gather(1, + beam_ix.unsqueeze(-1).expand(-1, + -1, + vocab_size)) + assert (_tmp_beam_logprobs == beam_logprobs).all() + beam_seq_logprobs = torch.cat([ + beam_seq_logprobs, + beam_logprobs.reshape(batch_size, -1, 1, vocab_size)], 2) + + new_state = [None for _ in state] + for _ix in range(len(new_state)): + new_state[_ix] = state[_ix][:, state_ix] + state = new_state + return beam_seq, beam_seq_logprobs, beam_logprobs_sum, state + + opt = kwargs['opt'] + temperature = opt.get('temperature', 1) + beam_size = opt.get('beam_size', 10) + group_size = opt.get('group_size', 1) + diversity_lambda = opt.get('diversity_lambda', 0.5) + decoding_constraint = opt.get('decoding_constraint', 0) + suppress_UNK = opt.get('suppress_UNK', 0) + length_penalty = utils.penalty_builder(opt.get('length_penalty', '')) + bdash = beam_size // group_size + + batch_size = init_logprobs.shape[0] + device = init_logprobs.device + beam_seq_table = [torch.LongTensor(batch_size, bdash, 0).to(device) for _ in range(group_size)] + beam_seq_logprobs_table = [torch.FloatTensor(batch_size, bdash, 0, self.vocab_size + 1).to(device) for _ in + range(group_size)] + beam_logprobs_sum_table = [torch.zeros(batch_size, bdash).to(device) for _ in range(group_size)] + + done_beams_table = [[[] for __ in range(group_size)] for _ in range(batch_size)] + state_table = [[_.clone() for _ in init_state] for _ in range(group_size)] + logprobs_table = [init_logprobs.clone() for _ in range(group_size)] + + args = list(args) + args = utils.split_tensors(group_size, args) + if self.__class__.__name__ == 'AttEnsemble': + args = [[[args[j][i][k] for i in range(len(self.models))] for j in range(len(args))] for k in + range(group_size)] + else: + args = [[args[i][j] for i in range(len(args))] for j in range(group_size)] + + for t in range(self.max_seq_length + group_size - 1): + for divm in range(group_size): + if t >= divm and t <= self.max_seq_length + divm - 1: + logprobs = logprobs_table[divm] + if decoding_constraint and t - divm > 0: + logprobs.scatter_(1, beam_seq_table[divm][:, :, t - divm - 1].reshape(-1, 1).to(device), + float('-inf')) + if suppress_UNK and hasattr(self, 'vocab') and self.vocab[str(logprobs.size(1) - 1)] == 'UNK': + logprobs[:, logprobs.size(1) - 1] = logprobs[:, logprobs.size(1) - 1] - 1000 + + logprobs, unaug_logprobs = add_diversity(beam_seq_table, logprobs, t, divm, diversity_lambda, bdash) + + # infer new beams + beam_seq_table[divm], \ + beam_seq_logprobs_table[divm], \ + beam_logprobs_sum_table[divm], \ + state_table[divm] = beam_step(logprobs, + unaug_logprobs, + bdash, + t - divm, + beam_seq_table[divm], + beam_seq_logprobs_table[divm], + beam_logprobs_sum_table[divm], + state_table[divm]) + + for b in range(batch_size): + is_end = beam_seq_table[divm][b, :, t - divm] == self.eos_idx + assert beam_seq_table[divm].shape[-1] == t - divm + 1 + if t == self.max_seq_length + divm - 1: + is_end.fill_(1) + for vix in range(bdash): + if is_end[vix]: + final_beam = { + 'seq': beam_seq_table[divm][b, vix].clone(), + 'logps': beam_seq_logprobs_table[divm][b, vix].clone(), + 'unaug_p': beam_seq_logprobs_table[divm][b, vix].sum().item(), + 'p': beam_logprobs_sum_table[divm][b, vix].item() + } + final_beam['p'] = length_penalty(t - divm + 1, final_beam['p']) + done_beams_table[b][divm].append(final_beam) + beam_logprobs_sum_table[divm][b, is_end] -= 1000 + + + it = beam_seq_table[divm][:, :, t - divm].reshape(-1) + logprobs_table[divm], state_table[divm] = self.get_logprobs_state(it.cuda(), *( + args[divm] + [state_table[divm]])) + logprobs_table[divm] = F.log_softmax(logprobs_table[divm] / temperature, dim=-1) + + done_beams_table = [[sorted(done_beams_table[b][i], key=lambda x: -x['p'])[:bdash] for i in range(group_size)] + for b in range(batch_size)] + done_beams = [sum(_, []) for _ in done_beams_table] + return done_beams + + def old_beam_search(self, init_state, init_logprobs, *args, **kwargs): + + def add_diversity(beam_seq_table, logprobsf, t, divm, diversity_lambda, bdash): + local_time = t - divm + unaug_logprobsf = logprobsf.clone() + for prev_choice in range(divm): + prev_decisions = beam_seq_table[prev_choice][local_time] + for sub_beam in range(bdash): + for prev_labels in range(bdash): + logprobsf[sub_beam][prev_decisions[prev_labels]] = logprobsf[sub_beam][prev_decisions[ + prev_labels]] - diversity_lambda + return unaug_logprobsf + + + def beam_step(logprobsf, unaug_logprobsf, beam_size, t, beam_seq, beam_seq_logprobs, beam_logprobs_sum, state): + + ys, ix = torch.sort(logprobsf, 1, True) + candidates = [] + cols = min(beam_size, ys.size(1)) + rows = beam_size + if t == 0: + rows = 1 + for c in range(cols): + for q in range(rows): + local_logprob = ys[q, c].item() + candidate_logprob = beam_logprobs_sum[q] + local_logprob + candidates.append({'c': ix[q, c], 'q': q, 'p': candidate_logprob, 'r': unaug_logprobsf[q]}) + candidates = sorted(candidates, key=lambda x: -x['p']) + + new_state = [_.clone() for _ in state] + if t >= 1: + beam_seq_prev = beam_seq[:t].clone() + beam_seq_logprobs_prev = beam_seq_logprobs[:t].clone() + for vix in range(beam_size): + v = candidates[vix] + if t >= 1: + beam_seq[:t, vix] = beam_seq_prev[:, v['q']] + beam_seq_logprobs[:t, vix] = beam_seq_logprobs_prev[:, v['q']] + for state_ix in range(len(new_state)): + new_state[state_ix][:, vix] = state[state_ix][:, v['q']] + beam_seq[t, vix] = v['c'] + beam_seq_logprobs[t, vix] = v['r'] + beam_logprobs_sum[vix] = v['p'] + state = new_state + return beam_seq, beam_seq_logprobs, beam_logprobs_sum, state, candidates + + opt = kwargs['opt'] + temperature = opt.get('temperature', 1) + beam_size = opt.get('beam_size', 10) + group_size = opt.get('group_size', 1) + diversity_lambda = opt.get('diversity_lambda', 0.5) + decoding_constraint = opt.get('decoding_constraint', 0) + suppress_UNK = opt.get('suppress_UNK', 0) + length_penalty = utils.penalty_builder(opt.get('length_penalty', '')) + bdash = beam_size // group_size + + # INITIALIZATIONS + beam_seq_table = [torch.LongTensor(self.max_seq_length, bdash).zero_() for _ in range(group_size)] + beam_seq_logprobs_table = [torch.FloatTensor(self.max_seq_length, bdash, self.vocab_size + 1).zero_() for _ in + range(group_size)] + beam_logprobs_sum_table = [torch.zeros(bdash) for _ in range(group_size)] + + done_beams_table = [[] for _ in range(group_size)] + state_table = list(zip(*[_.chunk(group_size, 1) for _ in init_state])) + logprobs_table = list(init_logprobs.chunk(group_size, 0)) + + args = list(args) + if self.__class__.__name__ == 'AttEnsemble': + args = [[_.chunk(group_size) if _ is not None else [None] * group_size for _ in args_] for args_ in + args] + args = [[[args[j][i][k] for i in range(len(self.models))] for j in range(len(args))] for k in + range(group_size)] + else: + args = [_.chunk(group_size) if _ is not None else [None] * group_size for _ in args] + args = [[args[i][j] for i in range(len(args))] for j in range(group_size)] + + for t in range(self.max_seq_length + group_size - 1): + for divm in range(group_size): + if t >= divm and t <= self.max_seq_length + divm - 1: + logprobsf = logprobs_table[divm].float() + if decoding_constraint and t - divm > 0: + logprobsf.scatter_(1, beam_seq_table[divm][t - divm - 1].unsqueeze(1).cuda(), float('-inf')) + if suppress_UNK and hasattr(self, 'vocab') and self.vocab[str(logprobsf.size(1) - 1)] == 'UNK': + logprobsf[:, logprobsf.size(1) - 1] = logprobsf[:, logprobsf.size(1) - 1] - 1000 + + unaug_logprobsf = add_diversity(beam_seq_table, logprobsf, t, divm, diversity_lambda, bdash) + + beam_seq_table[divm], \ + beam_seq_logprobs_table[divm], \ + beam_logprobs_sum_table[divm], \ + state_table[divm], \ + candidates_divm = beam_step(logprobsf, + unaug_logprobsf, + bdash, + t - divm, + beam_seq_table[divm], + beam_seq_logprobs_table[divm], + beam_logprobs_sum_table[divm], + state_table[divm]) + + for vix in range(bdash): + if beam_seq_table[divm][t - divm, vix] == self.eos_idx or t == self.max_seq_length + divm - 1: + final_beam = { + 'seq': beam_seq_table[divm][:, vix].clone(), + 'logps': beam_seq_logprobs_table[divm][:, vix].clone(), + 'unaug_p': beam_seq_logprobs_table[divm][:, vix].sum().item(), + 'p': beam_logprobs_sum_table[divm][vix].item() + } + final_beam['p'] = length_penalty(t - divm + 1, final_beam['p']) + done_beams_table[divm].append(final_beam) + beam_logprobs_sum_table[divm][vix] = -1000 + + + it = beam_seq_table[divm][t - divm] + logprobs_table[divm], state_table[divm] = self.get_logprobs_state(it.cuda(), *( + args[divm] + [state_table[divm]])) + logprobs_table[divm] = F.log_softmax(logprobs_table[divm] / temperature, dim=-1) + + done_beams_table = [sorted(done_beams_table[i], key=lambda x: -x['p'])[:bdash] for i in range(group_size)] + done_beams = sum(done_beams_table, []) + return done_beams + + def sample_next_word(self, logprobs, sample_method, temperature): + if sample_method == 'greedy': + sampleLogprobs, it = torch.max(logprobs.data, 1) + it = it.view(-1).long() + elif sample_method == 'gumbel': + def sample_gumbel(shape, eps=1e-20): + U = torch.rand(shape).cuda() + return -torch.log(-torch.log(U + eps) + eps) + + def gumbel_softmax_sample(logits, temperature): + y = logits + sample_gumbel(logits.size()) + return F.log_softmax(y / temperature, dim=-1) + + _logprobs = gumbel_softmax_sample(logprobs, temperature) + _, it = torch.max(_logprobs.data, 1) + sampleLogprobs = logprobs.gather(1, it.unsqueeze(1)) + else: + logprobs = logprobs / temperature + if sample_method.startswith('top'): + top_num = float(sample_method[3:]) + if 0 < top_num < 1: + probs = F.softmax(logprobs, dim=1) + sorted_probs, sorted_indices = torch.sort(probs, descending=True, dim=1) + _cumsum = sorted_probs.cumsum(1) + mask = _cumsum < top_num + mask = torch.cat([torch.ones_like(mask[:, :1]), mask[:, :-1]], 1) + sorted_probs = sorted_probs * mask.float() + sorted_probs = sorted_probs / sorted_probs.sum(1, keepdim=True) + logprobs.scatter_(1, sorted_indices, sorted_probs.log()) + else: + the_k = int(top_num) + tmp = torch.empty_like(logprobs).fill_(float('-inf')) + topk, indices = torch.topk(logprobs, the_k, dim=1) + tmp = tmp.scatter(1, indices, topk) + logprobs = tmp + it = torch.distributions.Categorical(logits=logprobs.detach()).sample() + sampleLogprobs = logprobs.gather(1, it.unsqueeze(1)) # gather the logprobs at sampled positions + return it, sampleLogprobs diff --git a/KMVE_RG/modules/__init__.py b/KMVE_RG/modules/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/KMVE_RG/modules/__pycache__/Caption.cpython-310.pyc b/KMVE_RG/modules/__pycache__/Caption.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9dd7169f907150a2a2dde1fa9eca0333e19692d1 Binary files /dev/null and b/KMVE_RG/modules/__pycache__/Caption.cpython-310.pyc differ diff --git a/KMVE_RG/modules/__pycache__/Caption.cpython-38.pyc b/KMVE_RG/modules/__pycache__/Caption.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b6120ebefa9df4d66929ac500519d18967f6eae Binary files /dev/null and b/KMVE_RG/modules/__pycache__/Caption.cpython-38.pyc differ diff --git a/KMVE_RG/modules/__pycache__/Generator.cpython-310.pyc b/KMVE_RG/modules/__pycache__/Generator.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1dad4c9964658ed3379af6851ab32d242e30d2a1 Binary files /dev/null and b/KMVE_RG/modules/__pycache__/Generator.cpython-310.pyc differ diff --git a/KMVE_RG/modules/__pycache__/Generator.cpython-38.pyc b/KMVE_RG/modules/__pycache__/Generator.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e3ef43c8935f067bd35be4916c52b7ad6192669 Binary files /dev/null and b/KMVE_RG/modules/__pycache__/Generator.cpython-38.pyc differ diff --git a/KMVE_RG/modules/__pycache__/__init__.cpython-310.pyc b/KMVE_RG/modules/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53ee4ff6c2f763f8ef078080299029f39e672ffd Binary files /dev/null and b/KMVE_RG/modules/__pycache__/__init__.cpython-310.pyc differ diff --git a/KMVE_RG/modules/__pycache__/__init__.cpython-38.pyc b/KMVE_RG/modules/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0cfce8f02b464123c65170b8f3195bc738846e5 Binary files /dev/null and b/KMVE_RG/modules/__pycache__/__init__.cpython-38.pyc differ diff --git a/KMVE_RG/modules/__pycache__/datasets.cpython-310.pyc b/KMVE_RG/modules/__pycache__/datasets.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b680a02a709c68888a97cbd5b34ac8f777be602a Binary files /dev/null and b/KMVE_RG/modules/__pycache__/datasets.cpython-310.pyc differ diff --git a/KMVE_RG/modules/__pycache__/datasets.cpython-38.pyc b/KMVE_RG/modules/__pycache__/datasets.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0414b659c51384b3a1bd495cab5c2ee453acfd5b Binary files /dev/null and b/KMVE_RG/modules/__pycache__/datasets.cpython-38.pyc differ diff --git a/KMVE_RG/modules/__pycache__/encoder_decoder.cpython-310.pyc b/KMVE_RG/modules/__pycache__/encoder_decoder.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a760f7676518ce953a5d99efbf08c7cfdf19a47f Binary files /dev/null and b/KMVE_RG/modules/__pycache__/encoder_decoder.cpython-310.pyc differ diff --git a/KMVE_RG/modules/__pycache__/encoder_decoder.cpython-38.pyc b/KMVE_RG/modules/__pycache__/encoder_decoder.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b677eea8cb47382fe03556aeb88fcd386898c727 Binary files /dev/null and b/KMVE_RG/modules/__pycache__/encoder_decoder.cpython-38.pyc differ diff --git a/KMVE_RG/modules/__pycache__/metrics.cpython-310.pyc b/KMVE_RG/modules/__pycache__/metrics.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cda67c8f228150f9e4773e52eebf0ac317a9e842 Binary files /dev/null and b/KMVE_RG/modules/__pycache__/metrics.cpython-310.pyc differ diff --git a/KMVE_RG/modules/__pycache__/new_model_utils.cpython-310.pyc b/KMVE_RG/modules/__pycache__/new_model_utils.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a050ebc095e90ea69e08badc87e43a39d0345dc6 Binary files /dev/null and b/KMVE_RG/modules/__pycache__/new_model_utils.cpython-310.pyc differ diff --git a/KMVE_RG/modules/__pycache__/new_model_utils.cpython-38.pyc b/KMVE_RG/modules/__pycache__/new_model_utils.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c5724a6d61f85d151a5660251eedd2595d39ae1 Binary files /dev/null and b/KMVE_RG/modules/__pycache__/new_model_utils.cpython-38.pyc differ diff --git a/KMVE_RG/modules/__pycache__/tokenizers.cpython-310.pyc b/KMVE_RG/modules/__pycache__/tokenizers.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc4c003e5573c103698965703fbcf1f743d2fc90 Binary files /dev/null and b/KMVE_RG/modules/__pycache__/tokenizers.cpython-310.pyc differ diff --git a/KMVE_RG/modules/__pycache__/tools.cpython-310.pyc b/KMVE_RG/modules/__pycache__/tools.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d631ef5c9665158614225d88d4421fb42d3a917 Binary files /dev/null and b/KMVE_RG/modules/__pycache__/tools.cpython-310.pyc differ diff --git a/KMVE_RG/modules/__pycache__/tools.cpython-38.pyc b/KMVE_RG/modules/__pycache__/tools.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..004ddbd631246f7923d5849c0f9c3e8bf9cf7733 Binary files /dev/null and b/KMVE_RG/modules/__pycache__/tools.cpython-38.pyc differ diff --git a/KMVE_RG/modules/__pycache__/utils.cpython-38.pyc b/KMVE_RG/modules/__pycache__/utils.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9067248c994dfbe5c9dd6cbfea49c425fe0514f1 Binary files /dev/null and b/KMVE_RG/modules/__pycache__/utils.cpython-38.pyc differ diff --git a/KMVE_RG/modules/__pycache__/visual_extractor.cpython-310.pyc b/KMVE_RG/modules/__pycache__/visual_extractor.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d0e663e9e9eca80e8f6394ee9299f04386cfd87 Binary files /dev/null and b/KMVE_RG/modules/__pycache__/visual_extractor.cpython-310.pyc differ diff --git a/KMVE_RG/modules/__pycache__/visual_extractor.cpython-38.pyc b/KMVE_RG/modules/__pycache__/visual_extractor.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..351d287c0f6f7b4c3060fa36b31f4ba071a5ec01 Binary files /dev/null and b/KMVE_RG/modules/__pycache__/visual_extractor.cpython-38.pyc differ diff --git a/KMVE_RG/modules/datasets.py b/KMVE_RG/modules/datasets.py new file mode 100644 index 0000000000000000000000000000000000000000..b6fafbd773f7f38f49475298ec4dd99fcdff7d33 --- /dev/null +++ b/KMVE_RG/modules/datasets.py @@ -0,0 +1,47 @@ +import os +import json + +import torch +from PIL import Image +from torch.utils.data import Dataset + + +class BaseDataset(Dataset): + def __init__(self, args, tokenizer, split, transform=None): + self.image_dir = args.image_dir + self.ann_path = args.ann_path + self.max_seq_length = args.max_seq_length + self.split = split + self.tokenizer = tokenizer + self.transform = transform + self.ann = json.loads(open(self.ann_path, 'r', encoding="utf_8_sig").read()) + + self.examples = self.ann[self.split] + for i in range(len(self.examples)): + self.examples[i]['ids'] = tokenizer(self.examples[i]['finding'])[:self.max_seq_length] + self.examples[i]['mask'] = [1] * len(self.examples[i]['ids']) + + def __len__(self): + return len(self.examples) + + +class MyDataset(BaseDataset): + def __getitem__(self, idx): + example = self.examples[idx] + image_id = example['uid'] + image_path = example['image_path'] + image_1 = Image.open(os.path.join(self.image_dir, image_path[0])).convert('RGB') + image_2 = Image.open(os.path.join(self.image_dir, image_path[1])).convert('RGB') + if self.transform is not None: + image_1 = self.transform(image_1) + image_2 = self.transform(image_2) + image = torch.stack((image_1, image_2), 0) + report_ids = example['ids'] + report_masks = example['mask'] + mesh_label = example['labels'] + seq_length = len(report_ids) + sample = (image_id, image, report_ids, report_masks, seq_length, mesh_label) + return sample + + + diff --git a/KMVE_RG/modules/encoder_decoder.py b/KMVE_RG/modules/encoder_decoder.py new file mode 100644 index 0000000000000000000000000000000000000000..d3058a088a84f2f17a3943d70c02c2de2efaacf6 --- /dev/null +++ b/KMVE_RG/modules/encoder_decoder.py @@ -0,0 +1,260 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import copy +import math + +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F + +from .Generator import pack_wrapper, GenModel + + +def clones(module, N): + return nn.ModuleList([copy.deepcopy(module) for _ in range(N)]) + + +def attention(query, key, value, mask=None, dropout=None): + d_k = query.size(-1) + scores = torch.matmul(query, key.transpose(-2, -1)) / math.sqrt(d_k) + if mask is not None: + scores = scores.masked_fill(mask == 0, -1e9) + p_attn = F.softmax(scores, dim=-1) + if dropout is not None: + p_attn = dropout(p_attn) + return torch.matmul(p_attn, value), p_attn + + +def subsequent_mask(size): + attn_shape = (1, size, size) + subsequent_mask = np.triu(np.ones(attn_shape), k=1).astype('uint8') + return torch.from_numpy(subsequent_mask) == 0 + + +class Transformer(nn.Module): + def __init__(self, encoder, decoder, src_embed, tgt_embed): + super(Transformer, self).__init__() + self.encoder = encoder + self.decoder = decoder + self.src_embed = src_embed + self.tgt_embed = tgt_embed + + def forward(self, src, tgt, src_mask, tgt_mask): + return self.decode(self.encode(src, src_mask), src_mask, tgt, tgt_mask) + + def encode(self, src, src_mask): + return self.encoder(self.src_embed(src), src_mask) + + def decode(self, hidden_states, src_mask, tgt, tgt_mask): + memory = None + return self.decoder(self.tgt_embed(tgt), hidden_states, src_mask, tgt_mask, memory) + + +class Encoder(nn.Module): + def __init__(self, layer, N): + super(Encoder, self).__init__() + self.layers = clones(layer, N) + self.norm = LayerNorm(layer.d_model) + + def forward(self, x, mask): + for layer in self.layers: + x = layer(x, mask) + return self.norm(x) + + +class EncoderLayer(nn.Module): + def __init__(self, d_model, self_attn, feed_forward, dropout): + super(EncoderLayer, self).__init__() + self.self_attn = self_attn + self.feed_forward = feed_forward + self.sublayer = clones(SublayerConnection(d_model, dropout), 2) + self.d_model = d_model # 512 + + def forward(self, x, mask): + x = self.sublayer[0](x, lambda x: self.self_attn(x, x, x, mask)) + return self.sublayer[1](x, self.feed_forward) + + +class SublayerConnection(nn.Module): + def __init__(self, d_model, dropout): + super(SublayerConnection, self).__init__() + self.norm = LayerNorm(d_model) + self.dropout = nn.Dropout(dropout) + + def forward(self, x, sublayer): + return x + self.dropout(sublayer(self.norm(x))) + + +class LayerNorm(nn.Module): + def __init__(self, features, eps=1e-6): + super(LayerNorm, self).__init__() + self.gamma = nn.Parameter(torch.ones(features)) + self.beta = nn.Parameter(torch.zeros(features)) + self.eps = eps + + def forward(self, x): + mean = x.mean(-1, keepdim=True) + std = x.std(-1, keepdim=True) + return self.gamma * (x - mean) / (std + self.eps) + self.beta + + +class Decoder(nn.Module): + def __init__(self, layer, N): + super(Decoder, self).__init__() + self.layers = clones(layer, N) + self.norm = LayerNorm(layer.d_model) + + def forward(self, x, hidden_states, src_mask, tgt_mask, memory): + for layer in self.layers: + x = layer(x, hidden_states, src_mask, tgt_mask, memory) + return self.norm(x) + + +class DecoderLayer(nn.Module): + def __init__(self, d_model, self_attn, src_attn, feed_forward, dropout): + super(DecoderLayer, self).__init__() + self.d_model = d_model # 512 + self.self_attn = self_attn + self.src_attn = src_attn + self.feed_forward = feed_forward + self.sublayer = clones(SublayerConnection(d_model, dropout), 3) + + def forward(self, x, hidden_states, src_mask, tgt_mask, memory): + m = hidden_states + x = self.sublayer[0](x, lambda x: self.self_attn(x, x, x, tgt_mask)) + x = self.sublayer[1](x, lambda x: self.src_attn(x, m, m, src_mask)) + return self.sublayer[2](x, self.feed_forward) + + +class MultiHeadedAttention(nn.Module): + def __init__(self, h, d_model, dropout=0.1): + super(MultiHeadedAttention, self).__init__() + assert d_model % h == 0 + self.d_k = d_model // h + self.h = h + self.linears = clones(nn.Linear(d_model, d_model), 4) + self.attn = None + self.dropout = nn.Dropout(p=dropout) + + def forward(self, query, key, value, mask=None): + if mask is not None: + mask = mask.unsqueeze(1) + nbatches = query.size(0) + query, key, value = [l(x).view(nbatches, -1, self.h, self.d_k).transpose(1, 2) + for l, x in zip(self.linears, (query, key, value))] + + x, self.attn = attention(query, key, value, mask=mask, dropout=self.dropout) + x = x.transpose(1, 2).contiguous().view(nbatches, -1, self.h * self.d_k) + return self.linears[-1](x) + + +class PositionwiseFeedForward(nn.Module): + def __init__(self, d_model, d_ff, dropout=0.1): + super(PositionwiseFeedForward, self).__init__() + self.w_1 = nn.Linear(d_model, d_ff) + self.w_2 = nn.Linear(d_ff, d_model) + self.dropout = nn.Dropout(dropout) + + def forward(self, x): + return self.w_2(self.dropout(F.relu(self.w_1(x)))) + + +class Embeddings(nn.Module): + def __init__(self, d_model, vocab): + super(Embeddings, self).__init__() + self.lut = nn.Embedding(vocab, d_model) + self.d_model = d_model + + def forward(self, x): + return self.lut(x) * math.sqrt(self.d_model) + + +class PositionalEncoding(nn.Module): + def __init__(self, d_model, dropout, max_len=5000): + super(PositionalEncoding, self).__init__() + self.dropout = nn.Dropout(p=dropout) + + pe = torch.zeros(max_len, d_model) + position = torch.arange(0, max_len).unsqueeze(1).float() + div_term = torch.exp(torch.arange(0, d_model, 2).float() * + -(math.log(10000.0) / d_model)) + pe[:, 0::2] = torch.sin(position * div_term) + pe[:, 1::2] = torch.cos(position * div_term) + pe = pe.unsqueeze(0) + self.register_buffer('pe', pe) + + def forward(self, x): + x = x + self.pe[:, :x.size(1)] + return self.dropout(x) + + +class EncoderDecoder(GenModel): + + def make_model(self, tgt_vocab): + c = copy.deepcopy + attn = MultiHeadedAttention(self.num_heads, self.d_model) + ff = PositionwiseFeedForward(self.d_model, self.d_ff, self.dropout) + position = PositionalEncoding(self.d_model, self.dropout) + model = Transformer( + Encoder(EncoderLayer(self.d_model, c(attn), c(ff), self.dropout), self.num_layers), + Decoder( + DecoderLayer(self.d_model, c(attn), c(attn), c(ff), self.dropout), + self.num_layers), + lambda x: x, + nn.Sequential(Embeddings(self.d_model, tgt_vocab), c(position))) + for p in model.parameters(): + if p.dim() > 1: + nn.init.xavier_uniform_(p) + return model + + def __init__(self, args, tokenizer): + super(EncoderDecoder, self).__init__(args, tokenizer) + self.args = args + self.num_layers = args.num_layers + self.d_model = args.d_model + self.d_ff = args.d_ff + self.num_heads = args.num_heads + self.dropout = args.dropout + self.vocab_size = tokenizer.get_vocab_size() + tgt_vocab = self.vocab_size + 1 + self.model = self.make_model(tgt_vocab) + self.logit = nn.Linear(args.d_model, tgt_vocab) + + def _prepare_feature(self, fc_feats, att_feats, att_masks): + att_feats, seq, att_masks, seq_mask = self._prepare_feature_forward(att_feats, att_masks) + memory = self.model.encode(att_feats, att_masks) + return fc_feats[..., :1], att_feats[..., :1], memory, att_masks + + def _prepare_feature_forward(self, att_feats, att_masks=None, seq=None): + att_feats, att_masks = self.clip_att(att_feats, att_masks) + att_feats = pack_wrapper(self.att_embed, att_feats, att_masks) + + if att_masks is None: + att_masks = att_feats.new_ones(att_feats.shape[:2], dtype=torch.long) + att_masks = att_masks.unsqueeze(-2) + if seq is not None: + seq = seq[:, :-1] + seq_mask = (seq.data > 0) + seq_mask[:, 0] += True + seq_mask = seq_mask.unsqueeze(-2) + seq_mask = seq_mask & subsequent_mask(seq.size(-1)).to(seq_mask) + else: + seq_mask = None + return att_feats, seq, att_masks, seq_mask + + def _forward(self, fc_feats, att_feats, seq, att_masks=None): + att_feats, seq, att_masks, seq_mask = self._prepare_feature_forward(att_feats, att_masks, seq) + out = self.model(att_feats, seq, att_masks, seq_mask) + outputs = F.log_softmax(self.logit(out), dim=-1) + return outputs, out + + def core(self, it, memory, state, mask): + if len(state) == 0: + ys = it.unsqueeze(1) + else: + ys = torch.cat([state[0][0], it.unsqueeze(1)], dim=1) + out = self.model.decode(memory, mask, ys, subsequent_mask(ys.size(1)).to(memory.device)) + return out[:, -1], [ys.unsqueeze(0)] diff --git a/KMVE_RG/modules/metrics.py b/KMVE_RG/modules/metrics.py new file mode 100644 index 0000000000000000000000000000000000000000..beeb8a74873833091f4a23d4f1ecca5e492fc92e --- /dev/null +++ b/KMVE_RG/modules/metrics.py @@ -0,0 +1,64 @@ +from sklearn.metrics import roc_auc_score, f1_score, recall_score, precision_score +from KMVE_RG.modules.pycocoevalcap.bleu.bleu import Bleu +from KMVE_RG.modules.pycocoevalcap.meteor import Meteor +from KMVE_RG.modules.pycocoevalcap.rouge import Rouge + + +def compute_scores(gts, res): + """ + Performs the MS COCO evaluation using the Python 3 implementation (https://github.com/salaniz/pycocoevalcap) + + :param gts: Dictionary with the image ids and their gold captions, + :param res: Dictionary with the image ids ant their generated captions + :print: Evaluation score (the mean of the scores of all the instances) for each measure + """ + + # Set up scorers + scorers = [ + (Bleu(4), ["BLEU_1", "BLEU_2", "BLEU_3", "BLEU_4"]), + (Meteor(), "METEOR"), + (Rouge(), "ROUGE_L") + ] + eval_res = {} + # Compute score for each metric + for scorer, method in scorers: + try: + score, scores = scorer.compute_score(gts, res, verbose=0) + except TypeError: + score, scores = scorer.compute_score(gts, res) + if type(method) == list: + for sc, m in zip(score, method): + eval_res[m] = sc + else: + eval_res[method] = score + return eval_res + + +def compute_mlc(gt, pred, label_set): + res_mlc = {} + avg_aucroc = 0 + for i, label in enumerate(label_set): + res_mlc['AUCROC_' + label] = roc_auc_score(gt[:, i], pred[:, i]) + avg_aucroc += res_mlc['AUCROC_' + label] + res_mlc['AVG_AUCROC'] = avg_aucroc / len(label_set) + + res_mlc['F1_MACRO'] = f1_score(gt, pred, average="macro") + res_mlc['F1_MICRO'] = f1_score(gt, pred, average="micro") + res_mlc['RECALL_MACRO'] = recall_score(gt, pred, average="macro") + res_mlc['RECALL_MICRO'] = recall_score(gt, pred, average="micro") + res_mlc['PRECISION_MACRO'] = precision_score(gt, pred, average="macro") + res_mlc['PRECISION_MICRO'] = precision_score(gt, pred, average="micro") + + return res_mlc + + +class MetricWrapper(object): + def __init__(self, label_set): + self.label_set = label_set + + def __call__(self, gts, res, gts_mlc, res_mlc): + eval_res = compute_scores(gts, res) + eval_res_mlc = compute_mlc(gts_mlc, res_mlc, self.label_set) + + eval_res.update(**eval_res_mlc) + return eval_res diff --git a/KMVE_RG/modules/new_model_utils.py b/KMVE_RG/modules/new_model_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..19b2e06fa6b72b636a9526992229ca94e52891ec --- /dev/null +++ b/KMVE_RG/modules/new_model_utils.py @@ -0,0 +1,61 @@ +import torch +import torch.nn as nn +from torch.nn import functional as F + + +class SemanticEmbedding(nn.Module): + def __init__(self, args, mesh_dim=71, report_dim=761, embed_size=512): + super(SemanticEmbedding, self).__init__() + self.mesh_tf = nn.Sequential( + nn.Linear(embed_size, embed_size // 2), + nn.ReLU(inplace=True), + nn.Linear(embed_size // 2, embed_size // 4), + nn.ReLU(inplace=True), + nn.Linear(embed_size // 4, mesh_dim) + ) + + self.report_tf = nn.Sequential( + nn.Linear(embed_size, embed_size // 2), + nn.ReLU(inplace=True), + nn.Linear(embed_size // 2, embed_size // 4), + nn.ReLU(inplace=True), + nn.Linear(embed_size // 4, report_dim) + ) + self.bn = nn.BatchNorm1d(num_features=embed_size, momentum=0.1) + self.w1 = nn.Linear(in_features=mesh_dim + report_dim, out_features=embed_size) + self.w2 = nn.Linear(in_features=embed_size, out_features=embed_size) + self.relu = nn.ReLU() + self.logit = nn.Linear(60, 31) + self.dropout = nn.Dropout(0.2) + self.__init_weight() + self.target_dim = 60 + self.sigm = nn.Sigmoid() + + def __init_weight(self): + self.w1.weight.data.uniform_(-0.1, 0.1) + self.w1.bias.data.fill_(0) + self.w2.weight.data.uniform_(-0.1, 0.1) + self.w2.bias.data.fill_(0) + + def forward(self, avg, pred_output): + avg_visual = avg.unsqueeze(1) + pred_output2 = F.pad(pred_output, (0, 0, 0, self.target_dim - pred_output.shape[1]), 'constant', 0) + pred = pred_output2.permute(0, 2, 1) + visual_text = torch.matmul(avg_visual, pred).squeeze(1) + outputs = self.sigm(self.logit(visual_text)) + return outputs + + +class classfication(nn.Module): + def __init__(self, distiller_num, avg_dim=1024): + super(classfication, self).__init__() + self.logit = nn.Linear(avg_dim, distiller_num) + self.relu = nn.ReLU() + self.sigm = nn.Sigmoid() + self.dropout = nn.Dropout(0.5) + + def forward(self, avg): + avg_visual = self.dropout(avg) + x = self.logit(avg_visual) + outputs = self.sigm(x) + return outputs diff --git a/KMVE_RG/modules/pycocoevalcap/README.md b/KMVE_RG/modules/pycocoevalcap/README.md new file mode 100644 index 0000000000000000000000000000000000000000..942de18171e9c5e9dad3adcaf28419de218a31e6 --- /dev/null +++ b/KMVE_RG/modules/pycocoevalcap/README.md @@ -0,0 +1,23 @@ +Microsoft COCO Caption Evaluation Tools
+--- + +Modified the code to work with Python 3.
+ +### Requirements +* Python 3.x +* Java 1.8 +* pycocotools + +--- + +### Tested on +* Windows 10, Python 3.5. + +--- +### To fix Windows JVM memory error:
+Add the following in System Variables
+    Variable name : _JAVA_OPTIONS
+    Variable value : -Xmx1024M
+ +--- +Original code : https://github.com/tylin/coco-caption
diff --git a/KMVE_RG/modules/pycocoevalcap/__init__.py b/KMVE_RG/modules/pycocoevalcap/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/KMVE_RG/modules/pycocoevalcap/__pycache__/__init__.cpython-310.pyc b/KMVE_RG/modules/pycocoevalcap/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e81a2bfe8acbb8244f79e54522df3a19e95c12ea Binary files /dev/null and b/KMVE_RG/modules/pycocoevalcap/__pycache__/__init__.cpython-310.pyc differ diff --git a/KMVE_RG/modules/pycocoevalcap/bleu/LICENSE b/KMVE_RG/modules/pycocoevalcap/bleu/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..9ccf677900b5238062979c7bc1e7102e501e0be4 --- /dev/null +++ b/KMVE_RG/modules/pycocoevalcap/bleu/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015 Xinlei Chen, Hao Fang, Tsung-Yi Lin, and Ramakrishna Vedantam + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/KMVE_RG/modules/pycocoevalcap/bleu/__init__.py b/KMVE_RG/modules/pycocoevalcap/bleu/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..680063e9fa3f9a30d61b4e7ff7a337b7637ee7fd --- /dev/null +++ b/KMVE_RG/modules/pycocoevalcap/bleu/__init__.py @@ -0,0 +1 @@ +__author__ = 'tylin' \ No newline at end of file diff --git a/KMVE_RG/modules/pycocoevalcap/bleu/__pycache__/__init__.cpython-310.pyc b/KMVE_RG/modules/pycocoevalcap/bleu/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c9e23d5f853a0b975c3253cf7f77f2bea2d8504 Binary files /dev/null and b/KMVE_RG/modules/pycocoevalcap/bleu/__pycache__/__init__.cpython-310.pyc differ diff --git a/KMVE_RG/modules/pycocoevalcap/bleu/__pycache__/bleu.cpython-310.pyc b/KMVE_RG/modules/pycocoevalcap/bleu/__pycache__/bleu.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54b2cb7d97d3537a4acac0fda3a7474220b6d418 Binary files /dev/null and b/KMVE_RG/modules/pycocoevalcap/bleu/__pycache__/bleu.cpython-310.pyc differ diff --git a/KMVE_RG/modules/pycocoevalcap/bleu/__pycache__/bleu_scorer.cpython-310.pyc b/KMVE_RG/modules/pycocoevalcap/bleu/__pycache__/bleu_scorer.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a77079986de556cfa85f710d437c40c2dae7319a Binary files /dev/null and b/KMVE_RG/modules/pycocoevalcap/bleu/__pycache__/bleu_scorer.cpython-310.pyc differ diff --git a/KMVE_RG/modules/pycocoevalcap/bleu/bleu.py b/KMVE_RG/modules/pycocoevalcap/bleu/bleu.py new file mode 100644 index 0000000000000000000000000000000000000000..6cc7bbecb7986d8e038a3156cf0df36aa3acbac6 --- /dev/null +++ b/KMVE_RG/modules/pycocoevalcap/bleu/bleu.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python +# +# File Name : bleu.py +# +# Description : Wrapper for BLEU scorer. +# +# Creation Date : 06-01-2015 +# Last Modified : Thu 19 Mar 2015 09:13:28 PM PDT +# Authors : Hao Fang and Tsung-Yi Lin + +# Last modified : Wed 22 May 2019 08:10:00 PM EDT +# By Sabarish Sivanath +# To support Python 3 + +from .bleu_scorer import BleuScorer + + +class Bleu: + def __init__(self, n=4): + # default compute Blue score up to 4 + self._n = n + self._hypo_for_image = {} + self.ref_for_image = {} + + def compute_score(self, gts, res, score_option='closest', verbose=1): + ''' + Inputs: + gts - ground truths + res - predictions + score_option - {shortest, closest, average} + verbose - 1 or 0 + Outputs: + Blue scores + ''' + assert (gts.keys() == res.keys()) + imgIds = gts.keys() + + bleu_scorer = BleuScorer(n=self._n) + for id in imgIds: + hypo = res[id] + ref = gts[id] + + # Sanity check. + assert (type(hypo) is list) + assert (len(hypo) == 1) + assert (type(ref) is list) + # assert(len(ref) >= 1) + + bleu_scorer += (hypo[0], ref) + + score, scores = bleu_scorer.compute_score(option=score_option, verbose=verbose) + + # return (bleu, bleu_info) + return score, scores + + def method(self): + return "Bleu" diff --git a/KMVE_RG/modules/pycocoevalcap/bleu/bleu_scorer.py b/KMVE_RG/modules/pycocoevalcap/bleu/bleu_scorer.py new file mode 100644 index 0000000000000000000000000000000000000000..d5646aae12c24c6b0e9e104c8c09e6aa3645f396 --- /dev/null +++ b/KMVE_RG/modules/pycocoevalcap/bleu/bleu_scorer.py @@ -0,0 +1,268 @@ +# bleu_scorer.py +# David Chiang + +# Copyright (c) 2004-2006 University of Maryland. All rights +# reserved. Do not redistribute without permission from the +# author. Not for commercial use. + +# Modified by: +# Hao Fang +# Tsung-Yi Lin + +# Last modified : Wed 22 May 2019 08:10:00 PM EDT +# By Sabarish Sivanath +# To support Python 3 + +'''Provides: +cook_refs(refs, n=4): Transform a list of reference sentences as strings into a form usable by cook_test(). +cook_test(test, refs, n=4): Transform a test sentence as a string (together with the cooked reference sentences) into a form usable by score_cooked(). +''' + +import copy +import sys, math, re +from collections import defaultdict + +def precook(s, n=4, out=False): + """Takes a string as input and returns an object that can be given to + either cook_refs or cook_test. This is optional: cook_refs and cook_test + can take string arguments as well.""" + words = s.split() + counts = defaultdict(int) + for k in range(1,n+1): + for i in range(len(words)-k+1): + ngram = tuple(words[i:i+k]) + counts[ngram] += 1 + return (len(words), counts) + +def cook_refs(refs, eff=None, n=4): ## lhuang: oracle will call with "average" + '''Takes a list of reference sentences for a single segment + and returns an object that encapsulates everything that BLEU + needs to know about them.''' + + reflen = [] + maxcounts = {} + for ref in refs: + rl, counts = precook(ref, n) + reflen.append(rl) + for (ngram,count) in counts.items(): + maxcounts[ngram] = max(maxcounts.get(ngram,0), count) + + # Calculate effective reference sentence length. + if eff == "shortest": + reflen = min(reflen) + elif eff == "average": + reflen = float(sum(reflen))/len(reflen) + + ## lhuang: N.B.: leave reflen computaiton to the very end!! + + ## lhuang: N.B.: in case of "closest", keep a list of reflens!! (bad design) + + return (reflen, maxcounts) + +def cook_test(test, refs , eff=None, n=4): + '''Takes a test sentence and returns an object that + encapsulates everything that BLEU needs to know about it.''' + + reflen = refs[0] + refmaxcounts = refs[1] + + testlen, counts = precook(test, n, True) + + result = {} + + # Calculate effective reference sentence length. + + if eff == "closest": + result["reflen"] = min((abs(l-testlen), l) for l in reflen)[1] + else: ## i.e., "average" or "shortest" or None + result["reflen"] = reflen + + result["testlen"] = testlen + + result["guess"] = [max(0,testlen-k+1) for k in range(1,n+1)] + + result['correct'] = [0]*n + for (ngram, count) in counts.items(): + result["correct"][len(ngram)-1] += min(refmaxcounts.get(ngram,0), count) + + return result + +class BleuScorer(object): + """Bleu scorer. + """ + + __slots__ = "n", "crefs", "ctest", "_score", "_ratio", "_testlen", "_reflen", "special_reflen" + # special_reflen is used in oracle (proportional effective ref len for a node). + + def copy(self): + ''' copy the refs.''' + new = BleuScorer(n=self.n) + new.ctest = copy.copy(self.ctest) + new.crefs = copy.copy(self.crefs) + new._score = None + return new + + def __init__(self, test=None, refs=None, n=4, special_reflen=None): + ''' singular instance ''' + + self.n = n + self.crefs = [] + self.ctest = [] + self.cook_append(test, refs) + self.special_reflen = special_reflen + + def cook_append(self, test, refs): + '''called by constructor and __iadd__ to avoid creating new instances.''' + + if refs is not None: + self.crefs.append(cook_refs(refs)) + if test is not None: + cooked_test = cook_test(test, self.crefs[-1]) + self.ctest.append(cooked_test) ## N.B.: -1 + else: + self.ctest.append(None) # lens of crefs and ctest have to match + + self._score = None ## need to recompute + + def ratio(self, option=None): + self.compute_score(option=option) + return self._ratio + + def score_ratio(self, option=None): + '''return (bleu, len_ratio) pair''' + return (self.fscore(option=option), self.ratio(option=option)) + + def score_ratio_str(self, option=None): + return "%.4f (%.2f)" % self.score_ratio(option) + + def reflen(self, option=None): + self.compute_score(option=option) + return self._reflen + + def testlen(self, option=None): + self.compute_score(option=option) + return self._testlen + + def retest(self, new_test): + if type(new_test) is str: + new_test = [new_test] + assert len(new_test) == len(self.crefs), new_test + self.ctest = [] + for t, rs in zip(new_test, self.crefs): + self.ctest.append(cook_test(t, rs)) + self._score = None + + return self + + def rescore(self, new_test): + ''' replace test(s) with new test(s), and returns the new score.''' + + return self.retest(new_test).compute_score() + + def size(self): + assert len(self.crefs) == len(self.ctest), "refs/test mismatch! %d<>%d" % (len(self.crefs), len(self.ctest)) + return len(self.crefs) + + def __iadd__(self, other): + '''add an instance (e.g., from another sentence).''' + + if type(other) is tuple: + ## avoid creating new BleuScorer instances + self.cook_append(other[0], other[1]) + else: + assert self.compatible(other), "incompatible BLEUs." + self.ctest.extend(other.ctest) + self.crefs.extend(other.crefs) + self._score = None ## need to recompute + + return self + + def compatible(self, other): + return isinstance(other, BleuScorer) and self.n == other.n + + def single_reflen(self, option="average"): + return self._single_reflen(self.crefs[0][0], option) + + def _single_reflen(self, reflens, option=None, testlen=None): + + if option == "shortest": + reflen = min(reflens) + elif option == "average": + reflen = float(sum(reflens))/len(reflens) + elif option == "closest": + reflen = min((abs(l-testlen), l) for l in reflens)[1] + else: + assert False, "unsupported reflen option %s" % option + + return reflen + + def recompute_score(self, option=None, verbose=0): + self._score = None + return self.compute_score(option, verbose) + + def compute_score(self, option=None, verbose=0): + n = self.n + small = 1e-9 + tiny = 1e-15 ## so that if guess is 0 still return 0 + bleu_list = [[] for _ in range(n)] + + if self._score is not None: + return self._score + + if option is None: + option = "average" if len(self.crefs) == 1 else "closest" + + self._testlen = 0 + self._reflen = 0 + totalcomps = {'testlen':0, 'reflen':0, 'guess':[0]*n, 'correct':[0]*n} + + # for each sentence + for comps in self.ctest: + testlen = comps['testlen'] + self._testlen += testlen + + if self.special_reflen is None: ## need computation + reflen = self._single_reflen(comps['reflen'], option, testlen) + else: + reflen = self.special_reflen + + self._reflen += reflen + + for key in ['guess','correct']: + for k in range(n): + totalcomps[key][k] += comps[key][k] + + # append per image bleu score + bleu = 1. + for k in range(n): + bleu *= (float(comps['correct'][k]) + tiny) \ + /(float(comps['guess'][k]) + small) + bleu_list[k].append(bleu ** (1./(k+1))) + ratio = (testlen + tiny) / (reflen + small) ## N.B.: avoid zero division + if ratio < 1: + for k in range(n): + bleu_list[k][-1] *= math.exp(1 - 1/ratio) + + if verbose > 1: + print(comps, reflen) + + totalcomps['reflen'] = self._reflen + totalcomps['testlen'] = self._testlen + + bleus = [] + bleu = 1. + for k in range(n): + bleu *= float(totalcomps['correct'][k] + tiny) \ + / (totalcomps['guess'][k] + small) + bleus.append(bleu ** (1./(k+1))) + ratio = (self._testlen + tiny) / (self._reflen + small) ## N.B.: avoid zero division + if ratio < 1: + for k in range(n): + bleus[k] *= math.exp(1 - 1/ratio) + + if verbose > 0: + print(totalcomps) + print("ratio:", ratio) + + self._score = bleus + return self._score, bleu_list diff --git a/KMVE_RG/modules/pycocoevalcap/cider/__init__.py b/KMVE_RG/modules/pycocoevalcap/cider/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/KMVE_RG/modules/pycocoevalcap/cider/__pycache__/__init__.cpython-310.pyc b/KMVE_RG/modules/pycocoevalcap/cider/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1df2ed9970c8bfea03dc1ca025da30c6bea9c708 Binary files /dev/null and b/KMVE_RG/modules/pycocoevalcap/cider/__pycache__/__init__.cpython-310.pyc differ diff --git a/KMVE_RG/modules/pycocoevalcap/cider/__pycache__/cider.cpython-310.pyc b/KMVE_RG/modules/pycocoevalcap/cider/__pycache__/cider.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1f9413b49e48444aea865f23a25ffa4176ed85a Binary files /dev/null and b/KMVE_RG/modules/pycocoevalcap/cider/__pycache__/cider.cpython-310.pyc differ diff --git a/KMVE_RG/modules/pycocoevalcap/cider/__pycache__/cider_scorer.cpython-310.pyc b/KMVE_RG/modules/pycocoevalcap/cider/__pycache__/cider_scorer.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..06a1acf20373b27ce765353cbe415974b43bd08e Binary files /dev/null and b/KMVE_RG/modules/pycocoevalcap/cider/__pycache__/cider_scorer.cpython-310.pyc differ diff --git a/KMVE_RG/modules/pycocoevalcap/cider/cider.py b/KMVE_RG/modules/pycocoevalcap/cider/cider.py new file mode 100644 index 0000000000000000000000000000000000000000..a0d43f7e9a8dc6068595521fb510c556048f640f --- /dev/null +++ b/KMVE_RG/modules/pycocoevalcap/cider/cider.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python +# Filename: cider.py +# +# Description: Describes the class to compute the CIDEr (Consensus-Based Image Description Evaluation) Metric +# by Vedantam, Zitnick, and Parikh (http://arxiv.org/abs/1411.5726) +# +# Creation Date: Sun Feb 8 14:16:54 2015 +# +# Authors: Ramakrishna Vedantam and Tsung-Yi Lin + + +# from .cider_scorer import CiderScorer +from .cider_scorer import CiderScorer +import pdb + + +class Cider: + """ + Main Class to compute the CIDEr metric + + """ + + def __init__(self, test=None, refs=None, n=4, sigma=6.0): + # set cider to sum over 1 to 4-grams + self._n = n + # set the standard deviation parameter for gaussian penalty + self._sigma = sigma + + def compute_score(self, gts, res): + """ + Main function to compute CIDEr score + :param hypo_for_image (dict) : dictionary with key and value + ref_for_image (dict) : dictionary with key and value + :return: cider (float) : computed CIDEr score for the corpus + """ + + assert (gts.keys() == res.keys()) + imgIds = gts.keys() + + cider_scorer = CiderScorer(n=self._n, sigma=self._sigma) + + for id in imgIds: + hypo = res[id] + ref = gts[id] + + # Sanity check. + assert (type(hypo) is list) + assert (len(hypo) == 1) + assert (type(ref) is list) + assert (len(ref) > 0) + + cider_scorer += (hypo[0], ref) + + (score, scores) = cider_scorer.compute_score() + + return score, scores + + def method(self): + return "CIDEr" diff --git a/KMVE_RG/modules/pycocoevalcap/cider/cider_scorer.py b/KMVE_RG/modules/pycocoevalcap/cider/cider_scorer.py new file mode 100644 index 0000000000000000000000000000000000000000..94752e8198476106b929f2607f82b7e8e269ef13 --- /dev/null +++ b/KMVE_RG/modules/pycocoevalcap/cider/cider_scorer.py @@ -0,0 +1,197 @@ +#!/usr/bin/env python +# Tsung-Yi Lin +# Ramakrishna Vedantam + + +# Last modified : Wed 22 May 2019 08:10:00 PM EDT +# By Sabarish Sivanath +# To support Python 3 + +import copy +from collections import defaultdict +import numpy as np +import pdb +import math + +def precook(s, n=4, out=False): + """ + Takes a string as input and returns an object that can be given to + either cook_refs or cook_test. This is optional: cook_refs and cook_test + can take string arguments as well. + :param s: string : sentence to be converted into ngrams + :param n: int : number of ngrams for which representation is calculated + :return: term frequency vector for occuring ngrams + """ + words = s.split() + counts = defaultdict(int) + for k in range(1,n+1): + for i in range(len(words)-k+1): + ngram = tuple(words[i:i+k]) + counts[ngram] += 1 + return counts + +def cook_refs(refs, n=4): ## lhuang: oracle will call with "average" + '''Takes a list of reference sentences for a single segment + and returns an object that encapsulates everything that BLEU + needs to know about them. + :param refs: list of string : reference sentences for some image + :param n: int : number of ngrams for which (ngram) representation is calculated + :return: result (list of dict) + ''' + return [precook(ref, n) for ref in refs] + +def cook_test(test, n=4): + '''Takes a test sentence and returns an object that + encapsulates everything that BLEU needs to know about it. + :param test: list of string : hypothesis sentence for some image + :param n: int : number of ngrams for which (ngram) representation is calculated + :return: result (dict) + ''' + return precook(test, n, True) + +class CiderScorer(object): + """CIDEr scorer. + """ + + def copy(self): + ''' copy the refs.''' + new = CiderScorer(n=self.n) + new.ctest = copy.copy(self.ctest) + new.crefs = copy.copy(self.crefs) + return new + + def __init__(self, test=None, refs=None, n=4, sigma=6.0): + ''' singular instance ''' + self.n = n + self.sigma = sigma + self.crefs = [] + self.ctest = [] + self.document_frequency = defaultdict(float) + self.cook_append(test, refs) + self.ref_len = None + + def cook_append(self, test, refs): + '''called by constructor and __iadd__ to avoid creating new instances.''' + + if refs is not None: + self.crefs.append(cook_refs(refs)) + if test is not None: + self.ctest.append(cook_test(test)) ## N.B.: -1 + else: + self.ctest.append(None) # lens of crefs and ctest have to match + + def size(self): + assert len(self.crefs) == len(self.ctest), "refs/test mismatch! %d<>%d" % (len(self.crefs), len(self.ctest)) + return len(self.crefs) + + def __iadd__(self, other): + '''add an instance (e.g., from another sentence).''' + + if type(other) is tuple: + ## avoid creating new CiderScorer instances + self.cook_append(other[0], other[1]) + else: + self.ctest.extend(other.ctest) + self.crefs.extend(other.crefs) + + return self + def compute_doc_freq(self): + ''' + Compute term frequency for reference data. + This will be used to compute idf (inverse document frequency later) + The term frequency is stored in the object + :return: None + ''' + for refs in self.crefs: + # refs, k ref captions of one image + for ngram in set([ngram for ref in refs for (ngram,count) in ref.items()]): + self.document_frequency[ngram] += 1 + # maxcounts[ngram] = max(maxcounts.get(ngram,0), count) + + def compute_cider(self): + def counts2vec(cnts): + """ + Function maps counts of ngram to vector of tfidf weights. + The function returns vec, an array of dictionary that store mapping of n-gram and tf-idf weights. + The n-th entry of array denotes length of n-grams. + :param cnts: + :return: vec (array of dict), norm (array of float), length (int) + """ + vec = [defaultdict(float) for _ in range(self.n)] + length = 0 + norm = [0.0 for _ in range(self.n)] + for (ngram,term_freq) in cnts.items(): + # give word count 1 if it doesn't appear in reference corpus + df = np.log(max(1.0, self.document_frequency[ngram])) + # ngram index + n = len(ngram)-1 + # tf (term_freq) * idf (precomputed idf) for n-grams + vec[n][ngram] = float(term_freq)*(self.ref_len - df) + # compute norm for the vector. the norm will be used for computing similarity + norm[n] += pow(vec[n][ngram], 2) + + if n == 1: + length += term_freq + norm = [np.sqrt(n) for n in norm] + return vec, norm, length + + def sim(vec_hyp, vec_ref, norm_hyp, norm_ref, length_hyp, length_ref): + ''' + Compute the cosine similarity of two vectors. + :param vec_hyp: array of dictionary for vector corresponding to hypothesis + :param vec_ref: array of dictionary for vector corresponding to reference + :param norm_hyp: array of float for vector corresponding to hypothesis + :param norm_ref: array of float for vector corresponding to reference + :param length_hyp: int containing length of hypothesis + :param length_ref: int containing length of reference + :return: array of score for each n-grams cosine similarity + ''' + delta = float(length_hyp - length_ref) + # measure consine similarity + val = np.array([0.0 for _ in range(self.n)]) + for n in range(self.n): + # ngram + for (ngram,count) in vec_hyp[n].items(): + # vrama91 : added clipping + val[n] += min(vec_hyp[n][ngram], vec_ref[n][ngram]) * vec_ref[n][ngram] + + if (norm_hyp[n] != 0) and (norm_ref[n] != 0): + val[n] /= (norm_hyp[n]*norm_ref[n]) + + assert(not math.isnan(val[n])) + # vrama91: added a length based gaussian penalty + val[n] *= np.e**(-(delta**2)/(2*self.sigma**2)) + return val + + # compute log reference length + self.ref_len = np.log(float(len(self.crefs))) + + scores = [] + for test, refs in zip(self.ctest, self.crefs): + # compute vector for test captions + vec, norm, length = counts2vec(test) + # compute vector for ref captions + score = np.array([0.0 for _ in range(self.n)]) + for ref in refs: + vec_ref, norm_ref, length_ref = counts2vec(ref) + score += sim(vec, vec_ref, norm, norm_ref, length, length_ref) + # change by vrama91 - mean of ngram scores, instead of sum + score_avg = np.mean(score) + # divide by number of references + score_avg /= len(refs) + # multiply score by 10 + score_avg *= 10.0 + # append score of an image to the score list + scores.append(score_avg) + return scores + + def compute_score(self, option=None, verbose=0): + # compute idf + self.compute_doc_freq() + # assert to check document frequency + assert(len(self.ctest) >= max(self.document_frequency.values())) + # compute cider score + score = self.compute_cider() + # debug + # print score + return np.mean(np.array(score)), np.array(score) \ No newline at end of file diff --git a/KMVE_RG/modules/pycocoevalcap/eval.py b/KMVE_RG/modules/pycocoevalcap/eval.py new file mode 100644 index 0000000000000000000000000000000000000000..21f53dcd52f3e7d93f30b239ca994dabd9aa7037 --- /dev/null +++ b/KMVE_RG/modules/pycocoevalcap/eval.py @@ -0,0 +1,74 @@ +__author__ = 'tylin' +from .tokenizer.ptbtokenizer import PTBTokenizer +from .bleu.bleu import Bleu +from .meteor.meteor import Meteor +from .rouge.rouge import Rouge +from .cider.cider import Cider + +class COCOEvalCap: + def __init__(self, coco, cocoRes): + self.evalImgs = [] + self.eval = {} + self.imgToEval = {} + self.coco = coco + self.cocoRes = cocoRes + self.params = {'image_id': cocoRes.getImgIds()} + + def evaluate(self): + imgIds = self.params['image_id'] + # imgIds = self.coco.getImgIds() + gts = {} + res = {} + for imgId in imgIds: + gts[imgId] = self.coco.imgToAnns[imgId] + res[imgId] = self.cocoRes.imgToAnns[imgId] + + # ================================================= + # Set up scorers + # ================================================= + print('tokenization...') + tokenizer = PTBTokenizer() + gts = tokenizer.tokenize(gts) + res = tokenizer.tokenize(res) + + # ================================================= + # Set up scorers + # ================================================= + print('setting up scorers...') + scorers = [ + (Bleu(4), ["Bleu_1", "Bleu_2", "Bleu_3", "Bleu_4"]), + (Meteor(),"METEOR"), + (Rouge(), "ROUGE_L"), + (Cider(), "CIDEr") + ] + + # ================================================= + # Compute scores + # ================================================= + eval = {} + for scorer, method in scorers: + print('computing %s score...'%(scorer.method())) + score, scores = scorer.compute_score(gts, res) + if type(method) == list: + for sc, scs, m in zip(score, scores, method): + self.setEval(sc, m) + self.setImgToEvalImgs(scs, imgIds, m) + print("%s: %0.3f"%(m, sc)) + else: + self.setEval(score, method) + self.setImgToEvalImgs(scores, imgIds, method) + print("%s: %0.3f"%(method, score)) + self.setEvalImgs() + + def setEval(self, score, method): + self.eval[method] = score + + def setImgToEvalImgs(self, scores, imgIds, method): + for imgId, score in zip(imgIds, scores): + if not imgId in self.imgToEval: + self.imgToEval[imgId] = {} + self.imgToEval[imgId]["image_id"] = imgId + self.imgToEval[imgId][method] = score + + def setEvalImgs(self): + self.evalImgs = [eval for imgId, eval in self.imgToEval.items()] diff --git a/KMVE_RG/modules/pycocoevalcap/license.txt b/KMVE_RG/modules/pycocoevalcap/license.txt new file mode 100644 index 0000000000000000000000000000000000000000..3ada56f2474312c22e71968ab82233a5430a6428 --- /dev/null +++ b/KMVE_RG/modules/pycocoevalcap/license.txt @@ -0,0 +1,26 @@ +Copyright (c) 2015, Xinlei Chen, Hao Fang, Tsung-Yi Lin, and Ramakrishna Vedantam +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of the FreeBSD Project. \ No newline at end of file diff --git a/KMVE_RG/modules/pycocoevalcap/meteor/__init__.py b/KMVE_RG/modules/pycocoevalcap/meteor/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..349338d26d52b73b4aaf5f575520a6d580025598 --- /dev/null +++ b/KMVE_RG/modules/pycocoevalcap/meteor/__init__.py @@ -0,0 +1 @@ +from .meteor import * \ No newline at end of file diff --git a/KMVE_RG/modules/pycocoevalcap/meteor/__pycache__/__init__.cpython-310.pyc b/KMVE_RG/modules/pycocoevalcap/meteor/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de788a3b6e3726905b2ac555af61a6f74c0c7479 Binary files /dev/null and b/KMVE_RG/modules/pycocoevalcap/meteor/__pycache__/__init__.cpython-310.pyc differ diff --git a/KMVE_RG/modules/pycocoevalcap/meteor/__pycache__/__init__.cpython-38.pyc b/KMVE_RG/modules/pycocoevalcap/meteor/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d9b6d3051b7f228fc82f76878fbc2ffc532405c Binary files /dev/null and b/KMVE_RG/modules/pycocoevalcap/meteor/__pycache__/__init__.cpython-38.pyc differ diff --git a/KMVE_RG/modules/pycocoevalcap/meteor/__pycache__/meteor.cpython-310.pyc b/KMVE_RG/modules/pycocoevalcap/meteor/__pycache__/meteor.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ac6d305964a66fd8a1888a4098ce27a3ac28c4b Binary files /dev/null and b/KMVE_RG/modules/pycocoevalcap/meteor/__pycache__/meteor.cpython-310.pyc differ diff --git a/KMVE_RG/modules/pycocoevalcap/meteor/__pycache__/meteor.cpython-38.pyc b/KMVE_RG/modules/pycocoevalcap/meteor/__pycache__/meteor.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1c896411c911a7b3ef0d1f47a3e71a251dc205f Binary files /dev/null and b/KMVE_RG/modules/pycocoevalcap/meteor/__pycache__/meteor.cpython-38.pyc differ diff --git a/KMVE_RG/modules/pycocoevalcap/meteor/data/paraphrase-en.gz b/KMVE_RG/modules/pycocoevalcap/meteor/data/paraphrase-en.gz new file mode 100644 index 0000000000000000000000000000000000000000..d4d224adc826d691ba76183c9463706cc13682bc --- /dev/null +++ b/KMVE_RG/modules/pycocoevalcap/meteor/data/paraphrase-en.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c147ac7d2c91f2fbb3ad31e4b352235061eb83145e0434daf217ee9ca5975f48 +size 61813011 diff --git a/KMVE_RG/modules/pycocoevalcap/meteor/meteor-1.5.jar b/KMVE_RG/modules/pycocoevalcap/meteor/meteor-1.5.jar new file mode 100644 index 0000000000000000000000000000000000000000..80e236efc242679f16fde17ea323f0a1cc35a126 --- /dev/null +++ b/KMVE_RG/modules/pycocoevalcap/meteor/meteor-1.5.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e57b4c72c0830ebe68558f1c799a624e96cbc1b6045c9f6330e26dcff6eafc2 +size 6318693 diff --git a/KMVE_RG/modules/pycocoevalcap/meteor/meteor.py b/KMVE_RG/modules/pycocoevalcap/meteor/meteor.py new file mode 100644 index 0000000000000000000000000000000000000000..b35a192d4116658899c345e60178bd4929c54c06 --- /dev/null +++ b/KMVE_RG/modules/pycocoevalcap/meteor/meteor.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python + +# Python wrapper for METEOR implementation, by Xinlei Chen +# Acknowledge Michael Denkowski for the generous discussion and help + +# Last modified : Wed 22 May 2019 08:10:00 PM EDT +# By Sabarish Sivanath +# To support Python 3 + +import os +import sys +import subprocess +import threading + +# Assumes meteor-1.5.jar is in the same directory as meteor.py. Change as needed. +METEOR_JAR = 'meteor-1.5.jar' + + +# print METEOR_JAR + +class Meteor: + + def __init__(self): + self.meteor_cmd = ['java', '-jar', '-Xmx2G', METEOR_JAR, + '-', '-', '-stdio', '-l', 'en', '-norm'] + self.meteor_p = subprocess.Popen(self.meteor_cmd, + cwd=os.path.dirname(os.path.abspath(__file__)), + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + universal_newlines=True, + bufsize=1) + # Used to guarantee thread safety + self.lock = threading.Lock() + + def compute_score(self, gts, res): + assert (gts.keys() == res.keys()) + imgIds = gts.keys() + scores = [] + + eval_line = 'EVAL' + self.lock.acquire() + for i in imgIds: + assert (len(res[i]) == 1) + stat = self._stat(res[i][0], gts[i]) + eval_line += ' ||| {}'.format(stat) + + self.meteor_p.stdin.write('{}\n'.format(eval_line)) + for i in range(0, len(imgIds)): + scores.append(float(self.meteor_p.stdout.readline().strip())) + score = float(self.meteor_p.stdout.readline().strip()) + self.lock.release() + + return score, scores + + def method(self): + return "METEOR" + + def _stat(self, hypothesis_str, reference_list): + # SCORE ||| reference 1 words ||| reference n words ||| hypothesis words + hypothesis_str = hypothesis_str.replace('|||', '').replace(' ', ' ') + score_line = ' ||| '.join(('SCORE', ' ||| '.join(reference_list), hypothesis_str)) + self.meteor_p.stdin.write('{}\n'.format(score_line)) + return self.meteor_p.stdout.readline().strip() + + def _score(self, hypothesis_str, reference_list): + self.lock.acquire() + # SCORE ||| reference 1 words ||| reference n words ||| hypothesis words + hypothesis_str = hypothesis_str.replace('|||', '').replace(' ', ' ') + score_line = ' ||| '.join(('SCORE', ' ||| '.join(reference_list), hypothesis_str)) + self.meteor_p.stdin.write('{}\n'.format(score_line)) + stats = self.meteor_p.stdout.readline().strip() + eval_line = 'EVAL ||| {}'.format(stats) + # EVAL ||| stats + self.meteor_p.stdin.write('{}\n'.format(eval_line)) + score = float(self.meteor_p.stdout.readline().strip()) + # bug fix: there are two values returned by the jar file, one average, and one all, so do it twice + # thanks for Andrej for pointing this out + score = float(self.meteor_p.stdout.readline().strip()) + self.lock.release() + return score + + def __del__(self): + self.lock.acquire() + self.meteor_p.stdin.close() + self.meteor_p.kill() + self.meteor_p.wait() + self.lock.release() + + diff --git a/KMVE_RG/modules/pycocoevalcap/rouge/__init__.py b/KMVE_RG/modules/pycocoevalcap/rouge/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e3c0469a60189757cd73225f759004eef4cbeb00 --- /dev/null +++ b/KMVE_RG/modules/pycocoevalcap/rouge/__init__.py @@ -0,0 +1 @@ +from .rouge import * \ No newline at end of file diff --git a/KMVE_RG/modules/pycocoevalcap/rouge/__pycache__/__init__.cpython-310.pyc b/KMVE_RG/modules/pycocoevalcap/rouge/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ce30f6ac6ce4bbf198799b6b3005dfffcd13014 Binary files /dev/null and b/KMVE_RG/modules/pycocoevalcap/rouge/__pycache__/__init__.cpython-310.pyc differ diff --git a/KMVE_RG/modules/pycocoevalcap/rouge/__pycache__/rouge.cpython-310.pyc b/KMVE_RG/modules/pycocoevalcap/rouge/__pycache__/rouge.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6bcda7e5b61c87f3a6a59df0aa127d73d1185d97 Binary files /dev/null and b/KMVE_RG/modules/pycocoevalcap/rouge/__pycache__/rouge.cpython-310.pyc differ diff --git a/KMVE_RG/modules/pycocoevalcap/rouge/rouge.py b/KMVE_RG/modules/pycocoevalcap/rouge/rouge.py new file mode 100644 index 0000000000000000000000000000000000000000..3a10f5a50371328d397dcb53c7c9d81eac9472fa --- /dev/null +++ b/KMVE_RG/modules/pycocoevalcap/rouge/rouge.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python +# +# File Name : rouge.py +# +# Description : Computes ROUGE-L metric as described by Lin and Hovey (2004) +# +# Creation Date : 2015-01-07 06:03 +# Author : Ramakrishna Vedantam + +import numpy as np +import pdb + +def my_lcs(string, sub): + """ + Calculates longest common subsequence for a pair of tokenized strings + :param string : list of str : tokens from a string split using whitespace + :param sub : list of str : shorter string, also split using whitespace + :returns: length (list of int): length of the longest common subsequence between the two strings + + Note: my_lcs only gives length of the longest common subsequence, not the actual LCS + """ + if(len(string)< len(sub)): + sub, string = string, sub + + lengths = [[0 for i in range(0,len(sub)+1)] for j in range(0,len(string)+1)] + + for j in range(1,len(sub)+1): + for i in range(1,len(string)+1): + if(string[i-1] == sub[j-1]): + lengths[i][j] = lengths[i-1][j-1] + 1 + else: + lengths[i][j] = max(lengths[i-1][j] , lengths[i][j-1]) + + return lengths[len(string)][len(sub)] + +class Rouge(): + ''' + Class for computing ROUGE-L score for a set of candidate sentences for the MS COCO test set + + ''' + def __init__(self): + # vrama91: updated the value below based on discussion with Hovey + self.beta = 1.2 + + def calc_score(self, candidate, refs): + """ + Compute ROUGE-L score given one candidate and references for an image + :param candidate: str : candidate sentence to be evaluated + :param refs: list of str : COCO reference sentences for the particular image to be evaluated + :returns score: int (ROUGE-L score for the candidate evaluated against references) + """ + assert(len(candidate)==1) + assert(len(refs)>0) + prec = [] + rec = [] + + # split into tokens + token_c = candidate[0].split(" ") + + for reference in refs: + # split into tokens + token_r = reference.split(" ") + # compute the longest common subsequence + lcs = my_lcs(token_r, token_c) + prec.append(lcs/float(len(token_c))) + rec.append(lcs/float(len(token_r))) + + prec_max = max(prec) + rec_max = max(rec) + + if(prec_max!=0 and rec_max !=0): + score = ((1 + self.beta**2)*prec_max*rec_max)/float(rec_max + self.beta**2*prec_max) + else: + score = 0.0 + return score + + def compute_score(self, gts, res): + """ + Computes Rouge-L score given a set of reference and candidate sentences for the dataset + Invoked by evaluate_captions.py + :param hypo_for_image: dict : candidate / test sentences with "image name" key and "tokenized sentences" as values + :param ref_for_image: dict : reference MS-COCO sentences with "image name" key and "tokenized sentences" as values + :returns: average_score: float (mean ROUGE-L score computed by averaging scores for all the images) + """ + assert(gts.keys() == res.keys()) + imgIds = gts.keys() + + score = [] + for id in imgIds: + hypo = res[id] + ref = gts[id] + + score.append(self.calc_score(hypo, ref)) + + # Sanity check. + assert(type(hypo) is list) + assert(len(hypo) == 1) + assert(type(ref) is list) + assert(len(ref) > 0) + + average_score = np.mean(np.array(score)) + return average_score, np.array(score) + + def method(self): + return "Rouge" diff --git a/KMVE_RG/modules/pycocoevalcap/tokenizer/__init__.py b/KMVE_RG/modules/pycocoevalcap/tokenizer/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..71357a4bff7219ddcf7f7321cfeb4484bd8bee08 --- /dev/null +++ b/KMVE_RG/modules/pycocoevalcap/tokenizer/__init__.py @@ -0,0 +1 @@ +__author__ = 'hfang' diff --git a/KMVE_RG/modules/pycocoevalcap/tokenizer/ptbtokenizer.py b/KMVE_RG/modules/pycocoevalcap/tokenizer/ptbtokenizer.py new file mode 100644 index 0000000000000000000000000000000000000000..84a79c4d3943dd4a8c38b5d2cc870eb785dba73f --- /dev/null +++ b/KMVE_RG/modules/pycocoevalcap/tokenizer/ptbtokenizer.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python +# +# File Name : ptbtokenizer.py +# +# Description : Do the PTB Tokenization and remove punctuations. +# +# Creation Date : 29-12-2014 +# Last Modified : Thu Mar 19 09:53:35 2015 +# Authors : Hao Fang and Tsung-Yi Lin + +import os +import sys +import subprocess +import tempfile +import itertools + +# Last modified : Wed 22 May 2019 08:10:00 PM EDT +# By Sabarish Sivanath +# To support Python 3 + +# path to the stanford corenlp jar +STANFORD_CORENLP_3_4_1_JAR = 'stanford-corenlp-3.4.1.jar' + +# punctuations to be removed from the sentences +PUNCTUATIONS = ["''", "'", "``", "`", "-LRB-", "-RRB-", "-LCB-", "-RCB-", \ + ".", "?", "!", ",", ":", "-", "--", "...", ";"] + + +class PTBTokenizer: + """Python wrapper of Stanford PTBTokenizer""" + + def tokenize(self, captions_for_image): + cmd = ['java', '-cp', STANFORD_CORENLP_3_4_1_JAR, \ + 'edu.stanford.nlp.process.PTBTokenizer', \ + '-preserveLines', '-lowerCase'] + + # ====================================================== + # prepare data for PTB Tokenizer + # ====================================================== + final_tokenized_captions_for_image = {} + image_id = [k for k, v in captions_for_image.items() for _ in range(len(v))] + sentences = '\n'.join([c['caption'].replace('\n', ' ') for k, v in captions_for_image.items() for c in v]) + + # ====================================================== + # save sentences to temporary file + # ====================================================== + path_to_jar_dirname = os.path.dirname(os.path.abspath(__file__)) + tmp_file = tempfile.NamedTemporaryFile(delete=False, dir=path_to_jar_dirname) + tmp_file.write(sentences.encode('utf-8')) + tmp_file.close() + + # ====================================================== + # tokenize sentence + # ====================================================== + cmd.append(os.path.basename(tmp_file.name)) + p_tokenizer = subprocess.Popen(cmd, + cwd=path_to_jar_dirname, + stdout=subprocess.PIPE, + universal_newlines=True, + bufsize=1) + token_lines = p_tokenizer.communicate(input=sentences.rstrip())[0] + lines = token_lines.split('\n') + # remove temp file + os.remove(tmp_file.name) + + # ====================================================== + # create dictionary for tokenized captions + # ====================================================== + for k, line in zip(image_id, lines): + if not k in final_tokenized_captions_for_image: + final_tokenized_captions_for_image[k] = [] + tokenized_caption = ' '.join([w for w in line.rstrip().split(' ') \ + if w not in PUNCTUATIONS]) + final_tokenized_captions_for_image[k].append(tokenized_caption) + + return final_tokenized_captions_for_image diff --git a/KMVE_RG/modules/pycocoevalcap/tokenizer/stanford-corenlp-3.4.1.jar b/KMVE_RG/modules/pycocoevalcap/tokenizer/stanford-corenlp-3.4.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..07e4e5e4f90d7060180c968bf31ca35084627c2d --- /dev/null +++ b/KMVE_RG/modules/pycocoevalcap/tokenizer/stanford-corenlp-3.4.1.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2fcb91bb7a111f93d71e264f4ee0e3afd19ba0dde6d21b38605088df9e940399 +size 5921410 diff --git a/KMVE_RG/modules/tokenizers.py b/KMVE_RG/modules/tokenizers.py new file mode 100644 index 0000000000000000000000000000000000000000..0a8bfa37b2e97fc0d0cede25f3f3408e352843e8 --- /dev/null +++ b/KMVE_RG/modules/tokenizers.py @@ -0,0 +1,93 @@ +import json +from collections import Counter +import jieba +import os +abs_path = os.path.dirname(os.path.abspath(__file__)) +jieba.load_userdict(os.path.join(abs_path, '../../utils/key_technical_words.txt')) + +class Tokenizer(object): + def __init__(self, args): + self.ann_path = args.ann_path + self.threshold = args.threshold + self.ann = json.loads(open(self.ann_path, 'r', encoding='utf-8-sig').read()) + self.dict_pth = args.dict_pth + self.token2idx, self.idx2token = self.create_vocabulary() + + def create_vocabulary(self): + if self.dict_pth != ' ': + word_dict = json.loads(open(self.dict_pth, 'r', encoding="utf_8_sig").read()) + word_dict[1] = {int(k): v for k, v in word_dict[1].items()} + return word_dict[0], word_dict[1] + else: + total_tokens = [] + split_list = ['train', 'test', 'val'] + for split in split_list: + for example in self.ann[split]: + tokens = list(jieba.lcut(example['finding'])) + for token in tokens: + total_tokens.append(token) + counter = Counter(total_tokens) + vocab = [k for k, v in counter.items()] + [''] + token2idx, idx2token = {}, {} + for idx, token in enumerate(vocab): + token2idx[token] = idx + 1 + idx2token[idx + 1] = token + with open('E:/Captionv0/Code/SGF/utils/breast_dict.txt', 'w', encoding='utf-8-sig') as f: + f.write(json.dumps([token2idx, idx2token])) + return token2idx, idx2token + + + def get_token_by_id(self, id): + return self.idx2token[id] + + def get_id_by_token(self, token): + if token not in self.token2idx: + return self.token2idx[''] + return self.token2idx[token] + + def get_vocab_size(self): + return len(self.token2idx) + + + def __call__(self, report): + tokens = list(jieba.cut(report)) + ids = [] + for token in tokens: + ids.append(self.get_id_by_token(token)) + ids = [0] + ids + [0] + return ids + + def decode(self, ids): + txt = '' + for i, idx in enumerate(ids): + if idx > 0: + if i >= 1: + txt += ' ' + txt += self.idx2token[idx] + else: + break + return txt + + def decode_list(self, ids): + txt = [] + for i, idx in enumerate(ids): + if idx > 0: + txt.append(self.idx2token[idx]) + else:txt.append('') + + return txt + + def decode_batch(self, ids_batch): + out = [] + for ids in ids_batch: + out.append(self.decode(ids)) + return out + + def decode_batch_list(self, ids_batch): + out = [] + for ids in ids_batch: + out.append(self.decode_list(ids)) + return out + + + diff --git a/KMVE_RG/modules/tools.py b/KMVE_RG/modules/tools.py new file mode 100644 index 0000000000000000000000000000000000000000..000876f301c6f0fe2d419a20d8030f14d0c5e39c --- /dev/null +++ b/KMVE_RG/modules/tools.py @@ -0,0 +1,14 @@ +import torch + +def _prepare_device(n_gpu_use): + n_gpu = torch.cuda.device_count() + if n_gpu_use > 0 and n_gpu == 0: + print("Warning: There\'s no GPU available on this machine," "training will be performed on CPU.") + n_gpu_use = 0 + if n_gpu_use > n_gpu: + print("Warning: The number of GPU\'s configured to use is {}, but only {} are available " "on this machine.". + format(n_gpu_use, n_gpu)) + n_gpu_use = n_gpu + device = torch.device('cuda:0' if n_gpu_use > 0 else 'cpu') + list_ids = list(range(n_gpu_use)) + return device, list_ids \ No newline at end of file diff --git a/KMVE_RG/modules/utils.py b/KMVE_RG/modules/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..e8bb1df91e3225da642e8f2225f71d4acdb37917 --- /dev/null +++ b/KMVE_RG/modules/utils.py @@ -0,0 +1,55 @@ +import torch + + +def penalty_builder(penalty_config): + if penalty_config == '': + return lambda x, y: y + pen_type, alpha = penalty_config.split('_') + alpha = float(alpha) + if pen_type == 'wu': + return lambda x, y: length_wu(x, y, alpha) + if pen_type == 'avg': + return lambda x, y: length_average(x, y, alpha) + + +def length_wu(length, logprobs, alpha=0.): + """ + NMT length re-ranking score from + "Google's Neural Machine Translation System" :cite:`wu2016google`. + """ + + modifier = (((5 + length) ** alpha) / + ((5 + 1) ** alpha)) + return logprobs / modifier + + +def length_average(length, logprobs, alpha=0.): + """ + Returns the average probability of tokens in a sequence. + """ + return logprobs / length + + +def split_tensors(n, x): + if torch.is_tensor(x): + assert x.shape[0] % n == 0 + x = x.reshape(x.shape[0] // n, n, *x.shape[1:]).unbind(1) + elif type(x) is list or type(x) is tuple: + x = [split_tensors(n, _) for _ in x] + elif x is None: + x = [None] * n + return x + + +def repeat_tensors(n, x): + """ + For a tensor of size Bx..., we repeat it n times, and make it Bnx... + For collections, do nested repeat + """ + if torch.is_tensor(x): + x = x.unsqueeze(1) # Bx1x... + x = x.expand(-1, n, *([-1] * len(x.shape[2:]))) # Bxnx... + x = x.reshape(x.shape[0] * n, *x.shape[2:]) # Bnx... + elif type(x) is list or type(x) is tuple: + x = [repeat_tensors(n, _) for _ in x] + return x diff --git a/KMVE_RG/modules/visual_extractor.py b/KMVE_RG/modules/visual_extractor.py new file mode 100644 index 0000000000000000000000000000000000000000..85cfa432ec48950bc1504e78072a063ec045034f --- /dev/null +++ b/KMVE_RG/modules/visual_extractor.py @@ -0,0 +1,32 @@ +import torch +import torch.nn as nn +import torchvision.models as models + + +class VisualExtractor(nn.Module): + def __init__(self, args): + super(VisualExtractor, self).__init__() + self.cov1x1 = nn.Conv2d(in_channels=2048, out_channels=args.nhidden, kernel_size=(1, 1)) + self.visual_extractor = args.visual_extractor + self.pretrained = args.visual_extractor_pretrained + + model = getattr(models, self.visual_extractor)(pretrained=self.pretrained) + modules = list(model.children())[:-2] + self.model = nn.Sequential(*modules) + + self.avg_fnt = torch.nn.AvgPool2d(kernel_size=7, stride=1, padding=0) + if self.pretrained is True: print('first init the imagenet pretrained!') + + def forward(self, images): + + patch_feats = self.model(images) + + att_feat_it = self.cov1x1(patch_feats) + avg_feat_it = self.avg_fnt(att_feat_it).squeeze().reshape(-1, att_feat_it.size(1)) + + avg_feats = self.avg_fnt(patch_feats).squeeze().reshape(-1, patch_feats.size(1)) + batch_size, feat_size, _, _ = patch_feats.shape + patch_feats = patch_feats.reshape(batch_size, feat_size, -1).permute(0, 2, 1) + return patch_feats, avg_feats, att_feat_it, avg_feat_it + + diff --git a/Model/breast_model_best.pth b/Model/breast_model_best.pth new file mode 100644 index 0000000000000000000000000000000000000000..de06f246c6e2465907c7bce98b1fb3fa58b44ba6 --- /dev/null +++ b/Model/breast_model_best.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b9ce694c7407e88a77aabecc60426167d76139cc7443c13dbd963ba4e60fbe0 +size 938731055 diff --git a/Model/liver_model_best.pth b/Model/liver_model_best.pth new file mode 100644 index 0000000000000000000000000000000000000000..19bffe70e1f0f847e28938ec5d0934dbf644a5ec --- /dev/null +++ b/Model/liver_model_best.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ef07fbd4064747388b1224fbe736f8aea5593df32b82c11bc0452f428528738b +size 935057455 diff --git a/Model/thyroid_model_best.pth b/Model/thyroid_model_best.pth new file mode 100644 index 0000000000000000000000000000000000000000..b1f82023b19cc211279a2cbb541d7b10166f597f --- /dev/null +++ b/Model/thyroid_model_best.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:76727001ac92778db814ecdd581f7be6b173862e08d45800805564f58c55ef67 +size 937943855 diff --git a/generate_demo.py b/generate_demo.py new file mode 100644 index 0000000000000000000000000000000000000000..9febf0ec2edd9e18ba4e6544fcc44380b1f45c17 --- /dev/null +++ b/generate_demo.py @@ -0,0 +1,189 @@ +import json + +from KMVE_RG.models.SGF_model import SGF +from KMVE_RG.modules.tokenizers import Tokenizer +from KMVE_RG.modules.metrics import compute_scores +import numpy as np +from Demo.utils.thyroid_gen_config import config as thyroid_args +from Demo.utils.liver_gen_config import config as liver_args +from Demo.utils.breast_gen_config import config as breast_args + +import gradio as gr +import torch +from PIL import Image +import os +from torchvision import transforms + +np.random.seed(9233) +torch.manual_seed(9233) +torch.backends.cudnn.deterministic = True +torch.backends.cudnn.benchmark = False + +class Generator(object): + def __init__(self, model_type): + if model_type == '甲状腺': + self.args = thyroid_args + elif model_type == '乳腺': + self.args = breast_args + elif model_type == '肝脏': + self.args = liver_args + self.tokenizer = Tokenizer(self.args) + self.model = SGF(self.args, self.tokenizer) + sd = torch.load(self.args.models)['state_dict'] + msg = self.model.load_state_dict(sd) + print(msg) + self.model.eval() + self.metrics = compute_scores + self.transform = transforms.Compose([ + transforms.Resize((224, 224)), + transforms.ToTensor(), + transforms.Normalize((0.485, 0.456, 0.406), + (0.229, 0.224, 0.225))]) + with open(self.args.ann_path, 'r', encoding='utf-8-sig') as f: + self.data = json.load(f) + print('模型加载完成') + + def image_process(self, img_paths): + image_1 = Image.open(os.path.join(self.args.image_dir, img_paths[0])).convert('RGB') + image_2 = Image.open(os.path.join(self.args.image_dir, img_paths[1])).convert('RGB') + if self.transform is not None: + image_1 = self.transform(image_1) + image_2 = self.transform(image_2) + image = torch.stack((image_1, image_2), 0) + return image + + def generate(self, uid): + img_paths, report = self.data[uid]['img_paths'], self.data[uid]['report'] + imgs = self.image_process(img_paths) + imgs = imgs.unsqueeze(0) + with torch.no_grad(): + output, _ = self.model(imgs, mode='sample') + pred = self.tokenizer.decode(output[0].cpu().numpy()) + gt = self.tokenizer.decode(self.tokenizer(report[:self.args.max_seq_length])[1:]) + scores = self.metrics({0: [gt]}, {0: [pred]}) + return pred, gt, scores + + def visualize_images(self, uid): + image_1 = Image.open(os.path.join(self.args.image_dir, self.data[uid]['img_paths'][0])).convert('RGB') + image_2 = Image.open(os.path.join(self.args.image_dir, self.data[uid]['img_paths'][1])).convert('RGB') + return image_1, image_2 + +# 主应用程序 +def demo(): + with gr.Blocks() as app: + gr.Markdown("# 超声报告生成Demo") + gr.Markdown('### SIAT认知与交互技术中心') + gr.Markdown('### 项目主页:https://lijunrio.github.io/Ultrasound-Report-Generation/') + + # 选择模型 + with gr.Row(): + model_choice = gr.Radio(choices=["甲状腺", "乳腺", "肝脏"], label="请选择模型类型", interactive=True) + + model = gr.State() + + # 展示UID按钮 + uids = [f"uid_{i}" for i in range(20)] + with gr.Row(): + uid_choice = gr.Radio(choices=[f"{uid}" for uid in uids], label="请选择uid", interactive=False) + + # 定义展示图片的组件 + with gr.Row(): + image1_display = gr.Image(label="图像1", visible=True) + image2_display = gr.Image(label="图像2", visible=True) + + # 定义生成报告的按钮和文本框 + generate_button = gr.Button("生成报告", interactive=False) + generated_report_display = gr.Textbox(label="生成的报告", visible=True) + ground_truth_display = gr.Textbox(label="Ground Truth报告", visible=True) + nlp_score_display = gr.Textbox(label="NLP得分", visible=True) + + # 加载模型的回调函数 + def load_model_and_uids(model_type): + model = Generator(model_type) + return model, gr.update(interactive=True) + + # 点击UID按钮后加载对应的图片 + def on_uid_click(model, uid): + image1, image2 = model.visualize_images(uid) + # 显示图片和生成按钮 + return image1, image2, gr.update(interactive=True) + + # 点击生成按钮生成报告 + def on_generate_click(model, uid): + generated_report, ground_truth_report, nlp_score = model.generate(uid) + # 展示生成的报告、Ground Truth 和 NLP 得分 + return generated_report, ground_truth_report, f"NLP得分: {nlp_score}" + + # 链接模型选择与UID按钮显示 + model_choice.change(load_model_and_uids, inputs=model_choice, outputs=[model, uid_choice]) + + # 链接UID按钮点击与图片显示 + # for uid_button in uid_buttons: + # uid_button.click(on_uid_click, inputs=[model, uid_button], outputs=[image1_display, image2_display, uid_choice]) + uid_choice.change(on_uid_click, inputs=[model, uid_choice], outputs=[image1_display, image2_display, generate_button]) + + generate_button.click(on_generate_click, inputs=[model, uid_choice], outputs=[generated_report_display, ground_truth_display, nlp_score_display]) + + return app + +# 主应用程序 +# def demo(): +# with gr.Blocks() as app: +# gr.Markdown("# 医学报告生成 Demo") +# +# # 选择模型类型 +# model_choice = gr.Radio(choices=["甲状腺", "乳腺", "肝脏"], label="请选择模型类型", interactive=True) +# +# # 创建空的 Generator 实例(将稍后初始化) +# generator_instance = gr.State() +# +# # 展示 UID 按钮 +# uids = [f"uid_{i}" for i in range(20)] +# selected_uid = gr.State() # 用于存储当前选择的 UID +# uid_buttons = [gr.Button(f"{uid}") for uid in uids] +# +# # 定义展示图片的组件 +# with gr.Row(): +# image1_display = gr.Image(label="图像 1", visible=False) +# image2_display = gr.Image(label="图像 2", visible=False) +# +# # 定义生成报告的按钮和文本框 +# generate_button = gr.Button("生成报告", visible=False) +# generated_report_display = gr.Textbox(label="生成的报告", visible=False) +# ground_truth_display = gr.Textbox(label="Ground Truth 报告", visible=False) +# nlp_score_display = gr.Textbox(label="NLP 得分", visible=False) +# +# # 模型选择后初始化 Generator 类 +# def initialize_generator(model_type): +# generator = Generator(model_type) # 初始化 Generator +# return generator, True # 返回生成器实例,显示 UID 按钮 +# +# # 点击 UID 按钮后可视化对应图片 +# def on_uid_click(uid, generator): +# image1, image2 = generator.visual_images(uid) +# return image1, image2, uid, True # 返回图片、UID,显示生成按钮 +# +# # 点击生成按钮生成 Ground Truth 报告、预测结果和 NLP 分数 +# def on_generate_click(generator, uid): +# ground_truth, predict, nlp_score = generator.generate(uid) +# return ground_truth, predict, nlp_score +# +# # 链接模型选择与生成器初始化 +# model_choice.change(initialize_generator, inputs=model_choice, outputs=[generator_instance, uid_buttons[0]]) +# +# # 链接 UID 按钮点击与图片显示 +# for i, uid_button in enumerate(uid_buttons): +# uid_button.click(on_uid_click, inputs=[selected_uid, generator_instance], +# outputs=[image1_display, image2_display, selected_uid, generate_button], +# fn=lambda uid=uids[i]: uid) +# +# # 点击生成按钮时生成报告 +# generate_button.click(on_generate_click, inputs=[generator_instance, selected_uid], +# outputs=[ground_truth_display, generated_report_display, nlp_score_display]) +# +# return app + +if __name__ == '__main__': + # 启动应用程序 + demo().launch() + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..2db4c6de57d601f5b2f418ce43ef521bade66de8 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +torch +numpy +jieba +torchvision \ No newline at end of file diff --git a/utils/__pycache__/breast_gen_config.cpython-310.pyc b/utils/__pycache__/breast_gen_config.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d3617a83dd528dc43ec2fef2539c49195541081 Binary files /dev/null and b/utils/__pycache__/breast_gen_config.cpython-310.pyc differ diff --git a/utils/__pycache__/liver_gen_config.cpython-310.pyc b/utils/__pycache__/liver_gen_config.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11099cdcee33cdc58c38f29a5a55d1f6ab86bc79 Binary files /dev/null and b/utils/__pycache__/liver_gen_config.cpython-310.pyc differ diff --git a/utils/__pycache__/thyroid_gen_config.cpython-310.pyc b/utils/__pycache__/thyroid_gen_config.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0992d479ca374af69cfd519db248485c5ede5f7 Binary files /dev/null and b/utils/__pycache__/thyroid_gen_config.cpython-310.pyc differ diff --git a/utils/breast_dict.txt b/utils/breast_dict.txt new file mode 100644 index 0000000000000000000000000000000000000000..d00ba32f85f8e653c5e21787010ad0e43a49da75 --- /dev/null +++ b/utils/breast_dict.txt @@ -0,0 +1 @@ +[{"\u53cc\u4fa7": 1, "\u4e73\u817a": 2, "\u817a\u4f53": 3, "\u7ed3\u6784": 4, "\u7a0d": 5, "\u7d0a\u4e71": 6, "\uff0c": 7, "\u4e73": 8, "\u5bfc\u7ba1": 9, "\u4e0d": 10, "\u6269\u5f20": 11, "\u672a\u89c1": 12, "\u660e\u786e": 13, "\u5360\u4f4d\u6027": 14, "\u75c5\u53d8": 15, "\u3002": 16, "\u814b\u4e0b": 17, "\u660e\u663e": 18, "\u80bf\u5927": 19, "\u6dcb\u5df4\u7ed3": 20, "\uff1a": 21, "\u8f6f\u7ec4\u7ec7": 22, "\u5404\u5c42\u6b21": 23, "\u663e\u793a": 24, "\u6e05\u6670": 25, "\u76ae\u80a4": 26, "\u548c": 27, "\u76ae\u4e0b\u8102\u80aa": 28, "\u5c42\u672a\u89c1": 29, "\u5f02\u5e38": 30, "\u56de\u58f0": 31, "\u6b20": 32, "\u89c4\u6574": 33, "\u5185": 34, "\u5747\u5300": 35, "\u5de6\u4fa7": 36, "\u7ea6": 37, "_Loc_": 38, "\u65b9\u5411": 39, "\u89c1": 40, "\u4e00": 41, "\u4f4e\u56de\u58f0": 42, "\u7ed3\u8282": 43, "\u5927\u5c0f": 44, "_2DS_": 45, "\u8fb9\u754c": 46, "\u5f62\u6001": 47, "CDFI": 48, "\u793a": 49, "\u672a\u63a2\u53ca": 50, "\u8840\u6d41": 51, "\u4fe1\u53f7": 52, "\u626b\u67e5": 53, "\u672a\u89c1\u5f02\u5e38": 54, "\u5207\u9664\u672f": 55, "\u540e": 56, "\u539f": 57, "\u533a\u57df": 58, "\u53f3\u4fa7": 59, "\u4e8e": 60, "\u533a\u8ddd": 61, "\u4e73\u5934": 62, "_SCM_": 63, "\u5904": 64, "\u53ef\u89c1": 65, "_3DS_": 66, "\u5904\u89c1": 67, "\u53cc": 68, "\u5448": 69, "\u7edd\u7ecf": 70, "\u6539\u53d8": 71, "\u840e\u7f29": 72, "\u5b9e\u6027": 73, "\u53ef\u63a2\u53ca": 74, "\u591a\u4e2a": 75, "\u5927\u8005": 76, "\u5c1a": 77, "\u76ae\u8d28": 78, "\u589e\u539a": 79, "\u201c": 80, "\u6dcb\u5df4\u95e8": 81, "\u201d": 82, "\u533a": 83, "\u65c1": 84, "\u5de6": 85, "\u4f53\u5c42": 86, "\u539a": 87, "\u53f3": 88, "\u53f3\u4e73": 89, "\u4e00\u4e2a": 90, "\u5468\u8fb9": 91, "\u53ca": 92, "\u5185\u90e8": 93, "\u5747": 94, "\u672a\u8bb0\u5f55": 95, "\u5230": 96, "\u5de6\u4e73\u5916": 97, "\u4e0a": 98, "\u8c61\u9650": 99, "\u4e3a": 100, "\u3001": 101, "\u6742\u4e71": 102, "\u5c42\u539a": 103, "\u5185\u672a\u89c1": 104, "\u5360\u4f4d": 105, "\u5176\u5185": 106, "6": 107, "-": 108, "_LocR_": 109, "\u4f4d\u81ea": 110, "\u81f3": 111, "\u8fb9\u7f18": 112, "\u591a\u53d1": 113, "\u7247\u72b6": 114, "\u8f83\u5927": 115, "\u8303\u56f4": 116, "\u63a2\u5934": 117, "\u52a0\u538b": 118, "\u6d41\u6c99": 119, "\u6837": 120, "\u80bf\u7269": 121, "\u5c42": 122, "\u51cf\u4f4e": 123, "\u5206\u5e03": 124, "\u5c1a\u5747": 125, ":": 126, "\u6392\u5217": 127, "\u89c4\u5219": 128, "\u793a\u672a\u89c1": 129, "\u8ddd": 130, "\u4e0a\u8ff0": 131, "\u4e00\u65e0": 132, "\u5185\u900f\u58f0": 133, "\u6b20\u4f73": 134, "\uff1b": 135, "\u76ae\u4e0b": 136, "\u53e6": 137, "\u53cc\u4e73": 138, "\u5bbd\u5747": 139, "Ca": 140, "\u672f\u540e": 141, "\u80f8\u58c1": 142, ",": 143, "\u4e0d\u89c4\u5219": 144, "\u4f4d\u4e8e": 145, "\u8fd1": 146, "\u80a9\u5cf0": 147, "\u4e0d\u6e05": 148, "\u81f4\u5bc6": 149, "\u5916\u4e0a": 150, "\u53ca\u5916": 151, "\u4e0b": 152, "\u5185\u4e0a": 153, "\u589e\u7c97": 154, "\u4ee5\u53cc\u4fa7": 155, "\u8457": 156, "\u52a8\u8109\u8840": 157, "\u6d41": 158, "\u76f4\u5f84\u7ea6": 159, "\u5c11\u8bb8": 160, "\u624b\u672f": 161, "\u5207\u53e3": 162, "\u5916\u4fa7": 163, "\u65e0": 164, "\u6570\u4e2a": 165, "\u6e05\u695a": 166, "\u591a\u5904": 167, "\u6700": 168, "\u5bbd": 169, "_SMM_": 170, "\u5c40\u9650\u6027": 171, "\u589e\u5bbd": 172, "\u7ba1\u58c1": 173, "\u5149\u6ed1": 174, "\u900f\u58f0": 175, "\u5dee": 176, "\u4f4d\u7f6e": 177, "\u6bdb\u523a": 178, "\u4fdd\u4e73": 179, "\u4e24\u4e2a": 180, "\u5206\u522b": 181, "\u793a\u5185": 182, "\u8f83": 183, "\u4e30\u5bcc": 184, "\u4e0a\u65b9": 185, "\u4e73\u6655": 186, "\u7537\u6027": 187, "\u68c0\u67e5": 188, "\u540e\u65b9": 189, "\u817a\u4f53\u6837": 190, "\u6b20\u6e05": 191, "\u817a\u58c1": 192, "\u5c40\u90e8": 193, "\u589e\u5f3a": 194, "\u5de6\u4e73": 195, "\u4e0d\u5747": 196, "\u8d28": 197, "\u65c1\u5904": 198, "\u5404\u89c1": 199, "\u8102\u80aa": 200, "\u5c42\u5904": 201, "\u4e00\u504f": 202, "\u5f3a": 203, "\u76ae": 204, "\u9ad3\u8d28": 205, "\u754c\u9650": 206, "\u949f": 207, "\u4e00\u56ca\u6027": 208, "\u5305\u5757": 209, "\u70b9": 210, "9": 211, "\u7622\u75d5": 212, "\u4e0b\u65b9": 213, "\u6700\u539a": 214, "\u53ca\u5176": 215, "\u5c42\u5185": 216, "\u5185\u4f3c": 217, "\u70b9\u72b6": 218, "\u5927": 219, "\u5206\u53f6\u72b6": 220, "\u4f4e": 221, "\u540e\u4f34": 222, "\u5f57\u661f": 223, "\u5c3e": 224, "\u5185\u89c1": 225, "\u90e8\u5206": 226, "\u4f3c\u7531": 227, "\u878d\u5408": 228, "\u800c\u6210": 229, "3": 230, "11": 231, "\u4e24\u70b9": 232, "X": 233, "\uff08": 234, "\uff09": 235, "\u4e00\u4f4e": 236, "\u5df2": 237, "\u5207\u9664": 238, "\u5904\u672a\u89c1": 239, "\u504f\u5f3a": 240, "\u5bbd\u7ea6": 241, "\u9686\u8d77": 242, "\u8102\u80aa\u7ec4\u7ec7": 243, "\u817a\u4e73": 244, "\u957f\u5ea6": 245, "\u5185\u5f84": 246, "\u5927\u5c0f\u4e0d\u7b49": 247, "\u7684": 248, "\u4f3c": 249, "\u5c11\u91cf": 250, "\u8fc2\u66f2": 251, "\u533a\u89c1": 252, "\u5904\u53ca": 253, "\u5904\u5747": 254, "\u591a": 255, "\u53d1\u4e73": 256, "\u4e00\u5904": 257, "\u65c1\u53ca": 258, "\u9499\u5316": 259, "\u4fdd\u7559": 260, "\u5168\u5207": 261, "\u4fdd": 262, "\u6591\u72b6\u5f3a": 263, "\u58f0\u5f71": 264, "\u524d\u540e": 265, "\u5f84\u7ea6": 266, "\u56e2": 267, "RI": 268, "0.53": 269, "\u539a\u7ea6": 270, "Ca\u4fdd\u4e73\u672f\u540e": 271, "\u4e00\u6781": 272, "\u7eb5\u6a2a\u6bd4": 273, "\u7565": 274, ">": 275, "1": 276, "\u8d28\u504f": 277, "\u5904\u4e0a": 278, "\u7f18": 279, "\uff1e": 280, "\u8870\u51cf": 281, "\u5916\u4e0b": 282, "\u5448\u56ca\u6027": 283, "\u8005": 284, "\u5047\u4f53": 285, "\u690d\u5165\u672f": 286, "\u4f59": 287, "\u81ea\u4f53": 288, "\u58c1": 289, "\u5468\u56f4": 290, "\u5de6\u4e73\u8f83": 291, "\u4e0e": 292, "\u76f8\u4f3c": 293, "\u53ef": 294, "\u6b8b\u4f59": 295, "\u4f34\u5bbd": 296, "\u5927\u58f0": 297, "\u5f71": 298, "\u6761\u5f62": 299, "\u5e26": 300, "\u6bdb\u7cd9": 301, "\u7565\u5927\u4e8e": 302, "\u4e00\u56ca\u5b9e": 303, "\u6df7\u5408\u56de\u58f0": 304, "PW": 305, "\u640f\u52a8": 306, "\u6027": 307, "\u9971\u6ee1": 308, "\u4e2a\u522b": 309, "\u589e\u591a": 310, "\u5f39\u6027": 311, "\u6210\u50cf": 312, "\u84dd\u8272": 313, "\u4e8c\u7ef4": 314, "\u58f0\u50cf": 315, "\u56fe": 316, "\u6269\u5927": 317, "\u7b26\u5408": 318, "\u7c7b": 319, "\u8868\u73b0": 320, "\u4e00\u4ee5": 321, "\u4e3a\u4e3b": 322, "\u56ca\u5b9e": 323, "\u6761\u72b6": 324, "\u4f4e\u81f3": 325, "\u87f9": 326, "\u8db3\u6837": 327, "\u661f": 328, "\u534a\u5904": 329, "\u4e00\u5f3a": 330, "\u76f4\u5f84": 331, "\u4f34\u58f0\u5f71": 332, "\u4e2d": 333, "\u7b49\u56de\u58f0": 334, "\u586b\u5145": 335, "\u578b": 336, "\u5c0f": 337, "\u533a\u53ca": 338, "10": 339, "\u5206\u9694": 340, "\u672f\u533a": 341, "\u6700\u6df1": 342, "\u4e00\u70b9": 343, "\u72b6\u5f3a": 344, "\u6de1\u58f0\u5f71": 345, "\u4f4e\u901f": 346, "\u9ad8\u963b": 347, "0.77": 348, "\u5c1a\u53ef": 349, "\u58c1\u4e0a": 350, "\u5f27\u5f62": 351, "\u9ad8\u56de\u58f0": 352, "\u6591": 353, "\u7a0d\u5f3a": 354, "\u76f8\u90bb": 355, "\u533a\u8fd1": 356, "\u5c1a\u6e05": 357, "\u4e4b\u95f4": 358, "\u504f": 359, "\u5176\u4e2d": 360, "\u5448\u89d2\u6837": 361, "\u8be5\u56ca\u6027": 362, "\u8bc4\u5206": 363, "\u6a2a\u5207": 364, "\u5206": 365, "\u7eb5\u5207": 366, "\u6700\u539a\u5904": 367, "\u5de6\u4e73\u5185": 368, "\u5806\u79ef": 369, "\u56f4\u7ed5": 370, "\u4e0b\u5c42": 371, "\u8be5": 372, "\u5411": 373, "\u7ec4\u7ec7": 374, "\u95f4\u9699": 375, "\u5f25\u6563": 376, "\u8bb0\u5f55": 377, "\u4e00\u6761": 378, "\u72b6": 379, "\u76f8\u901a": 380, "\u846b\u82a6": 381, "\u5185\u900f": 382, "\u58f0\u6027": 383, "\u7c97\u5927": 384, "\u5ddd": 385, "\u652f\u6837": 386, "PSV": 387, "/": 388, "s": 389, "0.63": 390, "0.69": 391, "\u6570\u6761": 392, "\u5185\u5747": 393, "\u6563": 394, "\u5728": 395, "\u7ec6\u70b9": 396, "\u5c3e\u5f81": 397, "\u5173\u7cfb\u5bc6\u5207": 398, "\u957f\u7ea6": 399, "\u95e8\u578b": 400, "\u5bbd\u4e3a": 401, "\u53d8\u8584": 402, "\u4e2d\u4f4e\u56de\u58f0": 403, "\u6708": 404, "\u65c1\u5747": 405, "\u56ca\u6027": 406, "\u5185\u4e0b": 407, "\u63a2\u53ca": 408, "\u814b\u7a9d": 409, "\u4e00\u7a0d": 410, "\u5904\u4f3c": 411, "\u80f8\u5927\u808c": 412, "\u5305\u819c": 413, "\u5b8c\u6574": 414, "\u900f\u58f0\u533a": 415, "\u77ed": 416, "\u76ae\u4e0b\u7ec4\u7ec7": 417, "\u5927\u4e8e": 418, "\u900f\u58f0\u6027": 419, "\u5f84\u5747": 420, "\u5176\u65c1": 421, "\u70b9\u5f3a": 422, "\u65c1\u89c1": 423, "\u793a\u5176": 424, "\u814b": 425, "\u52a8\u8109": 426, "\u5fae\u521b": 427, "\u5206\u53f6": 428, "0.78": 429, "\u7b2c": 430, "4": 431, "5": 432, "\u808b\u9aa8": 433, "\u8fde\u7eed\u6027": 434, "\u4e2d\u65ad": 435, "\u8868\u9762": 436, "\u51f9\u51f8\u4e0d\u5e73": 437, ";": 438, "\u533a\u5747": 439, "\u597d": 440, "\u6df1\u5c42": 441, "\u5ef6": 442, "\u8d70\u5f62": 443, "\u52a8\u9759\u8109": 444, "\u60a3\u8005": 445, "\u6240\u8ff0": 446, "\u5904\u626b\u67e5": 447, "\u7d22\u72b6": 448, "\u4e00\u4e73": 449, "\u56ca\u72b6": 450, "\u526f": 451, "\u65c1\u4e73": 452, "\u6240\u6307": 453, "*": 454, "2": 455, "\u808b\u4e0a": 456, "\u808c\u8089": 457, "\u4f53\u8868": 458, "\u8be6\u89c1": 459, "\u6807\u8bb0": 460, "\u9686\u80f8\u672f": 461, "\u8584": 462, "\u5f84": 463, "\u826f\u597d": 464, "\u5185\u4fa7": 465, "\u8695\u8c46": 466, "\u7c7b\u5706\u5f62": 467, "\u5de6\u53f3": 468, "\u4ee5": 469, "\u80a9\u80db\u9aa8": 470, "\u6761\u7d22\u6837": 471, "\u826f\u6027": 472, "\u4e24\u5904": 473, "\u7a84\u5e26": 474, "\u6837\u65e0": 475, "\u7d2f\u53ca": 476, "\u5916": 477, "\u7ba1\u8154": 478, "\u6d46\u7ec6\u80de": 479, "\u4e73\u817a\u708e": 480, "\u4e73\u4e73": 481, "\u5206\u90e8": 482, "\u4ece": 483, "\u5ef6\u81f3": 484, "\u793a\u63a2": 485, "\u949f\u8ddd": 486, "\u56ca\u5b9e\u6027": 487, "\u4fa7": 488, "\u4e00\u7247": 489, "\u672a": 490, "\u6b63\u540e\u65b9": 491, "\u53f3\u53cc\u4fa7": 492, "\u56e2\u72b6": 493, "\u76f8\u8fde": 494, "\u6761": 495, "\u819c\u6837": 496, "0.84": 497, "\u9891\u8c31": 498, "\u5782\u76f4": 499, "\u4f4d": 500, "\u53e3": 501, "\u6bb5": 502, "\u4e2d\u5fc3": 503, "\u4ee5\u5916": 504, "\u8f83\u539a": 505, "\u5904\u7ea6": 506, "0.82": 507, "\u88c2\u9699": 508, "\u90e8\u626b\u67e5": 509, "\u5176": 510, "\u524d\u65b9": 511, "\u5e76": 512, "\u4f4d\u8ddd": 513, "\u539a\u4e3a": 514, "\u4e00\u6591": 515, "\u4f34\u6de1": 516, "\u51f8\u8d77": 517, "\u76f8\u878d": 518, "\u5904\u591a": 519, "\u5de6\u4e73\u4e73": 520, "\u539a\u5ea6": 521, "\u6b63\u5e38": 522, "\u8d85\u58f0": 523, "\u5904\u4e73": 524, "\u539a\u58c1": 525, "\u7b2c\u4e94": 526, "\u808b\u7f18": 527, "\u524d\u7ebf": 528, "\u4e73\u7ba1": 529, "\u672a\u89c1\u660e": 530, "\u786e\u5b9e\u6027": 531, "\u533a\u4e73": 532, "\u65cb\u5207": 533, "\u4e09\u4e2a": 534, "\u6700\u5927": 535, "\u53f6\u814b": 536, "\u6210\u5206": 537, "\u76ae\u8868": 538, "\u5f25\u6f2b\u6027": 539, "\u4e00\u7c7b": 540, "\u5706\u5f62": 541, "1.6": 542, "m": 543, "\u6df1\u5ea6": 544, "\u4e8e\u5916": 545, "\u5f27\u957f": 546, "\u535a\u52a8": 547, "\u7d27\u90bb": 548, "\u661f\u70b9": 549, "\u80a9": 550, "\u6cbf": 551, "cm": 552, "\u00d7": 553, "\u5bc6\u96c6": 554, "\u8f7b\u8f7b": 555, "\u6324\u538b": 556, "\u79fb\u52a8": 557, "\u75c5\u7076": 558, "\u5c42\u53ca": 559, "\u6d88\u5931": 560, "\u7ba1\u72b6": 561, "\u53e6\u4e8e": 562, "\u73af\u7ed5": 563, "\u8840\u7ba1": 564, "\u7a7f\u884c": 565, "\u8ddd\u79bb": 566, "\u5185\u58c1": 567, "\u8be5\u5904": 568, "\u7d6e\u72b6": 569, "\u793a\u5916": 570, "\u5230\u661f": 571, "\u7ec4\u7ec7\u5173\u7cfb": 572, "\u5bc6\u5207": 573, "\u89d2\u6837": 574, "\u7802\u783e": 575, "\u6837\u5f3a": 576, "\u6d45\u5c42": 577, "\u4ea4\u754c\u5904": 578, "\u5de6\u53f6": 579, "\u53ca\u5185": 580, "\u4e0b\u4fa7": 581, "\u5f84\u4e3a": 582, "\u957f\u5f84": 583, "\u5206\u754c": 584, "\u56e2\u5757": 585, "\u7a84\u6761": 586, "\u6837\u4f4e": 587, "\u6e05": 588, "\u80bf\u7624": 589, "\u793a\u7a0d": 590, "\u56e0": 591, "\u4f53\u4f4d": 592, "\u53d7\u9650": 593, "\u8f85\u6599": 594, "\u906e\u76d6": 595, "\u53ca\u53f3": 596, "\u672a\u80fd": 597, "\u63a2\u67e5": 598, "\u4e73\u6c41": 599, "\u6de4\u79ef": 600, "\u7f51\u683c": 601, "\u7ec6\u5bc6": 602, "\u6f02\u6d6e": 603, "\u5176\u56ca": 604, "\u58c1\u7565\u539a": 605, "\u653e\u5c04\u6027": 606, "\u6a44\u6984\u578b": 607, "\u4e00\u652f": 608, "\u533a\u8ddd\u4e8e": 609, "\u6591\u70b9\u72b6": 610, "\u4f24\u53e3\u5904": 611, "\u6761\u5e26": 612, "\u8c61\u817a": 613, "\u7b49\u540c": 614, "\u4f59\u53cc\u4fa7": 615, "\u8db3\u72b6": 616, "\u6781": 617, "\u6241\u72b6": 618, "\u5706": 619, "0.67": 620, "\u72b6\u4f4e": 621, "\u8d28\u6db2": 622, "\u7ea2\u80bf": 623, "\u540e\u53f3": 624, "\u53e6\u89c1": 625, "\u5c42\u95f4": 626, "\u8f83\u786c": 627, "\u95f4\u8ddd": 628, "\u6c34\u80bf": 629, "\u7834\u6e83": 630, "\u65e0\u6cd5": 631, "\u4ec5": 632, "CDF": 633, "\u6db2\u5316": 634, "\u4e8e\u4fa7": 635, "\u5de6\u4e73\u5927\u8005": 636, "\u4e00\u819c\u6837": 637, "\u80f8\u90e8": 638, "\u53d8\u5f62": 639, "\u6b20\u5747": 640, "\u7eb5": 641, "\u6a2a": 642, "\u7ec6\u5c0f": 643, "\u653e\u5c04": 644, "\u6837\u5206\u5e03": 645, "\u4e73\u5916": 646, "\u6781\u4f4e": 647, "\u5904\u5185": 648, "\u8154": 649, "\u6d41\u52a8": 650, "\u77ed\u7ebf": 651, "\u67d0": 652, "\u4e00\u5207": 653, "\u9762\u5448": 654, "\u5bf9\u4fa7": 655, "\u4f3c\u6cbf": 656, "\u793a\u5747": 657, "\u7b2c\u56db": 658, "\u9519\u4f4d": 659, "\u5904\u957f": 660, "\u9aa8": 661, "\u75c2": 662, "\u5f62\u6210": 663, "\u9aa8\u75c2": 664, "\u76f8\u5bf9": 665, "\u591a\u6761": 666, "12": 667, "\u6839\u90e8": 668, "\u793a\u53ef\u63a2": 669, "\u6db2\u6027": 670, "\u6697\u533a": 671, "\u534a": 672, "\u692d\u5706\u5f62": 673, "0.93": 674, "\u5ef6\u4f38": 675, "\u793a\u4e3a": 676, "\u534a\u533a": 677, "\u6df1\u5904": 678, "\u9888\u90e8": 679, "\u80f8\u9501": 680, "\u4e73\u7a81": 681, "\u808c": 682, "\u5411\u4e0a": 683, "\u63a8\u6324": 684, "\u5411\u4e0b": 685, "\u663e\u8457": 686, "\u63a5\u8fd1": 687, "\u793a\u5b9e\u6027": 688, "\u906e\u6321": 689, "\u5207\u9762": 690, "\u56ca\u58c1": 691, "\u65e0\u58f0": 692, "8": 693, "": 694}, {"1": "\u53cc\u4fa7", "2": "\u4e73\u817a", "3": "\u817a\u4f53", "4": "\u7ed3\u6784", "5": "\u7a0d", "6": "\u7d0a\u4e71", "7": "\uff0c", "8": "\u4e73", "9": "\u5bfc\u7ba1", "10": "\u4e0d", "11": "\u6269\u5f20", "12": "\u672a\u89c1", "13": "\u660e\u786e", "14": "\u5360\u4f4d\u6027", "15": "\u75c5\u53d8", "16": "\u3002", "17": "\u814b\u4e0b", "18": "\u660e\u663e", "19": "\u80bf\u5927", "20": "\u6dcb\u5df4\u7ed3", "21": "\uff1a", "22": "\u8f6f\u7ec4\u7ec7", "23": "\u5404\u5c42\u6b21", "24": "\u663e\u793a", "25": "\u6e05\u6670", "26": "\u76ae\u80a4", "27": "\u548c", "28": "\u76ae\u4e0b\u8102\u80aa", "29": "\u5c42\u672a\u89c1", "30": "\u5f02\u5e38", "31": "\u56de\u58f0", "32": "\u6b20", "33": "\u89c4\u6574", "34": "\u5185", "35": "\u5747\u5300", "36": "\u5de6\u4fa7", "37": "\u7ea6", "38": "_Loc_", "39": "\u65b9\u5411", "40": "\u89c1", "41": "\u4e00", "42": "\u4f4e\u56de\u58f0", "43": "\u7ed3\u8282", "44": "\u5927\u5c0f", "45": "_2DS_", "46": "\u8fb9\u754c", "47": "\u5f62\u6001", "48": "CDFI", "49": "\u793a", "50": "\u672a\u63a2\u53ca", "51": "\u8840\u6d41", "52": "\u4fe1\u53f7", "53": "\u626b\u67e5", "54": "\u672a\u89c1\u5f02\u5e38", "55": "\u5207\u9664\u672f", "56": "\u540e", "57": "\u539f", "58": "\u533a\u57df", "59": "\u53f3\u4fa7", "60": "\u4e8e", "61": "\u533a\u8ddd", "62": "\u4e73\u5934", "63": "_SCM_", "64": "\u5904", "65": "\u53ef\u89c1", "66": "_3DS_", "67": "\u5904\u89c1", "68": "\u53cc", "69": "\u5448", "70": "\u7edd\u7ecf", "71": "\u6539\u53d8", "72": "\u840e\u7f29", "73": "\u5b9e\u6027", "74": "\u53ef\u63a2\u53ca", "75": "\u591a\u4e2a", "76": "\u5927\u8005", "77": "\u5c1a", "78": "\u76ae\u8d28", "79": "\u589e\u539a", "80": "\u201c", "81": "\u6dcb\u5df4\u95e8", "82": "\u201d", "83": "\u533a", "84": "\u65c1", "85": "\u5de6", "86": "\u4f53\u5c42", "87": "\u539a", "88": "\u53f3", "89": "\u53f3\u4e73", "90": "\u4e00\u4e2a", "91": "\u5468\u8fb9", "92": "\u53ca", "93": "\u5185\u90e8", "94": "\u5747", "95": "\u672a\u8bb0\u5f55", "96": "\u5230", "97": "\u5de6\u4e73\u5916", "98": "\u4e0a", "99": "\u8c61\u9650", "100": "\u4e3a", "101": "\u3001", "102": "\u6742\u4e71", "103": "\u5c42\u539a", "104": "\u5185\u672a\u89c1", "105": "\u5360\u4f4d", "106": "\u5176\u5185", "107": "6", "108": "-", "109": "_LocR_", "110": "\u4f4d\u81ea", "111": "\u81f3", "112": "\u8fb9\u7f18", "113": "\u591a\u53d1", "114": "\u7247\u72b6", "115": "\u8f83\u5927", "116": "\u8303\u56f4", "117": "\u63a2\u5934", "118": "\u52a0\u538b", "119": "\u6d41\u6c99", "120": "\u6837", "121": "\u80bf\u7269", "122": "\u5c42", "123": "\u51cf\u4f4e", "124": "\u5206\u5e03", "125": "\u5c1a\u5747", "126": ":", "127": "\u6392\u5217", "128": "\u89c4\u5219", "129": "\u793a\u672a\u89c1", "130": "\u8ddd", "131": "\u4e0a\u8ff0", "132": "\u4e00\u65e0", "133": "\u5185\u900f\u58f0", "134": "\u6b20\u4f73", "135": "\uff1b", "136": "\u76ae\u4e0b", "137": "\u53e6", "138": "\u53cc\u4e73", "139": "\u5bbd\u5747", "140": "Ca", "141": "\u672f\u540e", "142": "\u80f8\u58c1", "143": ",", "144": "\u4e0d\u89c4\u5219", "145": "\u4f4d\u4e8e", "146": "\u8fd1", "147": "\u80a9\u5cf0", "148": "\u4e0d\u6e05", "149": "\u81f4\u5bc6", "150": "\u5916\u4e0a", "151": "\u53ca\u5916", "152": "\u4e0b", "153": "\u5185\u4e0a", "154": "\u589e\u7c97", "155": "\u4ee5\u53cc\u4fa7", "156": "\u8457", "157": "\u52a8\u8109\u8840", "158": "\u6d41", "159": "\u76f4\u5f84\u7ea6", "160": "\u5c11\u8bb8", "161": "\u624b\u672f", "162": "\u5207\u53e3", "163": "\u5916\u4fa7", "164": "\u65e0", "165": "\u6570\u4e2a", "166": "\u6e05\u695a", "167": "\u591a\u5904", "168": "\u6700", "169": "\u5bbd", "170": "_SMM_", "171": "\u5c40\u9650\u6027", "172": "\u589e\u5bbd", "173": "\u7ba1\u58c1", "174": "\u5149\u6ed1", "175": "\u900f\u58f0", "176": "\u5dee", "177": "\u4f4d\u7f6e", "178": "\u6bdb\u523a", "179": "\u4fdd\u4e73", "180": "\u4e24\u4e2a", "181": "\u5206\u522b", "182": "\u793a\u5185", "183": "\u8f83", "184": "\u4e30\u5bcc", "185": "\u4e0a\u65b9", "186": "\u4e73\u6655", "187": "\u7537\u6027", "188": "\u68c0\u67e5", "189": "\u540e\u65b9", "190": "\u817a\u4f53\u6837", "191": "\u6b20\u6e05", "192": "\u817a\u58c1", "193": "\u5c40\u90e8", "194": "\u589e\u5f3a", "195": "\u5de6\u4e73", "196": "\u4e0d\u5747", "197": "\u8d28", "198": "\u65c1\u5904", "199": "\u5404\u89c1", "200": "\u8102\u80aa", "201": "\u5c42\u5904", "202": "\u4e00\u504f", "203": "\u5f3a", "204": "\u76ae", "205": "\u9ad3\u8d28", "206": "\u754c\u9650", "207": "\u949f", "208": "\u4e00\u56ca\u6027", "209": "\u5305\u5757", "210": "\u70b9", "211": "9", "212": "\u7622\u75d5", "213": "\u4e0b\u65b9", "214": "\u6700\u539a", "215": "\u53ca\u5176", "216": "\u5c42\u5185", "217": "\u5185\u4f3c", "218": "\u70b9\u72b6", "219": "\u5927", "220": "\u5206\u53f6\u72b6", "221": "\u4f4e", "222": "\u540e\u4f34", "223": "\u5f57\u661f", "224": "\u5c3e", "225": "\u5185\u89c1", "226": "\u90e8\u5206", "227": "\u4f3c\u7531", "228": "\u878d\u5408", "229": "\u800c\u6210", "230": "3", "231": "11", "232": "\u4e24\u70b9", "233": "X", "234": "\uff08", "235": "\uff09", "236": "\u4e00\u4f4e", "237": "\u5df2", "238": "\u5207\u9664", "239": "\u5904\u672a\u89c1", "240": "\u504f\u5f3a", "241": "\u5bbd\u7ea6", "242": "\u9686\u8d77", "243": "\u8102\u80aa\u7ec4\u7ec7", "244": "\u817a\u4e73", "245": "\u957f\u5ea6", "246": "\u5185\u5f84", "247": "\u5927\u5c0f\u4e0d\u7b49", "248": "\u7684", "249": "\u4f3c", "250": "\u5c11\u91cf", "251": "\u8fc2\u66f2", "252": "\u533a\u89c1", "253": "\u5904\u53ca", "254": "\u5904\u5747", "255": "\u591a", "256": "\u53d1\u4e73", "257": "\u4e00\u5904", "258": "\u65c1\u53ca", "259": "\u9499\u5316", "260": "\u4fdd\u7559", "261": "\u5168\u5207", "262": "\u4fdd", "263": "\u6591\u72b6\u5f3a", "264": "\u58f0\u5f71", "265": "\u524d\u540e", "266": "\u5f84\u7ea6", "267": "\u56e2", "268": "RI", "269": "0.53", "270": "\u539a\u7ea6", "271": "Ca\u4fdd\u4e73\u672f\u540e", "272": "\u4e00\u6781", "273": "\u7eb5\u6a2a\u6bd4", "274": "\u7565", "275": ">", "276": "1", "277": "\u8d28\u504f", "278": "\u5904\u4e0a", "279": "\u7f18", "280": "\uff1e", "281": "\u8870\u51cf", "282": "\u5916\u4e0b", "283": "\u5448\u56ca\u6027", "284": "\u8005", "285": "\u5047\u4f53", "286": "\u690d\u5165\u672f", "287": "\u4f59", "288": "\u81ea\u4f53", "289": "\u58c1", "290": "\u5468\u56f4", "291": "\u5de6\u4e73\u8f83", "292": "\u4e0e", "293": "\u76f8\u4f3c", "294": "\u53ef", "295": "\u6b8b\u4f59", "296": "\u4f34\u5bbd", "297": "\u5927\u58f0", "298": "\u5f71", "299": "\u6761\u5f62", "300": "\u5e26", "301": "\u6bdb\u7cd9", "302": "\u7565\u5927\u4e8e", "303": "\u4e00\u56ca\u5b9e", "304": "\u6df7\u5408\u56de\u58f0", "305": "PW", "306": "\u640f\u52a8", "307": "\u6027", "308": "\u9971\u6ee1", "309": "\u4e2a\u522b", "310": "\u589e\u591a", "311": "\u5f39\u6027", "312": "\u6210\u50cf", "313": "\u84dd\u8272", "314": "\u4e8c\u7ef4", "315": "\u58f0\u50cf", "316": "\u56fe", "317": "\u6269\u5927", "318": "\u7b26\u5408", "319": "\u7c7b", "320": "\u8868\u73b0", "321": "\u4e00\u4ee5", "322": "\u4e3a\u4e3b", "323": "\u56ca\u5b9e", "324": "\u6761\u72b6", "325": "\u4f4e\u81f3", "326": "\u87f9", "327": "\u8db3\u6837", "328": "\u661f", "329": "\u534a\u5904", "330": "\u4e00\u5f3a", "331": "\u76f4\u5f84", "332": "\u4f34\u58f0\u5f71", "333": "\u4e2d", "334": "\u7b49\u56de\u58f0", "335": "\u586b\u5145", "336": "\u578b", "337": "\u5c0f", "338": "\u533a\u53ca", "339": "10", "340": "\u5206\u9694", "341": "\u672f\u533a", "342": "\u6700\u6df1", "343": "\u4e00\u70b9", "344": "\u72b6\u5f3a", "345": "\u6de1\u58f0\u5f71", "346": "\u4f4e\u901f", "347": "\u9ad8\u963b", "348": "0.77", "349": "\u5c1a\u53ef", "350": "\u58c1\u4e0a", "351": "\u5f27\u5f62", "352": "\u9ad8\u56de\u58f0", "353": "\u6591", "354": "\u7a0d\u5f3a", "355": "\u76f8\u90bb", "356": "\u533a\u8fd1", "357": "\u5c1a\u6e05", "358": "\u4e4b\u95f4", "359": "\u504f", "360": "\u5176\u4e2d", "361": "\u5448\u89d2\u6837", "362": "\u8be5\u56ca\u6027", "363": "\u8bc4\u5206", "364": "\u6a2a\u5207", "365": "\u5206", "366": "\u7eb5\u5207", "367": "\u6700\u539a\u5904", "368": "\u5de6\u4e73\u5185", "369": "\u5806\u79ef", "370": "\u56f4\u7ed5", "371": "\u4e0b\u5c42", "372": "\u8be5", "373": "\u5411", "374": "\u7ec4\u7ec7", "375": "\u95f4\u9699", "376": "\u5f25\u6563", "377": "\u8bb0\u5f55", "378": "\u4e00\u6761", "379": "\u72b6", "380": "\u76f8\u901a", "381": "\u846b\u82a6", "382": "\u5185\u900f", "383": "\u58f0\u6027", "384": "\u7c97\u5927", "385": "\u5ddd", "386": "\u652f\u6837", "387": "PSV", "388": "/", "389": "s", "390": "0.63", "391": "0.69", "392": "\u6570\u6761", "393": "\u5185\u5747", "394": "\u6563", "395": "\u5728", "396": "\u7ec6\u70b9", "397": "\u5c3e\u5f81", "398": "\u5173\u7cfb\u5bc6\u5207", "399": "\u957f\u7ea6", "400": "\u95e8\u578b", "401": "\u5bbd\u4e3a", "402": "\u53d8\u8584", "403": "\u4e2d\u4f4e\u56de\u58f0", "404": "\u6708", "405": "\u65c1\u5747", "406": "\u56ca\u6027", "407": "\u5185\u4e0b", "408": "\u63a2\u53ca", "409": "\u814b\u7a9d", "410": "\u4e00\u7a0d", "411": "\u5904\u4f3c", "412": "\u80f8\u5927\u808c", "413": "\u5305\u819c", "414": "\u5b8c\u6574", "415": "\u900f\u58f0\u533a", "416": "\u77ed", "417": "\u76ae\u4e0b\u7ec4\u7ec7", "418": "\u5927\u4e8e", "419": "\u900f\u58f0\u6027", "420": "\u5f84\u5747", "421": "\u5176\u65c1", "422": "\u70b9\u5f3a", "423": "\u65c1\u89c1", "424": "\u793a\u5176", "425": "\u814b", "426": "\u52a8\u8109", "427": "\u5fae\u521b", "428": "\u5206\u53f6", "429": "0.78", "430": "\u7b2c", "431": "4", "432": "5", "433": "\u808b\u9aa8", "434": "\u8fde\u7eed\u6027", "435": "\u4e2d\u65ad", "436": "\u8868\u9762", "437": "\u51f9\u51f8\u4e0d\u5e73", "438": ";", "439": "\u533a\u5747", "440": "\u597d", "441": "\u6df1\u5c42", "442": "\u5ef6", "443": "\u8d70\u5f62", "444": "\u52a8\u9759\u8109", "445": "\u60a3\u8005", "446": "\u6240\u8ff0", "447": "\u5904\u626b\u67e5", "448": "\u7d22\u72b6", "449": "\u4e00\u4e73", "450": "\u56ca\u72b6", "451": "\u526f", "452": "\u65c1\u4e73", "453": "\u6240\u6307", "454": "*", "455": "2", "456": "\u808b\u4e0a", "457": "\u808c\u8089", "458": "\u4f53\u8868", "459": "\u8be6\u89c1", "460": "\u6807\u8bb0", "461": "\u9686\u80f8\u672f", "462": "\u8584", "463": "\u5f84", "464": "\u826f\u597d", "465": "\u5185\u4fa7", "466": "\u8695\u8c46", "467": "\u7c7b\u5706\u5f62", "468": "\u5de6\u53f3", "469": "\u4ee5", "470": "\u80a9\u80db\u9aa8", "471": "\u6761\u7d22\u6837", "472": "\u826f\u6027", "473": "\u4e24\u5904", "474": "\u7a84\u5e26", "475": "\u6837\u65e0", "476": "\u7d2f\u53ca", "477": "\u5916", "478": "\u7ba1\u8154", "479": "\u6d46\u7ec6\u80de", "480": "\u4e73\u817a\u708e", "481": "\u4e73\u4e73", "482": "\u5206\u90e8", "483": "\u4ece", "484": "\u5ef6\u81f3", "485": "\u793a\u63a2", "486": "\u949f\u8ddd", "487": "\u56ca\u5b9e\u6027", "488": "\u4fa7", "489": "\u4e00\u7247", "490": "\u672a", "491": "\u6b63\u540e\u65b9", "492": "\u53f3\u53cc\u4fa7", "493": "\u56e2\u72b6", "494": "\u76f8\u8fde", "495": "\u6761", "496": "\u819c\u6837", "497": "0.84", "498": "\u9891\u8c31", "499": "\u5782\u76f4", "500": "\u4f4d", "501": "\u53e3", "502": "\u6bb5", "503": "\u4e2d\u5fc3", "504": "\u4ee5\u5916", "505": "\u8f83\u539a", "506": "\u5904\u7ea6", "507": "0.82", "508": "\u88c2\u9699", "509": "\u90e8\u626b\u67e5", "510": "\u5176", "511": "\u524d\u65b9", "512": "\u5e76", "513": "\u4f4d\u8ddd", "514": "\u539a\u4e3a", "515": "\u4e00\u6591", "516": "\u4f34\u6de1", "517": "\u51f8\u8d77", "518": "\u76f8\u878d", "519": "\u5904\u591a", "520": "\u5de6\u4e73\u4e73", "521": "\u539a\u5ea6", "522": "\u6b63\u5e38", "523": "\u8d85\u58f0", "524": "\u5904\u4e73", "525": "\u539a\u58c1", "526": "\u7b2c\u4e94", "527": "\u808b\u7f18", "528": "\u524d\u7ebf", "529": "\u4e73\u7ba1", "530": "\u672a\u89c1\u660e", "531": "\u786e\u5b9e\u6027", "532": "\u533a\u4e73", "533": "\u65cb\u5207", "534": "\u4e09\u4e2a", "535": "\u6700\u5927", "536": "\u53f6\u814b", "537": "\u6210\u5206", "538": "\u76ae\u8868", "539": "\u5f25\u6f2b\u6027", "540": "\u4e00\u7c7b", "541": "\u5706\u5f62", "542": "1.6", "543": "m", "544": "\u6df1\u5ea6", "545": "\u4e8e\u5916", "546": "\u5f27\u957f", "547": "\u535a\u52a8", "548": "\u7d27\u90bb", "549": "\u661f\u70b9", "550": "\u80a9", "551": "\u6cbf", "552": "cm", "553": "\u00d7", "554": "\u5bc6\u96c6", "555": "\u8f7b\u8f7b", "556": "\u6324\u538b", "557": "\u79fb\u52a8", "558": "\u75c5\u7076", "559": "\u5c42\u53ca", "560": "\u6d88\u5931", "561": "\u7ba1\u72b6", "562": "\u53e6\u4e8e", "563": "\u73af\u7ed5", "564": "\u8840\u7ba1", "565": "\u7a7f\u884c", "566": "\u8ddd\u79bb", "567": "\u5185\u58c1", "568": "\u8be5\u5904", "569": "\u7d6e\u72b6", "570": "\u793a\u5916", "571": "\u5230\u661f", "572": "\u7ec4\u7ec7\u5173\u7cfb", "573": "\u5bc6\u5207", "574": "\u89d2\u6837", "575": "\u7802\u783e", "576": "\u6837\u5f3a", "577": "\u6d45\u5c42", "578": "\u4ea4\u754c\u5904", "579": "\u5de6\u53f6", "580": "\u53ca\u5185", "581": "\u4e0b\u4fa7", "582": "\u5f84\u4e3a", "583": "\u957f\u5f84", "584": "\u5206\u754c", "585": "\u56e2\u5757", "586": "\u7a84\u6761", "587": "\u6837\u4f4e", "588": "\u6e05", "589": "\u80bf\u7624", "590": "\u793a\u7a0d", "591": "\u56e0", "592": "\u4f53\u4f4d", "593": "\u53d7\u9650", "594": "\u8f85\u6599", "595": "\u906e\u76d6", "596": "\u53ca\u53f3", "597": "\u672a\u80fd", "598": "\u63a2\u67e5", "599": "\u4e73\u6c41", "600": "\u6de4\u79ef", "601": "\u7f51\u683c", "602": "\u7ec6\u5bc6", "603": "\u6f02\u6d6e", "604": "\u5176\u56ca", "605": "\u58c1\u7565\u539a", "606": "\u653e\u5c04\u6027", "607": "\u6a44\u6984\u578b", "608": "\u4e00\u652f", "609": "\u533a\u8ddd\u4e8e", "610": "\u6591\u70b9\u72b6", "611": "\u4f24\u53e3\u5904", "612": "\u6761\u5e26", "613": "\u8c61\u817a", "614": "\u7b49\u540c", "615": "\u4f59\u53cc\u4fa7", "616": "\u8db3\u72b6", "617": "\u6781", "618": "\u6241\u72b6", "619": "\u5706", "620": "0.67", "621": "\u72b6\u4f4e", "622": "\u8d28\u6db2", "623": "\u7ea2\u80bf", "624": "\u540e\u53f3", "625": "\u53e6\u89c1", "626": "\u5c42\u95f4", "627": "\u8f83\u786c", "628": "\u95f4\u8ddd", "629": "\u6c34\u80bf", "630": "\u7834\u6e83", "631": "\u65e0\u6cd5", "632": "\u4ec5", "633": "CDF", "634": "\u6db2\u5316", "635": "\u4e8e\u4fa7", "636": "\u5de6\u4e73\u5927\u8005", "637": "\u4e00\u819c\u6837", "638": "\u80f8\u90e8", "639": "\u53d8\u5f62", "640": "\u6b20\u5747", "641": "\u7eb5", "642": "\u6a2a", "643": "\u7ec6\u5c0f", "644": "\u653e\u5c04", "645": "\u6837\u5206\u5e03", "646": "\u4e73\u5916", "647": "\u6781\u4f4e", "648": "\u5904\u5185", "649": "\u8154", "650": "\u6d41\u52a8", "651": "\u77ed\u7ebf", "652": "\u67d0", "653": "\u4e00\u5207", "654": "\u9762\u5448", "655": "\u5bf9\u4fa7", "656": "\u4f3c\u6cbf", "657": "\u793a\u5747", "658": "\u7b2c\u56db", "659": "\u9519\u4f4d", "660": "\u5904\u957f", "661": "\u9aa8", "662": "\u75c2", "663": "\u5f62\u6210", "664": "\u9aa8\u75c2", "665": "\u76f8\u5bf9", "666": "\u591a\u6761", "667": "12", "668": "\u6839\u90e8", "669": "\u793a\u53ef\u63a2", "670": "\u6db2\u6027", "671": "\u6697\u533a", "672": "\u534a", "673": "\u692d\u5706\u5f62", "674": "0.93", "675": "\u5ef6\u4f38", "676": "\u793a\u4e3a", "677": "\u534a\u533a", "678": "\u6df1\u5904", "679": "\u9888\u90e8", "680": "\u80f8\u9501", "681": "\u4e73\u7a81", "682": "\u808c", "683": "\u5411\u4e0a", "684": "\u63a8\u6324", "685": "\u5411\u4e0b", "686": "\u663e\u8457", "687": "\u63a5\u8fd1", "688": "\u793a\u5b9e\u6027", "689": "\u906e\u6321", "690": "\u5207\u9762", "691": "\u56ca\u58c1", "692": "\u65e0\u58f0", "693": "8", "694": ""}] \ No newline at end of file diff --git a/utils/breast_gen_config.py b/utils/breast_gen_config.py new file mode 100644 index 0000000000000000000000000000000000000000..0c4af5b1ee85ef9ea33f60bf1bc5673050c194ea --- /dev/null +++ b/utils/breast_gen_config.py @@ -0,0 +1,47 @@ +import os +__author__ = 'Rio' +from yacs.config import CfgNode as CN +config = CN() +config.root = os.path.dirname(os.path.abspath(__file__)) +config.models = os.path.join(config.root, '../Model/breast_model_best.pth') + +config.dataset_name = 'Mammary' +config.distiller_num = 18 # liver:18; Mamary:18; Thyroid:5 +config.jieba_dir = os.path.join(config.root, '../utils/key_technical_words.txt') +config.image_dir = os.path.join(config.root, '../Data_demo/Images') +# config.ann_path = 'E:/Datasets/Ultrasound/Data/new_Mammary2.json' +config.ann_path = os.path.join(config.root, '../Data_demo/Breast.json') + +config.dict_pth = os.path.join(config.root, '../utils/breast_dict.txt') + +config.max_seq_length = 150 + +config.visual_extractor = 'resnet101' +config.visual_extractor_pretrained = True + +config.d_model = 512 +config.d_ff = 512 +config.d_vf = 2048 +config.num_heads = 8 +config.num_layers = 3 +config.dropout = 0.1 +config.logit_layers = 1 +config.bos_idx = 0 +config.eos_idx = 0 +config.pad_idx = 0 +config.use_bn = 0 +config.drop_prob_lm = 0.5 + +config.sample_n = 1 +config.output_logsoftmax = 1 +config.decoding_constraintt = 0 + +config.seed = 9233 + +# text_image_losses.py +config.cuda = True +config.threshold = 3 +config.nhidden = 512 + + + diff --git a/utils/key_technical_words.txt b/utils/key_technical_words.txt new file mode 100644 index 0000000000000000000000000000000000000000..21fb1bed191d396d905c7465cbdba4b1d4c95031 --- /dev/null +++ b/utils/key_technical_words.txt @@ -0,0 +1,58 @@ +_SMM_ +_SCM_ +_Loc_ +_LocR_ +_2DS_ +_3DS_ +_r_ +等回声 +一 +可探及 +皮下脂肪 +未探及 +纵横比 +切面 +中低回声 +分叶状 +椭圆形 +类圆形 +不规则 +规则 +包膜 +锐利 +高回声 +完整 +不完整 +清晰 +模糊 +成角 +毛刺 +微小分叶 +分叶 +小分叶 +低回声 +高回声 +混合回声 +等回声 +结节 +无 +微小 +粗大 +钙化 +微 +增强 +衰减 +不变 +混合改变 +平行 +垂直 +CDFI +乳房悬韧带 +淋巴门 +淋巴结 +囊实性 +腺体样 +边缘 +边界 +Ca保乳术后 +斑点装 diff --git a/utils/liver_dict.txt b/utils/liver_dict.txt new file mode 100644 index 0000000000000000000000000000000000000000..de8c2ccb7b6200b6d33705152fedb61da78c8e3d --- /dev/null +++ b/utils/liver_dict.txt @@ -0,0 +1 @@ +[{"\u809d\u810f": 1, "\u5f62\u6001": 2, "\u9971\u6ee1": 3, "\uff0c": 4, "\u5305\u819c": 5, "\u5149\u6ed1": 6, "\u5b9e\u8d28": 7, "\u56de\u58f0": 8, "\u7ec6\u5bc6": 9, "\u589e\u5f3a": 10, "\u95e8\u9759\u8109": 11, "\u7cfb\u7edf": 12, "\u663e\u793a": 13, "\u6b20": 14, "\u6e05\u6670": 15, "\u809d\u80be": 16, "\u5bf9\u6bd4": 17, "\u3002": 18, "\u809d": 19, "\u5185\u5916": 20, "\u80c6\u7ba1": 21, "\u672a\u89c1": 22, "\u6269\u5f20": 23, "\u4e3b\u5e72": 24, "\u5185\u5f84": 25, "\u6b63\u5e38": 26, "\u8303\u56f4": 27, "\u80c6\u56ca": 28, "\u5927\u5c0f": 29, "\u5982\u5e38": 30, "\u58c1\u4e0d\u539a": 31, "\u8154": 32, "\u5185": 33, "\u672a": 34, "\u89c1": 35, "\u660e\u663e": 36, "\u5f02\u5e38": 37, "\u80f0\u817a": 38, "\u5747\u5300": 39, "\u80f0\u7ba1": 40, "\u4e0d": 41, "\u5bbd": 42, "\u5185\u672a\u89c1": 43, "\u660e\u786e": 44, "\u5360\u4f4d\u6027": 45, "\u75c5\u53d8": 46, "\u813e\u810f": 47, "\u56e0": 48, "\u8179\u8154": 49, "\u80a0\u6c14": 50, "\u5e72\u6270": 51, "\u4e25\u91cd": 52, "\u56fe\u50cf": 53, "\u6ee1\u610f": 54, "\uff1a": 55, "\u540e\u573a": 56, "\u58f0": 57, "\u8870\u51cf": 58, "\u4e8e": 59, "\u809d\u53f3\u53f6": 60, "\u53ef\u89c1": 61, "\u4e00\u65e0": 62, "\u7ed3\u8282": 63, "\u7ea6": 64, "_2DS_": 65, "\u8fb9\u754c": 66, "\u540e": 67, "\u58c1": 68, "\uff1b": 69, "\u4f59": 70, "\u7a0d": 71, "\u53f3\u524d": 72, "\u53f6\u89c1": 73, "\u4e00\u7247": 74, "\u72b6": 75, "\u4f4e\u56de\u58f0": 76, "\u533a": 77, "\u4e3a": 78, "\u809d\u5185": 79, "\u7ba1\u9053": 80, "\u8d70\u884c": 81, "\u6e05\u695a": 82, "\u95e8\u8109": 83, "\u53ca": 84, "\u900f\u58f0": 85, "\u597d": 86, "\u672a\u89c1\u5f02\u5e38": 87, "\u809d\u5916": 88, "\u4e0a\u6bb5": 89, "_SCM_": 90, "\u6bb5": 91, "\u539a\u4e3a": 92, "\u808b\u4e0b": 93, "\u672a\u53ca": 94, "\u53f3\u53f6\u89c1": 95, "\u4e00": 96, "\u65e0": 97, "\u540e\u65b9": 98, "\u591a\u53d1": 99, "\u5f3a": 100, "\u5927\u8005": 101, "\u4f34\u58f0\u5f71": 102, "\u968f": 103, "\u4f53\u4f4d": 104, "\u6539\u53d8": 105, "\u800c": 106, "\u79fb\u52a8": 107, "\u56e0\u80a0\u6c14": 108, "\u4e0d\u6e05": 109, "\u8fb9\u7f18": 110, "\u949d": 111, "\u53cd\u5dee": 112, "\u5927": 113, "\u4e2d\u90e8": 114, "\u89c4\u6574": 115, "CDFI": 116, "\u793a": 117, "\u5468\u8fb9": 118, "\u8840\u6d41": 119, "\u4fe1\u53f7": 120, "\u56ca\u6027": 121, "\u7ed3\u6784": 122, "\u4f4d\u4e8e": 123, "\u5de6\u53f6": 124, "\u5176\u5185": 125, "\u672a\u63a2\u53ca": 126, "\u4f59\u809d": 127, "\u901a\u7545": 128, "\u7565": 129, "\u5c1a": 130, "\u56ca": 131, "\u58c1\u4e0a": 132, "\u504f": 133, "\u9ad8\u56de\u58f0": 134, "\u76f4\u5f84\u7ea6": 135, "\u65e0\u58f0": 136, "\u5f71": 137, "\u4e0d\u968f": 138, "\u70b9\u72b6": 139, "\u5934\u4f53\u90e8": 140, "\u524d\u540e": 141, "\u5f84": 142, "\u5206\u522b": 143, "\u3001": 144, "\u5c3e\u90e8": 145, "\u6c14\u4f53": 146, "\u4f53\u79ef": 147, "\u7a0d\u5927": 148, "\u539a": 149, "\u6bdb\u7cd9": 150, "\u539a\u7ea6": 151, "\u591a\u4e2a": 152, "\u7a0d\u5f3a": 153, "\u51f8\u8d77": 154, "\u58c1\u539a": 155, "\u5185\u89c1": 156, "\u53ef": 157, "\u5176\u4e2d": 158, "\u4e00\u4e2a": 159, "\u76f4\u5f84": 160, "\u4e00\u5f3a": 161, "\u5207\u9664\u672f": 162, "\u6591\u70b9": 163, "\u540e\u4f34": 164, "\u5f57\u661f": 165, "\u5c3e\u6837": 166, "\u5de6\u5185": 167, "\u72b6\u5f3a": 168, "\u80f0\u5934": 169, "\u80f0\u4f53": 170, "\u80f0\u5c3e\u539a": 171, "\u90e8\u89c1": 172, "\u809d\u53f3": 173, "\u53f6\u5185": 174, "\u4e00\u56ca\u6027": 175, "\u5de6\u5185\u53f6": 176, "\u65c1": 177, "\u53ef\u89c1\u4e00\u6591": 178, "\u53f6": 179, "\u53e6": 180, "\u9910\u540e": 181, "\u4e00\u7a0d": 182, "_3DS_": 183, "\u4e00\u70b9": 184, "\u58f0\u5f71": 185, "\u53f3\u53f6": 186, "\u4f34": 187, "\u201c": 188, "\u201d": 189, "\u5c3e\u5f81": 190, "\u90e8\u5206": 191, "\u80c6\u603b\u7ba1": 192, "\u5bbd\u7ea6": 193, "\u60a3\u8005": 194, "\u8179\u58c1": 195, "\u8f83\u539a": 196, "\u7ed3\u679c": 197, "\u4ec5\u4f9b": 198, "\u4e34\u5e8a": 199, "\u53c2\u8003": 200, "\u5207\u9762": 201, "\u6240\u793a": 202, "\u589e\u539a": 203, "\u4e2d\u4e0b": 204, "\u6b20\u6e05": 205, "\u4f53": 206, "\u5448": 207, "\u5185\u90e8": 208, "\u5360\u4f4d": 209, "\u813e\u95e8": 210, "\u5904\u89c1": 211, "\u7b49\u56de\u58f0": 212, "\u53ef\u63a2\u53ca": 213, "\u7247\u72b6": 214, "\u589e\u5927": 215, "\u4e24\u4e2a": 216, "\u5185\u4f3c": 217, "\u8f6e\u5ed3": 218, "\u4e0a": 219, "\u5de6\u53f6\u89c1": 220, "\u56e2": 221, "\u7a0d\u589e": 222, "\u7c97": 223, "\u9499\u5316": 224, "\u7565\u5927": 225, "\u8868\u9762": 226, "\u5e73\u6ed1": 227, "\u5e8a\u65c1": 228, "\u5c1a\u6e05": 229, "\u4e0d\u89c4\u5219": 230, "\u793a\u5176": 231, "\u5206\u5e03": 232, "\u5e95\u90e8": 233, "\u5e26\u72b6": 234, "\u5206\u9694": 235, "\u4e0d\u4f34": 236, "\u8f83\u5927": 237, "\u8005": 238, "\u58c1\u6b20": 239, ",": 240, "\u996e\u6c34": 241, "\u5de6\u5916": 242, "\u793a\u672a\u89c1": 243, "\u5207": 244, "\u672f\u540e": 245, "\u91cd": 246, "\u8d85\u58f0": 247, "\u68c0\u67e5": 248, "\u5de6": 249, "\u5916\u53f6": 250, "\u4e0b\u6781": 251, "\u5468\u56f4": 252, "\u5c1a\u53ef": 253, "\u53e6\u4e8e": 254, "\u7d6e\u72b6": 255, "\u4e3b": 256, "\u5c40\u9650\u6027": 257, "\u53f6\u4e0a": 258, "\u4e2d": 259, "\u9759\u8109": 260, "\u88ab\u52a8": 261, "\u626b\u67e5": 262, "\u4ec5\u4f9b\u53c2\u8003": 263, "\u6591\u72b6\u5f3a": 264, "\u8981\u6c42": 265, "\u5c40\u90e8": 266, "\u957f\u7ea6": 267, "\u5211\u5929": 268, "\u5806\u79ef": 269, "\u81ea\u8ff0": 270, "\u7a7a\u8179": 271, "\u5f81": 272, "\u504f\u4f4e": 273, "\u504f\u5f3a": 274, "\u7a0d\u539a": 275, "\u4ea4\u754c\u5904": 276, "\u5de6\u53f6\u53ca": 277, "\u5404\u89c1": 278, "\u5de6\u53f3": 279, "\u53f3\u540e": 280, "\u56ca\u58c1": 281, "\u5df2": 282, "\u5207\u9664": 283, "\u5c3e": 284, "\u53f6\u53ca": 285, "\u53f6\u5404\u89c1": 286, "\u8bb0\u5f55": 287, "\u5230": 288, "\u5c11\u8bb8": 289, "\u591a\u5904": 290, "\u4e00\u5904": 291, "\u8840\u7ba1": 292, "\u8d70\u5f62": 293, "\u5de6\u53f6\u5927\u8005": 294, "\u53f3\u53f6\u5927\u8005": 295, "\u53e6\u89c1": 296, "\u809d\u95e8\u5904": 297, "\u8154\u6837": 298, "\u5185\u900f\u58f0": 299, "\u6b20\u4f73": 300, "\u6de1\u58f0\u5f71": 301, "\u8d77\u59cb": 302, "\u8f83": 303, "\u5904": 304, "\u4e2d\u8fdc": 305, "\u89c4\u5219": 306, "\u5bfc\u7ba1": 307, "\u4e0b\u65b9": 308, "\u7c97\u7cd9": 309, "\u72b6\u504f": 310, "\u813e\u4e0b": 311, "\u6781\u89c1": 312, "\u53d7": 313, "\u5c0f\u56ca": 314, "\u6837": 315, "\u58c1\u5904": 316, "\u5de6\u809d\u7ba1": 317, "\u5206\u652f": 318, "\u7a0d\u949d": 319, "\u7565\u6709": 320, "\u533a\u56e0": 321, "\u80c3\u8154": 322, "\u7f29\u5c0f": 323, "\u6700\u539a": 324, "\u4f34\u6de1": 325, "\u70b9": 326, "\u5f20\u529b": 327, "\u80c3\u80a0": 328, "\u53f6\u8fd1": 329, "\u8188": 330, "\u9876": 331, "\u817a\u4f53": 332, "\u80f0\u5c3e": 333, "\u5927\u5c0f\u4e0d\u7b49": 334, "\u7684": 335, "\u56db\u4e2a": 336, "\u5f84\u4e3a": 337, "\u808b\u95f4": 338, "\u5c3e\u53f6": 339, "\u88ab": 340, "\u819c": 341, "\u5149\u56e2": 342, "\u672f\u5f0f": 343, ":": 344, "\u53f3\u534a": 345, "\u79fb\u690d\u672f": 346, "5": 347, "\u5e74": 348, "\u79fb\u690d": 349, "\u6700\u5927": 350, "\u9510\u5229": 351, "\u543b\u5408": 352, "\u53e3": 353, "\u4e0a\u65b9": 354, "/": 355, "s": 356, "\u52a8\u8109": 357, "Vmax": 358, "Vmin": 359, "RI": 360, "0.69": 361, "\u5f69\u8272": 362, "\u901f\u5ea6": 363, "\u4e24": 364, "\u76f8\u6ce2": 365, "\u4e0b\u8154": 366, "\u809d\u540e": 367, "\u809d\u95e8\u90e8": 368, "\u809d\u5468": 369, "\u8f85\u6599": 370, "\u906e\u6321": 371, "\u5e8a": 372, "\u56ca\u5b9e\u6027": 373, "\u6df7\u5408\u56de\u58f0": 374, "(": 375, "\uff09": 376, "\u5f25\u6f2b": 377, "\u53cc\u8fb9": 378, "\u57fa\u5e95": 379, "\u9644\u7740": 380, "\u6ce5\u6c99": 381, "\u7ed3\u77f3": 382, "\u4e0d\u5747": 383, "\u8d28": 384, "\u6027\u5dee": 385, "\u4e0b": 386, "\u5747": 387, "\u56e2\u72b6": 388, "\u6700\u539a\u5904": 389, "\u5dee": 390, "\u6563": 391, "\u5728": 392, "\u6240": 393, "\u7ecf\u76ae": 394, "\u7ecf\u809d": 395, "\u7a7f\u523a": 396, "\u7f6e\u7ba1": 397, "\u5f15\u6d41\u672f": 398, "\u5f27\u5f62": 399, "\u4f34\u5bbd": 400, "\u5927\u58f0": 401, "\u5176": 402, "\u7ec4\u7ec7": 403, "\u540e\u7f18": 404, "\u9888\u5904": 405, "\u813e\u95e8\u5904": 406, "\u672a\u8bb0\u5f55": 407, "\u5931\u5e38": 408, "\u5f27\u957f": 409, "\u5185\u6c5f": 410, "\u65c1\u53ca": 411, "\u6591": 412, "\u65c1\u89c1": 413, "\u80f0": 414, "\u5982": 415, "_SMM_": 416, "\u4e2d\u4f4e\u56de\u58f0": 417, "\u5bc6\u96c6": 418, "\u5927\u81f4": 419, "\u51cf\u4f4e": 420, "\u6df1\u7ea6": 421, "\u4e0e": 422, "\u76f8\u4e92": 423, "\u878d\u5408": 424, "\u4e09\u4e2a": 425, "\u56ca\u80bf": 426, "\u62bd\u5438": 427, "\u786c\u5316": 428, "\u6cbb\u7597": 429, "\u4ec5\u89c1": 430, "\u4f59\u809d\u5185": 431, "\u7ba1\u58c1": 432, "\u6e17\u6db2": 433, "\u9888\u90e8": 434, "\u72b6\u6001": 435, "\u5185\u900f": 436, "\u5c1a\u5dee": 437, "\u6f02\u6d6e": 438, "\u589e\u7c97": 439, "\u80f0\u5468": 440, "\u79ef\u6db2": 441, "\u6e38\u79bb": 442, "\u5e73\u5367": 443, "\u4f4d": 444, "\u5305\u5757": 445, "\u5f39\u6027": 446, "\u6210\u50cf": 447, "\u8fde\u7eed": 448, "\u6d4b\u91cf": 449, "\u516d\u6b21": 450, "\u538b\u529b": 451, "\u5f62\u53d8": 452, "\u5e73\u5747\u503c": 453, "2.035": 454, "\u589e\u5bbd": 455, "\u4e0b\u6bb5": 456, "\u957f\u4e3a": 457, "\u6536\u7f29": 458, "\u5904\u7ea6": 459, "\u6709": 460, "\u6577\u6599": 461, "\u4e32\u73e0": 462, "\u6392\u5217": 463, "\u809d\u89c1": 464, "\u53d7\u9650": 465, "\u4ec5": 466, "\u4f34\u5f31": 467, "\u524d\u65b9": 468, "\u6570\u4e2a": 469, "": 470}, {"1": "\u809d\u810f", "2": "\u5f62\u6001", "3": "\u9971\u6ee1", "4": "\uff0c", "5": "\u5305\u819c", "6": "\u5149\u6ed1", "7": "\u5b9e\u8d28", "8": "\u56de\u58f0", "9": "\u7ec6\u5bc6", "10": "\u589e\u5f3a", "11": "\u95e8\u9759\u8109", "12": "\u7cfb\u7edf", "13": "\u663e\u793a", "14": "\u6b20", "15": "\u6e05\u6670", "16": "\u809d\u80be", "17": "\u5bf9\u6bd4", "18": "\u3002", "19": "\u809d", "20": "\u5185\u5916", "21": "\u80c6\u7ba1", "22": "\u672a\u89c1", "23": "\u6269\u5f20", "24": "\u4e3b\u5e72", "25": "\u5185\u5f84", "26": "\u6b63\u5e38", "27": "\u8303\u56f4", "28": "\u80c6\u56ca", "29": "\u5927\u5c0f", "30": "\u5982\u5e38", "31": "\u58c1\u4e0d\u539a", "32": "\u8154", "33": "\u5185", "34": "\u672a", "35": "\u89c1", "36": "\u660e\u663e", "37": "\u5f02\u5e38", "38": "\u80f0\u817a", "39": "\u5747\u5300", "40": "\u80f0\u7ba1", "41": "\u4e0d", "42": "\u5bbd", "43": "\u5185\u672a\u89c1", "44": "\u660e\u786e", "45": "\u5360\u4f4d\u6027", "46": "\u75c5\u53d8", "47": "\u813e\u810f", "48": "\u56e0", "49": "\u8179\u8154", "50": "\u80a0\u6c14", "51": "\u5e72\u6270", "52": "\u4e25\u91cd", "53": "\u56fe\u50cf", "54": "\u6ee1\u610f", "55": "\uff1a", "56": "\u540e\u573a", "57": "\u58f0", "58": "\u8870\u51cf", "59": "\u4e8e", "60": "\u809d\u53f3\u53f6", "61": "\u53ef\u89c1", "62": "\u4e00\u65e0", "63": "\u7ed3\u8282", "64": "\u7ea6", "65": "_2DS_", "66": "\u8fb9\u754c", "67": "\u540e", "68": "\u58c1", "69": "\uff1b", "70": "\u4f59", "71": "\u7a0d", "72": "\u53f3\u524d", "73": "\u53f6\u89c1", "74": "\u4e00\u7247", "75": "\u72b6", "76": "\u4f4e\u56de\u58f0", "77": "\u533a", "78": "\u4e3a", "79": "\u809d\u5185", "80": "\u7ba1\u9053", "81": "\u8d70\u884c", "82": "\u6e05\u695a", "83": "\u95e8\u8109", "84": "\u53ca", "85": "\u900f\u58f0", "86": "\u597d", "87": "\u672a\u89c1\u5f02\u5e38", "88": "\u809d\u5916", "89": "\u4e0a\u6bb5", "90": "_SCM_", "91": "\u6bb5", "92": "\u539a\u4e3a", "93": "\u808b\u4e0b", "94": "\u672a\u53ca", "95": "\u53f3\u53f6\u89c1", "96": "\u4e00", "97": "\u65e0", "98": "\u540e\u65b9", "99": "\u591a\u53d1", "100": "\u5f3a", "101": "\u5927\u8005", "102": "\u4f34\u58f0\u5f71", "103": "\u968f", "104": "\u4f53\u4f4d", "105": "\u6539\u53d8", "106": "\u800c", "107": "\u79fb\u52a8", "108": "\u56e0\u80a0\u6c14", "109": "\u4e0d\u6e05", "110": "\u8fb9\u7f18", "111": "\u949d", "112": "\u53cd\u5dee", "113": "\u5927", "114": "\u4e2d\u90e8", "115": "\u89c4\u6574", "116": "CDFI", "117": "\u793a", "118": "\u5468\u8fb9", "119": "\u8840\u6d41", "120": "\u4fe1\u53f7", "121": "\u56ca\u6027", "122": "\u7ed3\u6784", "123": "\u4f4d\u4e8e", "124": "\u5de6\u53f6", "125": "\u5176\u5185", "126": "\u672a\u63a2\u53ca", "127": "\u4f59\u809d", "128": "\u901a\u7545", "129": "\u7565", "130": "\u5c1a", "131": "\u56ca", "132": "\u58c1\u4e0a", "133": "\u504f", "134": "\u9ad8\u56de\u58f0", "135": "\u76f4\u5f84\u7ea6", "136": "\u65e0\u58f0", "137": "\u5f71", "138": "\u4e0d\u968f", "139": "\u70b9\u72b6", "140": "\u5934\u4f53\u90e8", "141": "\u524d\u540e", "142": "\u5f84", "143": "\u5206\u522b", "144": "\u3001", "145": "\u5c3e\u90e8", "146": "\u6c14\u4f53", "147": "\u4f53\u79ef", "148": "\u7a0d\u5927", "149": "\u539a", "150": "\u6bdb\u7cd9", "151": "\u539a\u7ea6", "152": "\u591a\u4e2a", "153": "\u7a0d\u5f3a", "154": "\u51f8\u8d77", "155": "\u58c1\u539a", "156": "\u5185\u89c1", "157": "\u53ef", "158": "\u5176\u4e2d", "159": "\u4e00\u4e2a", "160": "\u76f4\u5f84", "161": "\u4e00\u5f3a", "162": "\u5207\u9664\u672f", "163": "\u6591\u70b9", "164": "\u540e\u4f34", "165": "\u5f57\u661f", "166": "\u5c3e\u6837", "167": "\u5de6\u5185", "168": "\u72b6\u5f3a", "169": "\u80f0\u5934", "170": "\u80f0\u4f53", "171": "\u80f0\u5c3e\u539a", "172": "\u90e8\u89c1", "173": "\u809d\u53f3", "174": "\u53f6\u5185", "175": "\u4e00\u56ca\u6027", "176": "\u5de6\u5185\u53f6", "177": "\u65c1", "178": "\u53ef\u89c1\u4e00\u6591", "179": "\u53f6", "180": "\u53e6", "181": "\u9910\u540e", "182": "\u4e00\u7a0d", "183": "_3DS_", "184": "\u4e00\u70b9", "185": "\u58f0\u5f71", "186": "\u53f3\u53f6", "187": "\u4f34", "188": "\u201c", "189": "\u201d", "190": "\u5c3e\u5f81", "191": "\u90e8\u5206", "192": "\u80c6\u603b\u7ba1", "193": "\u5bbd\u7ea6", "194": "\u60a3\u8005", "195": "\u8179\u58c1", "196": "\u8f83\u539a", "197": "\u7ed3\u679c", "198": "\u4ec5\u4f9b", "199": "\u4e34\u5e8a", "200": "\u53c2\u8003", "201": "\u5207\u9762", "202": "\u6240\u793a", "203": "\u589e\u539a", "204": "\u4e2d\u4e0b", "205": "\u6b20\u6e05", "206": "\u4f53", "207": "\u5448", "208": "\u5185\u90e8", "209": "\u5360\u4f4d", "210": "\u813e\u95e8", "211": "\u5904\u89c1", "212": "\u7b49\u56de\u58f0", "213": "\u53ef\u63a2\u53ca", "214": "\u7247\u72b6", "215": "\u589e\u5927", "216": "\u4e24\u4e2a", "217": "\u5185\u4f3c", "218": "\u8f6e\u5ed3", "219": "\u4e0a", "220": "\u5de6\u53f6\u89c1", "221": "\u56e2", "222": "\u7a0d\u589e", "223": "\u7c97", "224": "\u9499\u5316", "225": "\u7565\u5927", "226": "\u8868\u9762", "227": "\u5e73\u6ed1", "228": "\u5e8a\u65c1", "229": "\u5c1a\u6e05", "230": "\u4e0d\u89c4\u5219", "231": "\u793a\u5176", "232": "\u5206\u5e03", "233": "\u5e95\u90e8", "234": "\u5e26\u72b6", "235": "\u5206\u9694", "236": "\u4e0d\u4f34", "237": "\u8f83\u5927", "238": "\u8005", "239": "\u58c1\u6b20", "240": ",", "241": "\u996e\u6c34", "242": "\u5de6\u5916", "243": "\u793a\u672a\u89c1", "244": "\u5207", "245": "\u672f\u540e", "246": "\u91cd", "247": "\u8d85\u58f0", "248": "\u68c0\u67e5", "249": "\u5de6", "250": "\u5916\u53f6", "251": "\u4e0b\u6781", "252": "\u5468\u56f4", "253": "\u5c1a\u53ef", "254": "\u53e6\u4e8e", "255": "\u7d6e\u72b6", "256": "\u4e3b", "257": "\u5c40\u9650\u6027", "258": "\u53f6\u4e0a", "259": "\u4e2d", "260": "\u9759\u8109", "261": "\u88ab\u52a8", "262": "\u626b\u67e5", "263": "\u4ec5\u4f9b\u53c2\u8003", "264": "\u6591\u72b6\u5f3a", "265": "\u8981\u6c42", "266": "\u5c40\u90e8", "267": "\u957f\u7ea6", "268": "\u5211\u5929", "269": "\u5806\u79ef", "270": "\u81ea\u8ff0", "271": "\u7a7a\u8179", "272": "\u5f81", "273": "\u504f\u4f4e", "274": "\u504f\u5f3a", "275": "\u7a0d\u539a", "276": "\u4ea4\u754c\u5904", "277": "\u5de6\u53f6\u53ca", "278": "\u5404\u89c1", "279": "\u5de6\u53f3", "280": "\u53f3\u540e", "281": "\u56ca\u58c1", "282": "\u5df2", "283": "\u5207\u9664", "284": "\u5c3e", "285": "\u53f6\u53ca", "286": "\u53f6\u5404\u89c1", "287": "\u8bb0\u5f55", "288": "\u5230", "289": "\u5c11\u8bb8", "290": "\u591a\u5904", "291": "\u4e00\u5904", "292": "\u8840\u7ba1", "293": "\u8d70\u5f62", "294": "\u5de6\u53f6\u5927\u8005", "295": "\u53f3\u53f6\u5927\u8005", "296": "\u53e6\u89c1", "297": "\u809d\u95e8\u5904", "298": "\u8154\u6837", "299": "\u5185\u900f\u58f0", "300": "\u6b20\u4f73", "301": "\u6de1\u58f0\u5f71", "302": "\u8d77\u59cb", "303": "\u8f83", "304": "\u5904", "305": "\u4e2d\u8fdc", "306": "\u89c4\u5219", "307": "\u5bfc\u7ba1", "308": "\u4e0b\u65b9", "309": "\u7c97\u7cd9", "310": "\u72b6\u504f", "311": "\u813e\u4e0b", "312": "\u6781\u89c1", "313": "\u53d7", "314": "\u5c0f\u56ca", "315": "\u6837", "316": "\u58c1\u5904", "317": "\u5de6\u809d\u7ba1", "318": "\u5206\u652f", "319": "\u7a0d\u949d", "320": "\u7565\u6709", "321": "\u533a\u56e0", "322": "\u80c3\u8154", "323": "\u7f29\u5c0f", "324": "\u6700\u539a", "325": "\u4f34\u6de1", "326": "\u70b9", "327": "\u5f20\u529b", "328": "\u80c3\u80a0", "329": "\u53f6\u8fd1", "330": "\u8188", "331": "\u9876", "332": "\u817a\u4f53", "333": "\u80f0\u5c3e", "334": "\u5927\u5c0f\u4e0d\u7b49", "335": "\u7684", "336": "\u56db\u4e2a", "337": "\u5f84\u4e3a", "338": "\u808b\u95f4", "339": "\u5c3e\u53f6", "340": "\u88ab", "341": "\u819c", "342": "\u5149\u56e2", "343": "\u672f\u5f0f", "344": ":", "345": "\u53f3\u534a", "346": "\u79fb\u690d\u672f", "347": "5", "348": "\u5e74", "349": "\u79fb\u690d", "350": "\u6700\u5927", "351": "\u9510\u5229", "352": "\u543b\u5408", "353": "\u53e3", "354": "\u4e0a\u65b9", "355": "/", "356": "s", "357": "\u52a8\u8109", "358": "Vmax", "359": "Vmin", "360": "RI", "361": "0.69", "362": "\u5f69\u8272", "363": "\u901f\u5ea6", "364": "\u4e24", "365": "\u76f8\u6ce2", "366": "\u4e0b\u8154", "367": "\u809d\u540e", "368": "\u809d\u95e8\u90e8", "369": "\u809d\u5468", "370": "\u8f85\u6599", "371": "\u906e\u6321", "372": "\u5e8a", "373": "\u56ca\u5b9e\u6027", "374": "\u6df7\u5408\u56de\u58f0", "375": "(", "376": "\uff09", "377": "\u5f25\u6f2b", "378": "\u53cc\u8fb9", "379": "\u57fa\u5e95", "380": "\u9644\u7740", "381": "\u6ce5\u6c99", "382": "\u7ed3\u77f3", "383": "\u4e0d\u5747", "384": "\u8d28", "385": "\u6027\u5dee", "386": "\u4e0b", "387": "\u5747", "388": "\u56e2\u72b6", "389": "\u6700\u539a\u5904", "390": "\u5dee", "391": "\u6563", "392": "\u5728", "393": "\u6240", "394": "\u7ecf\u76ae", "395": "\u7ecf\u809d", "396": "\u7a7f\u523a", "397": "\u7f6e\u7ba1", "398": "\u5f15\u6d41\u672f", "399": "\u5f27\u5f62", "400": "\u4f34\u5bbd", "401": "\u5927\u58f0", "402": "\u5176", "403": "\u7ec4\u7ec7", "404": "\u540e\u7f18", "405": "\u9888\u5904", "406": "\u813e\u95e8\u5904", "407": "\u672a\u8bb0\u5f55", "408": "\u5931\u5e38", "409": "\u5f27\u957f", "410": "\u5185\u6c5f", "411": "\u65c1\u53ca", "412": "\u6591", "413": "\u65c1\u89c1", "414": "\u80f0", "415": "\u5982", "416": "_SMM_", "417": "\u4e2d\u4f4e\u56de\u58f0", "418": "\u5bc6\u96c6", "419": "\u5927\u81f4", "420": "\u51cf\u4f4e", "421": "\u6df1\u7ea6", "422": "\u4e0e", "423": "\u76f8\u4e92", "424": "\u878d\u5408", "425": "\u4e09\u4e2a", "426": "\u56ca\u80bf", "427": "\u62bd\u5438", "428": "\u786c\u5316", "429": "\u6cbb\u7597", "430": "\u4ec5\u89c1", "431": "\u4f59\u809d\u5185", "432": "\u7ba1\u58c1", "433": "\u6e17\u6db2", "434": "\u9888\u90e8", "435": "\u72b6\u6001", "436": "\u5185\u900f", "437": "\u5c1a\u5dee", "438": "\u6f02\u6d6e", "439": "\u589e\u7c97", "440": "\u80f0\u5468", "441": "\u79ef\u6db2", "442": "\u6e38\u79bb", "443": "\u5e73\u5367", "444": "\u4f4d", "445": "\u5305\u5757", "446": "\u5f39\u6027", "447": "\u6210\u50cf", "448": "\u8fde\u7eed", "449": "\u6d4b\u91cf", "450": "\u516d\u6b21", "451": "\u538b\u529b", "452": "\u5f62\u53d8", "453": "\u5e73\u5747\u503c", "454": "2.035", "455": "\u589e\u5bbd", "456": "\u4e0b\u6bb5", "457": "\u957f\u4e3a", "458": "\u6536\u7f29", "459": "\u5904\u7ea6", "460": "\u6709", "461": "\u6577\u6599", "462": "\u4e32\u73e0", "463": "\u6392\u5217", "464": "\u809d\u89c1", "465": "\u53d7\u9650", "466": "\u4ec5", "467": "\u4f34\u5f31", "468": "\u524d\u65b9", "469": "\u6570\u4e2a", "470": ""}] \ No newline at end of file diff --git a/utils/liver_gen_config.py b/utils/liver_gen_config.py new file mode 100644 index 0000000000000000000000000000000000000000..8ad1133e64a757cfceeec34b4cbebbc3cd4f84b3 --- /dev/null +++ b/utils/liver_gen_config.py @@ -0,0 +1,84 @@ +import os + +__author__ = 'Rio' +from yacs.config import CfgNode as CN +config = CN() +config.root = os.path.dirname(os.path.abspath(__file__)) +config.models = os.path.join(config.root, '../Model/liver_model_best.pth') + +config.dataset_name = 'Thyroid' +config.distiller_num = 18 # liver:18; Mamary:18; Thyroid:5 +config.jieba_dir = os.path.join(config.root, 'key_technical_words.txt') +config.image_dir = os.path.join(config.root, '../Data_demo/Images') +# config.ann_path = 'E:/Datasets/Ultrasound/Data/new_Liver2.json' +config.ann_path = os.path.join(config.root, '../Data_demo/Liver.json') + +config.dict_pth = os.path.join(config.root, 'liver_dict.txt') + +config.max_seq_length_train = 150 +config.max_seq_length = 150 +config.threshold = 3 +config.num_workers = 0 +config.batch_size = 32 +config.evaluate_batch = 1 + +config.visual_extractor = 'resnet101' +config.visual_extractor_pretrained = True + +config.d_model = 512 +config.d_ff = 512 +config.d_vf = 2048 +config.num_heads = 8 +config.num_layers = 3 +config.dropout = 0.1 +config.logit_layers = 1 +config.bos_idx = 0 +config.eos_idx = 0 +config.pad_idx = 0 +config.use_bn = 0 +config.drop_prob_lm = 0.5 + +config.sample_n = 1 +config.output_logsoftmax = 1 +config.decoding_constraintt = 0 + +config.n_gpu = 1 +config.epochs = 50 + +config.save_dir = '/Result/Models' +config.record_dir = '/Result/Records' + +config.save_period = 1 +config.monitor_mode = 'max' +config.monitor_metric = 'BLEU_4' +config.early_stop = 100 +config.image_type = '2d' + +config.optim = 'Adam' +config.lr_ve = 5e-5 +config.lr_ed = 1e-3 +config.weight_decay = 5e-5 +config.amsgrad = True + +config.lr_scheduler = 'StepLR' +config.step_size = 28 +config.gamma = 0.1 + +config.seed = 9233 +config.resume = None + +config.embedding_vector = 300 +config.nhidden = 512 +config.nlayers = 1 +config.bidirectional = True +config.rnn_type = 'LSTM' + +# text_image_losses.py +config.cuda = True +config.train_smooth_gamma3 = 10.0 +config.train_smooth_gamma2 = 5.0 +config.train_smooth_gamma1 = 4.0 +config.attn_pth = 'E:/Captionv0/Code/SGF/Result/Attn_pth' + + + diff --git a/utils/thyroid_dict.txt b/utils/thyroid_dict.txt new file mode 100644 index 0000000000000000000000000000000000000000..482f8daf022a9241cf38a6aeec934856ff094dfa --- /dev/null +++ b/utils/thyroid_dict.txt @@ -0,0 +1 @@ +[{"\u7532\u72b6\u817a": 1, "\u5927\u5c0f": 2, "\u5f62\u6001": 3, "\u5982\u5e38": 4, "\uff0c": 5, "\u817a\u4f53": 6, "\u56de\u58f0": 7, "\u5747\u5300": 8, "\u672a\u89c1": 9, "\u660e\u786e": 10, "\u5360\u4f4d\u6027": 11, "\u75c5\u53d8": 12, "CDFI": 13, "\u793a": 14, "\u5185": 15, "\u672a\u89c1\u5f02\u5e38": 16, "\u8840\u6d41": 17, "\u4fe1\u53f7": 18, "\u3002": 19, "\u53cc\u4fa7": 20, "\u9888\u90e8": 21, "\u660e\u663e": 22, "\u80bf\u5927": 23, "\u6dcb\u5df4\u7ed3": 24, "\u4e8e": 25, "\u5de6\u53f6": 26, "\u53ef\u89c1": 27, "\u591a\u53d1": 28, "\u7ed3\u8282": 29, "\u5927\u8005": 30, "\u4f4d\u4e8e": 31, "\u4e0a\u6781": 32, "\u5448\u56ca\u5b9e": 33, "\u6df7\u5408\u56de\u58f0": 34, "\u7ea6": 35, "_2DS_": 36, "\u8fb9\u754c": 37, "\u6e05\u6670": 38, "\u89c4\u6574": 39, "\u5468\u8fb9": 40, "\uff1b": 41, "\u4f59": 42, "\u5168\u5207": 43, "\u672f\u540e": 44, "\u539f": 45, "\u533a\u57df": 46, "\u4f53\u79ef": 47, "\u7a0d": 48, "\u589e\u5927": 49, "\u5de6\u53f6\u539a\u5f84": 50, "_SCM_": 51, "\u5ce1\u90e8\u539a": 52, "\u53f3\u53f6\u539a\u5f84": 53, "\u53f3\u53f6": 54, "\u4e0a": 55, "\u6781": 56, "\u4e00\u65e0": 57, "\u672a\u63a2\u53ca": 58, "\u4e0d": 59, "\u4e00\u56ca\u6027": 60, "\u5206\u9694": 61, "\u6b63\u5e38": 62, "\u6b20": 63, "\u89c4\u5219": 64, "\u589e\u7c97": 65, "\u3001": 66, "\u589e\u5f3a": 67, "\u90e8\u5206": 68, "\u6761\u7d22\u6837": 69, "\u6539\u53d8": 70, "\u5185\u672a\u89c1": 71, "\u5f02\u5e38": 72, "\u5de6": 73, "\u53f3\u53f6\u89c1": 74, "\u591a\u4e2a": 75, "\u4f4e\u56de\u58f0": 76, "\u5de6\u53f6\u5927\u8005": 77, "\u53f3\u53f6\u5927\u8005": 78, "\u4e2d\u90e8": 79, "\u4e0a\u8ff0": 80, "\u9971\u6ee1": 81, "\u4e2d\u4e0b\u90e8": 82, "\u4e00\u4ee5": 83, "\u56ca\u6027": 84, "\u4e3a\u4e3b": 85, "\u7684": 86, "\u56ca\u5b9e": 87, "_3DS_": 88, "\u53ef\u63a2\u53ca": 89, "\u8f83\u5927": 90, "\u8005": 91, "\u8fd1\u5ce1\u90e8": 92, "\u5448": 93, "\u4ee5": 94, "\u5b9e\u6027": 95, "\u5c1a": 96, "\u53ca": 97, "\u5185\u90e8": 98, "\u5ce1\u90e8": 99, "\u5207\u9664\u672f": 100, "\u540e": 101, "\u5de6\u53f3": 102, "\u53f6": 103, "\u53f3\u53f6\u4e0b": 104, "\u4e00\u5f3a": 105, "\u9499\u5316": 106, "\u76f4\u5f84\u7ea6": 107, "\u51cf\u4f4e": 108, "\u5206\u5e03": 109, "\u5176\u5185": 110, "\u5468\u56f4": 111, "\u5927": 112, "\u8840\u7ba1": 113, "\u65c1\u672a\u89c1": 114, "\u504f": 115, "\u4e2d": 116, "\u4e0a\u90e8": 117, "\u7565": 118, "\u7f51\u683c": 119, "\u72b6": 120, "\u589e\u591a": 121, "\u53cc": 122, "\u4e2d\u6bb5": 123, "\u4e00": 124, "\u53cc\u53f6": 125, "\u4e2d\u4e0b": 126, "\u6bb5": 127, "\u4e2d\u5fc3": 128, "\u90e8\u4e3a": 129, "\u504f\u5f3a": 130, "\u6837": 131, "\u4e30\u5bcc": 132, "\u540e\u4f34": 133, "\u58f0\u5f71": 134, "\u4e0d\u5747": 135, "\u8d28": 136, "\u4e0b\u6781": 137, "\u5de6\u53f6\u4e0b": 138, "\u89c1": 139, "\u5c1a\u53ef": 140, "\u65e0": 141, "\u6e05\u695a": 142, ":": 143, "\u4e3a": 144, "\u6781\u89c1": 145, "\u5185\u4ee5": 146, "\u5e76": 147, "\u533a": 148, "\u8303\u56f4": 149, "\u53ef": 150, "\u8bb0\u5f55": 151, "\u5230\u661f": 152, "\u70b9\u72b6": 153, "\u5185\u89c1": 154, "\u4e24\u4e2a": 155, "\u5206\u522b": 156, "\u9ad8\u56de\u58f0": 157, "\u4e00\u56ca\u5b9e": 158, "\u672a\u8bb0\u5f55": 159, "\u5230": 160, "\u6d45\u5c42": 161, "\u53ca\u5ce1\u90e8": 162, "\u5931\u5e38": 163, "\u5b9e\u8d28": 164, "\u7c97\u7cd9": 165, "\u72b6\u817a": 166, "\u6df1\u5c42": 167, "\u626b\u67e5": 168, "\u5de6\u4fa7": 169, "\u53f3\u4fa7": 170, "\u201c": 171, "\u6dcb\u5df4\u95e8": 172, "\u201d": 173, "\u7ed3\u6784": 174, "\u5c11\u91cf": 175, "\u5c11\u8bb8": 176, "\u80cc\u4fa7": 177, "\u793a\u672a\u89c1": 178, "\u5747": 179, "\u4ee5\u56ca\u6027": 180, "\u5de6\u53f6\u4e0a": 181, "\u6781\u53ca": 182, "\u5404\u89c1": 183, "\u53e6\u4e8e": 184, "\u6de1\u58f0\u5f71": 185, "\u5c0f": 186, "\u7c7b\u5706\u5f62": 187, "\u5176\u4e2d": 188, "\u4e00\u4e2a": 189, "\u7eb5\u6a2a\u6bd4": 190, "_r_": 191, "\u661f": 192, "\u6b8b\u4f59": 193, "\u7f29\u5c0f": 194, "\u5de6\u53f6\u53ca": 195, "\u6563": 196, "\u5728": 197, "\u5f3a": 198, "\u56e2": 199, "\u8fd1": 200, "\u80cc\u819c": 201, "\u5904": 202, "\u5185\u900f\u58f0": 203, "\u6b20\u4f73": 204, "\u5927\u4e8e": 205, "1": 206, "\u6bdb\u523a": 207, "\u4e00\u4e2d": 208, "\u8fb9\u7f18": 209, "\u5448\u56ca\u6027": 210, "\u4e0b": 211, "\u7247\u72b6": 212, "\u53ca\u5176": 213, "\u5de6\u53f6\u89c1": 214, "\u53ca\u56ca\u5b9e": 215, "\u5de6\u53f6\u533a": 216, "\u793a\u5de6\u53f6": 217, "\u793a\u5b9e\u6027": 218, "\u5f57\u661f": 219, "\u5c3e\u5f81": 220, "\u524d": 221, "\u88ab": 222, "\u819c": 223, "\u4e0b\u90e8": 224, "\u5411": 225, "\u5305\u819c": 226, "\u5916": 227, "\u51f8\u51fa": 228, "\u4e0d\u89c4\u5219": 229, "\u6761\u72b6": 230, "\u7ec6\u70b9": 231, "\u72b6\u5f3a": 232, "\u540e\u65b9": 233, "\u4f34\u5bbd": 234, "\u5927\u58f0": 235, "\u5f71": 236, "\u5c1a\u6e05": 237, "\u6d88\u878d\u672f": 238, "\u6d88\u878d\u533a": 239, "\u7a7f\u884c": 240, "III": 241, "\u5f25\u6f2b\u6027": 242, "\u51cf\u5c11": 243, "\u76ae": 244, "\u9ad3\u8d28": 245, "\u754c\u9650": 246, "\u793a\u672a": 247, "\u53ef\u53ca": 248, "\u4e00\u504f": 249, "\u58c1\u4e0a": 250, "\u533a\u5927\u8005": 251, "\u4ee5\u5b9e\u6027": 252, "\u4e2d\u5c42": 253, "\u7eb5\u5411": 254, "\u5f27\u5f62": 255, "\u793a\u53cc\u4fa7": 256, "\u6c34\u5e73": 257, "\u4f4d": 258, "\u5185\u5747": 259, "\u5927\u81f4": 260, "\u5de6\u53f6\u5185": 261, "\u793a\u5176": 262, "\u4e00\u6781": 263, "\u7d27\u90bb": 264, "\u6c14\u7ba1": 265, "\u4e0d\u6e05": 266, "\u793a\u53f3\u53f6": 267, "\u7ec6\u5bc6": 268, "\u7a0d\u5f3a": 269, "\u6f02\u6d6e": 270, "\u6570\u4e2a": 271, "\u8f83": 272, "\u53e6": 273, "\u6c99\u7c92": 274, "\u6837\u5f3a": 275, "\u4e0b\u6bb5": 276, "\u53f3\u53f6\u53ca": 277, "\u8d28\u504f": 278, "\u56ca\u5b9e\u6027": 279, "\u56ca\u5185": 280, "\u900f\u58f0": 281, "\u5dee": 282, "\u6df7\u5408\u6027": 283, "\u524d\u65b9": 284, "\u504f\u5de6": 285, "\u53f6\u89c1": 286, "\u4fe1": 287, "II": 288, "\u7b49\u56de\u58f0": 289, "\u6655": 290, "\u6781\u65c1": 291, "\u4e0e": 292, "\u5173\u7cfb\u5bc6\u5207": 293, "(": 294, ")": 295, "\u53f3": 296, "\u5c3e": 297, "\u53f6\u5747\u53ef": 298, "\u6e05": 299, "\u6b20\u6e05": 300, "\u58c1": 301, "\u53f3\u53f6\u4e0a": 302, "\u5c40\u90e8": 303, "\u524d\u540e": 304, "\u5f84\u7ea6": 305, "\u4e2d\u4e0a": 306, "\u5185\u4f3c": 307, "\u7802\u783e": 308, "\u663e\u793a": 309, "\u81f3\u4e0b": 310, "\u4e09\u4e2a": 311, "\u76f8\u90bb": 312, "\u7532\u72b6\u65c1\u817a": 313, "\u533a\u672a\u89c1": 314, "\u5360\u4f4d": 315, ";": 316, ",": 317, "\u793a\u8be5": 318, "IV": 319, "\u9501\u9aa8": 320, "\u52a8\u8109": 321, "\u8d77\u59cb": 322, "\u4e2d\u819c": 323, "\u589e\u539a": 324, "\u539a\u7ea6": 325, "_SMM_": 326, "\u9888": 327, "\u603b": 328, "\u5185\u5916": 329, "\u5185\u4e2d\u819c": 330, "\u4e0d\u539a": 331, "\u5149\u6ed1": 332, "\u6591\u5757": 333, "\u5f62\u6210": 334, "\u52a8\u8109\u8840": 335, "\u6d41\u901a": 336, "\u7545": 337, "\u5145\u76c8": 338, "\u826f\u597d": 339, "PW": 340, "\u9891\u8c31": 341, "\u63a2\u53ca": 342, "\u878d\u5408": 343, "\u4f34": 344, "\u5c0f\u56ca": 345, "\u6027": 346, "\u6d88\u5931": 347, "\u7d0a\u4e71": 348, "\u5931\u53bb": 349, "\u95e8": 350, "\u578b": 351, "\u4e0a\u533a": 352, "\u4e8e\u53f3": 353, "\u53f6\u4e0b": 354, "\u793a\u53f3": 355, "\u53f6\u5927\u8005": 356, "\u5206\u53f6\u72b6": 357, "\u86cb\u58f3": 358, "\u4f34\u58f0\u5f71": 359, "\u4e00\u679a": 360, "\u4e0e\u5176": 361, "\u4e0b\u65b9": 362, "\u7d27\u5bc6": 363, "\u76f8\u8fde": 364, "\u6574\u4f53": 365, "\u6781\u5747": 366, "\u6b8b\u5b58": 367, "\u53f3\u53f6\u5185": 368, "\u51e0\u4e4e": 369, "\u586b\u6ee1": 370, "\u56ca\u58c1": 371, "\u51f8\u8d77": 372, "\u4f3c": 373, "\u4e00\u4f4e": 374, "-": 375, "\u7565\u89c1": 376, "\u793a\u8840\u4f9b": 377, "\u73af\u5f62": 378, "\u4e00\u7a0d": 379, "\u5e8a\u65c1": 380, "\u8d85\u58f0": 381, "\u68c0\u67e5": 382, "\u8f6e\u5ed3": 383, "\u534a": 384, "\u73af\u72b6": 385, "\u5f84": 386, "\u56e0": 387, "\u4f53\u4f4d": 388, "\u53d7\u9650": 389, "\u5207\u9762": 390, "\u6ee1\u610f": 391, "\u7ed3\u679c": 392, "\u4ec5\u4f9b\u53c2\u8003": 393, "\u5176\u4e0b\u7f18": 394, "\u8ddd": 395, "\u5904\u89c1": 396, "\u800c\u6210": 397, "\u4e00\u70b9": 398, "\u51f8\u5411": 399, "\u77ed\u7ebf": 400, "\u793a\u5185": 401, "\u7ec4\u7ec7": 402, "\u6df7\u5408": 403, "\u5404": 404, "\u5f39\u6027": 405, "\u6210\u50cf": 406, "\u8bc4\u5206": 407, "\u6a2a\u5207": 408, "3": 409, "\u5206": 410, "\u7eb5\u5207": 411, "4": 412, "\u8be5": 413, "\u73af": 414, "\u6591\u72b6\u5f3a": 415, "\u7a0d\u5927": 416, "\u5bbd": 417, "\u76f8\u4e92": 418, "\u8702\u7a9d": 419, "\u5de6\u53f6\u8fd1": 420, "\u53ca\u53f3": 421, "\u53f6\u4e0a": 422, "\u6bdb\u7cd9": 423, "\u4f4e\u56de": 424, "\u662f": 425, "\u5ce1\u90e8\u539a\u5f84": 426, "\u5916\u4fa7": 427, "\u9888\u52a8\u8109": 428, "\u661f\u70b9": 429, "\u5305\u5757": 430, "\u6025\u8bca": 431, "\u5de6\u53f6\u539a": 432, "\u53f3\u53f6\u539a": 433, "\u988c": 434, "\u988f": 435, "\u988c\u4e0b": 436, "\u4e2a\u522b": 437, "\u76ae\u8d28": 438, "\u692d\u5706\u5f62": 439, "\u6210\u5206": 440, "\u6781\u8fd1": 441, "\u7565\u5927\u4e8e": 442, "\u56e2\u72b6": 443, "\u6655\u73af": 444, "\u7a0d\u589e": 445, "\u7c97": 446, "\u4e8e\u5ce1\u90e8": 447, "\u504f\u53f3": 448, "\u793a\u65e0": 449, "\u900f\u58f0\u533a": 450, "\u5f25\u6f2b": 451, "\u8f7b\u5ea6": 452, "\u4f3c\u7531": 453, "\u7c97\u5927": 454, "\u60a3\u8005": 455, "\u81ea\u8ff0": 456, "\u4e00\u7247": 457, "\u597d": 458, "\u4e4b\u95f4": 459, "\u5207\u53e3": 460, "\u5411\u80cc": 461, "\u820c\u6839": 462, "\u90e8": 463, "\u5927\u90e8\u5206": 464, "\u5927\u5c0f\u4e0d\u7b49": 465, "\u6a2a\u5207\u9762": 466, "\u65f6": 467, "\u7eb5\u5207\u9762": 468, "\u504f\u4f4e": 469, "\u4e00\u5904": 470, "\u5145\u6ee1": 471, "\u4e2d\u7b49": 472, "\u793a\u6a2a": 473, "\u7eb5": 474, "\u4e0a\u89c1": 475, "\u6d41": 476, "\u4e00\u5c0f": 477, "CDI": 478, "\u5f27\u957f": 479, "\u56db\u4e2a": 480, "\u65c1": 481, "\u6df1": 482, "\u8d28\u56ca\u5b9e": 483, "\u591a\u5904": 484, "\u793a\u5305\u5757": 485, "\u5185\u53ca": 486, "\u81f4": 487, "\u53e6\u53f3\u53f6": 488, "\u4e34\u8fd1": 489, "\u8179\u4fa7": 490, "\u6742\u4e71": 491, "\u533a\u5747": 492, "\u4e32\u73e0": 493, "\u6392\u5217": 494, "\u5916\u5747": 495, "\u6837\u53ca": 496, "\u5c0f\u900f": 497, "\u58f0\u533a": 498, "\u5185\u58c1": 499, "\u5e95\u90e8": 500, "\u539a\u5ea6": 501, "\u4e8e\u539f": 502, "\u7b49": 503, "\u5176\u56ca\u58c1": 504, "\u539a": 505, "\u8868\u9762": 506, "\u77ed": 507, "\u5176\u5b9e": 508, "\u6df1\u90e8": 509, "\u53e6\u89c1": 510, "\u6591": 511, "\u7f6e\u7ba1": 512, "\u8be5\u5904": 513, "\u6577\u6599": 514, "\u8986\u76d6": 515, "\u906e\u6321": 516, "\u6709\u9650": 517, "\u53e6\u53f3": 518, "\u4e0b\u6781\u5904": 519, "\u56de\u6b20": 520, "\u58f0": 521, "\u591a\u6761": 522, "\u7d22\u5f3a": 523, "\u5206\u90e8": 524, "\u5360\u636e": 525, "\u5185\u5b9e\u6027": 526, "\u816e\u817a": 527, "\u591a": 528, "\u53d1\u6761": 529, "\u7d22\u6837": 530, "\u5185\u4f34": 531, "\u4e24\u5904": 532, "\u7a7f\u523a\u672f": 533, "\u53f3\u5927\u8005": 534, "\u4e00\u5b9e\u6027": 535, "\u5e03\u6ee1": 536, "\u5206\u53f6": 537, "\u5305\u88f9": 538, "\u504f\u5ce1\u90e8": 539, "\u73af\u7ed5": 540, "\u9888\u540e": 541, "\u5904\u626b\u67e5": 542, "\u76ae\u4e0b": 543, "\u5c1a\u6574": 544, ".": 545, "\u8457": 546, "\u70b9": 547, "\u6761\u6837": 548, "\u5f81": 549, "\u5806\u79ef": 550, "\u793a\u63a2": 551, "\u80cc": 552, "\u4fa7\u8fd1": 553, "\u51cf\u5c0f": 554, "\u5411\u5916": 555, "\u9686\u8d77": 556, "\u6670": 557, "V": 558, "\u504f\u5ce1": 559, "\u90e8\u89c1": 560, "\u504f\u591a": 561, "\u5c0f\u7247\u6837": 562, "\u6240\u6307": 563, "\u95e8\u578b": 564, "\u56e2\u5757": 565, "\u5176": 566, "\u58c1\u5185": 567, "\u6a2a": 568, "\u793a\u5747": 569, "\u53f3\u53f6\u5747": 570, "\u5fae\u6ce2": 571, "\u6cbb\u7597": 572, "\u6708": 573, "1.8": 574, "\u5305\u7ed5": 575, "\u663e\u8457": 576, "\u5206\u754c": 577, "\u6781\u5904": 578, "\u76f4\u5f84": 579, "\u6761\u5f62": 580, "\u4f4d\u4e0b": 581, "\u533a\u5185": 582, "\u7a0d\u4f4e": 583, "\u4e00\u7c07": 584, "\u7206\u7c73\u82b1": 585, "\u53f3\u53f6\u539f": 586, "\u56ca\u6027\u533a": 587, "\u4e0a\u65b9": 588, "\u793a\u793a": 589, "\u533a\u89c1": 590, "\u8d28\u5b9e\u6027": 591, "\u53f3\u9888": 592, "\u5168": 593, "\u5168\u90e8": 594, "\u65e0\u8bed": 595, "\u65c1\u817a\u533a": 596, "\u8f83\u5c0f\u8005": 597, "VI": 598, "\u6570\u9897": 599, "\u5f02\u6d41": 600, "CDF": 601, "\u672a": 602, "\u5782\u76f4": 603, "\u8f83\u53f3\u53f6": 604, "RI": 605, "0.54": 606, "\u5fae": 607, "\u7c07\u72b6\u5f3a": 608, "\u4ee5\u53ca": 609, "\u8fd1\u8179\u4fa7": 610, "\u53f6\u4e2d": 611, "\u7d27\u8d34": 612, "\u7a9d": 613, "\u524d\u4e0a": 614, "\u6b63\u4e2d": 615, "\u8f6f\u7ec4\u7ec7": 616, "\u5c42\u5185": 617, "\u5178\u578b": 618, "\u53ca\u53f3\u53f6": 619, "\u7a00\u758f": 620, "\u88ab\u52a8": 621, "\u4fa7\u5367\u4f4d": 622, "\u53ca\u56ca\u6027": 623, "\u6574\u4e2a": 624, "\u8fd1\u4e0b": 625, "\u4f59\u5c0f": 626, "\u7f51\u72b6": 627, "\u5375\u5706\u5f62": 628, "I": 629, "\u53ef\u4f3c": 630, "\u4e0b\u988c\u90e8": 631, "\u00d7": 632, "0.4": 633, "\u53d1\u77ed": 634, "\u5f3a\u5f3a": 635, "\u8fde\u7eed\u6027": 636, "\u8584\u6655\u73af": 637, "\u5c0f\u8005": 638, "\u90bb\u8fd1": 639, "\u6478": 640, "\u5b66": 641, "\u6781\u4f3c": 642, "\u6781\u4f4e": 643, "\u53f3\u53f6\u8fd1": 644, "\u8fd1\u4f3c": 645, "\u591c\u95f4": 646, "\u5185\u7ea6": 647, "\u4e0b\u6781\u8fd1": 648, "\u5f69\u8d85": 649, "\u8868\u73b0": 650, "\u706b\u6d77": 651, "\u591a\u6570": 652, "\u95e8\u90e8": 653, "\u846b\u82a6": 654, "\u5185\u5f84": 655, "\u589e\u5bbd": 656, "\u4e0a\u6bb5": 657, "\u53f6\u5185": 658, "": 659}, {"1": "\u7532\u72b6\u817a", "2": "\u5927\u5c0f", "3": "\u5f62\u6001", "4": "\u5982\u5e38", "5": "\uff0c", "6": "\u817a\u4f53", "7": "\u56de\u58f0", "8": "\u5747\u5300", "9": "\u672a\u89c1", "10": "\u660e\u786e", "11": "\u5360\u4f4d\u6027", "12": "\u75c5\u53d8", "13": "CDFI", "14": "\u793a", "15": "\u5185", "16": "\u672a\u89c1\u5f02\u5e38", "17": "\u8840\u6d41", "18": "\u4fe1\u53f7", "19": "\u3002", "20": "\u53cc\u4fa7", "21": "\u9888\u90e8", "22": "\u660e\u663e", "23": "\u80bf\u5927", "24": "\u6dcb\u5df4\u7ed3", "25": "\u4e8e", "26": "\u5de6\u53f6", "27": "\u53ef\u89c1", "28": "\u591a\u53d1", "29": "\u7ed3\u8282", "30": "\u5927\u8005", "31": "\u4f4d\u4e8e", "32": "\u4e0a\u6781", "33": "\u5448\u56ca\u5b9e", "34": "\u6df7\u5408\u56de\u58f0", "35": "\u7ea6", "36": "_2DS_", "37": "\u8fb9\u754c", "38": "\u6e05\u6670", "39": "\u89c4\u6574", "40": "\u5468\u8fb9", "41": "\uff1b", "42": "\u4f59", "43": "\u5168\u5207", "44": "\u672f\u540e", "45": "\u539f", "46": "\u533a\u57df", "47": "\u4f53\u79ef", "48": "\u7a0d", "49": "\u589e\u5927", "50": "\u5de6\u53f6\u539a\u5f84", "51": "_SCM_", "52": "\u5ce1\u90e8\u539a", "53": "\u53f3\u53f6\u539a\u5f84", "54": "\u53f3\u53f6", "55": "\u4e0a", "56": "\u6781", "57": "\u4e00\u65e0", "58": "\u672a\u63a2\u53ca", "59": "\u4e0d", "60": "\u4e00\u56ca\u6027", "61": "\u5206\u9694", "62": "\u6b63\u5e38", "63": "\u6b20", "64": "\u89c4\u5219", "65": "\u589e\u7c97", "66": "\u3001", "67": "\u589e\u5f3a", "68": "\u90e8\u5206", "69": "\u6761\u7d22\u6837", "70": "\u6539\u53d8", "71": "\u5185\u672a\u89c1", "72": "\u5f02\u5e38", "73": "\u5de6", "74": "\u53f3\u53f6\u89c1", "75": "\u591a\u4e2a", "76": "\u4f4e\u56de\u58f0", "77": "\u5de6\u53f6\u5927\u8005", "78": "\u53f3\u53f6\u5927\u8005", "79": "\u4e2d\u90e8", "80": "\u4e0a\u8ff0", "81": "\u9971\u6ee1", "82": "\u4e2d\u4e0b\u90e8", "83": "\u4e00\u4ee5", "84": "\u56ca\u6027", "85": "\u4e3a\u4e3b", "86": "\u7684", "87": "\u56ca\u5b9e", "88": "_3DS_", "89": "\u53ef\u63a2\u53ca", "90": "\u8f83\u5927", "91": "\u8005", "92": "\u8fd1\u5ce1\u90e8", "93": "\u5448", "94": "\u4ee5", "95": "\u5b9e\u6027", "96": "\u5c1a", "97": "\u53ca", "98": "\u5185\u90e8", "99": "\u5ce1\u90e8", "100": "\u5207\u9664\u672f", "101": "\u540e", "102": "\u5de6\u53f3", "103": "\u53f6", "104": "\u53f3\u53f6\u4e0b", "105": "\u4e00\u5f3a", "106": "\u9499\u5316", "107": "\u76f4\u5f84\u7ea6", "108": "\u51cf\u4f4e", "109": "\u5206\u5e03", "110": "\u5176\u5185", "111": "\u5468\u56f4", "112": "\u5927", "113": "\u8840\u7ba1", "114": "\u65c1\u672a\u89c1", "115": "\u504f", "116": "\u4e2d", "117": "\u4e0a\u90e8", "118": "\u7565", "119": "\u7f51\u683c", "120": "\u72b6", "121": "\u589e\u591a", "122": "\u53cc", "123": "\u4e2d\u6bb5", "124": "\u4e00", "125": "\u53cc\u53f6", "126": "\u4e2d\u4e0b", "127": "\u6bb5", "128": "\u4e2d\u5fc3", "129": "\u90e8\u4e3a", "130": "\u504f\u5f3a", "131": "\u6837", "132": "\u4e30\u5bcc", "133": "\u540e\u4f34", "134": "\u58f0\u5f71", "135": "\u4e0d\u5747", "136": "\u8d28", "137": "\u4e0b\u6781", "138": "\u5de6\u53f6\u4e0b", "139": "\u89c1", "140": "\u5c1a\u53ef", "141": "\u65e0", "142": "\u6e05\u695a", "143": ":", "144": "\u4e3a", "145": "\u6781\u89c1", "146": "\u5185\u4ee5", "147": "\u5e76", "148": "\u533a", "149": "\u8303\u56f4", "150": "\u53ef", "151": "\u8bb0\u5f55", "152": "\u5230\u661f", "153": "\u70b9\u72b6", "154": "\u5185\u89c1", "155": "\u4e24\u4e2a", "156": "\u5206\u522b", "157": "\u9ad8\u56de\u58f0", "158": "\u4e00\u56ca\u5b9e", "159": "\u672a\u8bb0\u5f55", "160": "\u5230", "161": "\u6d45\u5c42", "162": "\u53ca\u5ce1\u90e8", "163": "\u5931\u5e38", "164": "\u5b9e\u8d28", "165": "\u7c97\u7cd9", "166": "\u72b6\u817a", "167": "\u6df1\u5c42", "168": "\u626b\u67e5", "169": "\u5de6\u4fa7", "170": "\u53f3\u4fa7", "171": "\u201c", "172": "\u6dcb\u5df4\u95e8", "173": "\u201d", "174": "\u7ed3\u6784", "175": "\u5c11\u91cf", "176": "\u5c11\u8bb8", "177": "\u80cc\u4fa7", "178": "\u793a\u672a\u89c1", "179": "\u5747", "180": "\u4ee5\u56ca\u6027", "181": "\u5de6\u53f6\u4e0a", "182": "\u6781\u53ca", "183": "\u5404\u89c1", "184": "\u53e6\u4e8e", "185": "\u6de1\u58f0\u5f71", "186": "\u5c0f", "187": "\u7c7b\u5706\u5f62", "188": "\u5176\u4e2d", "189": "\u4e00\u4e2a", "190": "\u7eb5\u6a2a\u6bd4", "191": "_r_", "192": "\u661f", "193": "\u6b8b\u4f59", "194": "\u7f29\u5c0f", "195": "\u5de6\u53f6\u53ca", "196": "\u6563", "197": "\u5728", "198": "\u5f3a", "199": "\u56e2", "200": "\u8fd1", "201": "\u80cc\u819c", "202": "\u5904", "203": "\u5185\u900f\u58f0", "204": "\u6b20\u4f73", "205": "\u5927\u4e8e", "206": "1", "207": "\u6bdb\u523a", "208": "\u4e00\u4e2d", "209": "\u8fb9\u7f18", "210": "\u5448\u56ca\u6027", "211": "\u4e0b", "212": "\u7247\u72b6", "213": "\u53ca\u5176", "214": "\u5de6\u53f6\u89c1", "215": "\u53ca\u56ca\u5b9e", "216": "\u5de6\u53f6\u533a", "217": "\u793a\u5de6\u53f6", "218": "\u793a\u5b9e\u6027", "219": "\u5f57\u661f", "220": "\u5c3e\u5f81", "221": "\u524d", "222": "\u88ab", "223": "\u819c", "224": "\u4e0b\u90e8", "225": "\u5411", "226": "\u5305\u819c", "227": "\u5916", "228": "\u51f8\u51fa", "229": "\u4e0d\u89c4\u5219", "230": "\u6761\u72b6", "231": "\u7ec6\u70b9", "232": "\u72b6\u5f3a", "233": "\u540e\u65b9", "234": "\u4f34\u5bbd", "235": "\u5927\u58f0", "236": "\u5f71", "237": "\u5c1a\u6e05", "238": "\u6d88\u878d\u672f", "239": "\u6d88\u878d\u533a", "240": "\u7a7f\u884c", "241": "III", "242": "\u5f25\u6f2b\u6027", "243": "\u51cf\u5c11", "244": "\u76ae", "245": "\u9ad3\u8d28", "246": "\u754c\u9650", "247": "\u793a\u672a", "248": "\u53ef\u53ca", "249": "\u4e00\u504f", "250": "\u58c1\u4e0a", "251": "\u533a\u5927\u8005", "252": "\u4ee5\u5b9e\u6027", "253": "\u4e2d\u5c42", "254": "\u7eb5\u5411", "255": "\u5f27\u5f62", "256": "\u793a\u53cc\u4fa7", "257": "\u6c34\u5e73", "258": "\u4f4d", "259": "\u5185\u5747", "260": "\u5927\u81f4", "261": "\u5de6\u53f6\u5185", "262": "\u793a\u5176", "263": "\u4e00\u6781", "264": "\u7d27\u90bb", "265": "\u6c14\u7ba1", "266": "\u4e0d\u6e05", "267": "\u793a\u53f3\u53f6", "268": "\u7ec6\u5bc6", "269": "\u7a0d\u5f3a", "270": "\u6f02\u6d6e", "271": "\u6570\u4e2a", "272": "\u8f83", "273": "\u53e6", "274": "\u6c99\u7c92", "275": "\u6837\u5f3a", "276": "\u4e0b\u6bb5", "277": "\u53f3\u53f6\u53ca", "278": "\u8d28\u504f", "279": "\u56ca\u5b9e\u6027", "280": "\u56ca\u5185", "281": "\u900f\u58f0", "282": "\u5dee", "283": "\u6df7\u5408\u6027", "284": "\u524d\u65b9", "285": "\u504f\u5de6", "286": "\u53f6\u89c1", "287": "\u4fe1", "288": "II", "289": "\u7b49\u56de\u58f0", "290": "\u6655", "291": "\u6781\u65c1", "292": "\u4e0e", "293": "\u5173\u7cfb\u5bc6\u5207", "294": "(", "295": ")", "296": "\u53f3", "297": "\u5c3e", "298": "\u53f6\u5747\u53ef", "299": "\u6e05", "300": "\u6b20\u6e05", "301": "\u58c1", "302": "\u53f3\u53f6\u4e0a", "303": "\u5c40\u90e8", "304": "\u524d\u540e", "305": "\u5f84\u7ea6", "306": "\u4e2d\u4e0a", "307": "\u5185\u4f3c", "308": "\u7802\u783e", "309": "\u663e\u793a", "310": "\u81f3\u4e0b", "311": "\u4e09\u4e2a", "312": "\u76f8\u90bb", "313": "\u7532\u72b6\u65c1\u817a", "314": "\u533a\u672a\u89c1", "315": "\u5360\u4f4d", "316": ";", "317": ",", "318": "\u793a\u8be5", "319": "IV", "320": "\u9501\u9aa8", "321": "\u52a8\u8109", "322": "\u8d77\u59cb", "323": "\u4e2d\u819c", "324": "\u589e\u539a", "325": "\u539a\u7ea6", "326": "_SMM_", "327": "\u9888", "328": "\u603b", "329": "\u5185\u5916", "330": "\u5185\u4e2d\u819c", "331": "\u4e0d\u539a", "332": "\u5149\u6ed1", "333": "\u6591\u5757", "334": "\u5f62\u6210", "335": "\u52a8\u8109\u8840", "336": "\u6d41\u901a", "337": "\u7545", "338": "\u5145\u76c8", "339": "\u826f\u597d", "340": "PW", "341": "\u9891\u8c31", "342": "\u63a2\u53ca", "343": "\u878d\u5408", "344": "\u4f34", "345": "\u5c0f\u56ca", "346": "\u6027", "347": "\u6d88\u5931", "348": "\u7d0a\u4e71", "349": "\u5931\u53bb", "350": "\u95e8", "351": "\u578b", "352": "\u4e0a\u533a", "353": "\u4e8e\u53f3", "354": "\u53f6\u4e0b", "355": "\u793a\u53f3", "356": "\u53f6\u5927\u8005", "357": "\u5206\u53f6\u72b6", "358": "\u86cb\u58f3", "359": "\u4f34\u58f0\u5f71", "360": "\u4e00\u679a", "361": "\u4e0e\u5176", "362": "\u4e0b\u65b9", "363": "\u7d27\u5bc6", "364": "\u76f8\u8fde", "365": "\u6574\u4f53", "366": "\u6781\u5747", "367": "\u6b8b\u5b58", "368": "\u53f3\u53f6\u5185", "369": "\u51e0\u4e4e", "370": "\u586b\u6ee1", "371": "\u56ca\u58c1", "372": "\u51f8\u8d77", "373": "\u4f3c", "374": "\u4e00\u4f4e", "375": "-", "376": "\u7565\u89c1", "377": "\u793a\u8840\u4f9b", "378": "\u73af\u5f62", "379": "\u4e00\u7a0d", "380": "\u5e8a\u65c1", "381": "\u8d85\u58f0", "382": "\u68c0\u67e5", "383": "\u8f6e\u5ed3", "384": "\u534a", "385": "\u73af\u72b6", "386": "\u5f84", "387": "\u56e0", "388": "\u4f53\u4f4d", "389": "\u53d7\u9650", "390": "\u5207\u9762", "391": "\u6ee1\u610f", "392": "\u7ed3\u679c", "393": "\u4ec5\u4f9b\u53c2\u8003", "394": "\u5176\u4e0b\u7f18", "395": "\u8ddd", "396": "\u5904\u89c1", "397": "\u800c\u6210", "398": "\u4e00\u70b9", "399": "\u51f8\u5411", "400": "\u77ed\u7ebf", "401": "\u793a\u5185", "402": "\u7ec4\u7ec7", "403": "\u6df7\u5408", "404": "\u5404", "405": "\u5f39\u6027", "406": "\u6210\u50cf", "407": "\u8bc4\u5206", "408": "\u6a2a\u5207", "409": "3", "410": "\u5206", "411": "\u7eb5\u5207", "412": "4", "413": "\u8be5", "414": "\u73af", "415": "\u6591\u72b6\u5f3a", "416": "\u7a0d\u5927", "417": "\u5bbd", "418": "\u76f8\u4e92", "419": "\u8702\u7a9d", "420": "\u5de6\u53f6\u8fd1", "421": "\u53ca\u53f3", "422": "\u53f6\u4e0a", "423": "\u6bdb\u7cd9", "424": "\u4f4e\u56de", "425": "\u662f", "426": "\u5ce1\u90e8\u539a\u5f84", "427": "\u5916\u4fa7", "428": "\u9888\u52a8\u8109", "429": "\u661f\u70b9", "430": "\u5305\u5757", "431": "\u6025\u8bca", "432": "\u5de6\u53f6\u539a", "433": "\u53f3\u53f6\u539a", "434": "\u988c", "435": "\u988f", "436": "\u988c\u4e0b", "437": "\u4e2a\u522b", "438": "\u76ae\u8d28", "439": "\u692d\u5706\u5f62", "440": "\u6210\u5206", "441": "\u6781\u8fd1", "442": "\u7565\u5927\u4e8e", "443": "\u56e2\u72b6", "444": "\u6655\u73af", "445": "\u7a0d\u589e", "446": "\u7c97", "447": "\u4e8e\u5ce1\u90e8", "448": "\u504f\u53f3", "449": "\u793a\u65e0", "450": "\u900f\u58f0\u533a", "451": "\u5f25\u6f2b", "452": "\u8f7b\u5ea6", "453": "\u4f3c\u7531", "454": "\u7c97\u5927", "455": "\u60a3\u8005", "456": "\u81ea\u8ff0", "457": "\u4e00\u7247", "458": "\u597d", "459": "\u4e4b\u95f4", "460": "\u5207\u53e3", "461": "\u5411\u80cc", "462": "\u820c\u6839", "463": "\u90e8", "464": "\u5927\u90e8\u5206", "465": "\u5927\u5c0f\u4e0d\u7b49", "466": "\u6a2a\u5207\u9762", "467": "\u65f6", "468": "\u7eb5\u5207\u9762", "469": "\u504f\u4f4e", "470": "\u4e00\u5904", "471": "\u5145\u6ee1", "472": "\u4e2d\u7b49", "473": "\u793a\u6a2a", "474": "\u7eb5", "475": "\u4e0a\u89c1", "476": "\u6d41", "477": "\u4e00\u5c0f", "478": "CDI", "479": "\u5f27\u957f", "480": "\u56db\u4e2a", "481": "\u65c1", "482": "\u6df1", "483": "\u8d28\u56ca\u5b9e", "484": "\u591a\u5904", "485": "\u793a\u5305\u5757", "486": "\u5185\u53ca", "487": "\u81f4", "488": "\u53e6\u53f3\u53f6", "489": "\u4e34\u8fd1", "490": "\u8179\u4fa7", "491": "\u6742\u4e71", "492": "\u533a\u5747", "493": "\u4e32\u73e0", "494": "\u6392\u5217", "495": "\u5916\u5747", "496": "\u6837\u53ca", "497": "\u5c0f\u900f", "498": "\u58f0\u533a", "499": "\u5185\u58c1", "500": "\u5e95\u90e8", "501": "\u539a\u5ea6", "502": "\u4e8e\u539f", "503": "\u7b49", "504": "\u5176\u56ca\u58c1", "505": "\u539a", "506": "\u8868\u9762", "507": "\u77ed", "508": "\u5176\u5b9e", "509": "\u6df1\u90e8", "510": "\u53e6\u89c1", "511": "\u6591", "512": "\u7f6e\u7ba1", "513": "\u8be5\u5904", "514": "\u6577\u6599", "515": "\u8986\u76d6", "516": "\u906e\u6321", "517": "\u6709\u9650", "518": "\u53e6\u53f3", "519": "\u4e0b\u6781\u5904", "520": "\u56de\u6b20", "521": "\u58f0", "522": "\u591a\u6761", "523": "\u7d22\u5f3a", "524": "\u5206\u90e8", "525": "\u5360\u636e", "526": "\u5185\u5b9e\u6027", "527": "\u816e\u817a", "528": "\u591a", "529": "\u53d1\u6761", "530": "\u7d22\u6837", "531": "\u5185\u4f34", "532": "\u4e24\u5904", "533": "\u7a7f\u523a\u672f", "534": "\u53f3\u5927\u8005", "535": "\u4e00\u5b9e\u6027", "536": "\u5e03\u6ee1", "537": "\u5206\u53f6", "538": "\u5305\u88f9", "539": "\u504f\u5ce1\u90e8", "540": "\u73af\u7ed5", "541": "\u9888\u540e", "542": "\u5904\u626b\u67e5", "543": "\u76ae\u4e0b", "544": "\u5c1a\u6574", "545": ".", "546": "\u8457", "547": "\u70b9", "548": "\u6761\u6837", "549": "\u5f81", "550": "\u5806\u79ef", "551": "\u793a\u63a2", "552": "\u80cc", "553": "\u4fa7\u8fd1", "554": "\u51cf\u5c0f", "555": "\u5411\u5916", "556": "\u9686\u8d77", "557": "\u6670", "558": "V", "559": "\u504f\u5ce1", "560": "\u90e8\u89c1", "561": "\u504f\u591a", "562": "\u5c0f\u7247\u6837", "563": "\u6240\u6307", "564": "\u95e8\u578b", "565": "\u56e2\u5757", "566": "\u5176", "567": "\u58c1\u5185", "568": "\u6a2a", "569": "\u793a\u5747", "570": "\u53f3\u53f6\u5747", "571": "\u5fae\u6ce2", "572": "\u6cbb\u7597", "573": "\u6708", "574": "1.8", "575": "\u5305\u7ed5", "576": "\u663e\u8457", "577": "\u5206\u754c", "578": "\u6781\u5904", "579": "\u76f4\u5f84", "580": "\u6761\u5f62", "581": "\u4f4d\u4e0b", "582": "\u533a\u5185", "583": "\u7a0d\u4f4e", "584": "\u4e00\u7c07", "585": "\u7206\u7c73\u82b1", "586": "\u53f3\u53f6\u539f", "587": "\u56ca\u6027\u533a", "588": "\u4e0a\u65b9", "589": "\u793a\u793a", "590": "\u533a\u89c1", "591": "\u8d28\u5b9e\u6027", "592": "\u53f3\u9888", "593": "\u5168", "594": "\u5168\u90e8", "595": "\u65e0\u8bed", "596": "\u65c1\u817a\u533a", "597": "\u8f83\u5c0f\u8005", "598": "VI", "599": "\u6570\u9897", "600": "\u5f02\u6d41", "601": "CDF", "602": "\u672a", "603": "\u5782\u76f4", "604": "\u8f83\u53f3\u53f6", "605": "RI", "606": "0.54", "607": "\u5fae", "608": "\u7c07\u72b6\u5f3a", "609": "\u4ee5\u53ca", "610": "\u8fd1\u8179\u4fa7", "611": "\u53f6\u4e2d", "612": "\u7d27\u8d34", "613": "\u7a9d", "614": "\u524d\u4e0a", "615": "\u6b63\u4e2d", "616": "\u8f6f\u7ec4\u7ec7", "617": "\u5c42\u5185", "618": "\u5178\u578b", "619": "\u53ca\u53f3\u53f6", "620": "\u7a00\u758f", "621": "\u88ab\u52a8", "622": "\u4fa7\u5367\u4f4d", "623": "\u53ca\u56ca\u6027", "624": "\u6574\u4e2a", "625": "\u8fd1\u4e0b", "626": "\u4f59\u5c0f", "627": "\u7f51\u72b6", "628": "\u5375\u5706\u5f62", "629": "I", "630": "\u53ef\u4f3c", "631": "\u4e0b\u988c\u90e8", "632": "\u00d7", "633": "0.4", "634": "\u53d1\u77ed", "635": "\u5f3a\u5f3a", "636": "\u8fde\u7eed\u6027", "637": "\u8584\u6655\u73af", "638": "\u5c0f\u8005", "639": "\u90bb\u8fd1", "640": "\u6478", "641": "\u5b66", "642": "\u6781\u4f3c", "643": "\u6781\u4f4e", "644": "\u53f3\u53f6\u8fd1", "645": "\u8fd1\u4f3c", "646": "\u591c\u95f4", "647": "\u5185\u7ea6", "648": "\u4e0b\u6781\u8fd1", "649": "\u5f69\u8d85", "650": "\u8868\u73b0", "651": "\u706b\u6d77", "652": "\u591a\u6570", "653": "\u95e8\u90e8", "654": "\u846b\u82a6", "655": "\u5185\u5f84", "656": "\u589e\u5bbd", "657": "\u4e0a\u6bb5", "658": "\u53f6\u5185", "659": ""}] \ No newline at end of file diff --git a/utils/thyroid_gen_config.py b/utils/thyroid_gen_config.py new file mode 100644 index 0000000000000000000000000000000000000000..9e78552cdb8ab42641d2c043c33b7377796d5369 --- /dev/null +++ b/utils/thyroid_gen_config.py @@ -0,0 +1,86 @@ +__author__ = 'Rio' + +import os + +from yacs.config import CfgNode as CN +config = CN() +config.root = os.path.dirname(os.path.abspath(__file__)) +config.models = os.path.join(config.root, '../Model/thyroid_model_best.pth') + +config.dataset_name = 'Thyroid' +config.distiller_num = 5 # liver:18; Mamary:18; Thyroid:5 +config.jieba_dir = '/Data/key_technical_words.txt' +config.image_dir = os.path.join(config.root, '../Data_demo/Images') +# config.ann_path = 'E:/Datasets/Ultrasound/Data/new_Thyroid2.json' +config.ann_path = os.path.join(config.root, '../Data_demo/Thyroid.json') + +config.dict_pth = os.path.join(config.root, 'thyroid_dict.txt') +# config.dict_pth = ' ' + +config.max_seq_length_train = 150 +config.max_seq_length = 150 +config.threshold = 3 +config.num_workers = 0 +config.batch_size = 32 +config.evaluate_batch = 1 + +config.visual_extractor = 'resnet101' +config.visual_extractor_pretrained = True + +config.d_model = 512 +config.d_ff = 512 +config.d_vf = 2048 +config.num_heads = 8 +config.num_layers = 3 +config.dropout = 0.1 +config.logit_layers = 1 +config.bos_idx = 0 +config.eos_idx = 0 +config.pad_idx = 0 +config.use_bn = 0 +config.drop_prob_lm = 0.5 + +config.sample_n = 1 +config.output_logsoftmax = 1 +config.decoding_constraintt = 0 + +config.n_gpu = 1 +config.epochs = 50 + +config.save_dir = '/Result/Models' +config.record_dir = '/Result/Records' + +config.save_period = 1 +config.monitor_mode = 'max' +config.monitor_metric = 'BLEU_4' +config.early_stop = 100 +config.image_type = '2d' + +config.optim = 'Adam' +config.lr_ve = 5e-5 +config.lr_ed = 1e-3 +config.weight_decay = 5e-5 +config.amsgrad = True + +config.lr_scheduler = 'StepLR' +config.step_size = 28 +config.gamma = 0.1 + +config.seed = 9233 +config.resume = None + +config.embedding_vector = 300 +config.nhidden = 512 +config.nlayers = 1 +config.bidirectional = True +config.rnn_type = 'LSTM' + +# text_image_losses.py +config.cuda = True +config.train_smooth_gamma3 = 10.0 +config.train_smooth_gamma2 = 5.0 +config.train_smooth_gamma1 = 4.0 +config.attn_pth = 'E:/Captionv0/Code/SGF/Result/Attn_pth' + + +