Mapillary: problemen met script, pip install en volgordes van foto's.

Overigens jammer dat deze hele discussie weer in een nieuw topic wordt geplaatst terwijl er al een mapillary topic is.
Maar goed, ik heb de hele discussie met verbazing gevolgd, want in diezelfde tijd heb ik al meer dan 10.000 foto’s geupload via de gewone browser-uploader die sinds enige tijd buitengewoon betrouwbaar is. Hoe dan?

Mijn sequences komen uit een Garmin Virb Elite en ik rename alle foto’s (gemaakt met 2 seconde interval) door vóór de naam die ze al hebben de tijd van opname te plakken (tot op de seconde nauwkeurig). Dat doe ik natuurlijk niet handmatig maar met een script.
Daarna kies ik op mapillary de uploader en dan NIET voor drag and drop maar kies gewoon de directory waar ik die sequence heb staan.
Werkt als een trein en alle foto’s zitten altijd keurig op volgorde.

Ik werk met OSX en het werken met de Python scripts is daar een fluitje van een cent (OSX is Unix) en heb ik ook gedaan, maar mijn ervaring is dat het gewoon veel vlugger gaat op de hierboven beschreven methode.

Excuses voor het aanmaken van een nieuw topic, achteraf gezien had ik misschien beter even de zoekfunctie kunnen gebruiken, maar daar had ik toen nog niet aan gedacht. Daarbij gaat dit over Mapillary en niet over OpenStreetMap, dus dit topic hoort hier sowieso niet thuis. Los daarvan hoop ik, dat je hebt kunnen lachen om de onhandige werkwijze die door mij, SubieLibero, wordt gevolgd.

10.000 in de tijd dat ik hier heb lopen klungelen haal ik geeneens, los van mijn internetsnelheid, die niet al te best is, werkt mijn script niet mee.

Waarom de boel bij mij af en toe door de war wordt gehaald door de browser-uploader weet ik niet. Ik gebruik de drag and drop functie niet meer, en selecteer de foto’s nu van onder naar boven terwijl ze op tijd (van oud naar nieuw) zijn gesorteerd, maar nog steeds gaat er af en toe iets verkeerd.

Ik heb geen ervaring met Python script en Windows CMD, laat staan met batch files. Alleen met de Linux Terminal kan ik het een en ander, omdat ik een oude laptop en een IBM ThinkCentre op Lubuntu heb lopen.

Ik ben zelf (nog) niet in staat om een script te schrijven die de namen van foto’s verandert, laat staan met de tijd op de seconde nauwkeurig d’r bij. Ik heb ook geen Apple computer, omdat die (naar mijn mening) te duur zijn voor wat je er voor krijgt, vastgesoldeerde hardware en behuizingen die niet open te krijgen zijn. Ik gebruik een ThinkPad.
Maar goed, merken doen er niet toe, als het maar een werkende computer is, en dat doen ze waarschijnlijk allemaal prima.

Na het speciale ‘Mapillary topic’ nu redelijk door te hebben gelezen doet mijn script het (nog steeds) niet. Ik vraag me nog steeds af waarom. En dan mag het script met OSX nog zoveel sneller werken, als je geen Apple hebt en het script het niet doet, is de browser-uploader nog altijd veel sneller. Als je, los van commentaar op mijn onhandige werkwijze, nog tips of aanwijzingen voor mij hebt om de boel misschien werkend kan krijgen, alles is welkom.

Groeten,
SubieLibero

Scripts zijn er voor ieder besturingssysteem.
En als de browser-uploader sneller is (dat is namelijk precies wat ik beweer in mijn post), waarom dan al die fuzz hier?
Gebruik die browser uploader (maar dus niet met drag and drop) en je bent klaar.

Ik interpreteerde dit verkeerd. De browser-uploader doet het dus niet altijd even best bij mij.

De browser uploader raad ik ook niet aan, ik had er ook problemen mee en gebruik die alleen voor incidentele foto’s.
De scripts moeten onder windows gewoon werken als alles eenmaal goed is ingesteld, en dat blijkt niet zo simpel met mapillary. Ik heb er (als moderator) geen bezwaar tegen dat dit in een apart topic wordt behandeld.

En nu we toch bezig zijn met dat script kunnen we net zo goed proberen om de boel werkend te krijgen. Ik bedoel, als je toch bezig bent, maak het dan af.

Ik had er aanvankelijk ook problemen mee (crashes, blijven hangen, traag), maar na de complete rewrite van de interface enige tijd geleden, heb ik geen enkel probleem meer ondervonden en kan ik zonder problemen batches van 3000 fotos in een keer uploaden.

Ik vermoed dat er iets nog niet goed is geïnstalleerd in python. Ik moest destijds ook iets met environment variabelen instellen maar weet niet meer exact wat. Laat staan onder windows 10 want ik heb nog W7. Maar kijk eens hier: http://www.anthonydebarros.com/2015/08/16/setting-up-python-in-windows-10/
En dan bedoel ik m.n. stap 5:

Hoi, ik ben een beetje laat in deze discussie en ik moet bekennen dat ik niet ieder bericht tot in detail gelezen heb, maar ik wil toch even mijn ervaringen met de upload scripts op linux (ubuntu) delen.

Ik kreeg ook PIP gerelateerde foutmeldingen en om de gevraagde pakketten via pip te installeren was me te veel gedoe. Temeer omdat ik eerst PIP moest installeren, wat weer andere problemen meebracht. Ik heb dit opgelost door via de pakketbeheerder van het systeem (synaptic) de volgende pakketten te installeren: exif, exiv2, python-exif en python-pyexiv2.

Dat is volgens mij hetzelfde waar dvdhoven het over had. Ik zal het vanmiddag nog even goed doorlezen.

Ik heb gisteren python geïnstalleerd op mijn oude lubuntu laptop, dat ging in een keer goed. Zal vanmiddag eens kijken of het script daar misschien wel op werkt met de pakketten die hierboven zijn gegeven. Maar ik ga dat hier denk ik niet uitvoerig beschrijven, anders lopen er twee dingen door elkaar in dit topic. Ik hou het in dit topic bij windows, maar ondertussen probeer ik het ook in linux :).

Ja dat wat dvdhoven heeft beschreven is hetzelfde en essentieel voor de werking van python, ik denk dat daar het probleem zit.

Oké, ik heb het advies van dvdhoven en ligfietser opgevolgd, met dit als resultaat:

Rechtsboven in beeld, onder het pdf’je van Pé en Rinus, staan de foto’s in een map zonder spaties of komma’s etc. Nog steeds dezelfde foutmelding… Ik ga Python, alle scriptjes en het environment variables even verwijderen, vervolgens installeer ik alles even opnieuw, eens kijken of dat helpt.

PS: heb het onderwerp van het topic gewijzigd, denk dat deze nieuwe titel de inhoud iets beter dekt.

  • SubieLibero

Ik weet niet of dat bij win10 anders is maar wat mij opvalt in bovenstaand plaatje is dat je de omgevingsvariabelen van Python onder PATH Python hebt opgeslagen, bij mij staan die bij path. Ik denk dat je bij Nieuw… gewoon path moet invullen met als variabelen c:\python27; etc etc

Heb ik net even veranderd. Ik dacht ‘ik geef het een naam zodat ik later weet waar het mee te maken heeft’… Maar misschien werkt dat niet.

Nee, ik denk niet dat windows begrijpt wat path python inhoudt. Voor de volledigheid, bij mijn pc staat:

Naam van variabele: Path
Waarde van variabele: C:\Program Files (x86)\Python27;C:\Program Files (x86)\Python27\Scripts; en nog meer zooi van andere windows toepassingen.

Dus kijk eerst ook waar precies jouw Python is geïnstalleerd, dat hoeft niet perse c:\Pythonxx te zijn maar kan dus ook zoals bij mij een submap zijn van C:\Program Files (x86)\

Aha, oké. Heb even lopen zoeken, maar bij mij is Python echt geïnstalleerd in c:\python27\ (daar staat python.exe en de rest van alle mapjes). Stond als standaardlocatie ingesteld bij de installatie van Python.

Ik heb het idee dat we de juiste richting op gaan:

Ik heb lib.uploader nodig volgens mij. Volgens mij is dat deze: https://github.com/mapillary/mapillary_tools/blob/master/python/lib/uploader.py
Neem aan dat ik deze, net als bij upload_with_authentication, weer kopieer in een text bestandje en die opsla als lib.upload.py. Nee dat werkte niet, geeft nog steeds dezelfde error als op het screenshot… Regel 12 werkt blijkbaar niet helemaal lekker. Ehm.

Ik ben dus even gaan kijken in upload_with_authentication.py, dat ziet er zo uit:

Wat ik me afvraag is waarom er een Linux map helemaal bovenaan staat?

from: lib.uploader import get_authentication_info, get_upload_token, etc
Als ik met m’n boeren verstand nadenk, moet hij dus lib.uploader hebben om daar vervolgens get_authentication_info etc uit te halen, maar die heeft ie niet, en daarom verschijnt er een error in beeld.

Beetje vreemd dat de error er nog steeds is als je dat script lib.upload van github haalt en in dezelfde map zet als waar upload.bat en upload_with_authentication.py staan. Of is dat verkeerd geredeneerd?

Misschien moet het lib\uploader.py zijn, (zie ook je link)

Zou ik ook nog kunnen proberen (werkte niet), of wacht, ik denk dat ik het al snap, dat ‘uploader’ bestandje moet natuurlijk in de map ‘libs’ en/of ‘Lib’ staan, dat gaan we eens proberen. :sunglasses:

Nee, werkt ook niet.

Ik heb upload.lib (ook geprobeerd als lib.uploader.lib, uploader.py en lib.uploader.py) eerst in ‘libs’ en daarna in ‘Lib’ gestopt, maar zonder resultaat. Ook in de hoofdmap (c:\python27) werkte het niet naar behoren.

Ehm. Tja. @ligfietser, in welke map staat dat lib.uploader bestandje bij jou? (Heb je überhaupt een bestandje met een naam die op iets met ‘uploader’ lijkt?).

Ik heb een andere versie denk ik. Bij mij staat helemaal niets van lib.uploader.
Probeer eens mijn versie van upload_with_authentication.py, misschien werkt het dan wel:

#!/usr/bin/python

import sys
import urllib2, urllib
import os
from Queue import Queue
import uuid
import exifread
import time

from upload import create_dirs, UploadThread, upload_file

'''
Script for uploading images taken with other cameras than
the Mapillary iOS or Android apps.

Intended use is for when you have used an action camera such as a GoPro
or Garmin VIRB, or any other camera where the location is included in the image EXIF.

The following EXIF tags are required:
-GPSLongitude
-GPSLatitude
-(GPSDateStamp and GPSTimeStamp) or DateTimeOriginal or DateTimeDigitized or DateTime
-Orientation

Before uploading put all images that belong together in a sequence, in a
specific folder, for example using 'time_split.py'. All images in a session
will be considered part of a single sequence.

NB: DO NOT USE THIS SCRIPT ON IMAGE FILES FROM THE MAPILLARY APPS,
USE UPLOAD.PY INSTEAD.

(assumes Python 2.x, for Python 3.x you need to change some module names)
'''


MAPILLARY_UPLOAD_URL = "https://s3-eu-west-1.amazonaws.com/mapillary.uploads.manual.images"
NUMBER_THREADS = 4
MOVE_FILES = False


def upload_done_file(params):
    print("Upload a DONE file to tell the backend that the sequence is all uploaded and ready to submit.")
    if not os.path.exists('DONE'):
        open("DONE", 'a').close()
    #upload
    upload_file("DONE", **params)
    #remove
    os.remove("DONE")


def verify_exif(filename):
    '''
    Check that image file has the required EXIF fields.

    Incompatible files will be ignored server side.
    '''
    # required tags in IFD name convention
    required_exif = [ ["GPS GPSLongitude", "EXIF GPS GPSLongitude"],
                      ["GPS GPSLatitude", "EXIF GPS GPSLatitude"],
                      ["EXIF DateTimeOriginal", "EXIF DateTimeDigitized", "Image DateTime", "GPS GPSDate", "EXIF GPS GPSDate"],
                      ["Image Orientation"]]
    description_tag = "Image ImageDescription"

    with open(filename, 'rb') as f:
        tags = exifread.process_file(f)

    # make sure no Mapillary tags
    if description_tag in tags:
        if "MAPSequenceUUID" in tags[description_tag].values:
            print("File contains Mapillary EXIF tags, use upload.py instead.")
            return False

    # make sure all required tags are there
    for rexif in required_exif:
        vflag = False
        for subrexif in rexif:
            if subrexif in tags:
                vflag = True
        if not vflag:
            print("Missing required EXIF tag: {0}".format(rexif[0]))
            return False

    return True



if __name__ == '__main__':
    '''
    Use from command line as: python upload_with_authentication.py path

    You need to set the environment variables MAPILLARY_USERNAME,
    MAPILLARY_PERMISSION_HASH and MAPILLARY_SIGNATURE_HASH to your
    unique values.

    You also need upload.py in the same folder or in your PYTHONPATH since this
    script uses pieces of that.
    '''

    if len(sys.argv) > 2:
        print("Usage: python upload_with_authentication.py path")
        raise IOError("Bad input parameters.")
    path = sys.argv[1]

    # if no success/failed folders, create them
    create_dirs()

    if path.lower().endswith(".jpg"):
        # single file
        file_list = [path]
    else:
        # folder(s)
        file_list = []
        for root, sub_folders, files in os.walk(path):
            file_list += [os.path.join(root, filename) for filename in files if filename.lower().endswith(".jpg")]

    # get env variables
    try:
        MAPILLARY_USERNAME = os.environ['MAPILLARY_USERNAME']
        MAPILLARY_PERMISSION_HASH = os.environ['MAPILLARY_PERMISSION_HASH']
        MAPILLARY_SIGNATURE_HASH = os.environ['MAPILLARY_SIGNATURE_HASH']
    except KeyError:
        print("You are missing one of the environment variables MAPILLARY_USERNAME, MAPILLARY_PERMISSION_HASH or MAPILLARY_SIGNATURE_HASH. These are required.")
        sys.exit()

    # generate a sequence UUID
    sequence_id = uuid.uuid4()

    # S3 bucket
    s3_bucket = MAPILLARY_USERNAME+"/"+str(sequence_id)+"/"
    print("Uploading sequence {0}.".format(sequence_id))

    # set upload parameters
    params = {"url": MAPILLARY_UPLOAD_URL, "key": s3_bucket,
            "permission": MAPILLARY_PERMISSION_HASH, "signature": MAPILLARY_SIGNATURE_HASH,
            "move_files": MOVE_FILES}

    # create upload queue with all files
    q = Queue()
    for filepath in file_list:
        if verify_exif(filepath):
            q.put(filepath)
        else:
            print("Skipping: {0}".format(filepath))

    # create uploader threads with permission parameters
    uploaders = [UploadThread(q, params) for i in range(NUMBER_THREADS)]

    # start uploaders as daemon threads that can be stopped (ctrl-c)
    try:
        for uploader in uploaders:
            uploader.daemon = True
            uploader.start()

        for uploader in uploaders:
            uploaders[i].join(1)

        while q.unfinished_tasks:
            time.sleep(1)
        q.join()
    except (KeyboardInterrupt, SystemExit):
        print("\nBREAK: Stopping upload.")
        sys.exit()

    # ask user if finalize upload to check that everything went fine
    print("===\nFinalizing upload will submit all successful uploads and ignore all failed.\nIf all files were marked as successful, everything is fine, just press 'y'.")

    # ask 3 times if input is unclear
    for i in range(3):
        proceed = raw_input("Finalize upload? [y/n]: ")
        if proceed in ["y", "Y", "yes", "Yes"]:
            # upload an empty DONE file
            upload_done_file(params)
            print("Done uploading.")
            break
        elif proceed in ["n", "N", "no", "No"]:
            print("Aborted. No files were submitted. Try again if you had failures.")
            break
        else:
            if i==2:
                print("Aborted. No files were submitted. Try again if you had failures.")
            else:
                print('Please answer y or n. Try again.')

Als ik op github kijk is dat later toegevoegd, geen idee wat het precies doet.
https://github.com/mapillary/mapillary_tools/commit/ce78016d8668472b592852c65cc7e4ff8edc322a

Jou code is inderdaad anders, het begin vooral. Maar helaas, we krijgen weer een error, soortgelijk, dat wel. No module named upload.

Daar gaan we weer :D: @ligfietser kan jij een module vinden in de python map die upload heet? Als je d’r geen zin meer in hebt moet je het zeggen, dat ga ik zelf even in Linux hannesen…

  • SubieLibero