AI訓練過程
conda虛擬環(huán)境安裝以及數(shù)據(jù)標注軟件安裝

創(chuàng)建虛擬環(huán)境
conda create -n 名稱 python==3.8.5
激活環(huán)境
conda activate 名稱
列出所有環(huán)境
conda info --envs 或 conda env list
退出虛擬環(huán)境
conda deactivate
刪除環(huán)境
conda env remove --name 名稱
下載資源包
pip install 名稱
如果慢的情況下,可用鏡像源
pip install package_name -i https://mirrors.aliyun.com/pypi
這些常用的國內的鏡像包括:
阿里云:https://mirrors.aliyun.com/pypi
清華大學:https://pypi.tuna.tsinghua.edu.cn/simple
中國科技大學:https://pypi.mirrors.ustc.edu.cn/simple/
豆瓣(Douban):https://pypi.douban.com/simple/
https://pypi.doubanio.com/simple
店鋪牌匾識別系統(tǒng)需求文檔
一、概述(作為了解的)
項目背景:隨著店鋪數(shù)量的不斷增加,人工審核牌匹信息的工作量是巨大的而且容易出錯。
為了提高效率和準確性,引入人工智能技術進行自動識別和分類。
目標:開發(fā)一個基于人工智能的牌匾識別系統(tǒng),能夠自動識別和分類不同店鋪的牌圖片,提取關鍵信息(如:店鋪名稱提取、電話、營業(yè)時間、商場招牌名稱、自適應判斷、名稱判斷相關性判斷)。
二、項目目標
主要目標:
1.自動識別牌匾上的文字。
2.提取并存儲關鍵信息(如:店鋪名稱提取、電話、營業(yè)時間、商場招牌名稱、自適應判斷、名稱判斷相關性判斷)。
3.生成結構化數(shù)據(jù),便于后續(xù)處理和分析。
次要目標:
1.提供友好的用戶界面,方便操作。
2.支持多語言的識別。
3.提供錯誤糾正和反饋機制。
三、功能需求
核心功能:
圖片上傳:支持用戶上傳牌匾圖片。
自動識別:自動識別圖片中的文字,并提取關鍵信息。
信息展示:在界面上展示識別出的信息,供用戶確認和修正,信息存儲:將識別出的信息存儲到數(shù)據(jù)庫中。
錯誤反饋:提供錯誤反饋機制,用戶可以手動糾正識別錯誤。
擴展功能:
批量處理:支持批量上傳和處理圖片。
多語言支持:支持多種語言的識別和處理。
歷史記錄:記錄每次識別的操作日志,便于追蹤和審計。
四、數(shù)據(jù)需求
數(shù)據(jù)來源:
從公開數(shù)據(jù)集中獲取樣本數(shù)據(jù)(可花錢買)
從實際業(yè)務中收集牌匾圖片數(shù)據(jù)。
數(shù)據(jù)預處理:
清洗和標注數(shù)據(jù)
數(shù)據(jù)格式:
圖片格式:jpg、jpeg、png
標注格式:JSON、XML
五、驗收標準
功能驗收:
系統(tǒng)能夠正確識別并提取牌匾上的文字。
系統(tǒng)能夠處理多種語言的牌匾圖片。
系統(tǒng)能夠批量處理圖片。
系統(tǒng)能夠生成結構化數(shù)據(jù),并存儲在數(shù)據(jù)庫中。
性能驗收:
識別的準確率:95%以上。
處理速度:每分鐘處理100圖片以上。
用戶體驗:
界面優(yōu)化,操作簡單。
錯誤反饋機制完善,用戶可以手動糾正錯誤。
六、項目進度
階段規(guī)劃:
需求分析:1周
數(shù)據(jù)準備:2周
模型訓練:4周
系統(tǒng)開發(fā):8周
系統(tǒng)測試:2周
上線部署:1周
店鋪牌匾識別系統(tǒng)-標注規(guī)則
備注:判斷某一個東西的邏輯是:先排除
一、品牌詞判斷(判斷一個品牌詞是不是一個真正的品牌)
品牌詞判斷可根據(jù)招牌特征,是否 是連鎖,是否加入大眾點評。
第一步:首先,應該判斷給出的示例圖片中的門店名稱是否與品牌詞對應。不對應,則當前圖片為無效數(shù)據(jù),不可參考,查看其他示例圖片。
第二步:根據(jù)品牌詞、參數(shù)圖片,滿足以下幾點中的任意一個,判為“不是品牌”。
1.「無專名」是地方小吃類的詞,如雞蛋灌餅、老媽蹄花、牛肉板面、煎餅果子、一元一串等,這一類詞一定不是品牌;
2.「無專名」的菜品類、經(jīng)營范圍類的詞,如:早點攤、小酒館、麻辣龍蝦、蔬菜水果等,這一類詞一定不是品牌;
3.「無特色的專名」,如:“誠信”、“陽光”、“好吃”、“實惠”、“電白”等之類常見的形容詞作為專名,這一類詞一定不是品牌;
第三步:若不滿足第二步的任何條件,再根掘參考招牌圖片,滿足1-3個條件中的任意一個,判為“是品牌”
1.招牌圖片上有明確的R標和TM標識。
2.招牌有“xx店”標識的分店
3.給定的參考圖中,有兩張有效的參考圖中的招牌是一模一樣的,則可以直接認為是連鎖品牌
第四步:若給的參考圖多于一張,并且每一張品牌門店招牌圖的牌匾都不相同,則可以認為當前品牌為“非品牌詞”。
第五步:如果給定的有效招牌只有一張,則可以查詢大眾點評,大眾點評查詢后有超過一家的門店,發(fā)現(xiàn)查詢結果滿足下面1和2任意一種就屬于品牌。
1.名稱相同,而且首圖或者logo相同
2.名稱相同,而且門店招牌特征一致
第六步:如果大眾點評查詢后只有一家門店或查不到,則參考有無公眾號判斷是否是品牌。
二、品牌分類判斷(判斷品牌所屬類型)
判斷品牌屬于“父品牌”、“子品牌”、“獨立品牌”
1.百度檢索對應的品牌詞的專名,查詢是否有官,查詢不到對應官網(wǎng),可以直接認為是獨立品牌。
2.有官網(wǎng),根據(jù)官網(wǎng)中的集團介紹,品牌介紹等等入口,判斷當前品牌詞屬于父品牌還是子品力牌。
三、品牌詞名稱規(guī)范(根據(jù)招牌提取品牌詞主名稱)
1.根據(jù)POI招牌,規(guī)則提取品牌詞名稱(專名+通名),招牌無通名可以不提取通名,但必須有專名。
2.5個示例POI,至少2張門臉圖、招牌,設計一致,方可提取對應品牌詞名稱。
3.若5個示例都不一致,則無需提取,備注:無法規(guī)范。
四、電話
規(guī)則一:如果店鋪只有手機號,則只需填寫手機號。
規(guī)則二:如果一個店鋪有多個手機號或座機,必須將此店鋪的所有座機和手機號全部填寫。
前置的需求文檔+標注規(guī)則都結束后
數(shù)據(jù)標注
備注:不是ai訓練師要干的事情,但是要懂,因為后面要涉及到驗收(質檢)的操作。
數(shù)據(jù)標注分類:文本標注、圖像標注、語音標注數(shù)據(jù)標注工具:
圖像標注:labelimg、labelme
1.1 labelimg工具介紹

快速截圖快捷鍵:w
保存當前操作:s
VOC:xml
YoLo:txt
mL:json
1.2 有關于標注的目錄結構
外層文件夾:dianpu
內層:image:數(shù)據(jù)集
label:標注
數(shù)據(jù)源問題
問題點:當數(shù)據(jù)集中的某些“圖片“可能不符合要求(當添加到labelimg中,無效)【文件名稱或者后綴名】不符合要求,我們要統(tǒng)一文件名和后綴名該怎么辦?
利用代碼統(tǒng)一生成文件名和后綴格式
圖片轉換成jpg格式
若提示沒有CV2,那么就運行:
安裝cv2:pip install opencv-python
import os
import os.path as osp
import numpy as np
import cv2
def cv_imread_chinese(file_path):
cv_img = cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), cv2.IMREAD_COLOR)
return cv_img
def folder_rename(src_folder_path, target_folder_path):
os.makedirs(target_folder_path, exist_ok=True)
file_names = os.listdir(src_folder_path)
for i, name in enumerate(file_names):
try:
print("{}:{}".format(i, name))
src_name = osp.join(src_folder_path, name)
src_img = cv_imread_chinese(src_name)
target_path = osp.join(target_folder_path, "yolo_data_{}.jpg".format(i))
cv2.imwrite(target_path, src_img)
except Exception as e:
print(f"處理文件 {name} 時出錯: {e}")
if __name__ == '__main__':
folder_rename("demo/images/test", "newdemo/img")
?
xml格式轉成txt
? 若提示沒有CV2,那么就運行:
? 安裝cv2:pip install opencv-python
import xml.etree.ElementTree as ET
import os
def convert_xml_to_txt(xml_file, class_mapping):
# 解析 XML 文件
tree = ET.parse(xml_file)
root = tree.getroot()
# 獲取圖像的寬度和高度
size = root.find('size')
img_width = int(size.find('width').text)
img_height = int(size.find('height').text)
txt_lines = []
# 遍歷所有的對象
for obj in root.findall('object'):
# 獲取類別名稱
class_name = obj.find('name').text
if class_name not in class_mapping:
continue
class_id = class_mapping[class_name]
# 獲取邊界框坐標
bbox = obj.find('bndbox')
xmin = float(bbox.find('xmin').text)
ymin = float(bbox.find('ymin').text)
xmax = float(bbox.find('xmax').text)
ymax = float(bbox.find('ymax').text)
# 計算 YOLO 格式的坐標
x_center = ((xmin + xmax) / 2) / img_width
y_center = ((ymin + ymax) / 2) / img_height
width = (xmax - xmin) / img_width
height = (ymax - ymin) / img_height
# 添加到 TXT 文件的行中
txt_lines.append(f"{class_id} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}")
return txt_lines
def convert_folder(xml_folder, txt_folder, class_mapping):
# 創(chuàng)建 TXT 文件保存的文件夾
if not os.path.exists(txt_folder):
os.makedirs(txt_folder)
# 遍歷 XML 文件夾中的所有文件
for xml_file in os.listdir(xml_folder):
if xml_file.endswith('.xml'):
xml_path = os.path.join(xml_folder, xml_file)
# 生成對應的 TXT 文件路徑
txt_file = os.path.splitext(xml_file)[0] + '.txt'
txt_path = os.path.join(txt_folder, txt_file)
# 轉換 XML 文件
txt_lines = convert_xml_to_txt(xml_path, class_mapping)
# 寫入 TXT 文件
with open(txt_path, 'w') as f:
for line in txt_lines:
f.write(line + '\n')
if __name__ == "__main__":
# 定義類別映射,根據(jù)實際情況修改
class_mapping = {
"cat": 0,
"dog": 1
}
# 這里修改為實際存放 XML 文件的文件夾路徑
xml_folder = "newdemo/img"
# 這里修改為實際要存放轉換后 TXT 文件的文件夾路徑
txt_folder = "demo"
convert_folder(xml_folder, txt_folder, class_mapping)
驗收和質檢
可視化檢查--抽樣檢查
抽樣檢查==》單個驗收
# 單張可視化圖片查看
import cv2
import xml.etree.ElementTree as ET
def visualize_annotations(image_path, annotation_path):
image = cv2.imread(image_path)
tree = ET.parse(annotation_path)
root = tree.getroot()
for obj in root.findall('object'):
bbox = obj.find('bndbox')
xmin = int(bbox.find('xmin').text)
ymin = int(bbox.find('ymin').text)
xmax = int(bbox.find('xmax').text)
ymax = int(bbox.find('ymax').text)
label = obj.find('name').text
color = (0, 255, 0) # Green color for bounding box
thickness = 2
cv2.rectangle(image, (xmin, ymin), (xmax, ymax), color, thickness)
cv2.putText(image, label, (xmin, ymin - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, color, thickness)
cv2.imshow('Annotated Image', image)
cv2.waitKey(0)
cv2.destroyAllwindows()
if __name__ == '__main__':
visualize_annotations('./newdemo/yolo_data_1.jpg', './label/yolo_data_1.xml')
抽樣檢查==》全部驗收
# 全部可視化圖片查看
import cv2
import xml.etree.ElementTree as ET
import os
def visualize_all_annotations(image_dir, annotation_dir):
for filename in os.listdir(image_dir):
if filename.endswith('.jpg') or filename.endswith('.png'):
image_path =os.path.join(image_dir, filename)
annotation_filename=os.path.splitext(filename)[0]+'.xml'
annotation_path = os.path.join(annotation_dir, annotation_filename)
if os.path.exists(annotation_path):
visualize_annotations(image_path, annotation_path)
else:
print(f"No annotation found for {filename}")
def visualize_annotations(image_path,annotation_path):
image = cv2.imread(image_path)
tree = ET.parse(annotation_path)
root = tree.getroot()
for obj in root.findall('object'):
bbox = obj.find('bndbox')
xmin = int(bbox.find('xmin').text)
ymin = int(bbox.find('ymin').text)
xmax = int(bbox.find('xmax').text)
ymax = int(bbox.find('ymax').text)
label = obj.find('name').text
color = (0, 255, 0) # Green color for bounding box
thickness = 2
cv2.rectangle(image, (xmin, ymin), (xmax, ymax), color, thickness)
cv2.putText(image, label, (xmin, ymin - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, color, thickness)
cv2.imshow('Annotated Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == '__main__':
image_directory='./newdemo'
annotation_directory='./label'
visualize_all_annotations(image_directory,annotation_directory)
備注:可視化檢查和labelimg工具檢查的區(qū)別:
如果有覆蓋的情況:labelimg很難直觀看到,可視化工具會讓有更加直觀的標注標簽顯示,labelimg沒有
總結:可視化工具質檢銷量超過labelimg工具質檢。
目標檢測
連接服務器
基于算力服務器訓練模型
將訓練的項目導入服務器中
如將項目導入data目錄下
conda activate lisi
安裝過程
1.進入到data項目目錄下,創(chuàng)建虛擬環(huán)境
conda createn lisi(名稱) python==3.8.5
2.進入虛擬環(huán)境
conda activate lisi
3.安裝GPU
conda install pytorch==1.10.0 torchvision torchaudio cudatoolkit=11.3
4.安裝項目所需依賴
pip install -v -e
5.安裝更新:torch torchvision
pip install --upgrade torch torchvision
例子(目標檢測:yolov8)
搭建環(huán)境
一、創(chuàng)建虛擬環(huán)境
第一步:通過終端命令進入到【yolov8項目】中
第二步:創(chuàng)建標注工具環(huán)境
conda create -n demo8 python==3.8.5
第三步:進入環(huán)境
conda activate demo8
二、配置環(huán)境
流程一:配置環(huán)境
1.把【yolov8】項目拖到【pycharm】工具中在
【Pycharm】工具,右下角點擊




三、安裝依賴
以上配置完畢后,接著要安裝依賴:打開終端**
pip install -v -e .

下載完成后,彈窗可關閉

四、測試配置環(huán)境是否正常
驗證搭建的環(huán)境有沒有問題,在pycharm終端輸入以下命令
yolo task=detect mode=predict model=pretrained/yolov8l.pt source=ultralytics/assets device=CPU
備注:
task=detect:執(zhí)行目標檢測任務。
mode=predict:正確指定推理模式。(mode=train:訓練模式(模型訓練),mode=val:驗證模式(模型性能評估),mode=predict:推理模式(對新數(shù)據(jù)進行預測),mode=export:導出模式(將模型轉換為其他格式,如 ONNX、TensorRT,mode=test:測試模型)
model=pretrained/yolov8l.pt:使用預訓練的 YOLOv8 Large 模型。
source=ultralytics/assets:輸入數(shù)據(jù)路徑(官方示例資源)。
device=CPU:在 CPU 上運行推理

項目目錄結構說明
訓練模型默認參數(shù)
C:\Users\shuto\Desktop\yolov8\ultralytics\cfg\default.yaml
基礎模型
C:\Users\shuto\Desktop\yolov8\pretrained\xx.pt
訓練集的目錄
C:/Users/shuto/Desktop/yolov8/ultralytics/cfg/datasets
訓練的過程
模型預測
yolo task=detect mode=predict model=pretrained/yolov8l.pt source=ultralytics/assets device=CPU
模型訓練
yolo task=detect mode=train model=pretrained/yolov8l.pt data=ultralytics/cfg/datasets/A_my_data.yaml batch=32 epochs=100 imgsz=100 workers=0 device=CPU cache=True
模型驗證
yolo task=detect mode=val model=pretrained/yolov8l.pt data=ultralytics/cfg/datasets/A_my_data.yaml batch=32 device=CPU plots=True
模型測試
yolo task=detect mode=predict model=pretrained/yolov8l.pt source=ultralytics/images/test device=CPU
訓練結果
一、weights文件夾:模型權重文件

best.pt是整個訓練過程中,性能最好的模型權重文件。最終我們要的就是這個文件。我們可以拿它進行實際業(yè)務的AI預測或繼續(xù)微調。
last.pt是最后一次訓練的模型權重文件。一般來說,訓練越久效果也越好。但有時它也會和best.pt不一致。這意味著最后一次訓練的結果,并不是最好的。
二、results.png:訓練總圖要略
這張圖片包含訓練過程中的各種評估指標,比如損失函數(shù)、精度、召回率、mAP等的圖表繪制。這個圖表可以直觀地看到模型訓練過程中性能的變化情況。

loss系列:
train/box_loss和val/box_loss
train/cls_loss和val/cls_loss
train/dfl_loss和val/dfl_loss
這幾組前面的train表示訓練集,val是驗證集。訓練集是用于訓練學習的,相當于書本的例題。而驗證集則用于考試,相當于試卷的試題。學得好不一定就考得好,主要還得看考題是不是有關聯(lián)性。不過他們更重要的相同點,好像在于都有l(wèi)oss。
loss是算法中一個常見的概念。翻譯成“損失”這個詞,其實很形象。生活中,對于能量轉化,我們常常用到損失。我們說100單位的電能轉化為80單位的動能,能量損失了20%。如果實現(xiàn)了百分百轉化,那么損失就是0。
應用到算法中也一樣。在有監(jiān)督訓練中,我們是先標記再訓練。
對于訓練集和驗證集,AI本身是知道這個區(qū)域標的是什么,位置在哪兒。因此,它會先猜測結論,然后跟正確答案做對比。它的猜測行為稱為“推理”或者“預測”。它自己的推理結果和人工標記的答案之間的差異,稱為“損失”。那么,損失越小越好,損失為0則說明AI的推理和正確答案之間沒有差異,即預測100%命中。
我們看下圖,這次訓練過程也是如此。這幾個train系列的loss都是降低的,X軸表示訓練輪次,Y軸表示損失的值。
? 
我們看到loss的值都是降低,這說明很好。但是第一個box_loss好像還有下降的趨勢。但是中間的cls_loss在50輪時就已經(jīng)趨于穩(wěn)定了,而dfl_loss好像在75輪附近才慢慢穩(wěn)定。

在看這個圖,幾乎都沒有明顯的下降趨勢和穩(wěn)定趨勢,就證明還需要進行更多輪訓練。
這些指標都代表什么?有什么意義呢?
box_loss 邊界框損失:衡量畫框
box_loss全稱是bounding box loss,表示邊界框損失。它表明AI通過訓練和學習之后,對于邊界框的預測和標準答案之間的損失。

正常情況下,隨著訓練的進行,損失是越降越低的。如果它是長期忽高忽低,或者一直不明顯收斂,那說明訓練存在問題。如果box_loss的損失不斷降低,而后持續(xù)穩(wěn)定,則說明訓練沒有問題,也沒有必要再投入資源訓練了。
但是box_loss表現(xiàn)優(yōu)秀,僅僅說明它對物體區(qū)域(畫框)的識別情況。就算這一項100分,整體效果也不一定就好。因為光會畫框意義不大,我們還要知道框里的物體是什么。
于是就引入另一個cls_loss指標。
cls_loss 分類損失:判斷框里的物體
它叫分類損失,全稱為classification loss。它衡量的是預測類別和真實類別之間的差異。
我們看下面的圖,它不但框出了物體。而且標注出了這個框里是人,那個框里是車,哪個是細菌,哪個是垃圾。

對于框里物體是什么的評價,就用到了cls_loss指標。從這里可以看出,其實目標檢測技術,已經(jīng)包含了圖片分類的技術。圖片分類很基礎。
如果你認為它僅憑哪個區(qū)域、什么物體兩項指標就結束了,那么確實是小看YOLO算法了。它還有第三項細化指標dfl_loss。
dfl_loss 分布式焦點損失:精益求精
dfl_loss全稱是Distribution Focal Loss,中文名稱為“分布式焦點損失”。 它輔助box_loss,提供額外的信息,通過對邊界框位置的概率分布進行優(yōu)化,進一步提高模型對邊界框位置的細化和準確度。

如上圖所示,AI模型成功預測出了①的位置。但是紅、藍、綠3個框中的①,好像哪個都沒錯。因此dfl_loss提供了一個可信度,表明哪一個焦點跟標準答案相比,會更加精確。
val驗證集:學得好,不一定考得好
上面是訓練集的loss。下面說說驗證集的loss。
從規(guī)范上講,驗證集和訓練集是永遠不見面的。這么做是為了驗證AI是否真正學到了數(shù)據(jù)的特征和精髓,而非是靠死記硬背所見過的數(shù)據(jù)。
也就是說模型在經(jīng)過幾番訓練集數(shù)據(jù)的學習之后,將面對從來沒有見過的驗證集數(shù)據(jù)。它將給出預測答案,然后再去對照標準答案。兩個答案的差異,就是驗證集的損失。
看下面這個驗證集曲線的趨勢。

相比訓練集的平滑趨勢,驗證集似乎是有些反復。
其實,這是一種常見現(xiàn)象。只要驗證集損失沒有顯著上升,整體趨勢在變好,且與訓練集損失的差距不是特別大,這一般是正常的。
不過,要留意以下細節(jié):
-
樣本數(shù)據(jù)的變異:驗證集可能包含一些與訓練集不同風格的樣本,這會導致?lián)p失不穩(wěn)定。好比你拿著泰迪狗做識別訓練,最后讓模型去認識哈士奇狗,模型有點迷糊,拿不準。
-
模型的過擬合:如果驗證集的樣本數(shù)據(jù)正常。模型在訓練集上的損失表現(xiàn)很好,但是驗證集表現(xiàn)不穩(wěn)定。那么可能是模型記住了訓練集的細節(jié),也就是過于死記硬背,只抓住形沒有抓住神。這叫過擬合。
如果遇到比較嚴重的問題,或者你感覺有問題,該怎么辦呢?
可以調整超參數(shù),比如調小學習率,或者使用提前停止策略來防止過擬合。也可以調整batch大小,增加一個批次數(shù)量,讓它見多識廣。
同時,增加訓練數(shù)據(jù)量或使用數(shù)據(jù)增強技術,可以使模型更好地泛化,減少驗證損失的波動。
大家不要小看驗證集的指標,這是衡量模型效果的第一道關卡。因為訓練集的結果指標頂多算是自娛自樂,這有點像學校內部的月考、期末考試。而驗證集則更像是高考。因此,對于驗證集的檢測,還有更多指標。
精度和召回率:又準又全的考量

之所以說他們是同一類,看表頭就知道,他們的名字前面帶metrics,后面帶(B)。
metrics表示模型是在驗證集上的評估指標。(B)呢,在目標檢測任務中表示Bounding Box,即邊界框的檢測結果。
首先看左上角的第一個precision。precision是精度,或者稱為“精確率”。請注意,是精確率,不是準確率。準確率有專門的名詞accuracy。兩者不一樣。
準確率表示預測正確的占比。比如1000件產品中,900件合格。我的AI模型全都找出來了,這時準確率是100%。
準確率存在一個問題,尤其對于少數(shù)個體而言不公平。比如預測絕癥,100個人預測對了90個人是健康的,預測錯了10個病危的人。雖然準確率是90%,但這屬于嚴重事故。于是,精確率的可以解決這個問題。
精確率會從100個里隨便抽出10條數(shù)據(jù),如果預測錯了5個,那么精確率就是50%。高準確率保證的是多數(shù)都正確,而高精確率是保證每一個都不出錯。
我們看到第一個精確率的圖表,大約30輪左右趨于穩(wěn)定了,而且向1(100%)靠攏。這說明效果不錯。
精確率就沒有問題嗎?也有問題!
精確率考核的是出錯率,只要不出錯,哪怕只干好一件事,也是100%。如果精確率指標它挑活干,那么就完犢子了。工作、生活中也有這類情況,就是揀著好做的工作去做,結果干得很漂亮。
因此,這時又引入了另一個指標,也就是第二幅圖中的召回率recall。召回率的口號是:“寧可做錯一千,絕不漏掉一個”。鼓勵大家搶著做,誰眼里沒活就打低分。這樣就解決了那些少干活、揀活干的情況。
其實召回率recall和精確率precision是矛盾的。兩者的值很難都高。因為既要臟活、累活、雜活都攬下,還要不允許出錯。這對于機器或者人類都是很大的挑戰(zhàn)。
但是,考核指標就是要這樣的。就要想盡一切辦法堵住漏洞。我們看第二幅圖中召回率也是在提高的,這說明檢測范圍在不斷擴大,大約在0.8處浮動。因此從前兩張圖我們可以說,這次訓練precision精度是0.9,召回率recall為0.8。
關于P(precision)和R(recall)之間的數(shù)據(jù)趨勢,這里面也有具體的圖示。

P_curve.png:
runs\detect\train下面有P_curve.png,這是每項精度的曲線。

R_curve.png
這是每項召回率的曲線。

PR_curve.png
則是兩者互相妥協(xié)的曲線。這個PR圖怎么看呢?越接近正方形效果越好。都接近正方形,說明整體效果又準又全。
![]()
看上圖,藍色總線接近正方形。但是具體到分類為8的目標,有些拖后腿。
results.png系列還剩兩張圖片,那就是mAP50與mAP50-95。這倆是一類(也是看名稱很像)。
mAP50要拆開看,拆成mAP-50,mAP表示mean Average Precision,稱為平均精度。50則是在IoU閾值為50%的情況下的值。

這些個預測出的框框兒,可能是物體的全部,也可能只是中心部分,還或許僅僅是物體的一個角。不管如何,這都是算法通過學習特征計算出來的。誰是誰非,看你怎么選擇。
如果預測出的面積(藍框)能占到實際區(qū)域(紅框)的50%以上,那么我們就說IoU為50。重合度能到50%,其實能說明AI大體猜中了。因為IoU為100就是完全重合。
mAP50是重合度以50%為界限的平均精度。而mAP50-95則是IoU閾值從50%到95%范圍內的平均值。這個更加嚴格一些。因此,我們看到圖里面mAP50-95的值確實也低一些。

從這里能看出啥信息呢?
mAP50這個指標相對寬松,能夠展示模型在較低嚴格度下的整體性能。它更適用于那些對定位要求不是特別嚴格的應用場景。
mAP50-95則意味著在嚴格的IoU條件下也能準確檢測和定位目標。它適用于那些對定位要求較高的應用場景,如自動駕駛、醫(yī)療影像分析等。
因此,完全看你的需求。如果覺得現(xiàn)在的模型識別效果不好,對精度要求又不高能大體定位就行,其實可以調低IoU的值。反正,各類表現(xiàn)都告訴你了。
results.csv:圖表里的數(shù)據(jù)明細

runs\detect\train下有一個results.csv表格文件。其實這是上面剛剛講的很多圖表的數(shù)字版本。
如果你想查詢某次訓練某項指標的具體值,可以從這個表格中查找。
三、labels文件:分類標簽的分布

看上圖第一項,很明顯有一個問題。那就是第13分類的樣本數(shù)太少。這也導致比如上面的P曲線、R曲線沒有第13分類的信息(沒注意可以滑上去再看看)。這是因為樣本過少,被淹沒、忽略了。
下面是是混淆矩陣的歸一化版本,對應的圖片是confusion_matrix_normalized.png。這里可以更清晰地展示模型在各類別上的性能表現(xiàn)。我們也可以看到第13類別數(shù)據(jù)為空。

注意:如果報錯torchvision,請安裝
pip install torchvision

浙公網(wǎng)安備 33010602011771號