# **影像辨識**
---
[TOC]
---
環境 : YOLOv4安裝環境
===
Installing Python(3.7.6)
---
*注意版本問題 版本會影響到後續的發展
https://www.python.org/downloads/windows/

因為我截圖前就先下載了

但一開始下載的結果應該是這樣

---
Git Installation (2.26.2)
---

---
CMAKE Installation(3.18.0)
---
*它是可以進行編譯的工具
下載 cmake-3.18.0-rc3-win64-x64
https://cmake.org/download/
---
Visual Studio Installation(2019)
---
*寫codeing可以用
下載 2019 版本
https://visualstudio.microsoft.com/zh-hant/downloads/
---
Updating GPU Drivers
---

---
CUDA Installation(10.2)
---

---
CUDnn Installation(7.6.5)
---

---
Open CV Installation (4.1.0)
---
https://opencv.org/opencv-4-1/

下載 https://github.com/opencv/opencv_contrib
新增 ”build” 資料夾

---
CMake
---
打開 CMake

按下方的 Configure 後

BUILD_opencv_world 要打勾

按下方的 Generate
跑完後出現這兩行就代表成功

---
Building OpenCV in Visual Studio
---
打開 ALL_BUILD.vcxproj

這兩個檔案要建置


建置成功後,測試OpenCV

沒有出現錯誤訊息,代表成功。
---
Downloading DarkNet
---
https://github.com/AlexeyAB/darknet

複製 C:\opencv\build\bin\Release 裡的


貼到 C:\Yolo_v4\darknet\build\darknet\x64 裡
---
Copying Open files into Darknet
---
複製 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\bin 裡的

貼到 C:\Yolo_v4\darknet\build\darknet\x64 裡
---
Changing the CuDNN version in Darknet
---
編輯 C:\Yolo_v4\darknet\build\darknet 裡的


把 CUDA 10.0 改成 CUDA 10.2

---
Compile YOLOv4 with updated CUDA version
---
打開  並建置
上方記得調整成 
---
Compiling Darknet
---
打開 

檔案按右鍵,屬性
新增 C:\opencv\build\install\include

移除 CUDNN_HALF

移除 compute_75,sm_75

新增 C:\opencv\build\install\x64\vc16\lib

---
Run YOLOv4 on Webcam
---

darknet_video_mod.py 利用現成程式碼做測試
```gherkin=
from ctypes import * # Import libraries
import math
import random
import os
import cv2
import numpy as np
import time
import darknet
def convertBack(x, y, w, h):
xmin = int(round(x - (w / 2)))
xmax = int(round(x + (w / 2)))
ymin = int(round(y - (h / 2)))
ymax = int(round(y + (h / 2)))
return xmin, ymin, xmax, ymax
def cvDrawBoxes(detections, img):
# Colored labels dictionary
color_dict = {
'person' : [0, 255, 255], 'bicycle': [238, 123, 158], 'car' : [24, 245, 217], 'motorbike' : [224, 119, 227],
'aeroplane' : [154, 52, 104], 'bus' : [179, 50, 247], 'train' : [180, 164, 5], 'truck' : [82, 42, 106],
'boat' : [201, 25, 52], 'traffic light' : [62, 17, 209], 'fire hydrant' : [60, 68, 169], 'stop sign' : [199, 113, 167],
'parking meter' : [19, 71, 68], 'bench' : [161, 83, 182], 'bird' : [75, 6, 145], 'cat' : [100, 64, 151],
'dog' : [156, 116, 171], 'horse' : [88, 9, 123], 'sheep' : [181, 86, 222], 'cow' : [116, 238, 87],'elephant' : [74, 90, 143],
'bear' : [249, 157, 47], 'zebra' : [26, 101, 131], 'giraffe' : [195, 130, 181], 'backpack' : [242, 52, 233],
'umbrella' : [131, 11, 189], 'handbag' : [221, 229, 176], 'tie' : [193, 56, 44], 'suitcase' : [139, 53, 137],
'frisbee' : [102, 208, 40], 'skis' : [61, 50, 7], 'snowboard' : [65, 82, 186], 'sports ball' : [65, 82, 186],
'kite' : [153, 254, 81],'baseball bat' : [233, 80, 195],'baseball glove' : [165, 179, 213],'skateboard' : [57, 65, 211],
'surfboard' : [98, 255, 164],'tennis racket' : [205, 219, 146],'bottle' : [140, 138, 172],'wine glass' : [23, 53, 119],
'cup' : [102, 215, 88],'fork' : [198, 204, 245],'knife' : [183, 132, 233],'spoon' : [14, 87, 125],
'bowl' : [221, 43, 104],'banana' : [181, 215, 6],'apple' : [16, 139, 183],'sandwich' : [150, 136, 166],'orange' : [219, 144, 1],
'broccoli' : [123, 226, 195],'carrot' : [230, 45, 209],'hot dog' : [252, 215, 56],'pizza' : [234, 170, 131],
'donut' : [36, 208, 234],'cake' : [19, 24, 2],'chair' : [115, 184, 234],'sofa' : [125, 238, 12],
'pottedplant' : [57, 226, 76],'bed' : [77, 31, 134],'diningtable' : [208, 202, 204],'toilet' : [208, 202, 204],
'tvmonitor' : [208, 202, 204],'laptop' : [159, 149, 163],'mouse' : [148, 148, 87],'remote' : [171, 107, 183],
'keyboard' : [33, 154, 135],'cell phone' : [206, 209, 108],'microwave' : [206, 209, 108],'oven' : [97, 246, 15],
'toaster' : [147, 140, 184],'sink' : [157, 58, 24],'refrigerator' : [117, 145, 137],'book' : [155, 129, 244],
'clock' : [53, 61, 6],'vase' : [145, 75, 152],'scissors' : [8, 140, 38],'teddy bear' : [37, 61, 220],
'hair drier' : [129, 12, 229],'toothbrush' : [11, 126, 158]
}
for detection in detections:
x, y, w, h = detection[2][0],\
detection[2][1],\
detection[2][2],\
detection[2][3]
name_tag = str(detection[0].decode())
for name_key, color_val in color_dict.items():
if name_key == name_tag:
color = color_val
xmin, ymin, xmax, ymax = convertBack(
float(x), float(y), float(w), float(h))
pt1 = (xmin, ymin)
pt2 = (xmax, ymax)
cv2.rectangle(img, pt1, pt2, color, 1)
cv2.putText(img,
detection[0].decode() +
" [" + str(round(detection[1] * 100, 2)) + "]",
(pt1[0], pt1[1] - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5,
color, 2)
return img
netMain = None
metaMain = None
altNames = None
def YOLO():
global metaMain, netMain, altNames
configPath = "./cfg/yolov4.cfg"
# Path to cfg
weightPath = "./yolov4.weights"
# Path to weights
metaPath = "./cfg/coco.data"
# Path to meta data
if not os.path.exists(configPath):
# 檢查文件是否存在,否則 return ValueError
raise ValueError("Invalid config path `" +
os.path.abspath(configPath)+"`")
if not os.path.exists(weightPath):
raise ValueError("Invalid weight path `" +
os.path.abspath(weightPath)+"`")
if not os.path.exists(metaPath):
raise ValueError("Invalid data file path `" +
os.path.abspath(metaPath)+"`")
if netMain is None:
# 檢查 metaMain, NetMain 和 altNames. Loads it in script
netMain = darknet.load_net_custom(configPath.encode(
"ascii"), weightPath.encode("ascii"), 0, 1)
# batch size = 1
if metaMain is None:
metaMain = darknet.load_meta(metaPath.encode("ascii"))
if altNames is None:
try:
with open(metaPath) as metaFH:
metaContents = metaFH.read()
import re
match = re.search("names *= *(.*)$", metaContents,
re.IGNORECASE | re.MULTILINE)
if match:
result = match.group(1)
else:
result = None
try:
if os.path.exists(result):
with open(result) as namesFH:
namesList = namesFH.read().strip().split("\n")
altNames = [x.strip() for x in namesList]
except TypeError:
pass
except Exception:
pass
cap = cv2.VideoCapture(0)
# 取消使用 Webcam
#cap = cv2.VideoCapture("test2.mp4")
# Local Stored video detection - Set input video
frame_width = int(cap.get(3))
# Returns the width and height of capture video
frame_height = int(cap.get(4))
# Set out for video writer
out = cv2.VideoWriter(
# Set the Output path for video writer
"./Demo/output.avi", cv2.VideoWriter_fourcc(*"MJPG"), 10.0,
(frame_width, frame_height))
print("Starting the YOLO loop...")
# Create an image we reuse for each detect
darknet_image = darknet.make_image(frame_width, frame_height, 3)
# Create image according darknet for compatibility of network
while True: # Load the input frame and write output frame.
prev_time = time.time()
ret, frame_read = cap.read()
# Capture frame and return true if frame present
# For Assertion Failed Error in OpenCV
if not ret:
# Check if frame present otherwise he break the while loop
break
frame_rgb = cv2.cvtColor(frame_read, cv2.COLOR_BGR2RGB)
# Convert frame into RGB from BGR and resize accordingly
frame_resized = cv2.resize(frame_rgb,
(frame_width, frame_height),
interpolation=cv2.INTER_LINEAR)
darknet.copy_image_from_bytes(darknet_image,frame_resized.tobytes())
# Copy that frame bytes to darknet_image
detections = darknet.detect_image(netMain, metaMain, darknet_image, thresh=0.25)
# Detection occurs at this line and return detections, for customize we can change the threshold.
image = cvDrawBoxes(detections, frame_resized)
# Call the function cvDrawBoxes() for colored bounding box per class
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
print(1/(time.time()-prev_time))
cv2.imshow('Demo', image)
# Display Image window
cv2.waitKey(3)
out.write(image)
# Write that frame into output video
cap.release()
# For releasing cap and out.
out.release()
print(":::Video Write Completed")
if __name__ == "__main__":
YOLO()
# Calls the main function YOLO()
```
###### tags: `By 田于昕` `By 劉芳杏`
---
訓練 : YOLOv4訓練臉部辨識
===
下載 yolov4.conv.137
---
https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.conv.137
下載在 ==D:\train\darknet\build\darknet\x64==
---
yolov4-custom.cfg --> yolov4-test.cfg
---
複製 ==D:\train\darknet\build\darknet\x64\cfg\yolov4-custom.cfg==
另存為 ==D:\train\darknet\build\darknet\x64\cfg\yolov4-test.cfg==

---
修改 yolov4-test.cfg
---
修改以下7個地方:
- batch改為32(原本改64,但出現CUDA記憶體不足的錯誤訊息)
- subdivisions改為64
- width和height都改為416
- max_batchs改為Max((分類項數*2000),6000)
一開始,我只有三個Class,所以分類項數=3
所以max_batchs=Max(6000,6000)=6000 (官方寫是不要少於6000次的模擬)
- steps輸入兩個數字,分別為max_batchs的80%以及90%
所以我這裡會輸入4800,5400

- 按下Ctrl+F搜尋 [yolo],classes和filters共有三個地方需修改
一、 下方會出現classes,將它改成3
二、 其上方的[convolutional]之下,把filters改成(classes+5)*3=24

---
建立test.names
---
在 ==D:\train\darknet\build\darknet\x64\data== 建立 test.names
裡面紀錄classes的名稱(Label)

---
建立test.data,並修改
---
在 ==D:\train\darknet\build\darknet\x64\data== 建立 test.data
裡面紀錄classes數量、train檔案路徑檔、valid檔案路徑檔、names檔、backup位置

---
建立資料夾(obj)
---
在 ==D:\train\darknet\build\darknet\x64\data== 下建立一個資料夾 obj
在 obj 下建立資料夾 test,然後在 test 下丟入照片(399張)
副檔名都統一用*.jpg

---
建立資料夾(valid)
---
在 ==D:\train\darknet\build\darknet\x64\data== 下建立資料夾 valid
在valid之下建立資料夾test,在裡面丟幾張跟obj/test不同的照片

---
建立的空白文字檔(test_train.txt)
---
在 ==D:\train\darknet\build\darknet\x64\data== 建立的空白文字檔 test_train.txt
將剛剛建立的399張照片的路徑都記錄在裡面

(同樣的動作在 test_valid.txt 做一遍,紀錄放在 valid/test 下的另外驗證照片路徑)
---
建立標籤位置(LabelImg)
---
採用LabelImg (Windows_v1.8.0) https://tzutalin.github.io/labelImg/
解壓縮後放在 ==D:\train\LabelImg\windows_v1.8.0== 下

先打開檔案下的 data 資料夾,可以看到 predefined_classes.txt 這個檔案,此檔案裡面原始有15個預設標籤
先複製 predefined_classes.txt 並改名為predefined_classes_origin.txt

再將原本的predefined_classes.txt的內容改成與 ==D:\train\darknet\build\darknet\x64\data\test.names== 一致

開啟 LabelImg.exe
- 點擊Open Dir,選擇到 ==D:\train\darknet\build\darknet\x64\data\obj\test==
- 點擊Change Save Dir,選擇同一路徑 ==D:\train\darknet\build\darknet\x64\data\obj\test==
- 從Menu-->View-->Auto Saving勾起來
- 在PascalVOC上點一下,會變成YOLO,這樣才會符合yolo的定位格式
- 點擊Create RectBox(快捷鍵是W,需切換至英打,快捷鍵才有效果)

去該路徑下看是否有生成檔案,如圖表示生成成功

---
開始訓練
---
cmd到 ==D:\train\darknet\build\darknet\x64== (darknet.exe所在路徑之下) 執行
:::info
darknet.exe detector train data/test.data cfg/yolov4-test.cfg yolov4.conv.137
:::

---
中斷訓練
---
對cmd按下==Ctrl+C==中斷
可以到 test.data 中指定的 backup 路徑下找到 weights 檔案
==D:\train\darknet\build\darknet\x64\backup==

---
中斷訓練後欲重新訓練
---
把train指令改成
:::info
darknet.exe detector train data/test.data cfg/yolov4-test.cfg backup/yolov4-test_last.weights
:::
將原本的 yolov4.conv.137 改成 backup/yolov4-test_last.weights 即可
想從1000重新訓練,就改成 backup/yolov4-test_1000.weights 即可
---
測試 : 訓練結果
===
cmd到 ==D:\train\darknet\build\darknet\x64== 下執行
圖片測試
---
:::info
darknet.exe detector test data/test.data cfg/yolov4-test.cfg backup/yolov4-test_last.weights
:::
影片測試
---
:::info
darknet.exe detector demo data/test.data cfg/yolov4-test.cfg yolov4-test_last.weights -ext_output test.mp4
:::
Webcam測試
---
:::info
darknet.exe detector demo data/test.data cfg/yolov4-test.cfg yolov4-test_last.weights -c 0
:::
最後程式碼
===
```gherkin=
from ctypes import *
import math
import random
import os
import cv2
import numpy as np
import time
import darknet
import json
import datetime
import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore
sent = ['non','non','non']
def convertBack(x, y, w, h):
xmin = int(round(x - (w / 2)))
xmax = int(round(x + (w / 2)))
ymin = int(round(y - (h / 2)))
ymax = int(round(y + (h / 2)))
return xmin, ymin, xmax, ymax
def cvDrawBoxes(detections, img):
add = []
point1 = []
point2 = []
for detection in detections:
postures = ['Standing', 'Sitting', 'Lying down']
people = ['Tian', 'Jennifer', 'Jenny']
x, y, w, h = detection[2][0],\
detection[2][1],\
detection[2][2],\
detection[2][3]
xmin, ymin, xmax, ymax = convertBack(
float(x), float(y), float(w), float(h))
pt1 = (xmin, ymin)
pt2 = (xmax, ymax)
pt3 = ((xmin+xmax)/2),((ymin+ymax)/2)
point = [pt3]
cv2.rectangle(img, pt1, pt2, (0, 255, 0), 1)
cv2.putText(img,
detection[0].decode() +
" [" + str(round(detection[1] * 100, 2)) + "]",
(pt1[0], pt1[1] - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5,
[0, 255, 0], 2)
#localtime = time.asctime( time.localtime(time.time()) )
nowTime = int(time.time()) # 取得現在時間
struct_time = time.localtime(nowTime) # 轉換成時間元組
timeString = time.strftime('%Y-%m-%d %H:%M:%S',struct_time) # 將時間元組轉換成想要的字串
#timeString = "2020-09-09 19:00:00" # 時間格式為字串
time1 = time.strptime(timeString,'%Y-%m-%d %H:%M:%S') # 轉成時間元組
time_stamp = str(time.mktime(time1)) # 轉成時間戳
#print(time_stamp)
if (detection[0].decode()) == "Standing" :
posture0 = postures.pop(0)
add.append(posture0)
elif (detection[0].decode()) == "Sitting" :
posture1 = postures.pop(1)
add.append(posture1)
elif (detection[0].decode()) == "Lying down" :
posture2 = postures.pop(2)
add.append(posture2)
elif (detection[0].decode()) == "Tian" :
person0 = people.pop(0)
add.append(person0)
elif (detection[0].decode()) == "Jennifer" :
person1 = people.pop(1)
add.append(person1)
elif (detection[0].decode()) == "Jenny" :
person2 = people.pop(2)
add.append(person2)
if len(point1) == 0 :
p1 = point.pop(0)
point1.append(p1)
elif len(point1) == 1:
p2 = point.pop(0)
point2.append(p2)
ps1 = np.asarray(point1)
ps2 = np.asarray(point2)
if len(add) == 2 :
#print(point1)
#print(point2)
#print('Object: ',add)
a=(ps1-ps2)**2
sum = 0
for d in a[0]:
sum += d
b=sum**(1/2)
#print(b)
#print('座標: ',a)
#print('未開根號:{:.2f},距離:{:.2f}'.format(sum, sum**(1/2)))
sub = ps1[0] - ps2[0]
x = abs(sub[0])
#print(x)
#print(x)
if (b<=210.0)&(b>=40.0)&(x<=47.0)&(x>=0.0):
data1 = {'Object': add}
data = {'Time': time_stamp ,'Name': add[0],'Pose': add[1]}
#print('Object: ',add)
if sent[0] == 'non' :
if data1['Object'] == ['Tian','Standing'] :
sent[0] = 'Standing'
print(data)
try:
app = firebase_admin.get_app()
except ValueError as e:
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#collection_ref = db.collection("TimeAndObject").document('ID')
collection_ref = db.collection("Tian+pose")
collection_ref.add(data)
print("已上傳")
elif data1['Object'] == ['Tian','Sitting'] :
sent[0] = 'Sitting'
print(data)
try:
app = firebase_admin.get_app()
except ValueError as e:
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#collection_ref = db.collection("TimeAndObject").document('ID')
collection_ref = db.collection("Tian+pose")
collection_ref.add(data)
print("已上傳")
elif data1['Object'] == ['Tian','Lying down'] :
sent[0] = 'Lying down'
print(data)
try:
app = firebase_admin.get_app()
except ValueError as e:
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#collection_ref = db.collection("TimeAndObject").document('ID')
collection_ref = db.collection("Tian+pose")
collection_ref.add(data)
print("已上傳")
elif sent[0] != 'non' :
#print(sent)
if sent[0] == 'Standing' :
if data1['Object'] == ['Tian','Sitting'] :
sent[0] = 'Sitting'
print(data)
try:
app = firebase_admin.get_app()
except ValueError as e:
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#collection_ref = db.collection("TimeAndObject").document('ID')
collection_ref = db.collection("Tian+pose")
collection_ref.add(data)
print("已上傳")
elif data1['Object'] == ['Tian','Lying down'] :
sent[0] = 'Lying down'
print(data)
try:
app = firebase_admin.get_app()
except ValueError as e:
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#collection_ref = db.collection("TimeAndObject").document('ID')
collection_ref = db.collection("Tian+pose")
collection_ref.add(data)
print("已上傳")
elif sent[0] == 'Sitting' :
if data1['Object'] == ['Tian','Standing'] :
sent[0] = 'Standing'
print(data)
try:
app = firebase_admin.get_app()
except ValueError as e:
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#collection_ref = db.collection("TimeAndObject").document('ID')
collection_ref = db.collection("Tian+pose")
collection_ref.add(data)
print("已上傳")
elif data1['Object'] == ['Tian','Lying down'] :
sent[0] = 'Lying down'
print(data)
try:
app = firebase_admin.get_app()
except ValueError as e:
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#collection_ref = db.collection("TimeAndObject").document('ID')
collection_ref = db.collection("Tian+pose")
collection_ref.add(data)
print("已上傳")
elif sent[0] == 'Lying down' :
if data1['Object'] == ['Tian','Sitting'] :
sent[0] = 'Sitting'
print(data)
try:
app = firebase_admin.get_app()
except ValueError as e:
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#collection_ref = db.collection("TimeAndObject").document('ID')
collection_ref = db.collection("Tian+pose")
collection_ref.add(data)
print("已上傳")
elif data1['Object'] == ['Tian','Standing'] :
sent[0] = 'Standing'
print(data)
try:
app = firebase_admin.get_app()
except ValueError as e:
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#collection_ref = db.collection("TimeAndObject").document('ID')
collection_ref = db.collection("Tian+pose")
collection_ref.add(data)
print("已上傳")
if sent[1] == 'non' :
if data1['Object'] == ['Jennifer','Standing'] :
sent[1] = 'Standing'
print(data)
try:
app = firebase_admin.get_app()
except ValueError as e:
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#collection_ref = db.collection("TimeAndObject").document('ID')
collection_ref = db.collection("J+pose")
collection_ref.add(data)
print("已上傳")
elif data1['Object'] == ['Jennifer','Sitting'] :
sent[1] = 'Sitting'
print(data)
try:
app = firebase_admin.get_app()
except ValueError as e:
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#collection_ref = db.collection("TimeAndObject").document('ID')
collection_ref = db.collection("J+pose")
collection_ref.add(data)
print("已上傳")
elif data1['Object'] == ['Jennifer','Lying down'] :
sent[1] = 'Lying down'
print(data)
try:
app = firebase_admin.get_app()
except ValueError as e:
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#collection_ref = db.collection("TimeAndObject").document('ID')
collection_ref = db.collection("J+pose")
collection_ref.add(data)
print("已上傳")
elif sent[1] != 'non' :
#print(sent)
if sent[1] == 'Standing' :
if data1['Object'] == ['Jennifer','Sitting'] :
sent[1] = 'Sitting'
print(data)
try:
app = firebase_admin.get_app()
except ValueError as e:
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#collection_ref = db.collection("TimeAndObject").document('ID')
collection_ref = db.collection("J+pose")
collection_ref.add(data)
print("已上傳")
elif data1['Object'] == ['Jennifer','Lying down'] :
sent[1] = 'Lying down'
print(data)
try:
app = firebase_admin.get_app()
except ValueError as e:
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#collection_ref = db.collection("TimeAndObject").document('ID')
collection_ref = db.collection("J+pose")
collection_ref.add(data)
print("已上傳")
elif sent[1] == 'Sitting' :
if data1['Object'] == ['Jennifer','Standing'] :
sent[1] = 'Standing'
print(data)
try:
app = firebase_admin.get_app()
except ValueError as e:
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#collection_ref = db.collection("TimeAndObject").document('ID')
collection_ref = db.collection("J+pose")
collection_ref.add(data)
print("已上傳")
elif data1['Object'] == ['Jennifer','Lying down'] :
sent[1] = 'Lying down'
print(data)
try:
app = firebase_admin.get_app()
except ValueError as e:
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#collection_ref = db.collection("TimeAndObject").document('ID')
collection_ref = db.collection("J+pose")
collection_ref.add(data)
print("已上傳")
elif sent[1] == 'Lying down' :
if data1['Object'] == ['Jennifer','Sitting'] :
sent[1] = 'Sitting'
print(data)
try:
app = firebase_admin.get_app()
except ValueError as e:
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#collection_ref = db.collection("TimeAndObject").document('ID')
collection_ref = db.collection("J+pose")
collection_ref.add(data)
print("已上傳")
elif data1['Object'] == ['Jennifer','Standing'] :
sent[1] = 'Standing'
print(data)
try:
app = firebase_admin.get_app()
except ValueError as e:
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#collection_ref = db.collection("TimeAndObject").document('ID')
collection_ref = db.collection("J+pose")
collection_ref.add(data)
print("已上傳")
if sent[2] == 'non' :
if data1['Object'] == ['Jenny','Standing'] :
sent[2] = 'Standing'
print(data)
try:
app = firebase_admin.get_app()
except ValueError as e:
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#collection_ref = db.collection("TimeAndObject").document('ID')
collection_ref = db.collection("1d16e844-d471-4911-95eb-554c14e7976ep")
collection_ref.add(data)
print("已上傳")
elif data1['Object'] == ['Jenny','Sitting'] :
sent[2] = 'Sitting'
print(data)
try:
app = firebase_admin.get_app()
except ValueError as e:
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#collection_ref = db.collection("TimeAndObject").document('ID')
collection_ref = db.collection("1d16e844-d471-4911-95eb-554c14e7976ep")
collection_ref.add(data)
print("已上傳")
elif data1['Object'] == ['Jenny','Lying down'] :
sent[2] = 'Lying down'
print(data)
try:
app = firebase_admin.get_app()
except ValueError as e:
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#collection_ref = db.collection("TimeAndObject").document('ID')
collection_ref = db.collection("1d16e844-d471-4911-95eb-554c14e7976ep")
collection_ref.add(data)
print("已上傳")
elif sent[2] != 'non' :
#print(sent)
if sent[2] == 'Standing' :
if data1['Object'] == ['Jenny','Sitting'] :
sent[2] = 'Sitting'
print(data)
try:
app = firebase_admin.get_app()
except ValueError as e:
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#collection_ref = db.collection("TimeAndObject").document('ID')
collection_ref = db.collection("1d16e844-d471-4911-95eb-554c14e7976ep")
collection_ref.add(data)
print("已上傳")
elif data1['Object'] == ['Jenny','Lying down'] :
sent[2] = 'Lying down'
print(data)
try:
app = firebase_admin.get_app()
except ValueError as e:
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#collection_ref = db.collection("TimeAndObject").document('ID')
collection_ref = db.collection("1d16e844-d471-4911-95eb-554c14e7976ep")
collection_ref.add(data)
print("已上傳")
elif sent[2] == 'Sitting' :
if data1['Object'] == ['Jenny','Standing'] :
sent[2] = 'Standing'
print(data)
try:
app = firebase_admin.get_app()
except ValueError as e:
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#collection_ref = db.collection("TimeAndObject").document('ID')
collection_ref = db.collection("1d16e844-d471-4911-95eb-554c14e7976ep")
collection_ref.add(data)
print("已上傳")
elif data1['Object'] == ['Jenny','Lying down'] :
sent[2] = 'Lying down'
print(data)
try:
app = firebase_admin.get_app()
except ValueError as e:
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#collection_ref = db.collection("TimeAndObject").document('ID')
collection_ref = db.collection("1d16e844-d471-4911-95eb-554c14e7976ep")
collection_ref.add(data)
print("已上傳")
elif sent[2] == 'Lying down' :
if data1['Object'] == ['Jenny','Sitting'] :
sent[2] = 'Sitting'
print(data)
try:
app = firebase_admin.get_app()
except ValueError as e:
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#collection_ref = db.collection("TimeAndObject").document('ID')
collection_ref = db.collection("1d16e844-d471-4911-95eb-554c14e7976ep")
collection_ref.add(data)
print("已上傳")
elif data1['Object'] == ['Jenny','Standing'] :
sent[2] = 'Standing'
print(data)
try:
app = firebase_admin.get_app()
except ValueError as e:
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#collection_ref = db.collection("TimeAndObject").document('ID')
collection_ref = db.collection("1d16e844-d471-4911-95eb-554c14e7976ep")
collection_ref.add(data)
print("已上傳")
return img
netMain = None
metaMain = None
altNames = None
def YOLO():
global metaMain, netMain, altNames
configPath = "./cfg/yolov4-test.cfg"
weightPath = "./yolov4-test_last.weights"
metaPath = "./data/test.data"
#configPath = "./cfg/yolov4.cfg"
#weightPath = "./yolov4.weights"
#metaPath = "./cfg/coco.data"
if not os.path.exists(configPath):
raise ValueError("Invalid config path `" +
os.path.abspath(configPath)+"`")
if not os.path.exists(weightPath):
raise ValueError("Invalid weight path `" +
os.path.abspath(weightPath)+"`")
if not os.path.exists(metaPath):
raise ValueError("Invalid data file path `" +
os.path.abspath(metaPath)+"`")
if netMain is None:
netMain = darknet.load_net_custom(configPath.encode(
"ascii"), weightPath.encode("ascii"), 0, 1) # batch size = 1
if metaMain is None:
metaMain = darknet.load_meta(metaPath.encode("ascii"))
if altNames is None:
try:
with open(metaPath) as metaFH:
metaContents = metaFH.read()
import re
match = re.search("names *= *(.*)$", metaContents,
re.IGNORECASE | re.MULTILINE)
if match:
result = match.group(1)
else:
result = None
try:
if os.path.exists(result):
with open(result) as namesFH:
namesList = namesFH.read().strip().split("\n")
altNames = [x.strip() for x in namesList]
except TypeError:
pass
except Exception:
pass
cap = cv2.VideoCapture(0)
#cap = cv2.VideoCapture("104.mp4")MJPG
CW=1080
CH=1920
cap.set(cv2.CAP_PROP_FRAME_WIDTH,CW)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT,CH)
out = cv2.VideoWriter(
"Demo/output.avi", cv2.VideoWriter_fourcc(*'XVID'), 10.0,
(darknet.network_width(netMain), darknet.network_height(netMain)))
print("Starting the YOLO loop...")
# Create an image we reuse for each detect
darknet_image = darknet.make_image(darknet.network_width(netMain),
darknet.network_height(netMain),3)
while True:
prev_time = time.time()
ret, frame_read = cap.read()
cv2.imshow('OBS', frame_read)
frame_resized = cv2.resize(frame_read,
(darknet.network_width(netMain),
darknet.network_height(netMain)),
interpolation=cv2.INTER_LINEAR)
# 寫入影格
#out.write(frame_resized)
frame_rgb = cv2.cvtColor(frame_read, cv2.COLOR_BGR2RGB)
frame_resized = cv2.resize(frame_rgb,
(darknet.network_width(netMain),
darknet.network_height(netMain)),
interpolation=cv2.INTER_LINEAR)
darknet.copy_image_from_bytes(darknet_image,frame_resized.tobytes())
detections = darknet.detect_image(netMain, metaMain, darknet_image, thresh=0.25)
image = cvDrawBoxes(detections, frame_resized)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
#for detection in detections:
#label = detection[0]
#confidence = detection[1]
#pstring = label+": "+str(np.rint(100 * confidence))+"%"
#imcaption.append(pstring)
cv2.imshow('Demo', image)
out.write(image)
cv2.waitKey(3)
cap.release()
out.release()
if __name__ == "__main__":
YOLO()
```
辨識結果
===
[點此連結觀看辨識結果](https://drive.google.com/file/d/1hy96LQHp2OiJR-pFGeJE5SDXSCeLmv5q/view?usp=sharing)
###### tags: `By 田于昕`
---
# Free Video to JPG Converter
主要用途:訓練前labelimg資料庫 方便訓練
### 到微軟官網下載
https://www.dvdvideosoft.com/products/dvd/Free-Video-to-JPG-Converter.htm
### 執行exe 即可安裝完成

### 執行完會到這個頁面

可以選擇擷取方式->可以選擇用秒數或用影片生成照片數
### 增加檔案成功會跳出

#### 轉換失敗->程序完成 但不會放入圖庫

#### 轉換成功->會進入

#### 成果

遇到的困難
===
*安裝python版本要注意 (如果不成功可以看看其他版本)
*cuda版本也有差哦 如果不成功的話 可以多把檔案執行幾次 就會成功了!
*建置opencv前務必確認前面步驟是否有安裝成功 沒有的話可能會造成建置失敗
*darknet該複製該貼上 請務必準確貼上
貼心小提醒
===
如果有任何建置錯誤google會是你的好朋友
把錯誤貼上任何方法都嘗試看看 多試試看幾種方法
安裝環境非常看電腦 很需要天時地利人和 缺一不可
如果安裝失敗很多次別喪志 很正常的
我安裝YOLO V3一個月才成功 YOLO V4也花半個月哦
辨識要精確框出label不然會影響準確度
遠與近 大與小 這些都需要有素材
拍攝角度也很重要
破除迷失:不是圖片多就會準確
(精確度跟我上述說的有關)
由於我們最終因為時間有限 程式碼偏笨拙
依照擁有聰明腦袋的你們可以好好優化它
有任何問題可以藉由胡老連絡上我們
但!!還是請先自己努力找資料
你們一定比我們聰明不會遇到太多困難的
還有YOLO更新速度非常快 能用最新就用最新
因為辨識速度真的有差 V3跟V4就差很多!
參考安裝網址
===
https://medium.com/@qqmanlin/yolo-v4-%E5%AE%89%E8%A3%9D%E6%AD%A5%E9%A9%9F-4cca54d460b1
https://wings890109.pixnet.net/blog/post/68926387-yolov4%E5%BB%BA%E7%BD%AE%E6%B5%81%E7%A8%8B
https://www.codenong.com/cs106150135/