Model for Detecting Cars

License Plate Detection (6 Part Series)

1 OpenCV in Python for End-to-end License Plate Detection
2 Camera and Computer Setup
2 more parts…
3 Capturing Images from DSLR to RPi
4 Model for Detecting Cars
5 Crop Bounding Box + Rotate
6 Model for Detecting License Plates in Cropped Image

Abstract

Build YOLO model from scratch to find bounding box of cars in images. This includes labeling test images, training model, and evaluating different settings for best model output.

Step-by-Step

Recipe

At this point we have focused camera, automatically capturing and transferring images, and we’re ready to process photos on the way to reading license plate numbers.

As humans, we see cars in the images from prior article. But our computers don’t distinguish those entities yet like we can – not without being trained to. Thus, we will teach the computer what a car on a highway looks like.

Enabling computer to know what a car looks like distills essentially to: 1) collect training data, 2) label training data, 3) train model on training data, 4) train models with varying configurations and choose best. We’ll walk through those steps next.

  1. Collect training data

    • Use for loop’ing capture from step two under good light for a bit. I compiled 145 images. Sample image
  2. Label training data

    • I used roboflow.com. I recommend their tooling. I’m sure there’s alternatives if you prefer, but roboflow made e2e process easier. Training the model requires label data in a particular format, which roboflow automates for you, and roboflow has online tooling to streamline your building of the labeling data.
    • Upload your images
    • Hand-label your images. This is time consuming. I suggest learning the hotkeys. Sample labeling from roboflow – one of many
    • I suggest defining guidelines for yourself to mitigate the monotony. My bounding boxes for labeling generally stretched from top-left turn-signal light to bottom-right wheel-well highlighting the entire rear bumper. I’m not saying use the same bounding box. I’m suggesting: know what your guideposts are. Knowing your guideposts will make your labeling consistent and help the tedium.
    • Download training data. This is just the formatted xml capturing all your bounding boxes for training.
  3. Train model YOLO

    • Note that my output model is “v21” ie I trained several models to experiment with different parameters. I recommend testing and iterating on configurations that work for you: nano model vs medium, less epochs or more, etc.
    • I found medium with default epoch and batch settings produced best results for my training set + labels. I trained five variant models including nano, medium, xlarge, and various permutations of epoch and batch.
    • On MacBook M1 Pro with 32GB memory, took 4.5 hours to train the winning model. Five permutations of training different configurations took ~33 hours total.
    <span>from</span> <span>ultralytics</span> <span>import</span> <span>YOLO</span>
    <span>########### # Training # Load the model </span><span>baseDir</span> <span>=</span> <span>'</span><span>/</span><span>Users</span><span>/</span><span>japollock</span><span>/</span><span>Projects</span><span>/</span><span>TrainHighwayCarDetector</span><span>/</span><span>'</span>
    <span>model</span> <span>=</span> <span>YOLO</span><span>(</span><span>baseDir</span> <span>+</span> <span>'</span><span>resources</span><span>/</span><span>yolov8m</span><span>.</span><span>pt</span><span>'</span><span>)</span>
    <span>results</span> <span>=</span> <span>model</span><span>.</span><span>train</span><span>(</span>
    <span>imgsz</span><span>=</span><span>1280</span><span>,</span>
    <span># epochs=100, # batch=8, # device='mps', </span> <span>data</span><span>=</span><span>baseDir</span> <span>+</span> <span>'</span><span>resources</span><span>/</span><span>v2data_CARS</span><span>/</span><span>data</span><span>.</span><span>yaml</span><span>'</span><span>,</span>
    <span>name</span><span>=</span><span>'</span><span>yolov8m_100_8_CARS_v21</span><span>'</span>
    <span>)</span>
    <span>########### </span>
    <span>from</span> <span>ultralytics</span> <span>import</span> <span>YOLO</span>
    
    <span>########### # Training # Load the model </span><span>baseDir</span> <span>=</span> <span>'</span><span>/</span><span>Users</span><span>/</span><span>japollock</span><span>/</span><span>Projects</span><span>/</span><span>TrainHighwayCarDetector</span><span>/</span><span>'</span>
    <span>model</span> <span>=</span> <span>YOLO</span><span>(</span><span>baseDir</span> <span>+</span> <span>'</span><span>resources</span><span>/</span><span>yolov8m</span><span>.</span><span>pt</span><span>'</span><span>)</span>
    
    <span>results</span> <span>=</span> <span>model</span><span>.</span><span>train</span><span>(</span>
       <span>imgsz</span><span>=</span><span>1280</span><span>,</span>
    <span># epochs=100, # batch=8, # device='mps', </span>   <span>data</span><span>=</span><span>baseDir</span> <span>+</span> <span>'</span><span>resources</span><span>/</span><span>v2data_CARS</span><span>/</span><span>data</span><span>.</span><span>yaml</span><span>'</span><span>,</span>
       <span>name</span><span>=</span><span>'</span><span>yolov8m_100_8_CARS_v21</span><span>'</span>
    <span>)</span>
    <span>########### </span>
    from ultralytics import YOLO ########### # Training # Load the model baseDir = '/Users/japollock/Projects/TrainHighwayCarDetector/' model = YOLO(baseDir + 'resources/yolov8m.pt') results = model.train( imgsz=1280, # epochs=100, # batch=8, # device='mps', data=baseDir + 'resources/v2data_CARS/data.yaml', name='yolov8m_100_8_CARS_v21' ) ###########
  4. Test YOLO.

    • I compared five model variants on ClearML score dimensions: precision, recall, map50, and map50-95. I confirmed model performance manually visualizing the results with above script. Did this for both best and worst model. Worst model had false-positives, multiple detections on single car, and generally lower confidence score. Best model had no false-positives (in limited testing), no multiple detections, etc. Helped to see the output in addition to ClearML scoring.
    <span>from</span> <span>ultralytics</span> <span>import</span> <span>YOLO</span>
    <span>import</span> <span>cv2</span>
    <span>from</span> <span>PIL</span> <span>import</span> <span>Image</span>
    <span>import</span> <span>imutils</span>
    <span>########### # predict </span><span>baseDir</span> <span>=</span> <span>'</span><span>/</span><span>Users</span><span>/</span><span>japollock</span><span>/</span><span>Projects</span><span>/</span><span>TrainHighwayCarDetector</span><span>/</span><span>'</span>
    <span>########### # model </span><span>model</span> <span>=</span> <span>YOLO</span><span>(</span><span>baseDir</span> <span>+</span> <span>'</span><span>src</span><span>/</span><span>runs</span><span>/</span><span>detect</span><span>/</span><span>yolov8m_v21_100e</span><span>/</span><span>weights</span><span>/</span><span>best</span><span>.</span><span>pt</span><span>'</span><span>)</span>
    <span>########### # images </span><span>img</span> <span>=</span> <span>cv2</span><span>.</span><span>imread</span><span>(</span><span>baseDir</span> <span>+</span> <span>'</span><span>photos</span><span>/</span><span>yolo_cars</span><span>/</span><span>all</span><span>/</span><span>IMG_4553</span><span>.</span><span>jpg</span><span>'</span><span>)</span>
    <span>results</span> <span>=</span> <span>model</span><span>.</span><span>predict</span><span>(</span>
    <span>source</span><span>=</span><span>img</span><span>,</span>
    <span>imgsz</span><span>=</span><span>1280</span>
    <span>)</span>
    <span>cv2</span><span>.</span><span>imshow</span><span>(</span><span>"image"</span><span>,</span> <span>results</span><span>[</span><span>0</span><span>].</span><span>plot</span><span>())</span>
    <span>cv2</span><span>.</span><span>waitKey</span><span>(</span><span>0</span><span>)</span>
    <span>from</span> <span>ultralytics</span> <span>import</span> <span>YOLO</span>
    <span>import</span> <span>cv2</span> 
    <span>from</span> <span>PIL</span> <span>import</span> <span>Image</span>
    <span>import</span> <span>imutils</span>
    
    <span>########### # predict </span><span>baseDir</span> <span>=</span> <span>'</span><span>/</span><span>Users</span><span>/</span><span>japollock</span><span>/</span><span>Projects</span><span>/</span><span>TrainHighwayCarDetector</span><span>/</span><span>'</span>
    
    <span>########### # model </span><span>model</span> <span>=</span> <span>YOLO</span><span>(</span><span>baseDir</span> <span>+</span> <span>'</span><span>src</span><span>/</span><span>runs</span><span>/</span><span>detect</span><span>/</span><span>yolov8m_v21_100e</span><span>/</span><span>weights</span><span>/</span><span>best</span><span>.</span><span>pt</span><span>'</span><span>)</span>
    
    <span>########### # images </span><span>img</span> <span>=</span> <span>cv2</span><span>.</span><span>imread</span><span>(</span><span>baseDir</span> <span>+</span> <span>'</span><span>photos</span><span>/</span><span>yolo_cars</span><span>/</span><span>all</span><span>/</span><span>IMG_4553</span><span>.</span><span>jpg</span><span>'</span><span>)</span>
    
    <span>results</span> <span>=</span> <span>model</span><span>.</span><span>predict</span><span>(</span>
       <span>source</span><span>=</span><span>img</span><span>,</span>
       <span>imgsz</span><span>=</span><span>1280</span>
    <span>)</span>
    
    <span>cv2</span><span>.</span><span>imshow</span><span>(</span><span>"image"</span><span>,</span> <span>results</span><span>[</span><span>0</span><span>].</span><span>plot</span><span>())</span>
    <span>cv2</span><span>.</span><span>waitKey</span><span>(</span><span>0</span><span>)</span>
    from ultralytics import YOLO import cv2 from PIL import Image import imutils ########### # predict baseDir = '/Users/japollock/Projects/TrainHighwayCarDetector/' ########### # model model = YOLO(baseDir + 'src/runs/detect/yolov8m_v21_100e/weights/best.pt') ########### # images img = cv2.imread(baseDir + 'photos/yolo_cars/all/IMG_4553.jpg') results = model.predict( source=img, imgsz=1280 ) cv2.imshow("image", results[0].plot()) cv2.waitKey(0)

    图片[1]-Model for Detecting Cars - 拾光赋-拾光赋
    Sample classification from best model. “Cars” is the classifier label.

Now we have model detecting cars bounding box. This enables us to hone in on license plate from highway view. Next up is cropping down to bounding box, and perspective warp’ing to rectangular-ize the license plate from eschew.

Next Link: Crop bounding box + rotate.

Appendix: References

Appendix: Interesting Points

License Plate Detection (6 Part Series)

1 OpenCV in Python for End-to-end License Plate Detection
2 Camera and Computer Setup
2 more parts…
3 Capturing Images from DSLR to RPi
4 Model for Detecting Cars
5 Crop Bounding Box + Rotate
6 Model for Detecting License Plates in Cropped Image

原文链接:Model for Detecting Cars

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
Sometimes you have to be your own hero.
有时候必须做自己的英雄
评论 抢沙发

请登录后发表评论

    暂无评论内容