Darkflow неверные результаты - PullRequest
0 голосов
/ 02 марта 2019

Мне нужно обнаружить руки на изображениях.Я использую 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, поэтому я подумал, что после этого он должен дать более или менее заметный результат, но он дает только хаос.

...