PaddlePaddle學習之使用PaddleDetection在樹莓派4B進行模型部署(一)--- 項目環境搭建

PaddlePaddle學習之使用PaddleDetection在樹莓派4B進行模型部署(一)— 項目環境搭建
PaddlePaddle學習之使用PaddleDetection在樹莓派4B進行模型部署(二)— 深度學習模型訓練
PaddlePaddle學習之使用PaddleDetection在樹莓派4B進行模型部署(三)— 樹莓派4B部署

此項目已公開,包括數據集在內已經打包上傳,歡迎Fork!傳送門:Paddle_ssd_mobilenet_v1_pascalvoc

本文將使用ssd_mobilenet_v1_voc算法,以一個例子說明,如何利用paddleDetection完成一個項目----從準備數據集到完成樹莓派部署,項目用到的工具是百度的AI Studio在線AI開發平臺和樹莓派4B
全部資料已經都打包在這裏(PaddleDetection、Paddle-Lite-Demo、Paddle-Lite、opt)↓
鏈接:https://pan.baidu.com/s/1IKT-ByVN9BaVxfqQC1VaMw
提取碼:mdd1

數據集準備

本項目是用的數據集格式是VOC格式,標註工具爲labelimg,圖像數據是手動拍攝獲取。
在這裏插入圖片描述
數據標註:

  1. 點擊Open Dir,打開文件夾,載入圖片
  2. 點擊Create RectBox,即可在圖像上畫框標註
  3. 輸入標籤,點擊OK
  4. 點擊Save保存,保存下來的是XML文件
    在這裏插入圖片描述
    XML文件內容如下
    在這裏插入圖片描述

整理成VOC格式的數據集:
創建三個文件夾:Annotations、ImageSets、JPEGImages
在這裏插入圖片描述
將標註生成的XML文件存入Annotations,圖片存入JPEGImages,訓練集、測試集、驗證集的劃分情況存入ImageSets。
在ImageSets下創建一個Main文件夾,並且在Mian文件夾下建立label_list.txt,裏面存入標註的標籤。
此label_list.txt文件複製一份與Annotations、ImageSets、JPEGImages同級位置放置。
其內容如下:
label_list.txt內容

運行該代碼將會生成trainval.txt、train.txt、val.txt、test.txt,將我們標註的600張圖像按照訓練集、驗證集、測試集的形式做一個劃分。

import os
import random
 
trainval_percent = 0.95  #訓練集驗證集總佔比
train_percent = 0.9  #訓練集在trainval_percent裏的train佔比
xmlfilepath = 'F:/Cola/Annotations'
txtsavepath = 'F:/Cola/ImageSets/Main'
total_xml = os.listdir(xmlfilepath)

num=len(total_xml)
list=range(num)
tv=int(num*trainval_percent)
tr=int(tv*train_percent)
trainval= random.sample(list,tv)
train=random.sample(trainval,tr)

ftrainval = open('F:/Cola/ImageSets/Main/trainval.txt', 'w')
ftest = open('F:/Cola/ImageSets/Main/test.txt', 'w')
ftrain = open('F:/Cola/ImageSets/Main/train.txt', 'w')
fval = open('F:/Cola/ImageSets/Main/val.txt', 'w')
 
for i  in list:
    name=total_xml[i][:-4]+'\n'
    if i in trainval:
        ftrainval.write(name)
        if i in train:
            ftrain.write(name)
        else:
            fval.write(name)
    else:
        ftest.write(name)
 
ftrainval.close()
ftrain.close()
fval.close()
ftest .close()

      以下代碼可根據在Main文件夾中劃分好的數據集進行位置索引,生成含有圖像及對應的XML文件的地址信息的文件。

import os
import re
import random

devkit_dir = './'
output_dir = './'

def get_dir(devkit_dir,  type):
    return os.path.join(devkit_dir, type)

def walk_dir(devkit_dir):
    filelist_dir = get_dir(devkit_dir, 'ImageSets/Main')
    annotation_dir = get_dir(devkit_dir, 'Annotations')
    img_dir = get_dir(devkit_dir, 'JPEGImages')
    trainval_list = []
    train_list = []
    val_list = []
    test_list = []

    added = set()

    for _, _, files in os.walk(filelist_dir):
        for fname in files:
            print(fname)
            img_ann_list = []
            if re.match('trainval.txt', fname):
                img_ann_list = trainval_list
            elif re.match('train.txt', fname):
                img_ann_list = train_list
            elif re.match('val.txt', fname):
                img_ann_list = val_list
            elif re.match('test.txt', fname):
                img_ann_list = test_list
            else:
                continue
            fpath = os.path.join(filelist_dir, fname)
            for line in open(fpath):
                name_prefix = line.strip().split()[0]
                print(name_prefix)

                added.add(name_prefix)
                #ann_path = os.path.join(annotation_dir, name_prefix + '.xml')
                ann_path = annotation_dir + '/' + name_prefix + '.xml'
                print(ann_path)
                #img_path = os.path.join(img_dir, name_prefix + '.jpg')
                img_path = img_dir + '/' + name_prefix + '.jpg'
                assert os.path.isfile(ann_path), 'file %s not found.' % ann_path
                assert os.path.isfile(img_path), 'file %s not found.' % img_path
                img_ann_list.append((img_path, ann_path))
            print(img_ann_list)

    return trainval_list, train_list, val_list, test_list


def prepare_filelist(devkit_dir, output_dir):
    trainval_list = []
    train_list = []
    val_list = []
    test_list = []

    trainval, train, val, test = walk_dir(devkit_dir)

    trainval_list.extend(trainval)
    train_list.extend(train)
    val_list.extend(val)
    test_list.extend(test)
    #print(trainval)
    with open(os.path.join(output_dir, 'trainval.txt'), 'w') as ftrainval:
        for item in trainval_list:
            ftrainval.write(item[0] + ' ' + item[1] + '\n')

    with open(os.path.join(output_dir, 'train.txt'), 'w') as ftrain:
        for item in train_list:
            ftrain.write(item[0] + ' ' + item[1] + '\n')

    with open(os.path.join(output_dir, 'val.txt'), 'w') as fval:
        for item in val_list:
            fval.write(item[0] + ' ' + item[1] + '\n')

    with open(os.path.join(output_dir, 'test.txt'), 'w') as ftest:
        for item in test_list:
            ftest.write(item[0] + ' ' + item[1] + '\n')


if __name__ == '__main__':
    prepare_filelist(devkit_dir, output_dir)

最終創建完成的VOC數據集如下:
在這裏插入圖片描述
將整個文件拷貝至 ./PaddleDetection/dataset/voc 下
以上全部完成後,還需要修改兩個地方,ssd_mobilenet_v1_voc源碼中是以20類目標爲準設計的,本項目的目標僅爲兩類

  1. 找到 ./PaddleDetection/configs/ssd/ssd_mobilenet_v1_voc.yml文件,修改第12行的num_classes,3代表2個標籤加一個背景
# 2(label_class) + 1(background)
num_classes: 3
  1. 找到 ./PaddleDetection/ppdet/data/source/voc.py文件,修改167行的pascalvoc_label()函數,按照前面設定的label_list.txt文件裏的標籤順序依次修改,並將多餘的內容刪掉
def pascalvoc_label(with_background=True):
    labels_map = {
        'PepsiCola': 1,
        'CocaCola': 2
    }
    if not with_background:
        labels_map = {k: v - 1 for k, v in labels_map.items()}
    return labels_map

至此,整個數據集製作及配置完成。

創建項目

進入AI Studio創建項目
在這裏插入圖片描述
確認創建項目前,需要將數據集添加進去,點擊創建數據集,將第一步做好的“PaddleDetection”整個文件夾壓縮打包上傳。
在這裏插入圖片描述
在這裏插入圖片描述
至此,創建項目完成。


參考資料

PaddleDetection官方文檔
系列文章:如何利用PaddleDetection做一個完整的項目

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章