目录
- 下载yolov4
- 编译
- 测试
-
- 检测图片
- 可基于python进行YOLOv4的inference
- 参考博客
下载yolov4
git clone https://github.com/AlexeyAB/darknet.git
文章图片
编译 进入darknet目录下
在编译darknet前首先需要修改Makefile
cd darknet
gedit Makefile
打开Makefile
文章图片
注意
文章图片
然后
make
文章图片
测试 检测图片 输入下面的命令
./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -thresh 0.25 ./data/dog.jpg
文章图片
测试成功!
文章图片
终端输出的结果如下,输出了每种类别的置信度
文章图片
查看大图
文章图片
可基于python进行YOLOv4的inference 注意这里的版本是python3,如果在python2上面就会出现问题
新建一个test.py文件写入:
import os
import cv2
import numpy as np
import random
import darknet
netMain = None
metaMain = None
altNames = NoneconfigPath = "./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
image_name = './data/dog.jpg'
src_img = cv2.imread(image_name)
bgr_img = src_img[:, :, ::-1]
height, width = bgr_img.shape[:2]
rsz_img = cv2.resize(bgr_img, (darknet.network_width(netMain), darknet.network_height(netMain)),
interpolation=cv2.INTER_LINEAR)
darknet_image, _ = darknet.array_to_image(rsz_img)
detections = darknet.detect_image(netMain, metaMain, darknet_image, thresh=0.25)
# convert xywh to xyxy
def convert_back(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# Plotting functions
def plot_one_box(x, img, color=None, label=None, line_thickness=None):
# Plots one bounding box on image img
tl = line_thickness or round(0.001 * max(img.shape[0:2])) + 1# line thickness
color = color or [random.randint(0, 255) for _ in range(3)]
c1, c2 = (int(x[0]), int(x[1])), (int(x[2]), int(x[3]))
cv2.rectangle(img, c1, c2, color, thickness=tl)
if label:
tf = max(tl - 1, 1)# font thickness
t_size = cv2.getTextSize(label, 0, fontScale=tl / 3, thickness=tf)[0]
c2 = c1[0] + t_size[0], c1[1] - t_size[1] - 3
cv2.rectangle(img, c1, c2, color, -1)# filled
cv2.putText(img, label, (c1[0], c1[1] - 2), 0, tl / 3, [225, 255, 255], thickness=tf, lineType=cv2.LINE_AA)random.seed(1)
colors = [[random.randint(0, 255) for _ in range(3)] for _ in range(metaMain.classes)]
for detection in detections:
x, y, w, h = detection[2][0], \
detection[2][1], \
detection[2][2], \
detection[2][3]
conf = detection[1]
x *= width / darknet.network_width(netMain)
w *= width / darknet.network_width(netMain)
y *= height / darknet.network_height(netMain)
h *= height / darknet.network_height(netMain)
xyxy = np.array([x - w / 2, y - h / 2, x + w / 2, y + h / 2])
label = detection[0].decode()
index = altNames.index(label)
label = f'{label} {conf:.2f}'
plot_one_box(xyxy, src_img, label=label, color=colors[index % metaMain.classes])
cv2.imwrite('result.jpg', src_img)
文章图片
查看YOLOv4的检测结果
输入(注意这里的版本是python3,如果在python2上面就会出现问题)
python3 test.py
文章图片
文章图片
文章图片
参考博客 1.YOLOv4 资源环境配置和测试样例效果
2.Ubuntu18.04配置darknet环境实现YOLOv4目标检测(三)——基于python进行YOLOv4 inference
3.Ubuntu18.04配置darknet环境实现YOLOv4目标检测(一)——配置YOLOv4环境darknet
推荐阅读
- 笔记|设计模式之一——单例模式
- Java|(JUC 下典型的类)Java 并发包中线程同步器
- 笔记|并发编程中常见的锁策略<包含详细介绍CAS机制和ABA问题>
- 安卓笔记-相关术语
- 安卓笔记-adb指令打包安装
- iPad Pro 10.5+Apple Pencil之专注文献阅读与笔记效率的App综述
- 笔记|电话面试-----海康威视
- 笔记|疫情防控交流社区平台——5.1 Kafka构建TB级异步消息系统(发送系统通知)
- C++中to_string()函数用法讲解