簡単な解決策は、バウンディングボックス情報を出力するように image.c ファイルを変更することです。
...
if(bot > im.h-1) bot = im.h-1;
// Print bounding box values
printf("Bounding Box: Left=%d, Top=%d, Right=%d, Bottom=%d\n", left, top, right, bot);
draw_box_width(im, left, top, right, bot, width, red, green, blue);
...
素敵な小さなpython(2-しかし、小さな変更を加えたものがあります。3. [main])メインリポジトリで使用できるプログラム https://github.com/pjreddie/darknet/blob/master/python/darknet.py
注意!与えられた座標は中点と幅と高さです。
python Windowsのユーザーの場合:
最初に、いくつかの設定ジョブを実行します。
設定python環境パス内のダークネットフォルダーのパス:
PYTHONPATH = 'YOUR DARKNET FOLDER'
addを使用して、PYTHONPATHをパス値に追加します。
%PYTHONPATH%
coco.data
内のファイルcfg folder
を編集するには、names
フォルダー変数をcoco.names
フォルダーに変更します。
names = D:/core/darknetAB/data/coco.names
この設定を使用すると、任意のフォルダーからpythonモジュール)としてdarknet.py( alexeyAB\darknet リポジトリから)を呼び出すことができます。
スクリプトを開始:
from darknet import performDetect as scan #calling 'performDetect' function from darknet.py
def detect(str):
''' this script if you want only want get the coord '''
picpath = str
cfg='D:/core/darknetAB/cfg/yolov3.cfg' #change this if you want use different config
coco='D:/core/darknetAB/cfg/coco.data' #you can change this too
data='D:/core/darknetAB/yolov3.weights' #and this, can be change by you
test = scan(imagePath=picpath, thresh=0.25, configPath=cfg, weightPath=data, metaPath=coco, showImage=False, makeImageOnly=False, initOnly=False) #default format, i prefer only call the result not to produce image to get more performance
#until here you will get some data in default mode from alexeyAB, as explain in module.
#try to: help(scan), explain about the result format of process is: [(item_name, convidence_rate (x_center_image, y_center_image, width_size_box, height_size_of_box))],
#to change it with generally used form, like PIL/opencv, do like this below (still in detect function that we create):
newdata = []
if len(test) >=2:
for x in test:
item, confidence_rate, imagedata = x
x1, y1, w_size, h_size = imagedata
x_start = round(x1 - (weight_size/2))
y_start = round(y1 - (height_size/2))
x_end = round(x_start + w_size)
y_end = round(y_start + h_size)
data = (item, confidence_rate, (x_start, y_start, x_end, y_end), w_size, h_size)
newdata.append(data)
Elif len(test) == 1:
item, confidence_rate, imagedata = test
x1, y1, w_size, h_size = imagedata
x_start = round(x1 - (w_size/2))
y_start = round(y1 - (h_size/2))
x_end = round(x_start + w_size)
y_end = round(y_start + h_size)
data = (item, confidence_rate, (x_start, y_start, x_end, y_end), w_size, h_size)
newdata.append(data)
else:
newdata = False
return newdata
それの使い方:
table = 'D:/test/image/test1.jpg'
checking = detect(table)'
座標を取得するには:
結果が1つだけの場合:
x1, y1, x2, y2 = checking[2]
多くの結果がある場合:
for x in checking:
item = x[0]
x1, y1, x2, y2 = x[2]
print(item)
print(x1, y1, x2, y2)
これをpython
に実装する場合は、私が here で作成したこの小さなpython
ラッパーがあります。 ReadMe
ファイルに従ってインストールします。インストールは非常に簡単です。
その後、この サンプルコード に従って、オブジェクトの検出方法を確認します。
検出がdet
の場合
top_left_x = det.bbox.x
top_left_y = det.bbox.y
width = det.bbox.w
height = det.bbox.h
必要に応じて、次の方法で中点を取得できます。
mid_x, mid_y = det.bbox.get_point(pyyolo.BBox.Location.MID)
お役に立てれば..
上記の@Wahyuの回答に触発されました。変更、修正、バグ修正はほとんどなく、単一のオブジェクト検出と複数のオブジェクト検出でテストされています。
# calling 'performDetect' function from darknet.py
from darknet import performDetect as scan
import math
def detect(img_path):
''' this script if you want only want get the coord '''
picpath = img_path
# change this if you want use different config
cfg = '/home/saggi/Documents/saggi/prabin/darknet/cfg/yolo-obj.cfg'
coco = '/home/saggi/Documents/saggi/prabin/darknet/obj.data' # you can change this too
# and this, can be change by you
data = '/home/saggi/Documents/saggi/prabin/darknet/backup/yolo-obj_last.weights'
test = scan(imagePath=picpath, thresh=0.25, configPath=cfg, weightPath=data, metaPath=coco, showImage=False, makeImageOnly=False,
initOnly=False) # default format, i prefer only call the result not to produce image to get more performance
# until here you will get some data in default mode from alexeyAB, as explain in module.
# try to: help(scan), explain about the result format of process is: [(item_name, convidence_rate (x_center_image, y_center_image, width_size_box, height_size_of_box))],
# to change it with generally used form, like PIL/opencv, do like this below (still in detect function that we create):
newdata = []
# For multiple Detection
if len(test) >= 2:
for x in test:
item, confidence_rate, imagedata = x
x1, y1, w_size, h_size = imagedata
x_start = round(x1 - (w_size/2))
y_start = round(y1 - (h_size/2))
x_end = round(x_start + w_size)
y_end = round(y_start + h_size)
data = (item, confidence_rate,
(x_start, y_start, x_end, y_end), (w_size, h_size))
newdata.append(data)
# For Single Detection
Elif len(test) == 1:
item, confidence_rate, imagedata = test[0]
x1, y1, w_size, h_size = imagedata
x_start = round(x1 - (w_size/2))
y_start = round(y1 - (h_size/2))
x_end = round(x_start + w_size)
y_end = round(y_start + h_size)
data = (item, confidence_rate,
(x_start, y_start, x_end, y_end), (w_size, h_size))
newdata.append(data)
else:
newdata = False
return newdata
if __name__ == "__main__":
# Multiple detection image test
# table = '/home/saggi/Documents/saggi/prabin/darknet/data/26.jpg'
# Single detection image test
table = '/home/saggi/Documents/saggi/prabin/darknet/data/1.jpg'
detections = detect(table)
# Multiple detection
if len(detections) > 1:
for detection in detections:
print(' ')
print('========================================================')
print(' ')
print('All Parameter of Detection: ', detection)
print(' ')
print('========================================================')
print(' ')
print('Detected label: ', detection[0])
print(' ')
print('========================================================')
print(' ')
print('Detected object Confidence: ', detection[1])
x1, y1, x2, y2 = detection[2]
print(' ')
print('========================================================')
print(' ')
print(
'Detected object top left and bottom right cordinates (x1,y1,x2,y2): x1, y1, x2, y2')
print('x1: ', x1)
print('y1: ', y1)
print('x2: ', x2)
print('y2: ', y2)
print(' ')
print('========================================================')
print(' ')
print('Detected object width and height: ', detection[3])
b_width, b_height = detection[3]
print('Weidth of bounding box: ', math.ceil(b_width))
print('Height of bounding box: ', math.ceil(b_height))
print(' ')
print('========================================================')
# Single detection
else:
print(' ')
print('========================================================')
print(' ')
print('All Parameter of Detection: ', detections)
print(' ')
print('========================================================')
print(' ')
print('Detected label: ', detections[0][0])
print(' ')
print('========================================================')
print(' ')
print('Detected object Confidence: ', detections[0][1])
x1, y1, x2, y2 = detections[0][2]
print(' ')
print('========================================================')
print(' ')
print(
'Detected object top left and bottom right cordinates (x1,y1,x2,y2): x1, y1, x2, y2')
print('x1: ', x1)
print('y1: ', y1)
print('x2: ', x2)
print('y2: ', y2)
print(' ')
print('========================================================')
print(' ')
print('Detected object width and height: ', detections[0][3])
b_width, b_height = detections[0][3]
print('Weidth of bounding box: ', math.ceil(b_width))
print('Height of bounding box: ', math.ceil(b_height))
print(' ')
print('========================================================')
# Single detections output:
# test value [('movie_name', 0.9223029017448425, (206.79859924316406, 245.4672393798828, 384.83673095703125, 72.8630142211914))]
# Multiple detections output:
# test value [('movie_name', 0.9225175976753235, (92.47076416015625, 224.9121551513672, 147.2491912841797, 42.063255310058594)),
# ('movie_name', 0.4900225102901459, (90.5261459350586, 12.4061279296875, 182.5990447998047, 21.261077880859375))]