文淵慧典》:五)
技術(shù)架構(gòu)上——當(dāng)PDF遇上PyMuPDF當(dāng)版面分析遇上PPStructure一場(chǎng)關(guān)于“怎么讓電腦看懂豎排繁體”的底層大揭秘——大胖老師“今天這堂課咱們不講虛的直接上硬菜。我要把文淵慧典的技術(shù)架構(gòu)從頭到尾扒一遍扒到毛細(xì)血管級(jí)別?!薄谕屏送蒲坨R“老師能從PDF扒到雙層PDF嗎”——大胖老師“不僅扒到我還要讓你看到一頁(yè)發(fā)黃的線裝書(shū)是怎么在代碼的流水線上走一遭最后變成一個(gè)能搜索、能復(fù)制的數(shù)字文檔的。”——小菜舉手“那我負(fù)責(zé)提問(wèn)。問(wèn)傻了你別罵我?!薄陬^也不抬“問(wèn)傻了說(shuō)明講得不好。老師您壓力大嗎”——大胖老師端起保溫杯潤(rùn)了潤(rùn)嗓子“壓力就是動(dòng)力。來(lái)咱們開(kāi)扒?!币?、總覽這是一條為古籍量身打造的“數(shù)字生產(chǎn)線”大胖老師在白板上畫(huà)了一條橫線線上戳了五個(gè)方框依次寫(xiě)著PDF解析 → 圖像預(yù)處理 → 版面分析 → OCR識(shí)別 → 后處理與輸出“這就是文淵慧典的核心流水線??粗胀∣CR系統(tǒng)差不多是吧”他敲敲第一個(gè)框“但每個(gè)模塊里面都塞滿(mǎn)了我們針對(duì)古籍專(zhuān)門(mén)設(shè)計(jì)的‘獨(dú)門(mén)暗器’。普通OCR一碰古籍就跪不是因?yàn)樗溶浭且驗(yàn)樗纳a(chǎn)線根本就不是為這條道修的?!薄敖裉煸蹅兙彤?dāng)一回車(chē)間主任一個(gè)工位一個(gè)工位地轉(zhuǎn)。你們會(huì)看到一頁(yè)發(fā)黃的線裝書(shū)是怎么在這條流水線上走一遭最后變成一個(gè)能搜索、能復(fù)制的數(shù)字文檔的?!毙〔硕⒅鞍婷娣治觥蹦莻€(gè)框眼睛發(fā)光“我最想聽(tīng)這個(gè)一頁(yè)亂糟糟的古籍電腦怎么就能一眼看出哪兒是正文、哪兒是注”二黑慢悠悠地接話(huà)“因?yàn)樗皇恰础鰜?lái)的是‘算’出來(lái)的。而且算的過(guò)程中踩過(guò)的坑比你吃過(guò)的鹽還多。”大胖老師“二黑說(shuō)得對(duì)。今天咱們就把這條流水線從頭扒到尾。先從第一站開(kāi)始?!倍?、第一車(chē)間PDF解析——PyMuPDF的“庖丁解?!贝笈掷蠋燑c(diǎn)開(kāi)一個(gè)掃描版PDF放大到像素級(jí)別?!澳銈兛催@種掃描版PDF每一頁(yè)就是一張高分辨率圖片外面裹著PDF的封裝殼。第一車(chē)間的任務(wù)就是把殼敲開(kāi)把圖片無(wú)損地請(qǐng)出來(lái)。還不能弄亂順序、弄丟頁(yè)碼、弄花畫(huà)質(zhì)。”“市面上PDF工具一大堆為什么單選PyMuPDF”二黑搶答“因?yàn)樗腔贛uPDF內(nèi)核的C語(yǔ)言寫(xiě)的速度極快內(nèi)存占用極小。更關(guān)鍵的是它支持幾乎所有PDF變種——加密的、壓縮的、帶透明層的全都能解。而且它可以把頁(yè)面直接渲染成像素圖DPI隨你設(shè)。”“我們?cè)O(shè)的是300?!贝笈掷蠋熃舆^(guò)話(huà)“這個(gè)數(shù)是反復(fù)試出來(lái)的黃金平衡點(diǎn)——低了字跡發(fā)虛高了文件太大拖慢速度。代碼寫(xiě)起來(lái)也干凈打開(kāi)PDF遍歷每一頁(yè)調(diào)一個(gè)get_pixmap(dpi300)一張高清PNG就出來(lái)了?!毙〔嗽囍胂竽莻€(gè)畫(huà)面“所以PyMuPDF就像一個(gè)熟練的拆包工”“對(duì)模范快遞員。”大胖老師笑了“而且它拆得快。一本300頁(yè)的PDF不到一分鐘全部導(dǎo)出。換成人工一頁(yè)頁(yè)截圖半天沒(méi)了。王大姐把PDF拖進(jìn)系統(tǒng)背后就是這個(gè)車(chē)間在咔咔地拆包裝把古籍原圖一張張平鋪在工作臺(tái)上等著下一步處理。她不需要知道什么是DPI什么是渲染——她只需要看到PDF丟進(jìn)去圖片自己就出來(lái)了?!薄安贿^(guò)有一個(gè)坑?!倍谕蝗徊逶?huà)“有些PDF里嵌了多種分辨率封面可能是600DPI高清正文是150DPI。統(tǒng)一按300渲染封面會(huì)超大正文會(huì)糊。所以我們?cè)诓鹬凹恿艘徊较茸x取每一頁(yè)的原始分辨率如果低于200就提個(gè)醒高于600就適當(dāng)壓縮?!贝笈掷蠋燑c(diǎn)頭“細(xì)節(jié)都是細(xì)節(jié)。這些細(xì)節(jié)加起來(lái)決定了王大姐用起來(lái)順不順?!比?、第二車(chē)間圖像預(yù)處理——給古籍“洗臉”和“正骨”拆出來(lái)的圖片可不是直接就能喂給OCR的。大胖老師打開(kāi)一張剛從PDF里拆出來(lái)的掃描件頁(yè)面發(fā)黃邊緣有污漬中間透背的墨跡像鬼影一樣靠近裝訂線的部分還微微彎曲。“古籍掃描件十個(gè)有九個(gè)‘灰頭土臉’。直接送OCR等于讓近視眼不戴眼鏡去認(rèn)路牌。所以第二車(chē)間專(zhuān)干兩件事洗臉和正骨?!毕茨槨赃m應(yīng)二值化“所謂洗臉就是把文字和背景徹底分開(kāi)?!贝笈掷蠋熤钢鴪D片“紙是黃的墨是黑的但受潮的地方紙色變深淡墨的地方字又偏灰。如果用全局閾值一刀切——‘比某個(gè)灰度深的就算字淺的就算紙’——那受潮的紙會(huì)被當(dāng)成字淡墨的字會(huì)被當(dāng)成紙結(jié)果一臉麻子?!倍诮舆^(guò)話(huà)“所以我們用的是自適應(yīng)二值化。OpenCV里的adaptiveThreshold原理是把圖像分成一個(gè)個(gè)小格子每個(gè)格子單獨(dú)計(jì)算閾值。深色紙區(qū)域的閾值會(huì)自動(dòng)調(diào)高淡墨區(qū)域的閾值會(huì)自動(dòng)調(diào)低。不論光照多不均文字都能被干凈地‘摳’出來(lái)。”“參數(shù)我們調(diào)試了很久。”大胖老師補(bǔ)充“blockSize11C2這對(duì)古籍來(lái)說(shuō)是最優(yōu)解——既能保留筆畫(huà)細(xì)節(jié)又不會(huì)把紙張紋理誤認(rèn)為字。而且這個(gè)操作是全自動(dòng)的系統(tǒng)會(huì)根據(jù)圖像直方圖分布自動(dòng)判斷二值化強(qiáng)度。王大姐不需要知道什么是閾值她只需要看到洗完臉的古籍字是字紙是紙黑白分明?!毙〔怂贫嵌熬拖窠o每個(gè)區(qū)域單獨(dú)調(diào)對(duì)比度”“就是這個(gè)意思。”正骨——展平與糾偏“再來(lái)看正骨。”大胖老師換了一張書(shū)頁(yè)彎曲的圖片“這是普通平板掃描儀掃的書(shū)脊沒(méi)壓平文字往中間凹。這種變形不糾正OCR會(huì)把一行字切成兩截。”“我們的展平算法用數(shù)學(xué)方法模擬書(shū)頁(yè)的彎曲曲面然后把它‘?dāng)偲健?。具體是用二次曲線擬合——先檢測(cè)每一行文字的基線根據(jù)基線的彎曲程度反推書(shū)頁(yè)形變參數(shù)再對(duì)圖像做透視變換把彎的拽直?!倍谘a(bǔ)充“后來(lái)我們又加了手機(jī)拍照的梯形校正。很多縣館沒(méi)有專(zhuān)業(yè)掃描儀館員就用手機(jī)拍。手機(jī)拍的書(shū)頁(yè)經(jīng)常是梯形的近大遠(yuǎn)小。我們用OpenCV的getPerspectiveTransform自動(dòng)檢測(cè)頁(yè)面四個(gè)角拉伸成標(biāo)準(zhǔn)矩形。”“所以”大胖老師總結(jié)“無(wú)論掃描儀掃的還是手機(jī)拍的進(jìn)了這個(gè)車(chē)間出去的時(shí)候都是平平整整、規(guī)規(guī)矩矩的標(biāo)準(zhǔn)照。這步做好了后面版面分析和OCR才有發(fā)揮的余地。”四、第三車(chē)間版面分析——PPStructure的“讀心術(shù)”圖片洗白正骨之后就來(lái)到了整個(gè)系統(tǒng)最核心、也最復(fù)雜的車(chē)間。大胖老師調(diào)出一張標(biāo)注過(guò)的古籍頁(yè)面上面用不同顏色的框標(biāo)記著正文、夾注、眉批、頁(yè)碼?!肮偶陌婷嬗盟膫€(gè)字形容就是亂中有序。人看一眼就知道哪兒是正文、哪兒是注、從哪兒開(kāi)始讀。但對(duì)電腦來(lái)說(shuō)這全是像素沒(méi)有任何意義。版面分析的任務(wù)就是給像素賦予‘意義’——聚合成文字塊判斷每個(gè)塊的類(lèi)型和閱讀順序?!薄斑@活兒我們交給了PPStructure?!贝笈掷蠋熍牧伺淖雷印昂芏嗳艘詾镻PStructure就是一個(gè)模型丟進(jìn)去圖片吐出來(lái)結(jié)果。大錯(cuò)特錯(cuò)。它是一個(gè)流水線里面整合了至少四個(gè)獨(dú)立的深度學(xué)習(xí)模型外加一堆后處理邏輯?!彼诎装迳袭?huà)了四個(gè)小圈套在“版面分析”的大圈里布局檢測(cè) → 方向分類(lèi) → 文本檢測(cè) → 文本識(shí)別OCR“第一個(gè)模型布局檢測(cè)?;赗esNet骨干網(wǎng)絡(luò)上面接特征金字塔和檢測(cè)頭。任務(wù)是在全圖范圍內(nèi)快速定位所有‘有意義’的區(qū)域——文字塊、表格、圖片、印章——用矩形框標(biāo)出來(lái)。這一步只看大局不管細(xì)節(jié)?!薄暗诙€(gè)模型方向分類(lèi)器。針對(duì)每一個(gè)檢測(cè)到的文字塊判斷方向是0度、90度、180度還是270度。古籍里絕大多數(shù)正文是豎排屬于90度旋轉(zhuǎn)。這個(gè)分類(lèi)器一判豎排塊就被自動(dòng)旋轉(zhuǎn)到0度變成橫排再送進(jìn)后面的OCR。這就是文淵慧典能處理豎排的核心秘密——不是OCR模型本身能認(rèn)豎排而是版面分析幫它把豎排‘?dāng)[正’了?!毙〔嘶腥淮笪颉芭端設(shè)CR模型其實(shí)一直在認(rèn)橫排文字”“對(duì)。”二黑接過(guò)話(huà)“這是一種經(jīng)典的分而治之策略。OCR模型專(zhuān)注于‘認(rèn)字’方向的事情由上游解決。而且方向分類(lèi)器還有一個(gè)隱藏功能——過(guò)濾誤檢。有些墨漬或紙張紋理被誤檢為文字塊送進(jìn)方向分類(lèi)器因?yàn)檎也坏矫鞔_的文字方向置信度會(huì)很低。我們?cè)诤筇幚砝镌O(shè)了閾值置信度低于0.6的塊直接丟棄。這就把大量‘假陽(yáng)性’攔截在了OCR之前?!贝笈掷蠋熇^續(xù)“第三個(gè)模型文本檢測(cè)。在每個(gè)文字塊內(nèi)部精細(xì)定位每一行文字的精確邊界——不是用矩形框而是用緊貼文字輪廓的多邊形。PPStructure用的是DB可微分二值化算法速度快、精度高對(duì)彎曲文本和多方向文本都友好?!薄暗谒膫€(gè)才是OCR識(shí)別也就是我們下一車(chē)間的主角。你看一篇古籍頁(yè)面進(jìn)來(lái)先被布局檢測(cè)掃描一遍分出幾大塊每塊單獨(dú)旋轉(zhuǎn)擺正然后每塊內(nèi)部再做精細(xì)的文本行檢測(cè)最后一行一行送給OCR。這流程像不像醫(yī)院體檢先分診再各科室檢查最后出報(bào)告?!薄澳俏抑暗睦斫馔耆e(cuò)了。”小菜撓頭“我以為就是‘唰’一下全出來(lái)了?!倍谕屏送蒲坨R“要真那么簡(jiǎn)單咱們還費(fèi)勁巴拉地踩三年坑”針對(duì)古籍的“特訓(xùn)”“不過(guò)”二黑翻開(kāi)一頁(yè)數(shù)據(jù)報(bào)告“通用PPStructure直接上古籍效果并不好。因?yàn)樗挠?xùn)練數(shù)據(jù)主要是現(xiàn)代文檔——橫排、單欄、無(wú)邊框。古籍是豎排、多欄、欄線斷斷續(xù)續(xù)、還混雜印章和墨漬。所以我們的第一步就是用古籍標(biāo)注數(shù)據(jù)對(duì)布局檢測(cè)模型進(jìn)行微調(diào)?!薄拔覀儚娜珖?guó)十幾家圖書(shū)館收集了大約五千頁(yè)不同時(shí)期、不同版式的古籍掃描件組織了二十多個(gè)研究生——包括小菜——手工標(biāo)注了每一頁(yè)的布局。正文、注文、眉批、標(biāo)題、印章、頁(yè)碼一個(gè)框一個(gè)框地標(biāo)。這批數(shù)據(jù)后來(lái)成了文淵慧典最寶貴的資產(chǎn)我們內(nèi)部管它叫‘古籍版面金標(biāo)數(shù)據(jù)集’。”小菜下意識(shí)揉了揉手腕“那個(gè)暑假我標(biāo)注了一千多頁(yè)貼了三盒膏藥。”大胖老師拍拍他“膏藥沒(méi)白貼。這批數(shù)據(jù)喂進(jìn)去微調(diào)后布局檢測(cè)模型對(duì)古籍的適應(yīng)能力大幅提升。正文和夾注的區(qū)分準(zhǔn)確率從不到70%提升到了90%以上。印章檢測(cè)也穩(wěn)定了。最關(guān)鍵的是模型學(xué)會(huì)了忽略欄線的干擾——不再把細(xì)細(xì)的欄線誤認(rèn)為文字行?!薄皺诰€干擾是古籍特有的坑?!倍谘a(bǔ)充“現(xiàn)代文檔沒(méi)有欄線通用模型沒(méi)見(jiàn)過(guò)。古籍欄線經(jīng)常斷斷續(xù)續(xù)、粗細(xì)不均檢測(cè)模型很容易把它當(dāng)成細(xì)長(zhǎng)文字塊。我們的解決辦法是在標(biāo)注數(shù)據(jù)里特意把欄線標(biāo)為‘忽略區(qū)域’訓(xùn)練時(shí)告訴模型‘這不是文字別管它’。另外在后處理中加了一層形態(tài)學(xué)濾波用OpenCV提取長(zhǎng)直線特征凡是形狀接近直線且像素密度均勻的都從文字候選區(qū)里剔除。雙管齊下欄線誤檢基本解決?!蔽?、閱讀順序重建讓文字“排隊(duì)歸位”所有文字行都檢測(cè)出來(lái)、識(shí)別出來(lái)之后還處在無(wú)序狀態(tài)——東一行西一行像一群散落在操場(chǎng)上的學(xué)生。大胖老師管這一步叫“整隊(duì)”?!伴喿x順序重建是古籍OCR特有的剛需?,F(xiàn)代文檔從上到下、從左到右默認(rèn)規(guī)則就能搞定。古籍呢從右到左從上到下遇到夾注跳進(jìn)去讀讀完跳出來(lái)繼續(xù)正文。這個(gè)順序不是簡(jiǎn)單坐標(biāo)排序能解決的?!倍谡酒饋?lái)在白板上畫(huà)示意圖“我們?cè)O(shè)計(jì)了一個(gè)兩階段排序算法。第一階段按列分組。算法掃描全頁(yè)的文字行坐標(biāo)根據(jù)右上角的橫坐標(biāo)和縱坐標(biāo)把豎直方向上對(duì)齊的行歸到一組。判斷標(biāo)準(zhǔn)是兩行橫坐標(biāo)中心線距離小于閾值且縱坐標(biāo)有較大重疊區(qū)間。分組之后列與列之間按橫坐標(biāo)從右到左排序。這就定下了‘從右到左’的大框架?!薄暗诙A段列內(nèi)排序。同一列里的行先按縱坐標(biāo)從上到下排。但如果檢測(cè)到夾注塊——寬度明顯小于正文的窄行——就把它們插到正確的位置。算法判斷夾注的上邊緣和哪一行正文對(duì)齊就把它插到那行正文的后面。這樣讀的時(shí)候先讀正文緊接著讀夾注讀完再跳回下一行正文。”小菜試著復(fù)述“第一步‘分列排隊(duì)’第二步‘列內(nèi)插隊(duì)’”大胖老師哈哈一笑“用語(yǔ)不太學(xué)術(shù)但理解到位。這個(gè)算法完全是基于坐標(biāo)的規(guī)則引擎不需要額外模型跑起來(lái)飛快。對(duì)常見(jiàn)的單欄、雙欄、夾注版式準(zhǔn)確率超過(guò)95%。但對(duì)一些特別復(fù)雜的版式——比如三欄加眉批加側(cè)批——還在持續(xù)優(yōu)化中?!绷?、第四車(chē)間OCR識(shí)別——PaddleOCR的“火眼金睛”版面分析把文字切成一行行橫排的、干凈的圖像現(xiàn)在這些圖像被送進(jìn)核心引擎?!暗鬃荘addleOCR的繁體中文識(shí)別模型?!贝笈掷蠋煷蜷_(kāi)模型結(jié)構(gòu)圖“用的是SVTR網(wǎng)絡(luò)——一種基于Transformer的輕量級(jí)架構(gòu)。它先把圖像切成小方塊通過(guò)多層Transformer編碼器提取全局特征最后用線性分類(lèi)器輸出每個(gè)位置的漢字?!薄跋啾葌鹘y(tǒng)CRNNSVTR有兩個(gè)優(yōu)勢(shì)?!倍谌鐢?shù)家珍“一是并行計(jì)算速度快二是全局感受野對(duì)形近字和上下文把握更好。遇到‘己’和‘已’它會(huì)利用前后文判斷‘自己’還是‘已經(jīng)’概率分布完全不同。”“針對(duì)古籍我們做了三個(gè)定制優(yōu)化?!贝笈掷蠋熽种浮暗谝蛔謳?kù)擴(kuò)展。默認(rèn)繁體模型覆蓋約2.5萬(wàn)字但古籍有Unicode擴(kuò)展區(qū)的生僻字。我們補(bǔ)充了這些字把字庫(kù)擴(kuò)展到3.5萬(wàn)基本覆蓋康熙字典常用部分?!薄暗诙苤M字處理。”二黑接過(guò)話(huà)“康熙缺筆‘玄’乾隆缺筆‘弘’這些半殘字符正常模型很難識(shí)別。我們用了數(shù)據(jù)增強(qiáng)——訓(xùn)練時(shí)隨機(jī)擦除筆畫(huà)模擬缺筆強(qiáng)迫模型根據(jù)殘余筆畫(huà)和上下文推斷原字。同時(shí)后處理加載避諱字映射表自動(dòng)補(bǔ)全。”“第三豎排數(shù)據(jù)微調(diào)。雖然版面分析把豎排旋轉(zhuǎn)成橫排了但豎排文本的字符間距、行間距跟橫排還是有微妙差異。我們用幾萬(wàn)張豎排古籍的真實(shí)標(biāo)注數(shù)據(jù)對(duì)模型又做了一輪微調(diào)讓它更適應(yīng)‘旋轉(zhuǎn)后的橫排’的字符分布?!逼?、第五車(chē)間預(yù)覽后處理與輸出識(shí)別出來(lái)的原始文本還要經(jīng)過(guò)精細(xì)加工。大胖老師快速預(yù)覽了第五車(chē)間的功能?!暗谝坏拦ば蛑眯哦葮?biāo)注與校對(duì)輔助。OCR對(duì)每個(gè)字都有置信度打分低于0.85的字標(biāo)記為黃色高亮。校對(duì)人員只需重點(diǎn)看黃字效率提升數(shù)倍。全自動(dòng)場(chǎng)景下低置信度字用語(yǔ)言模型做替換預(yù)測(cè)——比如‘已所不欲’自動(dòng)糾正為‘己所不欲’。”“第二道閱讀順序重建。前面已述跨頁(yè)段落還會(huì)根據(jù)上下文自動(dòng)合并?!薄暗谌离p層PDF生成。底層是原始圖片上面疊加透明文字層文字坐標(biāo)由版面分析提供。生成用的是PyMuPDF——插入透明文本框字體白色、字號(hào)極小既不影響閱讀又能被搜索和復(fù)制?!薄皩?dǎo)出格式有三種純文本TXT適合引用帶格式Word適合編輯雙層PDF適合閱讀和存檔。以后還會(huì)增加ALTO XML導(dǎo)出方便對(duì)接圖書(shū)館元數(shù)據(jù)系統(tǒng)?!卑?、整條流水線跑起來(lái)從PDF到雙層PDF的9分鐘大胖老師決定當(dāng)場(chǎng)演示一次完整流程。小菜從文件夾里隨機(jī)挑了一本掃描版PDF——光緒刻本《讀史方輿紀(jì)要》80頁(yè)。拖進(jìn)系統(tǒng)點(diǎn)擊“開(kāi)始識(shí)別”。屏幕上的日志開(kāi)始滾動(dòng)“PDF解析中… 80頁(yè)已拆分?!薄皥D像預(yù)處理… 自適應(yīng)二值化完成?!薄鞍婷娣治鲋小?檢測(cè)到文字塊1420個(gè)其中豎排塊占比96%夾注塊103個(gè)?!薄癘CR識(shí)別中… 當(dāng)前進(jìn)度45/80平均每頁(yè)7秒?!薄昂筇幚怼?生成雙層PDF?!币还不思s9分鐘。輸出的雙層PDF在屏幕上打開(kāi)小菜試著搜索“荊州”二字瞬間跳轉(zhuǎn)到第12頁(yè)對(duì)應(yīng)的文字被高亮。他驚呼“真的能搜而且位置好準(zhǔn)”二黑湊過(guò)去看了一下置信度“95.3%不錯(cuò)。不過(guò)這里有個(gè)異體字‘峽’的異體映射表還得再補(bǔ)一條。”大胖老師點(diǎn)頭“記錄一下下一個(gè)版本加進(jìn)去?!本拧槭裁催@套架構(gòu)對(duì)古籍這么“友好”二黑的深度總結(jié)二黑站起來(lái)在白板上寫(xiě)了一條公式古籍OCR 通用OCR 版面理解 領(lǐng)域知識(shí)“通用OCR能認(rèn)字但不懂版面版面分析能分塊但不理解古文排版規(guī)則領(lǐng)域知識(shí)藏在后處理的規(guī)則和微調(diào)數(shù)據(jù)里。文淵慧典的架構(gòu)就是把這三樣?xùn)|西焊在一起了。這不是在造更厲害的識(shí)別模型而是在造一整套‘理解古籍’的智能系統(tǒng)。”大胖老師滿(mǎn)意地補(bǔ)充“而且整套系統(tǒng)跑在CPU上不需要GPU。PyMuPDF是C寫(xiě)的跑得飛快OpenCV是C底層圖像處理秒級(jí)PaddleOCR的CPU推理用MKLDNN加速一頁(yè)7秒。一條離線流水線全天無(wú)休只耗電。這就是我們?yōu)槭裁锤艺f(shuō)王大姐的十年前老電腦也能用?!毙〔俗詈罂偨Y(jié)“所以整個(gè)架構(gòu)就像一家自動(dòng)化工廠。PyMuPDF是卸貨區(qū)OpenCV是清洗整形車(chē)間PPStructure是分揀質(zhì)檢PaddleOCR是精細(xì)加工后處理是包裝出品。大胖老師和二黑是總設(shè)計(jì)師兼維修工?!贝笈掷蠋煿笮Α澳峭醮蠼闶鞘裁础薄皬S長(zhǎng)?!毙〔苏f(shuō)“她只要按下開(kāi)關(guān)整條線就轟隆隆地轉(zhuǎn)起來(lái)。”窗外學(xué)校圖書(shū)館的燈次第亮起。在某個(gè)角落里王大姐正把新掃的一批古籍拖進(jìn)文淵慧典的界面。進(jìn)度條在走她的茶還沒(méi)涼。下期預(yù)告小菜合上筆記本意猶未盡“老師版面分析那塊你講了四個(gè)模型但每個(gè)模型怎么針對(duì)古籍做優(yōu)化的細(xì)節(jié)還沒(méi)完全展開(kāi)呢。還有閱讀順序重建那個(gè)‘分列排隊(duì)、列內(nèi)插隊(duì)’算法我也想聽(tīng)更細(xì)的?!倍谝蔡痤^“尤其是PPStructure在古籍面前踩過(guò)的坑。比如明萬(wàn)歷刻本那種幾乎看不見(jiàn)的‘隱形欄線’乾隆朱墨套印本的紅黑雙色分離還有手抄本的字跡粘連——這些實(shí)戰(zhàn)案例足夠單開(kāi)一講了?!贝笈掷蠋熍陌濉澳蔷拖缕趯?zhuān)門(mén)講版面分析的繡花功夫。主題就叫——”《PPStructure的繡花功夫布局檢測(cè)、方向分類(lèi)、文本檢測(cè)、閱讀順序重建——文淵慧典版面分析深度拆解》“小菜把你那個(gè)‘隱形欄線’的樣本準(zhǔn)備好。二黑把你上次寫(xiě)的欄線濾波代碼整理一下。下期咱們把版面分析這個(gè)車(chē)間扒到螺絲釘級(jí)別?!毙〔嗽诠P記本上重重記下。窗外夜色已深實(shí)驗(yàn)室白板上畫(huà)滿(mǎn)了流程圖和公式大胖老師的保溫杯第三次續(xù)了水而二黑已經(jīng)打開(kāi)IDE開(kāi)始修改昨天發(fā)現(xiàn)的一個(gè)閱讀順序bug。本文為注水技術(shù)版您看看即可不必當(dāng)真寫(xiě)此文字就是圖一樂(lè)-