TShopping

 找回密碼
 註冊
搜索
查看: 38893|回復: 0
打印 上一主題 下一主題

[教學] Python 使用OpenCV自定義辨識物件

[複製鏈接]
跳轉到指定樓層
1#
發表於 2020-10-22 10:36:33 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
 
Push to Facebook
GitHub Source Code
原文文章

演示圖:



成功辨識出貓



人類不會辨識出來


本文分為兩部分:
1.圖片的取得與資料建立
2.辨識模型的訓練

1.下載ImageNet圖片到neg資料夾
  1. # (本案例下載1131張)

  2. import urllib.request
  3. import cv2
  4. import os

  5. # 創建圖片保存目錄
  6. if not os.path.exists('neg'):
  7.     os.makedirs('neg')

  8. neg_img_url = ['http://image-net.org/api/text/imagenet.synset.geturls?wnid=n02123159']

  9. urls = ''
  10. for img_url in neg_img_url:
  11.     urls += urllib.request.urlopen(img_url).read().decode()

  12. img_index = 1
  13. for url in urls.split('\n'):
  14.     try:
  15.         print(url)
  16.         urllib.request.urlretrieve(url, 'neg/'+str(img_index)+'.jpg')
  17.         # 把圖片轉為灰度圖片
  18.         gray_img = cv2.imread('neg/'+str(img_index)+'.jpg', cv2.IMREAD_GRAYSCALE)
  19.         # 更改圖像大小
  20.         image = cv2.resize(gray_img, (150, 150))
  21.         # 保存圖片
  22.         cv2.imwrite('neg/'+str(img_index)+'.jpg', image)
  23.         img_index += 1
  24.     except Exception as e:
  25.         print(e)

  26. # 判斷兩張圖片是否完全一樣
  27. def is_same_image(img_file1, img_file2):
  28.     img1 = cv2.imread(img_file1)
  29.     img2 = cv2.imread(img_file2)
  30.     if img1.shape == img2.shape and not (np.bitwise_xor(img1, img2).any()):
  31.         return True
  32.     else:
  33.         return False

  34. # 去除重複圖片
  35. """
  36. file_list = os.listdir('neg')
  37. try:
  38.     for img1 in file_list:
  39.         for img2 in file_list:
  40.             if img1 != img2:
  41.                 if is_same_image('neg/'+img1, 'neg/'+img2) is True:
  42.                     print(img1, img2)
  43.                     os.remove('neg/'+img1)
  44.         file_list.remove(img1)
  45. except Exception as e:
  46.     print(e)
  47. """
複製代碼

建立圖片列表文件(neg.txt)
  1. import os
  2. import numpy as np

  3. with open('neg.txt', 'w') as f:
  4.     for img in os.listdir('neg'):
  5.         line = 'neg/'+img+'\n'
  6.         f.write(line)
複製代碼

2.安裝OpenCV(3.4.6)
  1. https://sourceforge.net/projects/opencvlibrary/files/3.4.6/opencv-3.4.6-vc14_vc15.exe/download
  2. #解壓縮至相關目錄(目錄名稱為opencv)
複製代碼

複製步驟1.下載的圖片及文件
將neg資料夾、neg.txt、目標物圖片(例如:cat.jpg)
移動到X:\opencv\build\x64\vc14\bin
#在該資料夾中同時會看到
opencv_createsamples.exe和opencv_traincascade.exe

建立pos.txt文件
#開啟CMD,輸入以下指令,建立pos.txt文件
opencv_createsamples -img object.jpg -bg neg.txt -info pos.txt -maxxangle 0.5 -maxyangle -0.5 -maxzangle 0.5 -num 5000
#預設值為1000

object.jpg 訓練目標檔案

建立pos.vec文件
#開啟CMD,輸入以下指令,建立pos.vec文件
opencv_createsamples -info pos.txt -num 5000 -w 20 -h 30 -vec pos.vec
#若pos.txt為2000,則這邊的num也為同樣2000,依照pos.txt的值而訂

開始訓練辨識模型
#開啟CMD,輸入以下指令,先建立資料夾再訓練模型
mkdir data
opencv_traincascade -data data -vec pos.vec -bg neg.txt -numPos 1000 -numNeg 500 -numStages 20 -w 20 -h 30  
# numPos通常為numNeg的兩倍
# numPos和numNeg必須小於提供的neg照片數量
# Stages越少,訓練時間越短
# 此步驟需花上較常時間進行訓練


本次花了25分2秒在訓練模型上



測試分類器
  1. import cv2
  2. cat_haar = cv2.CascadeClassifier(r"D:\opencv\build\x64\vc14\bin\data\cascade.xml")
  3. # 讀取圖片
  4. img = cv2.imread('cat.jpg')
  5. # 轉成灰階圖片
  6. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  7. cat = cat_haar.detectMultiScale(gray, 1.06, 1,minSize=(50, 50))
  8. # 繪製貓的方框
  9. for (x, y, w, h) in cat:
  10.     cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
  11. # 顯示成果
  12. cv2.namedWindow('img', cv2.WINDOW_NORMAL)  #正常視窗大小
  13. cv2.imshow('img', img)                     #秀出圖片
  14. cv2.waitKey(0)                             #等待按下任一按鍵
  15. cv2.destroyAllWindows()                    #關閉視窗
複製代碼


文章出處


網頁設計,網站架設 ,網路行銷,網頁優化,SEO - NetYea 網頁設計



 

臉書網友討論
*滑块验证:
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2024-4-24 16:08 , Processed in 0.052490 second(s), 30 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表