YOLOv3 Python接口调用详解:libdarknet.so加载与批量检测实现

半杯拿铁
半杯拿铁
发布时间:2026-10-13 | 6人浏览过
原创

本文详解YOLOv3模型在Python环境下的调用方法,重点解决libdarknet.so动态库加载失败问题。通过调整文件路径、使用绝对路径及修改darknet.py文件,实现批量图片的目标检测与结果可视化,包含代码逻辑解析与路径配置建议。

YOLOv3编译与Python接口依赖说明

修改C语言源代码后,必须对整个项目进行重新编译并执行make install,以更新生成的文件。这类似于在VS中为类添加新函数后重新编译封装DLL的操作。Python接口主要依赖libdarknet.so文件,因此配置文件中的其他修改无需重新编译安装。

libdarknet.so加载问题与解决方案

在使用已训练好的模型进行调用时,常会遇到以下问题:

在代码lib = CDLL("/home/*****/*******/darknet/libdarknet.so", RTLD_GLOBAL)处无法读取到darknet编译生成的.so文件,从而直接导致报错。起初误以为是文件路径问题,处理较为混乱。由于长时间未编写C代码,最终直接在Python接口的py文件中修改了画框、标注置信度等操作,经过多次尝试后成功解决。

文件路径配置与批量检测实现

(1)将项目python文件夹下的darknet.py文件拷贝至根目录,确保其与/libdarknet.so位于同一目录下;

(2)整个demo程序均使用绝对路径;

实现YOLOv3模型的加载,批量读取文件夹下的照片至库函数变量,最终将处理结果存入新建的文件夹中。

检测结果可视化代码解析


###2019.04.03 by ylxb
def showPicResult(image,peoplecar,outimage):
  img = cv2.imread(image)
  out_img =outimage
  cv2.imwrite(out_img, img)
  for i in range(len(peoplecar)):
    x1=peoplecar[i][2][0]-peoplecar[i][2][2]/2
    y1=peoplecar[i][2][1]-peoplecar[i][2][3]/2
    x2=peoplecar[i][2][0]+peoplecar[i][2][2]/2
    y2=peoplecar[i][2][1]+peoplecar[i][2][3]/2
    im = cv2.imread(out_img)
    cv2.rectangle(im,(int(x1),int(y1)),(int(x2),int(y2)),(255,255,0),3)
    text = listpeoplecar[i][0]
    # 在图片上添加文字信息
    if(text=="people"):
      carcol=(55, 55, 255)#颜色显示
    else:
      carcol = (255, 55, 55)
    cv2.putText(im, text, (int(x1), int(y1)), cv2.FONT_HERSHEY_SIMPLEX,
          0.8, carcol, 1, cv2.LINE_AA)
    #This is a method that works well.
    cv2.imwrite(out_img, im)

批量图片处理与统计逻辑


###2019.04.03 by ylxb
  filenames = os.listdir(picDir)
  i = 0
  num = 0#目标个数
  car_num = 0#car个数
  people_num = 0#people个数

  car = "car" # car元素
  people = "people" # people元素

  for name in filenames:
    filename=os.path.join(picDir,name)
    #print(filename)
    listpeoplecar = detect(net, meta, filename)
    print(listpeoplecar)
    i = i + 1
    #save_picpath = out_img+str(filename).split("/")[-1].split(".")[0] + ".png"
    out_img=out_img1+str(i)+'.png'
    showPicResult(filename,listpeoplecar,out_img)

    for item in listpeoplecar:
      #print(item)
      car_num = car_num + item[0].count(car)#car个数
      people_num = people_num + item[0].count(people)#people个数
      num = num + 1#目标个数

  print('car个数: ' + str(car_num))
  print('people个数: ' + str(people_num))
  print('共检测出目标个数: ' + str(num))
  print('共检测照片个数:'+ str(i))

其中一张测试照片的效果如下:

以上关于YOLOv3模型调用时Python接口的详解内容分享到此结束,希望能为大家提供参考,也希望大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表