內容一覽:基於 PaddleOCR 進行集裝箱箱號檢測,縮短記錄集裝箱箱號的時間,提高港口裝卸效率。
關鍵詞:PaddleOCR 文字識別 線上教程
國際航運諮詢分析機構 Alphaliner 在今年 3 月公佈的一組資料,2021 年集裝箱吞吐量排名前 30 的榜單中,上海港以 4702.5 萬標箱的「成績單」雄踞鰲頭。

較上一年同期,上海港集裝箱吞吐量增長 8.1%
與最近的競爭對手新加坡拉開了近 1000 萬標準箱的差距
全球百大集裝箱港口,更是在 2021 年共完成集裝箱吞吐量 6.76 億 TEU。如此大規模的集裝箱數量,使得箱號識別的壓力驟增,傳統的由人對集裝箱號進行識別記錄的方式成本高、效率低,運營條件落後。
隨著經濟和社會的發展,在港口經營中引入人工智慧,已經成為傳統港口在市場競爭中蛻變升維的關鍵。
本文將從環境準備到模型訓練,演示如何藉助 PaddleOCR,進行集裝箱箱號檢測識別。
直接查看程式碼教程:
https://openbayes.com/console/open-tutorials/containers/XJsxhLTnKNu
用少量資料實現箱號檢測識別任務
集裝箱號是指裝運出口貨物集裝箱的箱號,填寫託運單時必填此項。標準箱號的構成採用ISO6346 (1995) 標準,由 11 位編碼組成,以箱號 CBHU 123456 7 為例,它包括 3 個部分:
第一部分由 4 個英文字母組成,前 3 個字母表示箱主、經營人,第 4 個字母表示集裝箱類型。CBHU 表示箱主和經營人為中遠集運的標準集裝箱。
第二部分由 6 位數字組成,表示箱體註冊碼,是集裝箱箱體持有的唯一標識。
第三部分為校驗碼,由前面 4 個字母和 6 位數字經過校驗規則運算得到,用於識別在校驗時是否發生錯誤。

堆積在港口等待運輸的集裝箱
本教程基於PaddleOCR進行集裝箱箱號檢測識別任務,使用少量資料分別訓練檢測、識別模型,最後將他們串聯在一起實現集裝箱箱號檢測識別的任務
環境準備
1.在 OpenBayes 控制檯啟動一個「模型訓練」的容器,環境選擇 PaddlePaddle 2.3,資源選擇 RTX 3090 或其他 GPU 類型。
暫無平臺賬號的,請訪問以下地址先行註冊:
https://openbayes.com/console/signup
2.在 Jupyter 中打開一個 Terminal 窗口,然後執行如下命令:
cd PaddleOCR-release-2.5 #進入PaddleOCR-release-2.5檔案夾
pip install -r requirements.txt #安裝PaddleOCR所需依賴
python setup.py install #安裝PaddleOCR
資料集介紹
本教程使用集裝箱箱號資料集 (ContainerNumber-OCR Dataset),該資料包含 3003 張解析度為 1920×1080 的集裝箱圖像。
查看資料集詳細資訊,請訪問:
https://openbayes.com/console/open-tutorials/datasets/BzuGVEOJv2T/3
1.PaddleOCR檢測模型訓練標註規則如下,中間用 “\t” 分隔:
" 圖像檔案名 json.dumps編碼的圖像標註資訊"
ch4_test_images/img_61.jpg [{"transcription": "MASA", "points": [[310, 104], [416, 141], [418, 216], [312, 179]]}, {...}]
其中 json.dumps 編碼前的圖像標註資訊是包含多個字典的 list ,字典中的 points 表示文字框 4 個點的座標 (x, y),從左上角的點開始順時針排列。
transcription 表示當前文字框的文字,當其內容為「###」時,表示該文字框無效,在訓練時會跳過。
2.PaddleOCR 識別模型訓練標註規則如下,中間用 “\t” 分隔:
" 圖像檔案名 圖像標註資訊 "
train_data/rec/train/word_001.jpg 簡單可依賴
train_data/rec/train/word_002.jpg 用科技讓複雜的世界更簡單
資料整理
3.1 檢測模型所需資料準備
將資料集 3000 張圖片按 2:1 劃分成訓練集和驗證集,運行以下程式碼:
from tqdm import tqdm
finename = "all_label.txt"
f = open(finename)
lines = f.readlines()
t = open('det_train_label.txt','w')
v = open('det_eval_label.txt','w')
count = 0
for line in tqdm(lines):
if count < 2000:
t.writelines(line)
count += 1
else:
v.writelines(line)
f.close()
t.close()
v.close()
3.2 識別模型所需資料準備
根據檢測部分的註釋,裁剪資料集儘可能只包含文字部分圖片作為識別的資料,運行以下程式碼:

完整程式碼詳見:
https://openbayes.com/console/open-tutorials/containers/XJsxhLTnKNu
實驗
由於資料比較少,為了模型更好和更快的收斂,這裡選用 PaddleOCR 中的 PP-OCRv3 模型進行檢測和識別。
PP-OCRv3 在 PP-OCRv2 的基礎上,中文場景端到端 Hmean 指標相比於 PP-OCRv2 提升 5% , 英文數字模型端到端效果提升 11% 。
詳細最佳化細節請參考 PP-OCRv3 技術報告。
4.1 檢測模型
4.1.1 檢測模型配置
PaddleOCR 提供了許多檢測模型,在路徑PaddleOCR-release-2.5/configs/det下可找到模型及其配置檔案。如我們選用模型ch_PP-OCRv3_det_student.yml,配置檔案路徑為:
PaddleOCR-release-2.5/configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_student.yml
使用前需對其進行必要的設置,如訓練參數、資料集路徑等。將部分關鍵配置展示如下:
#關鍵訓練參數
use_gpu: true #是否使用顯示卡
epoch_num: 1200 #訓練epoch個數
save_model_dir: ./output/ch_PP-OCR_V3_det/ #模型保存路徑
save_epoch_step: 200 #每訓練200epoch,保存一次模型
eval_batch_step: [0, 100] #訓練每迭代100次,進行一次驗證
pretrained_model: ./PaddleOCR-release
2.5/pretrain_models/ch_PP-OCR_V3_det/best_accuracy.pdparams #預訓練模型路徑
#訓練集路徑設置
Train:
dataset:
name: SimpleDataSet
data_dir: /input0/images #圖片檔案夾路徑
label_file_list:
- ./det_train_label.txt #標籤路徑
4.1.2 模型微調
在 notebook 中運行如下命令對模型進行微調,其中 -c 傳入的為配置好的模型檔案路徑:
%run PaddleOCR-release-2.5/tools/train.py \
-c PaddleOCR-release-2.5/configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_student.yml
使用默認超參數,模型ch_PP-OCRv3_det_student在訓練集上訓練 385 個 epoch 後,模型在驗證集上的 hmean 達到:96.96% ,此後再無明顯增長:
[2022/10/11 06:36:09] ppocr INFO: best metric, hmean: 0.969551282051282, precision: 0.9577836411609498,
recall: 0.981611681990265, fps: 20.347745459258228, best_epoch: 385
4.2 識別模型
4.2.1 識別模型配置
PaddleOCR 提供了許多識別模型。在路徑PaddleOCR-release-2.5/configs/rec下可找到模型及其配置檔案。
如我們選用模型ch_PP-OCRv3_rec_distillation,其配置檔案路徑在:
PaddleOCR-release-2.5/configs/rec/PP-OCRv3/ch_PP-OCRv3_rec_distillation.yml
使用前需對其進行必要的設置,如訓練參數、資料集路徑等。將部分關鍵配置展示如下:
#關鍵訓練參數
use_gpu: true #是否使用顯示卡
epoch_num: 1200 #訓練epoch個數
save_model_dir: ./output/rec_ppocr_v3_distillation #模型保存路徑
save_epoch_step: 200 #每訓練200epoch,保存一次模型
eval_batch_step: [0, 100] #訓練每迭代100次,進行一次驗證
pretrained_model: ./PaddleOCR-release-2.5/pretrain_models/PPOCRv3/best_accuracy.pdparams #預訓練模型路徑
#訓練集路徑設置
Train:
dataset:
name: SimpleDataSet
data_dir: ./RecTrainData/ #圖片檔案夾路徑
label_file_list:
- ./rec_train_label.txt #標籤路徑
4.2.2 模型微調
在 notebook 中運行如下命令對模型進行微調,其中 -c 傳入的為配置好的模型檔案路徑:
%run PaddleOCR-release-2.5/tools/train.py \
-c PaddleOCR-release-2.5/configs/rec/PP-OCRv3/ch_PP-OCRv3_rec_distillation.yml
使用默認超參數,模型ch_PP-OCRv3_rec_distillation在訓練集上訓練 136 個 epoch 後,模型在驗證集上的精度達到:96.11% ,此後再無明顯增長:
[2022/10/11 20:04:28] ppocr INFO: best metric, acc: 0.9610600272522444, norm_edit_dis: 0.9927426548965615,
Teacher_acc: 0.9540291998159589, Teacher_norm_edit_dis: 0.9905629345025616, fps: 246.029195787707, best_epoch: 136
結果展示
5.1 檢測模型推理
在 notebook 中運行如下命令使用微調過的模型檢測測試圖片中的文字,其中:
*Global.infer_img為圖片路徑或圖片檔案夾路徑
*Global.pretrained_model為微調過的模型
*Global.save_res_path為推理結果保存路徑
%run PaddleOCR-release-2.5/tools/infer_det.py \
-c PaddleOCR-release-2.5/configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_student.yml \
-o Global.infer_img="/input0/images" Global.pretrained_model="./output/ch_PP-OCR_V3_det/best_accuracy" Global.save_res_path="./output/det_infer_res/predicts.txt"
5.2 識別模型推理
在 notebook 中運行如下命令使用微調過的模型檢測測試圖片中的文字,其中:
*Global.infer_img為圖片路徑或圖片檔案夾路徑
*Global.pretrained_model為微調過的模型
*Global.save_res_path為推理結果保存路徑
%run PaddleOCR-release-2.5/tools/infer_rec.py \
-c PaddleOCR-release-2.5/configs/rec/PP-OCRv3/ch_PP-OCRv3_rec_distillation.yml \
-o Global.infer_img="./RecEvalData/" Global.pretrained_model="./output/rec_ppocr_v3_distillation/best_accuracy" Global.save_res_path="./output/rec_infer_res/predicts.txt"
5.3 檢測識別模型串聯推理
5.3.1 模型轉換
在串聯推理前首先需要將訓練保存的模型轉換成推理模型,分別執行如下檢測命令即可。其中:
*-c傳入要轉換模型的配置檔案路徑
*-o Global.pretrained_model為要被轉換的模型檔案
*Global.save_inference_dir為轉換得到推理模型的儲存路徑

5.3.2 模型串聯推理
轉換完畢後,PaddleOCR 提供了檢測和識別模型的串聯工具,可以將訓練好的任一檢測模型和任一識別模型串聯成兩階段的文字識別系統。
輸入圖像經過文字檢測、檢測框矯正、文字識別、得分過濾四個主要階段輸出文字位置和識別結果。
執行程式碼如下,其中:
*image_dir為單張圖像或者圖像集合的路徑
*det_model_dir為檢測 inference 模型的路徑
*rec_model_dir為識別 inference 模型的路徑
視覺化識別結果默認保存到 ./inference_results 檔案夾裡面。
%run PaddleOCR-release-2.5/tools/infer/predict_system.py \
--image_dir="OCRTest" \
--det_model_dir="./output/det_inference/" \
--rec_model_dir="./output/rec_inference/Student/"

視覺化結果示例
左側為待識別集裝箱,右側為箱號識別結果
查看完整教程,請訪問:
https://openbayes.com/console/open-tutorials/containers/XJsxhLTnKNu
關於 PaddleOCR 和 OpenBayes
PaddleOCR 是一種基於百度飛槳的 OCR 工具庫,包含總模型僅 8.6M 的超輕量級中文 OCR,同時支持多種文字檢測、文字識別的訓練演算法、服務部署和端側部署。
更多詳情請訪問:
https://github.com/PaddlePaddle/PaddleOCR
了解 OpenBayes
OpenBayes 是國內領先的機器智慧研究機構,提供算力容器、自動建模、自動調參等多項 AI 開發相關的基礎服務。
同時 OpenBayes 還上線了資料集、教程、模型等眾多主流公開資源,供開發者快速學習並創建理想的機器學習模型。
現在訪問 openbayes.com 並註冊
即可享用
600 分鐘/周的 RTX 3090
以及 300 分鐘/周 的 CPU 免費計算時
注:每週贈送的資源將於每週一下午到賬
查看並運行完整教程,點選文末閱讀原文,或訪問以下連結:
https://openbayes.com/console/open-tutorials/containers/XJsxhLTnKNu