學(xué)校網(wǎng)站建設(shè)企業(yè)接推廣怎么收費(fèi)
本篇博客是由本人親自調(diào)試成功后的學(xué)習(xí)筆記。使用了mmdetection項(xiàng)目包進(jìn)行fast-rcnn模型的訓(xùn)練,數(shù)據(jù)集是自制圖像數(shù)據(jù)。廢話(huà)不多說(shuō),下面進(jìn)入訓(xùn)練步驟教程。
注:本人使用linux服務(wù)器進(jìn)行展示,Windows環(huán)境大差不差。另外,每個(gè)人的訓(xùn)練環(huán)境不同,目前我只展示自己所使用的環(huán)境和配置,條件允許的情況下,請(qǐng)盡可能地根據(jù)我的版本進(jìn)行安裝和訓(xùn)練,以防出錯(cuò)。
一、conda環(huán)境及torch、mmcv等包的安裝
1.1 linux服務(wù)器上的conda環(huán)境及torch包
linux服務(wù)器上的conda環(huán)境及torch包等可以根據(jù)下面這位博主發(fā)的教程進(jìn)行安裝:
Linux服務(wù)器安裝anaconda并安裝pytorch_如何利用pycharm在linux服務(wù)器上安裝anaconda-CSDN博客
1.2 mmdetection中的必須包安裝
在安裝mmdetection之前,先進(jìn)行下面三個(gè)包的安裝:
pip install -U openmim
mim install mmengine
mim install "mmcv>=2.0.0"
在安裝完上面三個(gè)包后,到github官網(wǎng)上把mmdetection的項(xiàng)目包拉下來(lái),下載網(wǎng)址如下:
GitHub - open-mmlab/mmdetection: OpenMMLab Detection Toolbox and Benchmark
dowm下來(lái)后,使用xshell等軟件打開(kāi)該項(xiàng)目包,確保路徑在該項(xiàng)目的主文件上。然后使用以下命令安裝必備的包:
pip install -v -e .
經(jīng)過(guò)上述步驟,mmdetection項(xiàng)目的運(yùn)行環(huán)境就已經(jīng)安裝結(jié)束,下面進(jìn)入mmdetection的配置和測(cè)試環(huán)節(jié)。
注意:請(qǐng)?jiān)谠摥h(huán)節(jié)結(jié)束前檢查自己安裝torch版本是否是顯卡(cuda)版本,不然無(wú)法使用顯卡進(jìn)行訓(xùn)練。可以在命令行中使用下面命令進(jìn)行測(cè)試:
python # 進(jìn)入python
import torch # 導(dǎo)入torch庫(kù)
torch.cuda.is_available() # 返回True則是cuda版本;返回False則是cpu版本
exit() # 退出python
二、mmdetection配置及調(diào)試
2.1 mmdetection測(cè)試
根據(jù)官網(wǎng)給出的測(cè)試步驟進(jìn)行測(cè)試,官網(wǎng)給出的是cpu的推理版本,這里給出的是cuda推理版本。調(diào)試命令如下:
mim download mmdet --config rtmdet_tiny_8xb32-300e_coco --dest .
進(jìn)行以上步驟后,會(huì)在mmdetection主目錄下下載一個(gè)權(quán)重文件(.pth)和模型配置文件(.py)。下載速度視自身網(wǎng)速而定,耐心等待~
在主目錄中出現(xiàn)上述兩個(gè)文件后,使用以下命令進(jìn)行推理測(cè)試:
python demo/image_demo.py demo/demo.jpg rtmdet_tiny_8xb32-300e_coco.py --weights rtmdet_tiny_8xb32-300e_coco_20220902_112414-78e30dcc.pth --device cuda
運(yùn)行結(jié)束后,mmdetection主目錄中會(huì)自動(dòng)生成一個(gè)新的文件夾output保存剛剛推理的結(jié)果。
注意:(1)推理的路徑使用了相對(duì)路徑,如果你在運(yùn)行后提示文件路徑的報(bào)錯(cuò),可以使用絕對(duì)路徑進(jìn)行運(yùn)行。如果還是報(bào)錯(cuò)的話(huà)請(qǐng)仔細(xì)檢查是否是文件沒(méi)有下載在正確的路徑中。(2)運(yùn)行后出現(xiàn)mmcv版本的報(bào)錯(cuò),該報(bào)錯(cuò)的解決請(qǐng)看下面的步驟~
2.2 mmcv版本報(bào)錯(cuò)的解決方法
在運(yùn)行推理測(cè)試后,彈出“AssertionError: MMCV==2.2.0 is used but incompatible. Please install mmcv>=2.0.0rc4, <2.2.0”的報(bào)錯(cuò),可以找到并打開(kāi)/mmdetection-main/mmdet文件夾下的init.py文件,然后注釋掉下面的這四行代碼:
# assert (mmcv_version >= digit_version(mmcv_minimum_version)
# and mmcv_version < digit_version(mmcv_maximum_version)), \
# f'MMCV=={mmcv.__version__} is used but incompatible. ' \
# f'Please install mmcv>={mmcv_minimum_version}, <{mmcv_maximum_version}.'
在執(zhí)行完上述操作后,基本可以解決mmcv版本的問(wèn)題。重新運(yùn)行推理測(cè)試命令即可生成output結(jié)果文件夾。
至此,mmdetection項(xiàng)目的調(diào)試到此就結(jié)束了,可以進(jìn)入正題開(kāi)始fast-rcnn的訓(xùn)練準(zhǔn)備工作!
三、自制數(shù)據(jù)集的準(zhǔn)備
3.1 數(shù)據(jù)集的標(biāo)注工作
這部分我就不詳細(xì)展開(kāi)標(biāo)準(zhǔn)的教程了,csdn中有很多這方面的教程,自己去找一下。
步驟:首先,使用labelme工具進(jìn)行數(shù)據(jù)標(biāo)注,我使用voc格式進(jìn)行標(biāo)注(.xml)。然后,在獲得圖片和標(biāo)簽文件后,將之分別存放在images和labels文件夾中。在這兩個(gè)文件夾中請(qǐng)自行劃分好train、val和test數(shù)據(jù)集。最終的數(shù)據(jù)集文件夾如下所示。
dataset
-images
--train
--val
--test
-labels
--train
--val
--test
3.2 制作fast-rcnn能訓(xùn)練的標(biāo)簽格式
利用以下代碼分別對(duì)train、val和test的標(biāo)簽進(jìn)行xml到coco標(biāo)簽的轉(zhuǎn)換:
(注意:為了后續(xù)訓(xùn)練的方便,輸出的json文件命名方式請(qǐng)遵循:instances_train2017.json、instances_val2017.json、instances_test2017.json)
import xml.etree.ElementTree as ET
import json
import os# 預(yù)定義類(lèi)別
PRE_DEFINE_CATEGORIES = {"A1": 1, "B1": 2, "B2": 3, "A2": 4}# 初始化 COCO 格式的字典
coco_dict = {"images": [],"annotations": [],"categories": []
}# 處理類(lèi)別信息
for category_name, category_id in PRE_DEFINE_CATEGORIES.items():category_info = {"id": category_id,"name": category_name,"supercategory": "object"}coco_dict["categories"].append(category_info)# 指定 XML 文件所在的文件夾
xml_dir = r'E:\BaiduSyncdisk\WALNUT-DATESET\split_dataset\test\labels\voc_label' # 請(qǐng)?zhí)鎿Q為實(shí)際的 XML 文件所在文件夾路徑annotation_id = 1
image_id = 1# 遍歷文件夾下的所有 XML 文件
for filename in os.listdir(xml_dir):if filename.endswith('.xml'):xml_file_path = os.path.join(xml_dir, filename)try:# 解析 XML 文件tree = ET.parse(xml_file_path)root = tree.getroot()# 處理圖像信息image_info = {"id": image_id,"file_name": root.find('filename').text,"width": int(root.find('size/width').text),"height": int(root.find('size/height').text)}coco_dict["images"].append(image_info)# 處理標(biāo)注信息for obj in root.findall('object'):category_name = obj.find('name').textcategory_id = PRE_DEFINE_CATEGORIES[category_name]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)width = xmax - xminheight = ymax - yminannotation_info = {"id": annotation_id,"image_id": image_id,"category_id": category_id,"bbox": [xmin, ymin, width, height],"area": width * height,"iscrowd": 0}coco_dict["annotations"].append(annotation_info)annotation_id += 1image_id += 1except Exception as e:print(f"Error processing {xml_file_path}: {e}")# 保存為 JSON 文件
output_json_file = r'E:\BaiduSyncdisk\WALNUT-DATESET\tools\1.數(shù)據(jù)集制作\annotations\instances_test2017.json'
with open(output_json_file, 'w') as f:json.dump(coco_dict, f, indent=4)
在對(duì)訓(xùn)練集、驗(yàn)證集和測(cè)試集都運(yùn)行了以上代碼后會(huì)生成三個(gè)josn文件,隨后將這三個(gè)文件保存到一個(gè)annotation文件夾中。
3.3 fast-rcnn數(shù)據(jù)文件保存格式
在進(jìn)行了上述操作后,現(xiàn)在可以在mmdetection主文件夾中按照以下格式新建文件夾:
mmdetection # 主目錄
-... # 主目錄的其他文件
-data
--coco
---annotations
---train2017
---val2017
---test2017
-... # 主目錄的其他文件
在新建完成后,將圖片數(shù)據(jù)按照分類(lèi)分別上傳到train2017、val2017和test2017文件夾中,剛剛生成的json文件上傳到annotations文件夾中。
3.4 數(shù)據(jù)集配置文件的準(zhǔn)備
在執(zhí)行完上述操作后,進(jìn)入/mmdetection/mmdet/datasets文件夾中復(fù)制coco.py,粘貼新建一個(gè)自己數(shù)據(jù)集的配置文件,本教程用ABC.py做例子進(jìn)行講解。
(1)將復(fù)制的文件打開(kāi)后,修改原來(lái)coco數(shù)據(jù)集的classes和palette信息,按照自己的來(lái)。
修改前:
修改后:(這是我的例子,請(qǐng)按照自己的情況設(shè)定)
class的名字也要改一下:ABCDataset
(2)然后打開(kāi)/mmdet/datasets/init.py,導(dǎo)入自己的數(shù)據(jù)集
....from .walnut import ABCDataset....__all__ = ['XMLDataset', 'CocoDataset', 'ABCDataset', 'DeepFashionDataset', 'VOCDataset','CityscapesDataset', 'LVISDataset', 'LVISV05Dataset', 'LVISV1Dataset','WIDERFaceDataset', 'get_loading_pipeline', 'CocoPanopticDataset','MultiImageMixDataset', 'OpenImagesDataset', 'OpenImagesChallengeDataset','AspectRatioBatchSampler', 'ClassAwareSampler', 'MultiSourceSampler','GroupMultiSourceSampler', 'BaseDetDataset', 'CrowdHumanDataset','Objects365V1Dataset', 'Objects365V2Dataset', 'DSDLDetDataset','BaseVideoDataset', 'MOTChallengeDataset', 'TrackImgSampler','ReIDDataset', 'YouTubeVISDataset', 'TrackAspectRatioBatchSampler','ADE20KPanopticDataset', 'CocoCaptionDataset', 'RefCocoDataset','BaseSegDataset', 'ADE20KSegDataset', 'CocoSegDataset','ADE20KInstanceDataset', 'iSAIDDataset', 'V3DetDataset', 'ConcatDataset','ODVGDataset', 'MDETRStyleRefCocoDataset', 'DODDataset','CustomSampleSizeSampler', 'Flickr30kDataset'
]
至此,fast-rcnn模型能接受的數(shù)據(jù)集格式已經(jīng)已經(jīng)布置完成。接下來(lái)進(jìn)入fast-rcnn模型訓(xùn)練的配置環(huán)節(jié)。
四、模型配置文件的準(zhǔn)備
在訓(xùn)練fast-rcnn模型前,需要先進(jìn)行rpn的訓(xùn)練,因?yàn)閞pn有fast-rcnn模型訓(xùn)練所需要的前置文件(.pkl)。
4.1 rpn模型的訓(xùn)練
(1)選擇模型
進(jìn)入到/mmdetection/configs文件夾中找到rpn文件夾,進(jìn)入后找到rpn_r50_fpn_1x_coco.py,本博客將使用這個(gè)例子進(jìn)行教學(xué)。
(2)rpn模型訓(xùn)練
在命令行中使用以下模型進(jìn)行訓(xùn)練:
python tools/train.py /root/autodl-tmp/model/mmdetection-main/configs/rpn/rpn_r50_fpn_1x_coco.py
修改rpn_r50_fpn_1x_coco.py文件中的相應(yīng)代碼獲得train和val的.pkl文件,這兩個(gè)文件會(huì)自動(dòng)生成在數(shù)據(jù)集/mmdetection/data/coco/路徑下的proposals文件夾中。
注:本例子只做訓(xùn)練集和驗(yàn)證集的pkl,沒(méi)有test。各位根據(jù)自身的需要進(jìn)行生成。
在獲得這兩個(gè)文件后,就可以進(jìn)行fast-rcnn模型的訓(xùn)練啦~
4.2 fast-rcnn模型的訓(xùn)練
(1)類(lèi)別設(shè)置
打開(kāi)mmdetection-main/configs/_base_/models,找到并打開(kāi)fast-rcnn_r50_fpn.py,搜索num_classes,把coco的80個(gè)類(lèi)別修改成自己的類(lèi)別,本博客例子有4個(gè)類(lèi)別,所以我將num_classes設(shè)置成4。
(2)配置dataset、batch、workers
打開(kāi)mmdetection-main/configs/_base_/datasets,找到并打開(kāi)coco_detection.py。
修改一下部位,請(qǐng)Ctrl+F進(jìn)行分別搜索關(guān)鍵字
dataset_type
train_dataloader
val_dataloader
test_dataloader
將dataset_type設(shè)置成ABCDataset;train_dataloader、val_dataloader、test_dataloader中的? ? batch_size=16,
num_workers=16,
根據(jù)自己的設(shè)備配置來(lái)設(shè)置,這里我將batch和worker都設(shè)置成了16。
以上就完成了fast-rcnn的環(huán)境、數(shù)據(jù)集和訓(xùn)練文件的全部配置。接下來(lái)開(kāi)始進(jìn)行fast-rcnn模型的訓(xùn)練步驟。
五、開(kāi)始訓(xùn)練
在命令行中cd進(jìn)到mmdetection的項(xiàng)目主目錄中,使用以下命令進(jìn)行fast-rcnn模型的訓(xùn)練:(文件路徑請(qǐng)根據(jù)自己的來(lái)改)
python tools/train.py /root/autodl-tmp/model/mmdetection-main/configs/fast_rcnn/fast-rcnn_r50_fpn_2x_coco.py
訓(xùn)練過(guò)程截圖如下:
如果不報(bào)錯(cuò)并且出現(xiàn)和截圖相似的界面就說(shuō)明訓(xùn)練開(kāi)始了!!
——————————? 今天不學(xué)習(xí),明天變垃圾? ——————————