Использование неразрешенного идентификатора в списке переменных в приложении CoreML - PullRequest
0 голосов
/ 14 января 2019

Я добавляю результаты из моей модели обнаружения объектов (latestObservation) в список (listofObservation), который работает нормально, но я бы хотел добавить условие, чтобы последнее наблюдение добавлялось, только если оно отличается от предыдущего 3 наблюдения.

При сравнении последнего результата с предыдущими наблюдениями у меня возникла проблема с доступом к переменной.

Это мой код:

var latestObservation = (topIdentifier: String(), topConfidence: Float(), scndIdentifier: String(), scndConfidence: Float()) 
var listofObservation:[(topIdentifier: String, topConfidence: Float, scndIdentifier: String, scndConfidence: Float)] = []
var LastTopIdentifierCounter = 0

// ... and the part of the func drawVisionRequestResults that is relevant here follows:  

for observation in results where observation is VNRecognizedObjectObservation {
        guard let objectObservation = observation as? VNRecognizedObjectObservation else {
            continue
        }
        // Select only the label with the highest confidence and the second highest confidence: 
        let topLabelObservation = objectObservation.labels[0]
        let secondLabelObservation = objectObservation.labels[1]

latestObservation = (topIdentifier: topLabelObservation.identifier, topConfidence: topLabelObservation.confidence, scndIdentifier: secondLabelObservation.identifier, scndConfidence: secondLabelObservation.confidence)

let OFL = listofObservation.count
if (listofObservation.topIdentifier(OFL)) == latestObservation.topIdentifier
   && latestObservation.topidentifier == listofObservation.topIdentifier[OFL-1]
   && latestObservation.topidentifier == listofObservation.topIdentifier[OFL-2]
   {
   LastTopIdentifierCounter += (1)
   }
   else {
   listofObservation.append(latestObservation)
   LastTopIdentifierCounter = 0
print(latestObservation)
print(listofObservation)    

печать показывает следующее содержание переменных (в случае, если я сделаю добавление безусловным):

  1. latestObservation:

(topIdentifier: "6.no_phase", topConfidence: 0.87878287, scndIdentifier: "4.Faden_abnehmen", scndConfidence: 0.06840562)

  1. список наблюдения:

[(topIdentifier: "6.no_phase", topConfidence: 0.87878287, scndIdentifier: "4.Faden_abnehmen", scndConfidence: 0.06840562), (topIdentifier: "6.no_phase", topConfidence: 0.726424abne, scndIdentifier_ "4.FD) , scndConfidence: 0.22894023), (topIdentifier: "6.no_phase", topConfidence: 0.92339694, scndIdentifier: "4.Faden_abnehmen", scndConfidence: 0.058480877)]

в строке кода:

if (listofObservation.topIdentifier(OFL)) == latestObservation.topIdentifier

Я получаю следующее сообщение: Значение типа '[(topIdentifier: String, topConfidence: Float, scndIdentifier: String, scndConfidence: Float)] не имеет члена' topIdentifier '

Я очень новичок в стремительности и поэтому должен извиниться, так как это, вероятно, довольно наивный вопрос ... Я боролся с этим уже 2 дня и нигде не могу найти правильный совет, как решить эту проблему. Любой комментарий высоко ценится. Большое спасибо!

1 Ответ

0 голосов
/ 14 января 2019

Ваш listofObservation является массивом кортежей, поэтому вам нужно указать индекс определенного кортежа, чтобы получить определенный кортеж, а затем его свойство

array[index] -> element
      ^ Int      ^ certain tuple

if listofObservation[OFL].topIdentifier  == latestObservation.topIdentifier 
&& listofObservation[OFL-1].topIdentifier  == latestObservation.topidentifier
&& listofObservation[OFL-2].topIdentifier  == latestObservation.topidentifier {...}

Или в Swift 4.2+ вы можете использовать allSatisfy

if listofObservation[OFL-2...OFL].allSatisfy { $0.topIdentifier == latestObservation.topIdentifier } {...}
...