//top\\: Mmodlist

# Convert simple rectangle list to mmodlist with default label 0 def to_mmodlist(rect_list, label=0): return [dlib.mmod_rect(r, label=label, ignore=False) for r in rect_list] Reverse conversion (strip labels/ignore):

for xml_file in glob.glob("annotations/*.xml"): # Load dlib's XML format (which uses mmod_rect internally) rects = dlib.load_image_dataset(images, xml_file, "image") # rects is already list of mmod_rect mmodlists.append(rects) mmodlist

# List of images (numpy arrays or dlib array2d) images = [img1, img2, ...] boxes_per_image = [ [mmod_rect(...), mmod_rect(...)], # image 0 [mmod_rect(...)], # image 1 [] # image 2 (no objects) ] Example construction: import dlib def load_mmodlist_from_annotation(image_path, annotation_dict): img = dlib.load_rgb_image(image_path) rects = [] for obj in annotation_dict['objects']: r = dlib.rectangle( left=obj['x'], top=obj['y'], right=obj['x']+obj['w'], bottom=obj['y']+obj['h'] ) # label: 0 for 'car', 1 for 'pedestrian', etc. m = dlib.mmod_rect(r, label=obj['class_id'], ignore=obj.get('ignore', False)) rects.append(m) return rects 4. Training a MMOD Detector with mmodlist Once you have images and mmodlists , training is: # Convert simple rectangle list to mmodlist with

mmodlist = detector.run(image) # returns mmod_rects rects = [m.rect for m in mmodlist] # just boxes labels = [m.label for m in mmodlist] # class predictions ignored = [m.ignore for m in mmodlist] # usually False for output | Problem | Likely cause | |--------|---------------| | Training crashes with “empty mmodlist” | An image has zero mmod_rect s. That’s allowed, but check that your dataset isn't entirely empty. | | Loss stays high | ignore=True used incorrectly on positive samples. | | Detector outputs wrong class | Mismatch between training labels and test-time expectations. | | Memory explosion | Too many mmod_rect s per image (e.g., 1000+ small objects). Use ignore for tiny or edge objects. | 8. mmodlist in C++ (for custom dlib extensions) If you work with dlib’s C++ API: That’s allowed, but check that your dataset isn't

Under the hood, train_simple_object_detector converts mmodlist into the internal MMOD loss format. The ignore flag is critical for hard examples:

detector = dlib.train_simple_object_detector(images, mmodlists, options) img = dlib.load_rgb_image("test.jpg") dets = detector(img) for det in dets: print(f"Class det.label at det.rect, score det.detection_confidence")

options = dlib.simple_object_detector_training_options() options.add_left_right_image_flips = True options.C = 5 options.num_threads = 4 options.be_verbose = True detector = dlib.train_simple_object_detector(images, boxes_per_image, options) Save the detector detector.save("mmod_detector.svm")

Share.

Leave a Reply