| 
 | 
 
 
GitHub Source Code 
原文文章 
 
演示圖: 
 
Python  OpenCV 自定義 辨識物件 
 
 
成功辨識出貓  
 
Python  OpenCV 自定義 辨識物件 
 
 
人類不會辨識出來  
 
本文分為兩部分: 
1.圖片的取得與資料建立 
2.辨識模型的訓練  
1.下載ImageNet圖片到neg資料夾 
- # (本案例下載1131張)
 
 -  
 
 - import urllib.request
 
 - import cv2
 
 - import os
 
 -  
 
 - # 創建圖片保存目錄
 
 - if not os.path.exists('neg'):
 
 -     os.makedirs('neg')
 
 -  
 
 - neg_img_url = ['http://image-net.org/api/text/imagenet.synset.geturls?wnid=n02123159']
 
 -  
 
 - urls = ''
 
 - for img_url in neg_img_url:
 
 -     urls += urllib.request.urlopen(img_url).read().decode()
 
 -  
 
 - img_index = 1
 
 - for url in urls.split('\n'):
 
 -     try:
 
 -         print(url)
 
 -         urllib.request.urlretrieve(url, 'neg/'+str(img_index)+'.jpg')
 
 -         # 把圖片轉為灰度圖片
 
 -         gray_img = cv2.imread('neg/'+str(img_index)+'.jpg', cv2.IMREAD_GRAYSCALE)
 
 -         # 更改圖像大小
 
 -         image = cv2.resize(gray_img, (150, 150))
 
 -         # 保存圖片
 
 -         cv2.imwrite('neg/'+str(img_index)+'.jpg', image)
 
 -         img_index += 1
 
 -     except Exception as e:
 
 -         print(e)
 
 -  
 
 - # 判斷兩張圖片是否完全一樣
 
 - def is_same_image(img_file1, img_file2):
 
 -     img1 = cv2.imread(img_file1)
 
 -     img2 = cv2.imread(img_file2)
 
 -     if img1.shape == img2.shape and not (np.bitwise_xor(img1, img2).any()):
 
 -         return True
 
 -     else:
 
 -         return False
 
 -  
 
 - # 去除重複圖片
 
 - """
 
 - file_list = os.listdir('neg')
 
 - try:
 
 -     for img1 in file_list:
 
 -         for img2 in file_list:
 
 -             if img1 != img2:
 
 -                 if is_same_image('neg/'+img1, 'neg/'+img2) is True:
 
 -                     print(img1, img2)
 
 -                     os.remove('neg/'+img1)
 
 -         file_list.remove(img1)
 
 - except Exception as e:
 
 -     print(e)
 
 - """
 
  複製代碼 
建立圖片列表文件(neg.txt) 
- import os
 
 - import numpy as np
 
 -  
 
 - with open('neg.txt', 'w') as f:
 
 -     for img in os.listdir('neg'):
 
 -         line = 'neg/'+img+'\n'
 
 -         f.write(line)
 
  複製代碼 
2.安裝OpenCV(3.4.6) 
- https://sourceforge.net/projects/opencvlibrary/files/3.4.6/opencv-3.4.6-vc14_vc15.exe/download
 
 - #解壓縮至相關目錄(目錄名稱為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越少,訓練時間越短 
# 此步驟需花上較常時間進行訓練  
Python  OpenCV 自定義 辨識物件 
 
 
本次花了25分2秒在訓練模型上 
 
 
測試分類器 
- import cv2
 
 - cat_haar = cv2.CascadeClassifier(r"D:\opencv\build\x64\vc14\bin\data\cascade.xml")
 
 - # 讀取圖片
 
 - img = cv2.imread('cat.jpg')
 
 - # 轉成灰階圖片
 
 - gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 
 - cat = cat_haar.detectMultiScale(gray, 1.06, 1,minSize=(50, 50))
 
 - # 繪製貓的方框
 
 - for (x, y, w, h) in cat:
 
 -     cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
 
 - # 顯示成果
 
 - cv2.namedWindow('img', cv2.WINDOW_NORMAL)  #正常視窗大小
 
 - cv2.imshow('img', img)                     #秀出圖片
 
 - cv2.waitKey(0)                             #等待按下任一按鍵
 
 - cv2.destroyAllWindows()                    #關閉視窗
 
  複製代碼 
 
文章出處  
網頁設計,網站架設 ,網路行銷,網頁優化,SEO - NetYea 網頁設計  
 |   
 
 
 
 |