Day 21 - 嵌入 AlexeyAB/darknet 的 Python

Day 21 - 嵌入 AlexeyAB/darknet 的 Python

如同先前的 Joseph/darknet 一样, AlexeyAB/darknet 版本也提供了 Python 的介面,可以让 Python 的开发人员直接调用,好方便结合原有的 Python 代码,比较不同的是,他并没有特别放在 python 这个目录,而是直接放在根目录里,在 Day 20 - 重新检视 mAP, F1, IoU, Precision-Recall 精准度 这篇文章有详细介绍 AlexeyAB/darknet 的档案结构,下图是安装 AlexeyAB/darknet 版本的 YOLO 的档案结构图,,这边就只针对需要用到的部份加以说明:

  • darknet: AlexeyAB/darknet 的主要执行档。
  • darknet_image.py, darknet.py, darknet_video.py:透过呼叫 libdarknet.so ,可以在 Python 中直接调用 AlexeyAB/darknet 的一些主要功能,如训练、测试、载入网路结构等。
  • libdarknet.so: AlexeyAB/darknet 使用 c 语言所撰写的共享函式库,可供其他程式语言呼叫。

在这里插入图片描述
图 1、AlexeyAB/darknet 版本的 YOLO 的档案结构图

Day 15 - 说明 YOLO 相关设定 这篇文章中,利用 Joseph/darknet 版本的辨识模型建立一个自建数据集的练习,现在将 AlexeyAV/darknet 相关档案 (darknet, darknet.py, libdarknet.so) 复制到这个文件夹中

在这里插入图片描述
图 2、自建数据集的影像辨识文件夹,引入 AlexeyAB/darknet

接着建立一个档案,汇入 darknet.py,接着指定相关组态就可以了,yolov3.cfg,obj.data 这两个档案在 Day 15 - 说明 YOLO 相关设定 这篇文章有详细说明,yolov3.backup 则是在 Day 16 - 进行影像辨识训练 这篇文章训练生成的。

AlexeyABYolo.py

import cv2
import darknet
import time

def image_detection(image_path, network, class_names, class_colors, thresh):
    width = darknet.network_width(network)
    height = darknet.network_height(network)
    darknet_image = darknet.make_image(width, height, 3)

    image = cv2.imread(image_path)
    image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    image_resized = cv2.resize(image_rgb, (width, height),
                               interpolation=cv2.INTER_LINEAR)

    darknet.copy_image_from_bytes(darknet_image, image_resized.tobytes())
    detections = darknet.detect_image(network, class_names, darknet_image, thresh=thresh)
    darknet.free_image(darknet_image)
    image = darknet.draw_boxes(detections, image_resized, class_colors)
    return cv2.cvtColor(image, cv2.COLOR_BGR2RGB), detections

# 指定网路结构配置档 yolov3.cfg,自建数据集设定档 obj.data,事先训练好的权重档 yolov3.backup
network, class_names, class_colors = darknet.load_network(
    "./cfg/yolov3.cfg",
    "./cfg/obj.data",
    "./weights/yolov3.backup",
    1
)

prev_time = time.time() # 用来计算辨识一张图片的时间
print('predicting...', prev_time)
# 进行影像辨识,回传画出方块框的图片以及辨识结果,辨识结果包含标签、置信度以及方块框的座标
image, detections = image_detection(
        './labels/00-frame-608x608-0030.jpg', network, class_names, class_colors, 0.25
        )
# 印出标签、置信度以及方块框的座标
darknet.print_detections(detections, '--ext_output')
# 显示辨识时间
print((time.time() - prev_time))
# 将结果图片写成档案 result.jpg
cv2.imwrite('result.jpg', image)

运行之前需先安装 OpenCV,因为这个程式会用到,画面如下所示,辨识出三个物件,后面有有列出左上角座标以及长宽,时间约 0.566 秒。

pip3 install opencv-python
python3 AlexeyAB.py

在这里插入图片描述
图 3、AlexeyAB.py 执行的文字输出画面

在这里插入图片描述
图 4、AlexeyAB.py 执行的图形输出画面

拿原来用命令方式来比较,底下是命令列的执行语法。

./darknet detector test cfg/obj.data cfg/yolov3.cfg weights/yolov3.backup ./labels/00-frame-608x608-0030.jpg -ext_output

在这里插入图片描述
图 5、AlexeyAB版本的指令执行的文字输出画面

在这里插入图片描述
图 6、AlexeyAB版本的指令执行的图形输出画面

发现边是的物件内容是一样,但置信度的部份,使用 Python 的部份没有在小数点后三位四舍五入,所以结果是 99.22%, 99.94%, 99.97%,而指令部分则是 99%, 100%, 100%;辨识时间上也差不多,指令执行约 0.558 秒,而Python部分则是 0.566 秒;最奇怪的是 bbox 的资料不一样,下表列出使用 Python 与使用 command的方块框座标比较表,直接观看结果图片,方块框是一样的,可以发现 Python 取的是中心点的座标,而 Command 取的是左上角座标。

表 1. 使用 Python 与使用 Command 的方块框座标比较表

 left_xtop_ywidthheight
Python10242017193
Command1637417193

以下为使用 Python 与 Command 的输出座标内容。

# using Pyhon
Altolamprologuscompressiceps: 99.22%    (left_x: 102   top_y:  420   width:   171   height:  93)
Altolamprologuscompressiceps: 99.94%    (left_x: 235   top_y:  373   width:   86   height:  51)
Altolamprologuscompressiceps: 99.97%    (left_x: 311   top_y:  400   width:   147   height:  77)

# using Command
Altolamprologuscompressiceps: 99%	(left_x:   16   top_y:  374   width:  171   height:   93)
Altolamprologuscompressiceps: 100%	(left_x:  192   top_y:  348   width:   86   height:   51)
Altolamprologuscompressiceps: 100%	(left_x:  238   top_y:  361   width:  147   height:   77)       

使用下列程式根据 Command 所提供的座标画出第一个物件的方块框,图型如下所示。

DrawCoord.py

import cv2

inputImgPath = '../labels/00-frame-608x608-0030.jpg'
outputImgPath = '../image/00-frame-608x608-0030-1.jpg'
img_w= img_h = 608
cv2image = cv2.imread(inputImgPath)

# Altolamprologuscompressiceps: 99%	(left_x:   16   top_y:  374   width:  171   height:   93)
min_x, min_y, max_x, max_y = 16,374,16+171,374+93
cv2.rectangle(cv2image, (int(min_x),int(min_y)), (int(max_x),int(max_y)), (0,255,255), 2)
cv2.imwrite(r'{}'.format(outputImgPath), cv2image)

在这里插入图片描述
图 7、检验 Python 与 Command 的输出座标

参考资料

  • Yolo v4, v3 and v2 for Windows and Linux, https://github.com/AlexeyAB/darknet
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一个开源的深度学习框架,主要用于目标检测、图像分类、语义分割等计算机视觉任务。它支持多种神经网络模型,包括卷积神经网络、循环神经网络等,并且可以在CPU和GPU上运行。该框架的作者是AlexeyAB。 ### 回答2: Darknet是一个基于C和CUDA的开源深度学习框架,由AlexeyAB开发。该框架被广泛用于计算机视觉和图像识别领域,可以支持多种神经网络架构,如CNN、YOLO等。而且这个框架非常的轻量级,在GPU上可以达到非常快的训练和推理速度。 Darknet的特点有以下几点: 1.支持多平台。它可以在Windows、Linux、macOS等多个平台上运行,且安装和使用非常方便。 2.高效率。Darknet支持多GPU训练,利用并行加速算法可以显著减少训练时间,同时能够发挥GPU性能,提高运算速度。 3.灵活性。Darknet可自由配置网络结构和训练参数,可以根据不同的数据集进行调整,同时还能够自由切换CPU/GPU模式。 4.内置多个神经网络算法。Darknet内置了多种神经网络算法,如卷积神经网络(CNN)、递归神经网络(RNN)、LSTM神经网络等,能够应对不同领域的任务需求。 5.支持多种数据格式。Darknet可以处理多种数据格式,如图片、视频、音频等,可以广泛应用于计算机视觉、语音识别等领域。 总之,Darknet是一个功能齐全而且易用的深度学习框架,不仅具有高效率、灵活性和可拓展性,而且由于其轻量级的特点可以很好的嵌入到各种嵌入式设备中,因此能够被广泛应用于机器学习和人工智能领域,成为人工智能研究领域中不可或缺的一部分。 ### 回答3: Darknet是一个开源的深度学习框架,最初是由AlexeyAB创建。这是一个适用于CPU和GPU的跨平台工具包,专门用于实施各种计算机视觉算法。其主要优势在于拥有有效加速神经网络训练和推理性能的特点。 Darknet的一个主要优势在于其速度非常快。由于Darknet被专门设计用于高效计算,它的架构非常简明高效。 此框架具有许多优化,包括原始C代码的优化和最小化内存占用。 Darknet可用于实现多种计算机视觉算法,如目标检测、图像分类、语义分割等。 它包括用于图像和视频处理的实用程序。 它还提供模型训练和测试需要的预处理和后处理功能。 Darknet框架还可以使用多个数据集进行训练和测试,包括COCO、VOC、PASCAL等。 对于初学者,Darknet也是一个容易使用的框架,因为可以直接通过命令行快速地进行模型训练和测试。 此外,Darknet有一个丰富的社区,可以提供相应的支持和贡献。 总的来说,Darknet是深度学习计算机视觉领域中一个非常有前途的开源框架。 其优越的性能和广泛的功能使其成为构建多种计算机视觉应用的理想选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值