日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

【Python4】字符分割识别,车牌识别矫正,移动物检测,Caffe_SSD三字码识别,ckpt文件转pb文件,人脸检测与识别

發布時間:2024/4/24 python 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Python4】字符分割识别,车牌识别矫正,移动物检测,Caffe_SSD三字码识别,ckpt文件转pb文件,人脸检测与识别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1.字符分割識別
  • 2.車牌識別矯正
    • 2.1 車牌識別項目安裝
    • 2.2 車牌矯正的方法
  • 3.移動物檢測
    • 3.1 幀間差分法
    • 3.2 相機捕捉照片
    • 3.3 MindVision品牌的相機
    • 3.4 無品牌相機,大多數有相機的電腦
  • 4.Caffe_SSD三字碼識別
    • 4.1 check List
    • 4.2 正式安裝
  • 5.ckpt轉pb文件(fasterrcnn)
  • 6.人臉檢測識別
    • 6.1 MTCNN(人臉檢測)
    • 6.2 FaceNet(人臉識別)


1.字符分割識別

import cv2 #1111111111111111、讀取圖像,并把圖像轉換為灰度圖像并顯示 img = cv2.imread("D:/xunlei/2.png") # 讀取圖片 img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 轉換了灰度化 cv2.imshow('gray', img_gray) # 顯示圖片 cv2.waitKey(0)#1111111111111112、將灰度圖像二值化,設定閾值是100 img_thre = img_gray cv2.threshold(img_gray, 100, 255, cv2.THRESH_BINARY_INV, img_thre) cv2.imshow('threshold', img_thre) cv2.waitKey(0)#111111111111111113、保存黑白圖片 cv2.imwrite('thre_res.png', img_thre)#11111111111111114、分割字符 white = [] # 記錄每一列的白色像素總和 black = [] # ..........黑色....... height = img_thre.shape[0] width = img_thre.shape[1] white_max = 0 black_max = 0 # 計算每一列的黑白色像素總和 for i in range(width):s = 0 # 這一列白色總數t = 0 # 這一列黑色總數for j in range(height):if img_thre[j][i] == 255:s += 1if img_thre[j][i] == 0:t += 1white_max = max(white_max, s)black_max = max(black_max, t)white.append(s)black.append(t)print(s)print(t) arg = False # False表示白底黑字;True表示黑底白字 if black_max > white_max:arg = True# 分割圖像 def find_end(start_):end_ = start_ + 1for m in range(start_ + 1, width - 1):if (black[m] if arg else white[m]) > (0.95 * black_max if arg else 0.95 * white_max): # 0.95這個參數請多調整,對應下面的0.05end_ = mbreakreturn end_n = 1 start = 1 end = 2 while n < width - 2:n += 1if (white[n] if arg else black[n]) > (0.05 * white_max if arg else 0.05 * black_max):# 上面這些判斷用來辨別是白底黑字還是黑底白字# 0.05這個參數請多調整,對應上面的0.95start = nend = find_end(start)n = endif end - start > 5:cj = img_thre[1:height, start:end]cv2.imshow('caijian', cj)cv2.waitKey(0)



2.車牌識別矯正

2.1 車牌識別項目安裝

1.git clone 最新的文檔

cd /opt/deploy git clone https://github.com/sergiomsilva/alpr-unconstrained.git

2.下載預訓練模型

cd alpr-unconstrained/bash get-networks.sh

3.刪除項目自帶 Darknet 替換為官方自帶darknet

rm -rf darknet git clone https://github.com/pjreddie/darknet

4.更改官方darknet 支持gpu 并且 make 由于我的cudn 驅動裝在了默認位置 所以 我只需要 更改三處即可

cd darknet/ vim Makefile將第12行的 已支持GPU GPU=0 CUDNN=0 修改成: GPU=1 CUDNN=124行的 支持 cudnn NVCC=nvcc 修改成: NVCC=/usr/local/cuda/bin/nvcc:wq

5.編譯

make all -j6 根據自己核數調整

6.重新進入主目錄

cd /opt/alpr-unconstrained cp -R data/* darknet/data/

7.更改names文件

vim data/ocr/ocr-net.names 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N P Q R S T U V W X Y Z 京 滬 津 渝 冀 晉 蒙 遼 吉 黑 蘇 浙 皖 閩 贛 魯 豫 鄂 湘 粵 桂 瓊 川 貴 云 藏 陜 甘 青 寧 新

8.修改對應的類 訓練文件所在的位置

vim data/ocr/ocr-net.dataclasses=66 names=data/ocr/ocr-net.names train=data/ocr/train.txt backup=data/ocr/output

9.創建output 目錄

mkdir -p data/ocr/output

10.修改CFG網絡層的層數和訓練參數

cp /opt/deploy/darknet/cfg/yolov3.cfg data/ocr/ocr-net.cfgvim data/ocr/ocr-net.cfg 據自己GPU 和內存來指定 cfg 部分訓練的時候將第34行的 已支持GPU batch=64 subdivisions=4[net] # Testing # batch=1 # subdivisions=1 # Trainingbatch=64subdivisions=8......[convolutional] size=1 stride=1 pad=1 filters=33###75activation=linear[yolo] mask = 6,7,8 anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 classes=6###20 num=9 jitter=.3 ignore_thresh = .5 truth_thresh = 1 random=0###1......[convolutional] size=1 stride=1 pad=1 filters=33###75 activation=linear[yolo] mask = 3,4,5 anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 classes=6###20 num=9 jitter=.3 ignore_thresh = .5 truth_thresh = 1 random=0###1......[convolutional] size=1 stride=1 pad=1 filters=33###75 activation=linear[yolo] mask = 0,1,2 anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 classes=6###20 num=9 jitter=.3 ignore_thresh = .5 truth_thresh = 1 random=0###1 ———————————— filters數目是怎么計算的:3x(classes數目+5),和聚類數目分布有關,論文中有說明; 比如說我有66類 那么 3*66+5=213

2.2 車牌矯正的方法




def findContoursAndDrawBoundingBox(image_rgb): #部分源代碼(我加了點注釋) 參考:https://github.com/zeusees/HyperLPRline_upper = [];line_lower = []; line_experiment = []grouped_rects = []gray_image = cv2.cvtColor(image_rgb,cv2.COLOR_BGR2GRAY)# for k in np.linspace(-1.5, -0.2,10):for k in np.linspace(-50, 0, 15): # thresh_niblack = threshold_niblack(gray_image, window_size=21, k=k)# binary_niblack = gray_image > thresh_niblack# binary_niblack = binary_niblack.astype(np.uint8) * 255# 當一幅圖像上的不同部分具有不同亮度時,我們需要采用自適應閾值.此時的閾值是根據圖像上的每一個小區域計算與其# 對應的閾值.因此,在同一幅圖像上的不同區域采用的是不同的閾值,從而使我們能在亮度不同的情況下得到更好的結果."""Args:- src, 原圖像,應該是灰度圖- x, 指當像素值高于(有時是低于)閾值時應該被賦予新的像素值, 255是白色- adaptive_method, CV_ADAPTIVE_THRESH_MEAN_C 或 CV_ADAPTIVE_THRESH_GAUSSIAN_C- threshold_type: 指取閾值類型. CV_THRESH_BINARY, 二進制閾值化. CV_THRESH_BINARY_INV, 反二進制閾值化- block_size: 用來計算閾值的像素鄰域大小(塊大小):3,5,7,...- param1: 指與方法有關的參數.對方法CV_ADAPTIVE_THRESH_MEAN_C和CV_ADAPTIVE_THRESH_GAUSSIAN_C,它是一個從均值或加權均值提取的常數,盡管它可以是負數。. 對方法 CV_ADAPTIVE_THRESH_MEAN_C,先求出塊中的均值,再減掉param1。. 對方法 CV_ADAPTIVE_THRESH_GAUSSIAN_C ,先求出塊中的加權和(gaussian), 再減掉param1。"""binary_niblack = cv2.adaptiveThreshold(gray_image,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,17,k) #鄰域大小17是不是太大了??#cv2.imshow("image1",binary_niblack)#cv2.waitKey(0)#imagex, contours, hierarchy = cv2.findContours(binary_niblack.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)contours, hierarchy = cv2.findContours(binary_niblack.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) # modified by bigzfor contour in contours:#用一個最小的矩形,把找到的形狀包起來bdbox = cv2.boundingRect(contour)if (bdbox[3]/float(bdbox[2])>0.7 and bdbox[3]*bdbox[2]>100 and bdbox[3]*bdbox[2]<1200) or (bdbox[3]/float(bdbox[2])>3 and bdbox[3]*bdbox[2]<100):# cv2.rectangle(rgb,(bdbox[0],bdbox[1]),(bdbox[0]+bdbox[2],bdbox[1]+bdbox[3]),(255,0,0),1)line_upper.append([bdbox[0],bdbox[1]])line_lower.append([bdbox[0]+bdbox[2],bdbox[1]+bdbox[3]])line_experiment.append([bdbox[0],bdbox[1]])line_experiment.append([bdbox[0]+bdbox[2],bdbox[1]+bdbox[3]])# grouped_rects.append(bdbox)"""想為圖像周圍建一個邊使用訪函數,這經常在卷積運算或0填充時被用到Args:- src: 輸入圖像- top,bottom,left,right 對應邊界的像素數目- borderType: 要添加哪種類型的邊界- BORDER_CONSTANT #邊緣填充用固定像素值,比如填充黑邊,就用0,白邊255- BORDER_REPLICATE #用原始圖像相應的邊緣的像素去做填充,看起來有一種把圖像邊緣"拉糊了"的效果"""rgb = cv2.copyMakeBorder(image_rgb,30,30,0,0,cv2.BORDER_REPLICATE)leftyA, rightyA = fitLine_ransac(np.array(line_lower),3)rows,cols = rgb.shape[:2]# rgb = cv2.line(rgb, (cols - 1, rightyA), (0, leftyA), (0, 0, 255), 1,cv2.LINE_AA)leftyB, rightyB = fitLine_ransac(np.array(line_upper),-3)rows,cols = rgb.shape[:2]# rgb = cv2.line(rgb, (cols - 1, rightyB), (0, leftyB), (0,255, 0), 1,cv2.LINE_AA)pts_map1 = np.float32([[cols - 1, rightyA], [0, leftyA],[cols - 1, rightyB], [0, leftyB]])pts_map2 = np.float32([[136,36],[0,36],[136,0],[0,0]])mat = cv2.getPerspectiveTransform(pts_map1,pts_map2)image = cv2.warpPerspective(rgb,mat,(136,36),flags=cv2.INTER_CUBIC)#校正角度#cv2.imshow("校正前",image)#cv2.waitKey(0)image,M = deskew.fastDeskew(image)#cv2.imshow("校正后",image)#cv2.waitKey(0)return image

3.移動物檢測

3.1 幀間差分法

1.使用opencv展示圖像

import cv2 def cv2_display(image_ndarray):windowName = 'display'cv2.imshow(windowName, image_ndarray)# 按Esc鍵或者q鍵可以退出循環pressKey = cv2.waitKey(0)if 27 == pressKey or ord('q') == pressKey:cv2.destroyAllWindows()

2.加載2張圖片文件為圖像數據

image_ndarray_1 = cv2.imread('../resources/1.jpg') image_ndarray_2 = cv2.imread('../resources/2.jpg')

2.1 展示原始圖像數據

# 按Esc鍵或者q鍵可以退出cv2顯示窗口 cv2_display(image_ndarray_1) cv2_display(image_ndarray_2)

3.圖像處理

def get_processedImage(image_ndarray):# 對拍攝圖像進行圖像處理,先轉灰度圖,再進行高斯濾波。image_ndarray_1 = cv2.cvtColor(image_ndarray, cv2.COLOR_BGR2GRAY)# 用高斯濾波對圖像處理,避免亮度、震動等參數微小變化影響效果filter_size = 7image_ndarray_2 = cv2.GaussianBlur(image_ndarray_1, (filter_size, filter_size), 0)return image_ndarray_2 image_ndarray_1_2 = get_processedImage(image_ndarray_1) image_ndarray_2_2 = get_processedImage(image_ndarray_2)

3.1 展示處理后的圖像數據

cv2_display(image_ndarray_1_2) # 展示處理后的圖像數據 cv2_display(image_ndarray_2_2)

4.圖像相減

absdiff_ndarray = cv2.absdiff(image_ndarray_1_2, image_ndarray_2_2) cv2_display(absdiff_ndarray) # 展示相減后的圖像數據

5.圖像二值化

result_1 = cv2.threshold(absdiff_ndarray, 25, 255, cv2.THRESH_BINARY) type(result_1) # 輸出tuple len(result_1) # 輸出2 type(result_1[0]) # 輸出float result_1[0] # 輸出25.0 type(result_1[1]) # 輸出numpy.ndarray result_1[1].shape # 輸出(960, 1280) cv2_display(result_1[1]) threshhold_ndarray = result_1[1]

5.1 顯示二值化后的圖像

cv2_display(threshhold_ndarray)

6.獲取輪廓列表,并做響應操作

contour_list = cv2.findContours(threshhold_ndarray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0] import datetime image_ndarray_3 = image_ndarray_2.copy() for contour in contour_list:# 對于較小矩形區域,選擇忽略if cv2.contourArea(contour) < 2000:continueelse:x1, y1, w, h = cv2.boundingRect(contour)x2, y2 = x1 + w, y1 + hleftTop_coordinate = x1, y1rightBottom_coordinate = x2, y2bgr_color = (0, 0, 255)thickness = 2cv2.rectangle(image_ndarray_3, leftTop_coordinate, rightBottom_coordinate, bgr_color, thickness)text = "Find motion object! x=%d, y=%d" %(x1, y1)print(text) cv2.putText(image_ndarray_3, text, (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, bgr_color, thickness) time_string = datetime.datetime.now().strftime("%A %d %B %Y %I:%M:%S%p") _ = cv2.putText(image_ndarray_3, time_string, (10, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, bgr_color, thickness)


6.1 根據輪廓繪制方框后,顯示圖像

cv2_display(image_ndarray_3)

3.2 相機捕捉照片

# 導入常用的庫 import os import cv2 # 導入MindVision品牌的相機庫mvsdk import mvsdk# 相機持續拍攝并保存照片 def get_capturedImage(imageFilePath=None):if not imageFilePath:imageFilePath = '../resources/temp.jpg'device_list = mvsdk.CameraEnumerateDevice()if len(device_list) == 0:return Nonedevice_info = device_list[0]cameraIndex = mvsdk.CameraInit(device_info, -1, -1)capability = mvsdk.CameraGetCapability(cameraIndex)mvsdk.CameraSetTriggerMode(cameraIndex, 0)# 加載相機配置文件configFilePath = '../resources/camera.Config'assert os.path.exists(configFilePath), 'please check if exists %s'%configFilePathmvsdk.CameraReadParameterFromFile(cameraIndex, configFilePath)# 獲取相機拍攝照片的預處理mvsdk.CameraPlay(cameraIndex)FrameBufferSize = capability.sResolutionRange.iWidthMax * capability.sResolutionRange.iHeightMax * 3FrameBuffer_address = mvsdk.CameraAlignMalloc(FrameBufferSize, 16)RawData, FrameHead = mvsdk.CameraGetImageBuffer(cameraIndex, 2000)mvsdk.CameraImageProcess(cameraIndex, RawData, FrameBuffer_address, FrameHead)mvsdk.CameraReleaseImageBuffer(cameraIndex, RawData)# 把文件路徑轉換為絕對文件路徑imageFilePath_1 = os.path.abspath(imageFilePath)status = mvsdk.CameraSaveImage(cameraIndex, imageFilePath_1, FrameBuffer_address, FrameHead, mvsdk.FILE_JPG, 100)if status != mvsdk.CAMERA_STATUS_SUCCESS:print('ID為%d的相機拍攝并保存照片失敗!!!')is_successful = Falseelse:print('ID為%d的相機保存照片至路徑:%s' %(cameraIndex, imageFilePath_1))is_successful = True# 關閉相機、釋放幀緩存mvsdk.CameraUnInit(cameraIndex)mvsdk.CameraAlignFree(FrameBuffer_address)

3.3 MindVision品牌的相機

import os import cv2 # 導入MindVision品牌的相機庫mvsdk import mvsdk# 相機持續拍攝并保存照片 # 如果沒有使用MindVision品牌相機,需要修改此函數內容 def get_capturedImage(cameraIndex):imageFilePath = '../resources/temp.jpg'capability = mvsdk.CameraGetCapability(cameraIndex)mvsdk.CameraSetTriggerMode(cameraIndex, 0)# 加載相機配置文件configFilePath = '../resources/camera.Config'assert os.path.exists(configFilePath), 'please check if exists %s'%configFilePathmvsdk.CameraReadParameterFromFile(cameraIndex, configFilePath)# 獲取相機拍攝照片的預處理mvsdk.CameraPlay(cameraIndex)frameBufferSize = capability.sResolutionRange.iWidthMax * capability.sResolutionRange.iHeightMax * 3frameBufferAddress = mvsdk.CameraAlignMalloc(frameBufferSize, 16)rawData, frameHead = mvsdk.CameraGetImageBuffer(cameraIndex, 2000)mvsdk.CameraImageProcess(cameraIndex, rawData, frameBufferAddress, frameHead)mvsdk.CameraReleaseImageBuffer(cameraIndex, rawData)# 把文件路徑轉換為絕對文件路徑imageFilePath_1 = os.path.abspath(imageFilePath)status = mvsdk.CameraSaveImage(cameraIndex, imageFilePath_1, frameBufferAddress, frameHead, mvsdk.FILE_JPG, 100)if status != mvsdk.CAMERA_STATUS_SUCCESS:print('ID為%d的相機拍攝并保存照片失敗!!!')is_successful = Falseelse:is_successful = Trueimage_ndarray = cv2.imread(imageFilePath) if is_successful else Nonereturn image_ndarray# 對拍攝圖像進行圖像處理,先轉灰度圖,再進行高斯濾波。 def get_processedImage(image_ndarray):image_ndarray_1 = cv2.cvtColor(image_ndarray, cv2.COLOR_BGR2GRAY)# 用高斯濾波對圖像處理,避免亮度、震動等參數微小變化影響效果filter_size = 15image_ndarray_2 = cv2.GaussianBlur(image_ndarray_1, (filter_size, filter_size), 0)return image_ndarray_2# 獲取表示當前時間的字符串 import time def get_timeString():now_timestamp = time.time()now_structTime = time.localtime(now_timestamp)timeString_pattern = '%Y %m %d %H:%M:%S'now_timeString = time.strftime(timeString_pattern, now_structTime)return now_timeString# 根據兩張圖片的不同,在第2張圖上繪制不同位置的方框、日期時間 def get_drawedDetectedImage(first_image_ndarray, second_image_ndarray):if second_image_ndarray is None or first_image_ndarray is None:return Nonefirst_image_ndarray_2 = get_processedImage(first_image_ndarray)second_image_ndarray_2 = get_processedImage(second_image_ndarray)# cv2.absdiff表示計算2個圖像差值的絕對值absdiff_ndarray = cv2.absdiff(first_image_ndarray_2, second_image_ndarray_2)# cv2.threshold表示設定閾值做圖像二值化threshold_ndarray = cv2.threshold(absdiff_ndarray, 25, 255, cv2.THRESH_BINARY)[1]# cv2.dilate表示圖像膨脹dilate_ndarray = cv2.dilate(threshold_ndarray, None, iterations=2)# cv2.findContours表示找出圖像中的輪廓contour_list = cv2.findContours(threshold_ndarray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]copy_image_ndarray = second_image_ndarray.copy()for contour in contour_list:if cv2.contourArea(contour) < 2000:continueelse:x1, y1, w, h = cv2.boundingRect(contour)x2, y2 = x1 + w, y1 + hleftTop_coordinate = x1, y1rightBottom_coordinate = x2, y2bgr_color = (0, 0, 255)thickness = 2cv2.rectangle(copy_image_ndarray, leftTop_coordinate, rightBottom_coordinate, bgr_color, thickness)time_string = get_timeString()text = '在時刻%s 發現運動物體! x=%d, y=%d' %(time_string, x1, y1)print(text)time_string = get_timeString()bgr_color = (0, 0, 255)thickness = 2cv2.putText(copy_image_ndarray, time_string, (10,50), cv2.FONT_HERSHEY_SIMPLEX, 1, bgr_color, thickness)return copy_image_ndarray# 使用cv2庫展示圖片 def show_image(image_ndarray): windowName = 'display'cv2.imshow(windowName, image_ndarray)# 主函數 from sys import exit if __name__ == '__main__':# 獲取相機設備的信息device_list = mvsdk.CameraEnumerateDevice()if len(device_list) == 0:print('沒有連接MindVision品牌的相機設備')exit()device_info = device_list[0]cameraIndex = mvsdk.CameraInit(device_info, -1, -1)# 開始用相機監控first_image_ndarray = Nonewhile True:second_image_ndarray = get_capturedImage(cameraIndex)drawed_image_ndarray = get_drawedDetectedImage(first_image_ndarray, second_image_ndarray)if drawed_image_ndarray is not None:show_image(drawed_image_ndarray)# 在展示圖片后,等待1秒,接收按鍵pressKey = cv2.waitKey(1)# 按Esc鍵或者q鍵可以退出循環if 27 == pressKey or ord('q') == pressKey:cv2.destroyAllWindows() break# 隨著時間推移,當前幀作為下一幀的前一幀first_image_ndarray = second_image_ndarray# 關閉相機mvsdk.CameraUnInit(cameraIndex)

3.4 無品牌相機,大多數有相機的電腦

# 導入常用的庫 import cv2 import time import os# 對拍攝圖像進行圖像處理,先轉灰度圖,再進行高斯濾波。 def get_processedImage(image_ndarray):image_ndarray_1 = cv2.cvtColor(image_ndarray, cv2.COLOR_BGR2GRAY)# 用高斯濾波對圖像處理,避免亮度、震動等參數微小變化影響效果filter_size = 21image_ndarray_2 = cv2.GaussianBlur(image_ndarray_1, (filter_size, filter_size), 0)return image_ndarray_2# 獲取表示當前時間的字符串 import time def get_timeString():now_timestamp = time.time()now_structTime = time.localtime(now_timestamp)timeString_pattern = '%Y %m %d %H:%M:%S'now_timeString = time.strftime(timeString_pattern, now_structTime)return now_timeString# 根據兩張圖片的不同,在第2張圖上繪制不同位置的方框、日期時間 def get_drawedDetectedImage(first_image_ndarray, second_image_ndarray):if second_image_ndarray is None or first_image_ndarray is None:return Nonefirst_image_ndarray_2 = get_processedImage(first_image_ndarray)second_image_ndarray_2 = get_processedImage(second_image_ndarray)# cv2.absdiff表示計算2個圖像差值的絕對值absdiff_ndarray = cv2.absdiff(first_image_ndarray_2, second_image_ndarray_2)# cv2.threshold表示設定閾值做圖像二值化threshold_ndarray = cv2.threshold(absdiff_ndarray, 25, 255, cv2.THRESH_BINARY)[1]# cv2.dilate表示圖像膨脹dilate_ndarray = cv2.dilate(threshold_ndarray, None, iterations=2)# cv2.findContours表示找出圖像中的輪廓contour_list = cv2.findContours(threshold_ndarray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]copy_image_ndarray = second_image_ndarray.copy()height, width, _ = copy_image_ndarray.shapecontour_minArea = int(height * width * 0.001)for contour in contour_list:if cv2.contourArea(contour) < contour_minArea:continueelse:x1, y1, w, h = cv2.boundingRect(contour)x2, y2 = x1 + w, y1 + hleftTop_coordinate = x1, y1rightBottom_coordinate = x2, y2bgr_color = (0, 0, 255)thickness = 2cv2.rectangle(copy_image_ndarray, leftTop_coordinate, rightBottom_coordinate, bgr_color, thickness)time_string = get_timeString()text = '在時刻%s 發現移動物體! x=%d, y=%d' %(time_string, x1, y1)print(text)time_string = get_timeString()bgr_color = (0, 0, 255)thickness = 2cv2.putText(copy_image_ndarray, time_string, (10,50), cv2.FONT_HERSHEY_SIMPLEX, 1, bgr_color, thickness)return copy_image_ndarray# 主函數 from sys import exit if __name__ == '__main__':cameraIndex = 0# 實例化視頻流對象camera = cv2.VideoCapture(cameraIndex)is_successful, first_image_ndarray = camera.read()if not is_successful:print("相機未成功連接,可能原因:1.相機不支持cv2庫直接調用;2.如果有多個相機,設置正確的cameraIndex")exit()while True:is_successful, second_image_ndarray = camera.read()windowName = 'cv2_display'drawed_image_ndarray = get_drawedDetectedImage(first_image_ndarray, second_image_ndarray)cv2.imshow(windowName, drawed_image_ndarray)# 在展示圖片后,等待1秒,接收按鍵pressKey = cv2.waitKey(1)# 按Esc鍵或者q鍵可以退出循環if 27 == pressKey or ord('q') == pressKey:cv2.destroyAllWindows() break# 隨著時間推移,當前幀作為下一幀的前一幀first_image_ndarray = second_image_ndarray # 關閉相機camera.release()


如下Opencv4的DNN模塊

如下Net,String都是類。訓練用深度學習框架(關心各個層的權重),推理用opencv(只需要知道輸入輸出,并解析輸出獲得結果)







4.Caffe_SSD三字碼識別

4.1 check List

1.檢查 CUDA nvcc -V環境是否安裝正常 如果不正常則去安裝 NVIDIA ,CUDA ,CUDNN (版本搭配)

nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2019 NVIDIA Corporation Built on Sun_Jul_28_19:07:16_PDT_2019 Cuda compilation tools, release 10.1, V10.1.243

2.sudo ldconfig 檢查是否有軟連接沒有生效

4.2 正式安裝

1.依賴解決:

sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compilersudo apt-get install --no-install-recommends libboost-all-devsudo apt-get install libopenblas-dev liblapack-dev libatlas-base-devsudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-devsudo apt-get install git cmake build-essential

從源代碼編譯Opencv,進入官網 : http://opencv.org/releases.html , 下載 3.x系列 解壓到你要安裝的位置,命令行進入已解壓的文件夾

mkdir build # 創建編譯的文件目錄cd buildcmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..make -j8 #編譯 注意自己的核數

在執行 make -j8 命令編譯到 92% 時可能會出現以下錯誤,是由于opecv3.1與cuda8.0不兼容導致的。解決辦法:修改 /opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp 文件內容,如圖:

編譯成功后安裝:sudo make install
安裝完成后通過查看 opencv 版本驗證是否安裝成功:pkg-config --modversion opencv

2.安裝caffe-SSD

git clone https://github.com/weiliu89/caffe.git cd caffe git checkout ssd

再次檢查依賴

sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler sudo apt-get install --no-install-recommends libboost-all-dev sudo apt-get install libatlas-base-dev python-dev sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev

3.修改Makefile.config文件,復制一份的原因是編譯 caffe 時需要的是 Makefile.config 文件,而Makefile.config.example 只是caffe 給出的配置文件例子,不能用來編譯 caffe。

cp Makefile.config.example Makefile.config sudo vim Makefile.config

應用 cudnn

將第5行的 # 取消 #USE_CUDNN := 1 修改成: USE_CUDNN := 1

應用 opencv 版本

將第21行的 # 取消 #OPENCV_VERSION := 3 修改為: OPENCV_VERSION := 3

使用 python 接口

將第89行的 # 取消 #WITH_PYTHON_LAYER := 1 修改為 WITH_PYTHON_LAYER := 1

修改 python 路徑

92/93行的 代碼修改如下 INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib 修改為: INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial

注釋Python2 切換python3,代碼修改如下 否則會編譯Python.h and numpy/arrayobject.h. 出錯

67/68行的 實際行數稍微有些出路可能 PYTHON_INCLUDE := /usr/include/python2.7 \/usr/lib/python2.7/dist-packages/numpy/core/include 修改為: # PYTHON_INCLUDE := /usr/include/python2.7 \# /usr/lib/python2.7/dist-packages/numpy/core/include 77/78 行的 注釋解除 并更新 為Python3.6 實際行數稍微有些出路可能 # PYTHON_LIBRARIES := boost_python3 python3.5m# PYTHON_INCLUDE := /usr/include/python3.5m \# /usr/lib/python3.5/dist-packages/numpy/core/includePYTHON_LIBRARIES := boost_python3 python3.6mPYTHON_INCLUDE := /usr/include/python3.6m \/usr/lib/python3.6/dist-packages/numpy/core/include

如果最后提示不支持compute_20,就把這句刪掉,最后效果是
nvcc fatal : Unsupported gpu architecture ‘compute_20’
Makefile:588: recipe for target ‘.build_release/cuda/src/caffe/solvers/sgd_solver.o’ failed
make: *** [.build_release/cuda/src/caffe/solvers/sgd_solver.o] Error 1
make : ** * Waiting for unfinished jobs…

建議顯卡直接改成如下:
CUDA_ARCH := -gencode arch=compute_30,code=sm_30
-gencode arch=compute_35,code=sm_35
-gencode arch=compute_50,code=sm_50
-gencode arch=compute_52,code=sm_52
-gencode arch=compute_60,code=sm_60
-gencode arch=compute_61,code=sm_61
-gencode arch=compute_61,code=compute_61

然后修改caffe 目錄下的 Makefile 文件: 注意不是Makefile.config文件

sudo vim Makefile 將第409行 替換為如下 NVCCFLAGS +=-ccbin=$(CXX) -Xcompiler-fPIC $(COMMON_FLAGS) 替換為: NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS) 將:181行替換為如下 LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_hl hdf5 改為: LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial將:265行 替換如下(我的環境太新除了這個問題【可選項】當你出現了 .build_release/lib/libcaffe.so: undefined reference to `boost::re_detail_106501::put_mem_block(void*)')LIBRARIES += boost_thread stdc++ 改為: LIBRARIES += boost_thread stdc++ boost_regex

4.下載python 環境依賴包 :
去到caffe根目錄中的python目錄中運行 …/caffe/python
5.設置系統python環境 在末尾添加環境變量

vim ~/.bashrc export PYTHONPATH="/opt/build/caffe/python" # 此處為caffe 的rootdir 目錄 source ~/.bashrc

6.編譯caffe保存 開始編譯,在 caffe 目錄下執行 如果出錯 建議修改完畢使用 make clean 繼續Try

make all -j32 代表幾核并行編譯 請與自己電腦量力而行 后續將不再重復聲明哇 make test -j32 make pycaffe make runtest -j32

“/ usr / bin / ld:在Caffe編譯中找不到-lopenblas”錯誤
即使在克隆OpenBlas之后包括基本包,并且將在14.04和16中鏈接相應的庫。
apt install liblapack-dev liblapack3 libopenblas-base libopenblas-dev
apt install liblapack-dev liblapack3 libopenblas-base libopenblas-dev
到此 安裝caffe 結束
7.更改caffe 源碼: https://blog.csdn.net/sinat_14916279/article/details/56489601



安裝參考:https://blog.csdn.net/lukaslong/article/details/81390276

5.ckpt轉pb文件(fasterrcnn)

import tensorflow as tf from tensorflow.python.framework import graph_util from tensorflow.python import pywrap_tensorflowdef freeze_graph(input_checkpoint,output_graph):#指定輸出的節點名稱,該節點名稱必須是原模型中存在的節點。直接用最后輸出的節點,可以在tensorboard中查找到,tensorboard只能在linux中使用output_node_names = "SCORE/resnet_v1_101_5/cls_prob/cls_prob/scores,SCORE/resnet_v1_101_5/bbox_pred/BiasAdd/bbox_pred/scores,SCORE/resnet_v1_101_5/cls_pred/cls_pred/scores"saver = tf.train.import_meta_graph(input_checkpoint + '.meta', clear_devices=True) #通過 import_meta_graph 導入模型中的圖----1graph = tf.get_default_graph() #獲得默認的圖input_graph_def = graph.as_graph_def() #返回一個序列化的圖代表當前的圖with tf.Session() as sess:saver.restore(sess, input_checkpoint) #通過 saver.restore 從模型中恢復圖中各個變量的數據----2output_graph_def = graph_util.convert_variables_to_constants( #通過 graph_util.convert_variables_to_constants 將模型持久化----3sess=sess,input_graph_def=input_graph_def, #等于:sess.graph_defoutput_node_names=output_node_names.split(",")) #如果有多個輸出節點,以逗號隔開with tf.gfile.GFile(output_graph, "wb") as f: #保存模型f.write(output_graph_def.SerializeToString()) #序列化輸出print("%d ops in the final graph." % len(output_graph_def.node)) #得到當前圖有幾個操作節點input_checkpoint='./checkpoints/res101_faster_rcnn_iter_70000.ckpt' out_pb_path='./checkpoints/frozen_model.pb'reader = pywrap_tensorflow.NewCheckpointReader(input_checkpoint) var_to_shape_map = reader.get_variable_to_shape_map() for key in var_to_shape_map: # Print tensor name and valuesprint("tensor_name: ", key)#print(reader.get_tensor(key))freeze_graph(input_checkpoint, out_pb_path)

6.人臉檢測識別

6.1 MTCNN(人臉檢測)













訓練集:http://mmlab.ie.cuhk.edu.hk/archive/CNN_FacePoint.htm

6.2 FaceNet(人臉識別)








CASIA-WebFace數據集:鏈接:https://pan.baidu.com/s/1dYHmuTOShnXBE0xUfvdWxw 提取碼:7bap
訓練模型:鏈接:https://pan.baidu.com/s/1QaMS46EWB80EYLQ8p8a4kw 提取碼:cpfa








.dat文件鏈接:https://pan.baidu.com/s/1TPdqB0afWnIDh4T7d704Fg 提取碼:jxit

總結

以上是生活随笔為你收集整理的【Python4】字符分割识别,车牌识别矫正,移动物检测,Caffe_SSD三字码识别,ckpt文件转pb文件,人脸检测与识别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。