def mainLoop(modelType,modelArgs,positives,trueObjectBoxes,trainingList,featuresDir,featuresExt,modelOut,maxNegOverlap,iter):
  pos,posIdx,ari,osi = positives
  startTime = cu.tic()
  if iter == 0:
    ## Random Negatives
    print ' >>> RANDOM NEGATIVES'
    neg,negIdx = learn.getRandomNegs(featuresDir,trainingList,featuresExt,pos.shape[1],maxVectorsCache,maxNegativeImages)
    detectionsList = [ [x[0],'0.0']+x[1:]+['1'] for x in negIdx]
    hards = {'features':np.zeros((0,neg.shape[1])),'index':[]}
    lap = cu.toc('Random negatives matrix ('+str(neg.shape[0])+' instances)',startTime)
  else:
    ## Mine hard negatives
    print ' >>> MINING HARD NEGATIVES'
    model = det.createDetector(modelType,modelArgs)
    model.load(modelOut+'.'+ str( iter-1 ))
    detectionsList = detector.detectObjects(model,trainingList,featuresDir,featuresExt,0.3,-10.0)
    hards = cu.loadMatrixNoCompression(modelOut+'.hards').item()
    lap = cu.toc('Hard negatives matrix ('+str(hards['features'].shape[0])+' instances)',startTime)

  ## Rank and clean negative detections
  detectionsData = evaluation.loadDetections(detectionsList)
  groundTruth = evaluation.loadGroundTruthAnnotations(trueObjectBoxes)
  detectionsLog = evaluation.evaluateDetections(groundTruth,detectionsData,0.5,allowDuplicates=True) # overlapMeasure=validRegion,
  evaluation.computePrecisionRecall(len(posIdx),detectionsLog['tp'],detectionsLog['fp'],'tmp.txt')
  evaluation.computePrecAt(detectionsLog['tp'],[20,50,100,200,300,400,500])
  logData = learn.parseRankedDetectionsFile(detectionsLog['log'],maxNegOverlap,maxNegativeVectors)
  print ' >>> LOADING HARD NEGATIVES'
  neg,negIdx = learn.loadHardNegativesFromList(featuresDir,logData['negExamples'],featuresExt,pos.shape[1],logData['negTaken'])
  del(detectionsList,detectionsData,detectionsLog,logData)
  lap = cu.toc('Ranked negatives matrix ('+str(neg.shape[0])+' instances)',lap)
  neg = np.concatenate( (neg,hards['features']) )
  negIdx = negIdx + hards['index']

  ## Learn Detector
  clf = det.createDetector(modelType,modelArgs)
  clf.learn(pos,neg,posIdx,negIdx)
  clf.save(modelOut+'.'+str(iter))
  lap = cu.toc('Classifier learned:',lap)

  ## Keep hard negatives for next iterations
  scores = clf.predict(neg,negIdx)
  hardNegsIdx = np.argsort(scores)
  hardNeg = np.concatenate( (hards['features'], neg[hardNegsIdx[-cu.topHards:]]) )
  negIdx = hards['index'] + [negIdx[j] for j in hardNegsIdx[-cu.topHards:]]
  print 'Hard negatives:',hardNeg.shape[0]
  hards = {'features':hardNeg, 'index':negIdx}
  cu.saveMatrixNoCompression({'features':hardNeg,'index':negIdx},modelOut+'.hards')

  print ' ** Iteration',iter,'done'
  return {'detector':clf,'pos':pos,'posIdx':posIdx,'neg':neg,'negIdx':negIdx}
def buildDataSetWithTopDetections(detectionsData,topKPositives,featuresDir,featuresExt):
  detections = evaluation.loadDetections(detectionsData)
  m = cu.loadMatrix(featuresDir+'/'+detections[0][0]+'.'+featuresExt)
  positivesInfo = {}
  for i in range(topKPositives):
    d = detections[i]
    try:
      positivesInfo[ d[0] ].append( map(int,d[2:6]) )
    except:
      positivesInfo[ d[0] ] = [ map(int,d[2:6]) ]
  pos,posIdx = learn.loadHardNegativesFromList(featuresDir,positivesInfo,featuresExt,m.shape[1],topKPositives)
  #ari,osi = learn.computeAspectRatioAndSizeIntervals(posIdx)
  ari,osi = [],[]
  print 'Positive Matrix with Top Detections ('+str(pos.shape[0])+' instances)'
  return (pos,posIdx,ari,osi)
示例#3
0
def buildDataSetWithTopDetections(detectionsData, topKPositives, featuresDir,
                                  featuresExt):
    detections = evaluation.loadDetections(detectionsData)
    m = cu.loadMatrix(featuresDir + '/' + detections[0][0] + '.' + featuresExt)
    positivesInfo = {}
    for i in range(topKPositives):
        d = detections[i]
        try:
            positivesInfo[d[0]].append(map(int, d[2:6]))
        except:
            positivesInfo[d[0]] = [map(int, d[2:6])]
    pos, posIdx = learn.loadHardNegativesFromList(featuresDir, positivesInfo,
                                                  featuresExt, m.shape[1],
                                                  topKPositives)
    #ari,osi = learn.computeAspectRatioAndSizeIntervals(posIdx)
    ari, osi = [], []
    print 'Positive Matrix with Top Detections (' + str(
        pos.shape[0]) + ' instances)'
    return (pos, posIdx, ari, osi)
示例#4
0
        try:
            boxes = groundTruth[d[0]]
        except:
            continue
        bestIoU = 0.0
        for gt in boxes:
            iou = det.IoU(d[2:6], gt)
            if iou > bestIoU:
                bestIoU = iou
        print bestIoU
        if bestIoU > minOverlap:
            candidates.append(d)
    return candidates


def saveCandidates(candidates, output):
    out = open(output, 'w')
    for k in candidates:
        out.write(k[0] + ' ' + ' '.join(map(str, map(int, k[2:6]))) + '\n')
    out.close()


if __name__ == "__main__":
    params = cu.loadParams("detectionsFile groundTruths output")
    detectionsData = [x.split() for x in open(params['detectionsFile'])]
    detections = eval.loadDetections(detectionsData)
    groundTruth = cu.loadBoxIndexFile(params['groundTruths'])
    candidates = selectBestBoxes(detections, groundTruth, 0.5)
    print 'Selected candidates:', len(candidates)
    saveCandidates(candidates, params['output'])
示例#5
0
def mainLoop(modelType, modelArgs, positives, trainingList, featuresDir,
             featuresExt, modelOut, maxNegOverlap, iter):
    pos, posIdx, ari, osi = positives
    startTime = cu.tic()
    if iter == 0:
        ## Random Negatives
        print ' >>> RANDOM NEGATIVES'
        neg, negIdx = learn.getRandomNegs(featuresDir, trainingList,
                                          featuresExt, pos.shape[1],
                                          maxVectorsCache, maxNegativeImages)
        detectionsList = [[x[0], '0.0'] + x[1:] + ['1'] for x in negIdx]
        hards = {'features': np.zeros((0, neg.shape[1])), 'index': []}
        lap = cu.toc(
            'Random negatives matrix (' + str(neg.shape[0]) + ' instances)',
            startTime)
    else:
        ## Mine hard negatives
        print ' >>> MINING HARD NEGATIVES'
        model = det.createDetector(modelType, modelArgs)
        model.load(modelOut + '.' + str(iter - 1))
        detectionsList = detector.detectObjects(
            model, trainingList, featuresDir, featuresExt, 1.0, -10.0
        )  # For RCNN the overlap parameter is 0.3 not 1.0(no suppression)
        hards = cu.loadMatrixNoCompression(modelOut + '.hards').item()
        lap = cu.toc(
            'Hard negatives matrix (' + str(hards['features'].shape[0]) +
            ' instances)', startTime)

    ## Rank and clean negative detections
    detectionsData = evaluation.loadDetections(detectionsList)
    groundTruth = evaluation.loadGroundTruthAnnotations(posIdx)
    detectionsLog = evaluation.evaluateDetections(
        groundTruth, detectionsData, 0.5,
        allowDuplicates=False)  #,overlapMeasure=det.overlap
    evaluation.computePrecisionRecall(len(posIdx), detectionsLog['tp'],
                                      detectionsLog['fp'], 'tmp.txt')
    evaluation.computePrecAt(detectionsLog['tp'],
                             [20, 50, 100, 200, 300, 400, 500])
    logData = learn.parseRankedDetectionsFile(detectionsLog['log'],
                                              maxNegOverlap,
                                              maxNegativeVectors)
    print ' >>> LOADING HARD NEGATIVES'
    neg, negIdx = learn.loadHardNegativesFromList(featuresDir,
                                                  logData['negExamples'],
                                                  featuresExt, pos.shape[1],
                                                  logData['negTaken'])
    del (detectionsList, detectionsData, detectionsLog, logData)
    lap = cu.toc(
        'Ranked negatives matrix (' + str(neg.shape[0]) + ' instances)', lap)
    neg = np.concatenate((neg, hards['features']))
    negIdx = negIdx + hards['index']

    ## Learn Detector
    clf = det.createDetector(modelType, modelArgs)
    clf.learn(pos, neg, posIdx, negIdx)
    clf.save(modelOut + '.' + str(iter))
    lap = cu.toc('Classifier learned:', lap)

    ## Keep hard negatives for next iterations
    scores = clf.predict(neg, negIdx)
    hardNegsIdx = np.argsort(scores)
    hardNeg = np.concatenate(
        (hards['features'], neg[hardNegsIdx[-cu.topHards:]]))
    negIdx = hards['index'] + [negIdx[j] for j in hardNegsIdx[-cu.topHards:]]
    print 'Hard negatives:', hardNeg.shape[0]
    hards = {'features': hardNeg, 'index': negIdx}
    cu.saveMatrixNoCompression({
        'features': hardNeg,
        'index': negIdx
    }, modelOut + '.hards')

    print ' ** Iteration', iter, 'done'
    return {
        'detector': clf,
        'pos': pos,
        'posIdx': posIdx,
        'neg': neg,
        'negIdx': negIdx
    }
def selectBestBoxes(detections, groundTruth, minOverlap):
  candidates = []
  for d in detections:
    try: boxes = groundTruth[d[0]]
    except: continue
    bestIoU = 0.0
    for gt in boxes:
      iou = det.IoU(d[2:6],gt)
      if iou > bestIoU:
        bestIoU = iou
    print bestIoU
    if bestIoU > minOverlap:
      candidates.append(d)
  return candidates

def saveCandidates(candidates, output):
  out = open(output, 'w')
  for k in candidates:
    out.write(k[0] + ' ' + ' '.join(map(str, map(int, k[2:6]) ) ) + '\n')
  out.close()

if __name__ == "__main__":
  params = cu.loadParams("detectionsFile groundTruths output")
  detectionsData = [x.split() for x in open(params['detectionsFile'])]
  detections = eval.loadDetections(detectionsData)
  groundTruth = cu.loadBoxIndexFile(params['groundTruths'])
  candidates = selectBestBoxes(detections, groundTruth, 0.5)
  print 'Selected candidates:', len(candidates)
  saveCandidates(candidates, params['output'])