📢 公告:OpenCV 系列文章目前正在重構整理中(進度約 65%),部分文章已暫時下架,後續會陸續補上,完成時間待定。感謝耐心等候!

Like Share Discussion Bookmark Smile

J.J. Huang   2026-03-24   Python OpenCV 07.物件偵測與辨識篇   瀏覽次數:次   DMCA.com Protection Status

Python | OpenCV 資料蒐集

📚 前言

在上一篇 模型訓練與微調 中,我們了解了整個訓練流程的概觀。
訓練的第一步,也是最重要的基礎,就是 資料蒐集 (Data Collection)

「垃圾進,垃圾出 (Garbage in, garbage out)」是機器學習不變的定律。
資料的數量與品質,直接決定了模型的上限。

❓ 需要多少資料?

資料量並沒有固定標準,但以下是常見的經驗法則:

任務類型 建議最低資料量(每類別)
圖片分類 100 ~ 500 張
物件偵測 200 ~ 1000 張(含標註)
語義分割 500 張以上
遷移學習微調 50 ~ 200 張即可有效果

💡 資料多樣性比數量更重要:涵蓋不同光線、角度、背景、遮擋情況。

🗂️ 資料蒐集方法


圖:資料蒐集四大常用方法 ─ 公開資料集、批次下載、自行拍攝、從影片截取影格

方法一:公開資料集

最快速且品質穩定的方式,適合快速驗證想法或作為預訓練基礎。

資料集 說明 適用任務
ImageNet 1000+ 類別,百萬級圖片 圖片分類
COCO 80 類別,含偵測與分割標註 物件偵測、分割
Open Images Google 提供,600+ 類別 偵測、分類
PASCAL VOC 20 類別,經典偵測資料集 物件偵測
Kaggle Datasets 社群上傳,涵蓋各領域 各類任務
Roboflow Universe 提供大量已標註的視覺資料集 偵測、分割

方法二:使用 Python 批次下載圖片

可透過 icrawler 套件從 Bing 批次下載圖片。

⚠️ GoogleImageCrawler 因 Google 改版目前已無法使用,請改用 BingImageCrawler

1
pip install icrawler
1
2
3
4
5
# download_images.py
from icrawler.builtin import BingImageCrawler

crawler = BingImageCrawler(storage={"root_dir": "dataset/cat"})
crawler.crawl(keyword="cat", max_num=200)


圖:使用 BingImageCrawler 批次下載圖片至本地資料夾

⚠️ 注意版權問題,建議使用 Creative Commons 授權圖片,或僅用於研究與學習目的。

方法三:使用 OpenCV 自行拍攝

透過攝影機即時拍攝,按空白鍵存圖、按 q 離開。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# capture_from_camera.py
import cv2
import os

save_dir = "dataset/camera"
os.makedirs(save_dir, exist_ok=True)

cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("❌ 無法開啟攝影機")
exit()
count = 0

print("按下空白鍵拍照,按 q 離開")

while True:
ret, frame = cap.read()
if not ret:
break

cv2.imshow("Capture", frame)
key = cv2.waitKey(1) & 0xFF

if key == ord(' '):
filename = os.path.join(save_dir, f"{count:04d}.jpg")
cv2.imwrite(filename, frame)
print(f"已儲存:{filename}")
count += 1
elif key == ord('q'):
break

cap.release()
cv2.destroyAllWindows()


圖:按空白鍵從攝影機拍照並儲存至資料集

註:由於本身沒有攝影鏡頭,所以無法示範效果。

方法四:從影片中截取影格

若已有錄製好的影片,可自動截取每隔 N 幀的影像。

🎨 範例影片:

  • 來源:Pexels - Highway Video,屬於無版權影片,可自由下載與使用。
  • 內容:影片為高速公路的畫面,長度約 3 秒,畫面中有大量交通工具,非常適合用來資料蒐集。
  • 下載後將檔名改為 highway.mp4,放到專案的 assets/ 目錄下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# extract_frames.py
import cv2
import os

video_path = "assets/highway.mp4"
save_dir = "dataset/car"
os.makedirs(save_dir, exist_ok=True)

cap = cv2.VideoCapture(video_path)
if not cap.isOpened():
print(f"❌ 無法開啟影片:{video_path}")
exit()
frame_interval = 10 # 每隔 10 幀截取一張
count = 0
saved = 0

while True:
ret, frame = cap.read()
if not ret:
break
if count % frame_interval == 0:
filename = os.path.join(save_dir, f"{saved:04d}.jpg")
cv2.imwrite(filename, frame)
saved += 1
count += 1

cap.release()
print(f"共截取 {saved} 張影格")


圖:從影片中每隔 N 幀截取一張影格並儲存

⚠️ 注意事項

  • 版權問題:商業用途需確認授權,避免使用有版權限制的圖片。
  • 資料隱私:若涉及人臉或個人資訊,需遵守當地法規(如 GDPR)。
  • 訓練/驗證集分離:兩者資料絕不能重疊。
  • 類別均衡:若某類別資料太少,可透過資料增強補足。

🎯 結語

以上介紹了四種常見的資料蒐集方式,可依場景需求搭配使用。
方法四的基礎截幀腳本雖然簡單,但實際使用時會遇到模糊幀與重複幀的問題。

下一篇進入 影片資料集建立與品質檢查,介紹如何自動過濾這兩類問題,以及如何掃描並清除損壞的圖片。

📖 如在學習過程中遇到疑問,或是想了解更多相關主題,建議回顧一下 Python | OpenCV 系列導讀,掌握完整的章節目錄,方便快速找到你需要的內容。

註:以上參考了
OpenCV 官方文件 — Tutorials
COCO Dataset
Roboflow Universe
icrawler GitHub