YOLOv5 Object Detection Video Analysis
In this tutorial, we will use fastdup with a pretrained yolov5 object detection model to detect and crop from videos. Following that we analyze the cropped objects for issues such as duplicates, near-duplicates, outliers, bright/dark/blurry objects.
Follow along this tutorial by running this Colab Notebook.
Setting Up
!pip install pip -U
!pip install fastdup
Verify the installation
import fastdup
fastdup.__version__
'0.910'
Download & Extract Dataset
We downloaded a few random TikTok videos for the purpose of this demonstration. Feel free to use your own video dataset.
Let's download the TikTok videos into our local folder.
!gdown --fuzzy https://drive.google.com/file/d/1fzmOgmRu557aU4lEbzL7XCf78KntFCeQ/view
!unzip data.zip
From Videos to Images
fastdup works on images. We must first extract frames from the videos using a one-liner fastdup utility function.
fastdup.extract_video_frames(input_dir="data", work_dir="frames")
This should create aframes/
folder which stores all the frames extracted from the videos.
Run fastdup
Now that we have the frames of images, let's run fastdup and analyze the frames.
fd = fastdup.create(input_dir='frames', work_dir='face_detection_work_dir')
fd.run(bounding_box='yolov5s', overwrite=True)
FastDup Software, (C) copyright 2022 Dr. Amir Alush and Dr. Danny Bickson.
2023-03-29 17:11:55 [INFO] Going to loop over dir frames
2023-03-29 17:11:55 [INFO] Found total 99 images to run on
FastDup Software, (C) copyright 2022 Dr. Amir Alush and Dr. Danny Bickson.utes 0 Features
2023-03-29 17:11:58 [INFO] Going to loop over dir /tmp/crops_input.csv
2023-03-29 17:11:58 [INFO] Found total 66 images to run on
2023-03-29 17:11:59 [INFO] Found total 66 images to run onEstimated: 0 Minutes 0 Features
Finished histogram 0.091
Finished bucket sort 0.106
2023-03-29 17:11:59 [INFO] 10) Finished write_index() NN model
2023-03-29 17:11:59 [INFO] Stored nn model index file face_detection_work_dir/nnf.index
2023-03-29 17:11:59 [INFO] Total time took 1017 ms
2023-03-29 17:11:59 [INFO] Found a total of 0 fully identical images (d>0.990), which are 0.00 %
2023-03-29 17:11:59 [INFO] Found a total of 2 nearly identical images(d>0.980), which are 1.01 %
2023-03-29 17:11:59 [INFO] Found a total of 28 above threshold images (d>0.900), which are 14.14 %
2023-03-29 17:11:59 [INFO] Found a total of 6 outlier images (d<0.050), which are 3.03 %
2023-03-29 17:11:59 [INFO] Min distance found 0.528 max distance 0.982
2023-03-29 17:11:59 [INFO] Running connected components for ccthreshold 0.960000
.0
########################################################################################
Dataset Analysis Summary:
Dataset contains 66 images
Valid images are 100.00% (66) of the data, invalid are 0.00% (0) of the data
Similarity: 3.03% (2) belong to 2 similarity clusters (components).
96.97% (64) images do not belong to any similarity cluster.
Largest cluster has 6 (9.09%) images.
For a detailed analysis, use `.connected_components()`
(similarity threshold used is 0.9, connected component threshold used is 0.96).
Outliers: 6.06% (4) of images are possible outliers, and fall in the bottom 5.00% of similarity values.
For a detailed list of outliers, use `.outliers()`.
Components Gallery
We can visualize the cluster of similar detections using the components gallery view. Specify draw_bbox=True
to see the detection bounding box on the original image.
fd.vis.component_gallery(draw_bbox=True)
Similarity Gallery
Using the similarity_gallery
view, we can find similar looking faces (bounding boxes) across all the extracted frames.
fd.vis.similarity_gallery(draw_bbox=False)
Duplicates Gallery
With the duplicates_gallery
view, visualize duplicate image pairs across videos.
fd.vis.duplicates_gallery()
Outliers Gallery
Using the outliers_gallery
we can also visualize faces (detections) that looks visually different from others.
fd.vis.outliers_gallery()
Stats Gallery
You can visualize the faces using various metrics using the stats_gallery
.
Dark Objects
Specifying metric='dark'
sorts the detections in an ascending order of image mean
value.
fd.vis.stats_gallery(metric='dark')
Bright Objects
Conversely, specifying metric='bright'
sorts the detections in descending order of image mean
value.
fd.vis.stats_gallery(metric='bright')
Blurry Objects
Finally, specifying metric='blur'
ranks the images in ascending 'blurriness'.
fd.vis.stats_gallery(metric='blur')
Updated about 1 year ago