目錄
- 前言
- 一、研究背景與問題
- 1-1、地質圖的重要性
- 1-2、現有MLLMs的不足
- 二、 主要貢獻
- 2-1、GeoMap-Bench:首個地質圖理解評估基準
- 2-2、GeoMap-Agent:首個地質圖專用AI代理
- 2-3、實驗驗證與性能優勢
- 三、關鍵技術
- 3-1、 數據構建與預處理
- 3-2、分層信息提取(HIE)
- 3-3、 領域知識注入(DKI)
- 3-4、 提示增強問答(PEQA)
- 3-5、 評估方法設計
- 3-6、工具與技術集成
- 四、局限與展望
- 附錄:
- 1、Google Earth Engine
- 總結
前言
這篇文章提出了一種名為PEACE的框架,旨在通過多模態大語言模型(MLLMs)增強地質圖的全方位理解。一、研究背景與問題
1-1、地質圖的重要性
地質圖是地質學中的核心工具,通過可視化的方式呈現地球表層和地下的巖石分布、地質構造(如斷層、褶皺)及地層年代關系。其應用涵蓋多個關鍵領域:
- 災害檢測:通過分析地質圖中的斷層活動、巖層穩定性等,評估地震、滑坡、地下水污染等自然災害的風險。例如,活躍斷層的分布可直接關聯區域地震概率。
- 資源勘探:識別石油、天然氣、礦產等資源的潛在儲存區域。例如,背斜構造(巖層向上拱起)常作為石油儲集層,地質圖能幫助定位此類結構。
- 土木工程:為基礎設施建設(如隧道、大壩)提供地下巖層條件信息,避免因地質不穩定導致的工程風險。
- 科學研究:揭示地球演化歷史,例如通過地層序列推斷地質年代和古環境變化。
1-2、現有MLLMs的不足
盡管多模態大語言模型(MLLMs,如GPT-4、LLaVA)在通用圖像理解中表現出色,但在地質圖理解中存在顯著瓶頸,主要源于以下挑戰:
(1)高分辨率圖像處理難題:
- 地質圖通常為高分辨率(如平均6,1462像素),遠超普通圖像的輸入限制。直接壓縮會導致細節丟失(如微小斷層符號模糊),而分塊處理需解決局部與全局信息的關聯問題。
- 例如,一張1:50,000比例尺的地質圖可能包含數千個獨立符號,模型需同時捕捉微觀細節和宏觀結構。
(2)多關聯組件的復雜交互:
- 地質圖包含七大核心組件(標題、比例尺、圖例、主圖、索引圖、剖面圖、地層柱狀圖)及數十種符號化標記(如顏色編碼的巖石類型、線狀斷層、面狀巖層邊界)。這些組件需聯合解讀,例如:(1)圖例與主圖關聯:不同顏色對應特定巖石類型(如紅色代表花崗巖),需模型將顏色映射到地質術語。(2)剖面圖與主圖聯動:垂直剖面圖需與平面主圖結合,以理解三維地質結構。
- 組件間的空間和語義關聯增加了模型推理的復雜度。
(3)領域知識依賴性強:
- 地質圖的符號系統高度專業化,需結合地質學、地理學、地震學等知識。例如:(1)斷層符號:需區分正斷層、逆斷層、走滑斷層,并關聯其活動性與地震風險。(2)地層年代:需理解國際地層年代表(如“侏羅紀”“白堊紀”)及其對應的巖石特征。
- 通用MLLMs缺乏此類領域知識庫,導致回答模糊或錯誤。例如,GPT-4可能無法準確解釋“背斜構造中不透水層如何封閉油氣”。
二、 主要貢獻
2-1、GeoMap-Bench:首個地質圖理解評估基準
1、數據來源與構成:
- 標準化數據源:整合來自美國地質調查局(USGS)和中國地質調查局(CGS)的公開地質圖,覆蓋不同區域(如北美、東亞)和比例尺(1:24,000至1:500,000),確保數據多樣性和專業性。
- 數據集規模:包含124張高分辨率地質圖(平均分辨率6,1462像素)和3,864個標注問題,涵蓋中英文雙語環境。
- 標注與驗證:通過人工標注與專家審核,記錄每張地圖的元數據(標題、比例尺、經緯度范圍)及組件信息(圖例顏色、巖石類型、斷層分布等),確保答案的準確性。
2、任務設計與評估維度:
(1)五大能力評估:
- 提取(Extracting):獲取地圖基礎信息(如比例尺、經緯度范圍);
- 定位(Grounding):根據名稱或意圖定位地圖組件(如“圖例的位置”);
- 關聯(Referring):建立符號與語義的映射(如顏色對應巖石類型);
- 推理(Reasoning):結合領域知識進行邏輯推斷(如“某區域是否存在斷層”);
- 分析(Analyzing):綜合解讀復雜問題(如“評估區域地震風險”)。
(2)25項具體任務:例如:
- 基礎任務:填空型問題(“地圖的標題是什么?”);
- 復雜任務:多選題(“哪種巖石面積排名第三?”)與開放式問答題(“分析該區域資源潛力”)。
(3)創新性評估指標:
- IoU檢測框重疊度:用于定位任務的精確度評估;
- 集合交并比(IoU_set):評估連續或離散數據(如經緯度范圍)的重合度;
- GPT-4o輔助評分:通過對比模型生成答案與專家標注答案的專業性、多樣性,評判開放式問題的質量。
2-2、GeoMap-Agent:首個地質圖專用AI代理
GeoMap-Agent通過模塊化設計解決MLLMs在地質圖理解中的三大挑戰,其核心模塊包括:
1、HIE(分層信息提取):
(1)分治策略:將高分辨率圖像按語義分割為子圖(如標題、圖例、主圖),利用檢測模型(如YOLOv10)識別組件邊界,逐塊提取信息。
(2)結構化元數據生成:整合子圖信息形成全局元數據,例如將圖例顏色映射到巖石類型,主圖區域關聯斷層分布。
2、DKI(領域知識注入):
(1)專家知識庫:引入地質學家、地理學家和地震學家的知識庫,動態匹配問題需求。例如:
- 地質學知識:巖石分類表(3級結構,涵蓋335種巖石類型);
- 地震學數據:調用USGS地震數據庫分析區域活動斷層。
(2)工具池擴展:支持調用Google Earth Engine(GEE)API獲取人口密度、地形數據,增強分析維度。
3、PEQA(提示增強問答):
(1)多模態提示設計:
- 上下文注入:將元數據與領域知識作為背景信息;
- 思維鏈(CoT):要求模型分步驟推理(如“先定位斷層,再評估地震風險”);
- 示例引導:提供標準答案格式(JSON結構)與示例;
- 注意力增強:裁剪相關子圖(如聚焦特定區域)并嵌入提示。
(2)性能優化:通過提示工程將GPT-4o的答案準確率提升30%以上。
2-3、實驗驗證與性能優勢
三、關鍵技術
3-1、 數據構建與預處理
(1)數據來源與標準化:
- 多源數據整合:從USGS(美國)和CGS(中國)獲取公開地質圖,覆蓋不同比例尺(1:24,000至1:500,000)、區域(北美、東亞)及語言(中英文)。
- 格式統一化:將CGS的MapGIS格式轉換為柵格圖像,USGS的ArcGIS數據直接使用高分辨率柵格圖,確保輸入一致性。
- 分辨率處理:平均分辨率達6,1462像素,通過自動化腳本批量處理圖像質量(如去噪、對比度調整)。
(2)標注與元數據生成:
- 人工標注:專家團隊手動標注地圖組件(標題、圖例、斷層)的邊界框(Bounding Box)、顏色編碼及巖石類型。
- 結構化元數據:記錄每張地圖的經緯度范圍、比例尺、巖石面積統計、斷層分布等,形成標準化數據庫。
- 驗證機制:通過交叉檢查(如雙人獨立標注)確保標注準確性,錯誤率控制在2%以下。
3-2、分層信息提取(HIE)
(1)分塊處理高分辨率圖像:
- 語義分塊:將整張地質圖按組件(如標題、圖例、主圖)分割為子圖,采用YOLOv10檢測模型識別組件邊界。
- 樹狀結構整合:以整圖為根節點,子圖為分支,構建層次化信息樹,確保局部與全局信息關聯。
(2)信息提取與融合:
- 局部特征提取:對每個子圖使用GPT-4o生成描述性文本(如“圖例中紅色對應花崗巖”)。
- 全局元數據合成:整合所有子圖信息,生成結構化元數據(如JSON格式),包含組件位置、符號語義及統計信息。
(3)技術優勢:
- 解決高分辨率瓶頸:避免直接壓縮導致的細節丟失。
- 提升處理效率:并行處理子圖,減少單次推理的計算負載。
代碼解析:
- 輸入:地質圖圖像路徑
- 輸出:結構化地質信息JSON文件
- 處理步驟:
- 檢查緩存 → 存在則直接返回
- 初始化元數據結構
- 地圖布局分析(定位各區域)
- 區域裁剪與特殊處理
- 圖例信息提取與知識補充
- 基礎信息提取(使用大模型API)
- 主地圖巖石分割
- 保存結果并返回
import cv2
import json
import collections
from tool_pool import geological_knwoledge_type
from utils import api, prompt, vision, common
from agents import geologist_agent# 定義分層信息提取類。
class hierarchical_information_extraction:def __init__(self):# 初始化地質學專家智能體self.geologist = geologist_agent()def digitalize(self, image_path):# 讀取圖像并且檢查緩存image = cv2.imread(image_path)# 從路徑中提取文件名。name = common.path2name(image_path)# 構建元數據緩存路徑meta_path = os.path.join(common.cache_path(), "meta", name + ".json")# 檢查緩存文件是否存在,如果存在的話,則直接從緩沖中讀取。if os.path.exists(meta_path):meta = json.loads(open(meta_path).read())return meta# get headers of geologic map# 初始化元數據結構meta = dict()meta["date"] = common.today_date() # 處理日期meta["name"] = name # 圖像名稱meta["version"] = "v1.0" #版本號meta["source"] = common.dataset_source # 數據來源meta["size"] = {"width": image.shape[1], "height": image.shape[0]} # 圖像的尺寸meta["regions"] = dict() # 初始化區域字典 meta["legend"] = dict() # 初始化圖例字典meta["information"] = dict() # 其他基礎信息meta["faults"] = None # 初始化斷層信息# get layout of geologic map.# 使用地質專家Agent分析地圖布局map_layout = self.geologist.get_map_layout(image_path)# 提取區域信息regions = map_layout["regions"]meta["regions"] = regions# crop each component in geologic map.# 創建字典存儲區域路徑和邊界框region_path_and_bbox = collections.defaultdict(list)# 遍歷所有檢測到的區域for region_name, region_bndboxes in regions.items():# 遍歷區域內所有邊界框for i, region_bndbox in enumerate(region_bndboxes):# 構建區域保存路徑region_path = os.path.join(common.cache_path(), "det", name, f"{region_name}_{i}.png")# 創建所需目錄common.create_folder_by_file_path(region_path)# 裁剪圖像并且保存到指定路徑vision.crop_and_save_image(image, region_bndbox, region_path)region_path_and_bbox[region_name].append((region_path, region_bndbox))# 特殊處理 主地圖區域if "main_map" == region_name:# crop latitude and longitude region of geologic map.lonlat_name = "lonlat"lonlat_region_path = os.path.join(common.cache_path(), "det", name, f"{lonlat_name}_{i}.png")common.create_folder_by_file_path(lonlat_region_path)vision.crop_corners_and_save_image(region_path, lonlat_region_path)region_path_and_bbox[lonlat_name].append((lonlat_region_path, None))# 特殊處理索引地圖區域elif "index_map" == region_name:# extend index map and add vision prompt.vision.annotate_image_with_directions(region_path, region_path)# get metadata of legend.# 提取圖例的元數據if len(region_path_and_bbox["legend"]) > 0:legend_path, legend_bndbox = region_path_and_bbox["legend"][0]# 通過地質專家代理獲取圖例元數據legend_metadata = self.geologist.get_legend_metadata(legend_path, legend_bndbox)# 提取圖例項legends = legend_metadata["legend"]# 為每個圖例補充地質知識for legend in legends.values():legend["lithology"] = self.geologist.get_knowledge(geological_knwoledge_type.Rock_Type, legend["text"])["rock_type"]legend["stratigraphic_age"] = self.geologist.get_knowledge(geological_knwoledge_type.Rock_Age, legend["text"])["rock_age"]meta["legend"] = legends# get basic information of geologic map.# 提取基礎信息region_names = ["title", "scale", "lonlat", "index_map"]for region_name in region_names:if region_name not in region_path_and_bbox:continue# 獲取區域路徑和邊界框region_path, region_bndbox = region_path_and_bbox[region_name][0]keys, instruction = prompt.get_component_instruction(region_name)# 構建多模態提示內容prompt_content = [{"type": "image_url", "image_url": {"url": api.local_image_to_data_url(region_path)}},{"type": "text", "text": instruction},]# 構建API請求信息messages = [{"role": "system", "content": prompt.system_prompt},{"role": "user", "content": prompt_content},]# 調用api獲取結構化響應answer = api.answer_wrapper(messages, structured=True)# 將響應轉化為python對象infos = eval(answer)# key_value_pairs = prompt.get_basic_information(region_name, infos)for key, value in key_value_pairs:meta["information"][key] = value# get statistic information of rock.# 檢查是否存在主地圖區域,并且進行巖石區域的分割。if len(region_path_and_bbox["main_map"]) > 0:main_map_path, main_map_bndbox = region_path_and_bbox["main_map"][0]vision.rock_region_seg(main_map_path, list(meta["legend"].values()))# output digitalization result of geologic map.# 保存數字化結果common.create_folder_by_file_path(meta_path)with open(meta_path, "w", encoding="utf-8") as f:f.write(json.dumps(meta, indent=4, ensure_ascii=False))return metaif __name__ == "__main__":image_path = "sample.jpg"hie = hierarchical_information_extraction()meta = hie.digitalize(image_path)print(meta)
3-3、 領域知識注入(DKI)
(1)專家知識庫構建:
- 巖石分類表:3級結構(大類、亞類、具體巖石),涵蓋335種英文、256種中文巖石類型(如沉積巖→碎屑巖→礫巖)。
- 地震與斷層數據庫:整合USGS地震記錄(1970年至今,震級>2.5)和GEM全球活動斷層數據庫。
(2)動態知識調用:
- 問題驅動的知識匹配:根據問題類型(如地震風險評估)自動調用相關數據庫(如人口密度、地形數據)。
- 多專家協作:地質學家、地理學家、地震學家的知識通過API(如Google Earth Engine)動態注入。
(3)工具池擴展:
- GIS工具:調用ArcGIS API進行空間分析(如斷層緩沖區計算)。
- OCR與顏色提取:從圖例子圖中提取文本(如巖石名稱)和顏色編碼(如RGB值對應特定巖石)。
代碼解析:
- 專家代理模式:通過 seismologist_agent 和 geographer_agent 封裝領域知識獲取邏輯。代理內部調用專業數據庫或 API(未在代碼中展示)。
- 緩存機制:知識結果保存為 JSON 文件,路徑為 ./cache/knowledge/{區域名稱}.json。避免重復計算,提升性能。
- 動態知識篩選:使用大模型(如 GPT-4)動態判斷哪些知識類型與問題相關。示例:若問題關于“地震風險”,模型可能選擇 seismic 而忽略 geographical。
- 坐標處理工具:common.convert_to_decimal:將度分秒格式(如 “120°00’E”)轉換為十進制(如 120.0)。common.is_valid_longitude/latitude:驗證坐標是否在有效范圍內(經度[-180,180],緯度[-90,90])
import os
os.sys.path.append(f"{os.path.dirname(os.path.realpath(__file__))}/..")
import json
from utils import api, prompt, vision, common
from agents import geographer_agent, seismologist_agent# 領域知識注入,主要用于結合地理學家和地震學家的專業知識,回答與低質和地震風險相關的問題。
class domain_knowledge_injection:def __init__(self):# 初始化地震學專家智能體和地理學專家智能體self.seismologist = seismologist_agent()self.geographer = geographer_agent()# 知識選擇def select(self, question, knowledge):# 調用select篩選出與問題相關的知識。# 提取知識類型列表knowledge_types = list(knowledge.keys())# 構造提示詞,要求模型返回需要的知識類型(JSON格式)# 使用大模型動態判斷哪些知識類型與問題相關examples = '{"required_knowledge_types": %s}' % knowledge_typesinstructions = [{"type": "text", "text": f"The given question is '{question}'."},{"type": "text", "text": f"The knowledge types from expert group are {', '.join(knowledge_types)}."},{"type": "text", "text": f'What are the helpful knowledge types among them to answer the givenquestion, the example is {examples}, only respond with JSON format.\n'},]# prompt.system_prompt:你是地質學和地圖學方面的專家,主要研究地質圖。messages = [{"role": "system", "content": prompt.system_prompt},{"role": "user", "content": instructions},]# 調用api獲取回答answer = api.answer_wrapper(messages, structured=True)# 解析返回的json,篩選知識try:answer = eval(answer)keys = answer["required_knowledge_types"]except:keys = list()# 返回篩選后的知識。selected_knowledge = dict()for key in keys:if key in knowledge:selected_knowledge[key] = knowledge[key]return selected_knowledgedef consult(self, question, meta):# 咨詢,根據地理坐標獲取專家知識,并且緩存結果以提高效率# 檢查地理坐標元數據是否存在if meta is None:print("Missing metadata in DKI module", flush=True)return None# 檢查是否有緩存的知識文件knowledge_path = os.path.join(common.cache_path(), "knowledge", meta["name"] + ".json")# 如果存在的話,就加載文件if os.path.exists(knowledge_path):knowledge = json.loads(open(knowledge_path).read())else:longitude_range = meta["information"]["longitude"]longitude_range = list(map(lambda x: common.convert_to_decimal(x), longitude_range))latitude_range = meta["information"]["latitude"]latitude_range = list(map(lambda x: common.convert_to_decimal(x), latitude_range))# 拿到地理坐標元素min_lon = min(longitude_range)max_lon = max(longitude_range)min_lat = min(latitude_range)max_lat = max(latitude_range)if common.is_valid_longitude(min_lon) and \common.is_valid_longitude(max_lon) and \common.is_valid_latitude(min_lat) and \common.is_valid_latitude(max_lat):# 地震學家根據經緯度獲取到具體的知識。seismic_data = self.seismologist.get_knowledge(min_lon, min_lat, max_lon, max_lat)
# print('-'*100)
# print(seismic_data)
# print('-'*100)# 地理學家根據經緯度獲取到具體的知識geographical_data = self.geographer.get_knowledge(min_lon, min_lat, max_lon, max_lat)# 匯總地震學家和地理學家的知識knowledge = seismic_data | geographical_dataelse:knowledge = dict()# output external knowledge of geologic map.# 保存知識到緩存文件,把文件寫入,common.create_folder_by_file_path
(knowledge_path)with open(knowledge_path, "w", encoding="utf-8") as f:f.write(json.dumps(knowledge, indent=4, ensure_ascii=False))# 調用select來篩選知識dataset_sourceselected_knowledge = self.select(question, knowledge)return selected_knowledgeif __name__ == "__main__":meta = {
# "name": "E4901","name": "E4xxx","information": {# 東經120°-121°"longitude": ["113°00'E","114°00'E"],# 北緯30.5°-31.5°"latitude": ["34°33'N","35°00'N"]}}# 根據這張地質圖,請分析一下該地區的地震4/1AUJR-x5DDA9A8GLHUMp0fMS0JIImB0RyKKOjV0B14irVsu6kC9-smiO5n1g風險等級。question = "Based on this geologic map, please analyze the seismic risk level in this area?"dki = domain_knowledge_injection()# prompt.system_promptexternal_knowledge = dki.consult(question, meta)print(external_knowledge)
3-4、 提示增強問答(PEQA)
(1)多模態提示設計:
- 上下文注入:將HIE提取的元數據(如“圖例中#5D1C1C對應頁巖”)和DKI提供的領域知識(如“背斜構造易儲油”)作為背景信息。
- 思維鏈(CoT)引導:要求模型分步推理(如“首先定位斷層,其次分析活動性,最后評估地震風險”)。
- 示例驅動:提供標準答案格式(JSON結構)和示例問題-答案對,減少模型輸出偏差。
- 注意力增強:裁剪與問題相關的子圖(如聚焦某區域斷層)并嵌入提示,引導模型關注關鍵區域。
(2)性能優化策略:
- 結構化輸出:強制模型以JSON格式回答,便于后續解析與評估。
- 迭代修正:通過反饋機制(如檢測答案與元數據的一致性)自動修正錯誤。
3-5、 評估方法設計
(1)定量指標:
- IoU檢測框重疊度:用于定位任務(如“圖例位置”),計算預測框與標注框的交并比。
- 集合交并比(IoU_set):評估連續數據(如經緯度范圍)或離散集合(如相鄰區域名稱)的重合度。
- 分類準確率:多選題(MCQ)和填空題(FITB)的直接匹配率。
(2)定性評估:
- GPT-4o輔助評分:對開放式問題(如“分析地震風險”),由GPT-4o對比模型答案與專家標注,從多樣性、專業性和具體性三個維度打分。
- 人工審核:專家團隊對復雜答案進行最終審核,確保評估結果的可靠性。
(3)模塊化測試:
- 消融實驗:分別關閉HIE、DKI、PEQA模塊,分析各模塊對性能的貢獻(如HIE使基礎任務提升40%)。
- 跨模型適配性:測試不同基礎模型(如GPT-4o、GPT-4o-mini)的表現,驗證框架的通用性。
3-6、工具與技術集成
檢測模型:YOLOv10用于地圖組件檢測,訓練時采用1,000張標注地圖,IoU閾值設為0.8,確保高精度定位。
GIS與數據庫接口:
- Google Earth Engine(GEE):調用人口密度(WorldPop)和土地利用(ESA WorldCover)數據。
- USGS地震API:實時獲取歷史地震記錄,支持動態風險評估。
工具API
- population_density_api:根據經緯度坐標來統計人口密度。
- landcover_type_api: 調用ESA WorldCover全球土地覆蓋數據集,計算指定地理區域內各類土地覆蓋類型(如森林、農田、城市)的面積占比。
- active_fault_db: 處理活動斷層數據庫的查詢
- history_earthquake_db: 歷史地震數據工具。
四、局限與展望
局限性:
- 復雜巖石模式識別仍有挑戰;
- 中文地質圖(CGS)表現略遜于英文(USGS);
- 開放式問題的自動評估需進一步優化。
未來方向:
- 擴展專家知識庫和工具池;
- 探索監督微調(Supervised Fine-Tuning)提升模型性能;
- 將框架推廣至高分辨率、多組件、領域知識依賴的其他場景(如醫學影像)。
附錄:
1、Google Earth Engine
Google Earth Engine官方文檔: https://developers.google.cn/earth-engine/guides/access?hl=zh-cn
- 注冊用于商業或者非商業用途
- 創建新的Cloud項目
- 激活Earth Engine API
項目預覽界面:
Google Earth Engine API的進一步使用:https://developers.google.com/earth-engine/guides/python_install?hl=zh_CN
參考文章:
官方GitHub
Google Earth Engine官方文檔: https://developers.google.cn/earth-engine/guides/access?hl=zh-cn
總結
這份愛多隆重,憑什么落空,那些海誓山盟,形色匆匆。凜冽的寒冬,與誰相擁,第五季節的朦朧,深情萬種。親愛的不要哭,他愛你在無人處,推開清晨的霧,恍惚間被他觸碰,以為得到了救贖,可是他最后的溫度,我留不住。