Мне нужно обнаружить руки на изображениях.Я использую Darkflow: https://github.com/thtrieu/darkflow.git
Я использую конфигурацию tiny-yolo с весами отсюда: https://github.com/digitalbrain79/pyyolo/raw/master/tiny-yolo.weights
Я скопировал tiny-yolo.cfg в tempCfg.cfg и изменил параметры, как вreadme.
Я использую этот набор данных: http://www.robots.ox.ac.uk/~vgg/data/hands/
Это мой скрипт для файлов аннотаций трансформации:
import os
from lxml import etree
import xml.etree.cElementTree as ET
import cv2
import scipy.io
import numpy as np
for wrongAnnotation in os.scandir('/content/hand_dataset/training_dataset/training_data/annotations'):
if(wrongAnnotation.path.endswith('.mat') == False): continue
path = wrongAnnotation.path
path = path.replace('.mat', '.xml')
path = path.replace('annotations', 'annotationsXML')
imgPath = path.replace ('annotationsXML', 'images')
imgPath = imgPath.replace ('.xml', '.jpg')
#print(wrongAnnotation.path)
image = cv2.imread(imgPath)
height, width, depth = image.shape
annotation = ET.Element('annotation')
ET.SubElement(annotation, 'folder').text = '/content/hand_dataset/training_dataset/training_data/annotationsXML'
ET.SubElement(annotation, 'filename').text = os.path.basename(imgPath)
ET.SubElement(annotation, 'segmented').text = '0'
size = ET.SubElement(annotation, 'size')
ET.SubElement(size, 'width').text = str(width)
ET.SubElement(size, 'height').text = str(height)
ET.SubElement(size, 'depth').text = str(depth)
data = scipy.io.loadmat(wrongAnnotation.path)
for x in data.get('boxes')[0]:
xTemp = x[0][0]
bottom = np.min([y[0][0] for y in xTemp.item()[:4]])
left = np.min([y[0][1] for y in xTemp.item()[:4]])
right = np.max([y[0][1] for y in xTemp.item()[:4]])
top = np.max([y[0][0] for y in xTemp.item()[:4]])
ob = ET.SubElement(annotation, 'object')
ET.SubElement(ob, 'name').text = 'hand'
ET.SubElement(ob, 'pose').text = 'Unspecified'
ET.SubElement(ob, 'truncated').text = '0'
ET.SubElement(ob, 'difficult').text = '0'
bbox = ET.SubElement(ob, 'bndbox')
ET.SubElement(bbox, 'xmin').text = str(left)
ET.SubElement(bbox, 'ymin').text = str(bottom)
ET.SubElement(bbox, 'xmax').text = str(right)
ET.SubElement(bbox, 'ymax').text = str(top)
xml_str = ET.tostring(annotation)
root = etree.fromstring(xml_str)
xml_str = etree.tostring(root, pretty_print = True)
with open(path, 'wb') as newXML:
newXML.write(xml_str)
Он преобразует аннотации из чего-то вроде этого:
{'__header__': b'MATLAB 5.0 MAT-file, Platform: MACI, Created on: Mon Jul 18 17:53:23 2011', '__version__': '1.0', '__globals__': [], 'boxes': array([[array([[(array([[215.63338254, 412.85084076]]), array([[223.47936255, 421.93052125]]), array([[250.44014687, 398.63303021]]), array([[242.59416686, 389.55334972]]), array(['L'], dtype='<U1'), array([], shape=(0, 0), dtype=uint8))]],
dtype=[('a', 'O'), ('b', 'O'), ('c', 'O'), ('d', 'O'), ('handtype', 'O'), ('truncated', 'O')]),
array([[(array([[194.93452622, 273.71437979]]), array([[178.00174829, 275.22468831]]), array([[179.83998359, 295.8340073 ]]), array([[196.77276151, 294.32369879]]), array(['R'], dtype='<U1'), array([], shape=(0, 0), dtype=uint8))]],
dtype=[('a', 'O'), ('b', 'O'), ('c', 'O'), ('d', 'O'), ('handtype', 'O'), ('truncated', 'O')]),
array([[(array([[174.40487672, 310.17948749]]), array([[183.82551544, 317.61262721]]), array([[193.01669191, 305.96388169]]), array([[183.59605319, 298.53074197]]), array(['L'], dtype='<U1'), array([], shape=(0, 0), dtype=uint8))]],
dtype=[('a', 'O'), ('b', 'O'), ('c', 'O'), ('d', 'O'), ('handtype', 'O'), ('truncated', 'O')])]],
dtype=object)}
На это:
<annotation>
<folder>/content/hand_dataset/training_dataset/training_data/annotationsXML</folder>
<filename>VOC2007_100.jpg</filename>
<segmented>0</segmented>
<size>
<width>500</width>
<height>375</height>
<depth>3</depth>
</size>
<object>
<name>hand</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>389.5533497217231</xmin>
<ymin>215.6333825448044</ymin>
<xmax>421.9305212460187</xmax>
<ymax>250.44014686696025</ymax>
</bndbox>
</object>
<object>
<name>hand</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>273.7143797917917</xmin>
<ymin>178.00174829348282</ymin>
<xmax>295.8340073049824</xmax>
<ymax>196.77276151043867</ymax>
</bndbox>
</object>
<object>
<name>hand</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>298.53074196966594</xmin>
<ymin>174.40487671681234</ymin>
<xmax>317.6126272059612</xmax>
<ymax>193.01669191063854</ymax>
</bndbox>
</object>
</annotation>
После этого я использую эту команду для начала обучения:
flow --model cfg/tempCfg.cfg --load bin/tiny-yolo.weights --train --annotation /content/hand_dataset/training_dataset/training_data/annotationsXML --dataset /content/hand_dataset/training_dataset/training_data/images --gpu 1.0 --epoch 30 --batch 10 --verbalise false
И затем я пытаюсь сделать:
flow --imgdir /content/hand_dataset/test_dataset/test_data/demoImages --model cfg/tempCfg.cfg --load bin/tiny-yolo.weights --gpu 1.0
И результат полностью случайный.Он обнаруживает много пустых областей и не определяет руки.Это потому, что я использую только 30 эпох или я делаю что-то не так?Обучение занимает несколько часов на GPU, поэтому я подумал, что после этого он должен дать более или менее заметный результат, но он дает только хаос.