1、數據集準備
假設已經有了標註好的一分部數據,
(1)運行voc2yolo3.py生成txt文件,保存在ImageSets/Main目錄下
(2)修改voc_annotation.py中的classes
classes = ["mask", "unmask"]
運行後,生成三個txt文件,每一行對應的是一張圖片的位置,標註的真實框位置以及label, 0代表戴口罩,1代表未戴口罩:
2、修改先驗框中的值
根據訓練集中標註框的大小,利用kmeans.py生成合適的先驗框保存在model_data下的yolo_anchors.txt和tiny_yolo_anchors.txt中,而不使用官方給定的。這裏有兩種架構,yolov3_tiny架構和yolov3架構,k=9,生成yolo_anchors;k=6,生成tiny_yolo_anchors。
然後,將model_data下的voc_classes.txt中的類別修改爲需要的類別:mask與unmask,或新建object_classes.txt寫入。
3、訓練
在訓練之前先將預先下載的yolov3 的 weights文件轉化爲keras的h5文件:
在cmd下切換到工程目錄:
python convert.py yolov3.cfg yolov3.weights model_data/yolo.h5
python convert.py yolov3-tiny.cfg yolov3-tiny.weights model_data/tiny_yolo.h5
這裏我使用的是yolo.y5進行的訓練。
注意修改train.py裏的classes_path,anchors_path,pretrained_path:
def _main():
annotation_path = 'dataset/2007_train.txt'
log_dir = 'logs/'
classes_path = 'model_data/object_classes.txt'
anchors_path = 'model_data/yolo_anchors.txt'
class_names = get_classes(classes_path)
num_classes = len(class_names)
anchors = get_anchors(anchors_path)
input_shape = (416, 416)
pretrained_path = 'model_data/yolo.h5'
is_tiny_version = len(anchors)==6 # default setting
if is_tiny_version:
model = create_tiny_model(input_shape, anchors, num_classes,
freeze_body=2, weights_path='model_data/tiny_yolo.h5')
else:
model = create_model(input_shape, anchors, num_classes,
freeze_body=2, weights_path=pretrained_path)
運行train.py 即可開始訓練,訓練好的模型會存放在logs目錄下。
4、測試
(1)單張圖片測試
detect_image_test(img_path, out_path)
(2)本地視頻測試並保存
對應的yolo.py文件detect_video函數中vid = cv2.VideoCapture(“視頻路徑+視頻名+視頻後綴名”);
(3)電腦攝像頭實時測試
對應的yolo.py文件detect_video函數中vid = cv2.VideoCapture(0);