Updated start-dev-env.sh, fix photo.py (get_xmp), misc Python 2 --> 3 changes

Former-commit-id: 07fc3c3ff8
pull/1161/head
Piero Toffanin 2020-09-09 12:10:24 -04:00
rodzic 443560f047
commit 4ba6716a54
7 zmienionych plików z 43 dodań i 34 usunięć

3
.gitignore vendored
Wyświetl plik

@ -24,4 +24,5 @@ ceres-solver.tar.gz
*.pyc *.pyc
opencv.zip opencv.zip
settings.yaml settings.yaml
.setupdevenv .setupdevenv
__pycache__

Wyświetl plik

@ -14,7 +14,6 @@ check_version(){
exit 1 exit 1
fi fi
} }
check_version
if [[ $2 =~ ^[0-9]+$ ]] ; then if [[ $2 =~ ^[0-9]+$ ]] ; then
processes=$2 processes=$2
@ -36,7 +35,11 @@ install() {
echo "Installing sudo" echo "Installing sudo"
apt-get update && apt-get install -y sudo apt-get update && apt-get install -y sudo
fi fi
sudo apt-get update && sudo apt-get install software-properties-common -y --no-install-recommends sudo apt-get update && sudo apt-get install software-properties-common lsb-release tzdata -y --no-install-recommends
# Check version
check_version
sudo add-apt-repository -y ppa:ubuntugis/ubuntugis-unstable sudo add-apt-repository -y ppa:ubuntugis/ubuntugis-unstable
sudo apt-get update sudo apt-get update
@ -110,6 +113,8 @@ install() {
} }
uninstall() { uninstall() {
check_version
echo "Removing SuperBuild and build directories" echo "Removing SuperBuild and build directories"
cd ${RUNPATH}/SuperBuild cd ${RUNPATH}/SuperBuild
rm -rfv build src download install rm -rfv build src download install
@ -118,6 +123,8 @@ uninstall() {
} }
reinstall() { reinstall() {
check_version
echo "Reinstalling ODM modules" echo "Reinstalling ODM modules"
uninstall uninstall
install install

Wyświetl plik

@ -1,4 +1,3 @@
import io
import logging import logging
import re import re
@ -8,6 +7,7 @@ from six import string_types
from datetime import datetime, timedelta from datetime import datetime, timedelta
import pytz import pytz
from opendm import io
from opendm import log from opendm import log
from opendm import system from opendm import system
import xmltodict as x2d import xmltodict as x2d
@ -15,8 +15,7 @@ from opendm import get_image_size
from xml.parsers.expat import ExpatError from xml.parsers.expat import ExpatError
class ODM_Photo: class ODM_Photo:
""" ODMPhoto - a class for ODMPhotos """ODMPhoto - a class for ODMPhotos"""
"""
def __init__(self, path_file): def __init__(self, path_file):
# Standard tags (virtually all photos have these) # Standard tags (virtually all photos have these)
@ -85,13 +84,13 @@ class ODM_Photo:
try: try:
if 'Image Make' in tags: if 'Image Make' in tags:
try: try:
self.camera_make = tags['Image Make'].values.encode('utf8') self.camera_make = tags['Image Make'].values
except UnicodeDecodeError: except UnicodeDecodeError:
log.ODM_WARNING("EXIF Image Make might be corrupted") log.ODM_WARNING("EXIF Image Make might be corrupted")
self.camera_make = "unknown" self.camera_make = "unknown"
if 'Image Model' in tags: if 'Image Model' in tags:
try: try:
self.camera_model = tags['Image Model'].values.encode('utf8') self.camera_model = tags['Image Model'].values
except UnicodeDecodeError: except UnicodeDecodeError:
log.ODM_WARNING("EXIF Image Model might be corrupted") log.ODM_WARNING("EXIF Image Model might be corrupted")
self.camera_model = "unknown" self.camera_model = "unknown"
@ -129,7 +128,7 @@ class ODM_Photo:
if 'Image BitsPerSample' in tags: if 'Image BitsPerSample' in tags:
self.bits_per_sample = self.int_value(tags['Image BitsPerSample']) self.bits_per_sample = self.int_value(tags['Image BitsPerSample'])
if 'EXIF DateTimeOriginal' in tags: if 'EXIF DateTimeOriginal' in tags:
str_time = tags['EXIF DateTimeOriginal'].values.encode('utf8') str_time = tags['EXIF DateTimeOriginal'].values
utc_time = datetime.strptime(str_time, "%Y:%m:%d %H:%M:%S") utc_time = datetime.strptime(str_time, "%Y:%m:%d %H:%M:%S")
subsec = 0 subsec = 0
if 'EXIF SubSecTime' in tags: if 'EXIF SubSecTime' in tags:
@ -146,7 +145,7 @@ class ODM_Photo:
epoch = timezone.localize(datetime.utcfromtimestamp(0)) epoch = timezone.localize(datetime.utcfromtimestamp(0))
self.utc_time = (timezone.localize(utc_time) - epoch).total_seconds() * 1000.0 self.utc_time = (timezone.localize(utc_time) - epoch).total_seconds() * 1000.0
except Exception as e: except Exception as e:
log.ODM_WARNING("Cannot read extended EXIF tags for %s: %s" % (_path_file, e.message)) log.ODM_WARNING("Cannot read extended EXIF tags for %s: %s" % (_path_file, str(e)))
# Extract XMP tags # Extract XMP tags
@ -262,15 +261,15 @@ class ODM_Photo:
# From https://github.com/mapillary/OpenSfM/blob/master/opensfm/exif.py # From https://github.com/mapillary/OpenSfM/blob/master/opensfm/exif.py
def get_xmp(self, file): def get_xmp(self, file):
img_str = str(file.read()) img_bytes = file.read()
xmp_start = img_str.find('<x:xmpmeta') xmp_start = img_bytes.find(b'<x:xmpmeta')
xmp_end = img_str.find('</x:xmpmeta') xmp_end = img_bytes.find(b'</x:xmpmeta')
if xmp_start < xmp_end: if xmp_start < xmp_end:
xmp_str = img_str[xmp_start:xmp_end + 12] xmp_str = img_bytes[xmp_start:xmp_end + 12].decode('utf8')
try: try:
xdict = x2d.parse(xmp_str) xdict = x2d.parse(xmp_str)
except ExpatError: except ExpatError as e:
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
xmp_str = str(BeautifulSoup(xmp_str, 'xml')) xmp_str = str(BeautifulSoup(xmp_str, 'xml'))
xdict = x2d.parse(xmp_str) xdict = x2d.parse(xmp_str)
@ -297,7 +296,7 @@ class ODM_Photo:
def float_values(self, tag): def float_values(self, tag):
if isinstance(tag.values, list): if isinstance(tag.values, list):
return map(lambda v: float(v.num) / float(v.den), tag.values) return [float(v.num) / float(v.den) for v in tag.values]
else: else:
return [float(tag.values.num) / float(tag.values.den)] return [float(tag.values.num) / float(tag.values.den)]
@ -308,7 +307,7 @@ class ODM_Photo:
def int_values(self, tag): def int_values(self, tag):
if isinstance(tag.values, list): if isinstance(tag.values, list):
return map(int, tag.values) return [int(v) for v in tag.values]
else: else:
return [int(tag.values)] return [int(tag.values)]

Wyświetl plik

@ -32,7 +32,7 @@ class Broadcaster:
global_progress = 100 global_progress = 100
try: try:
sock.sendto("PGUP/{}/{}/{}".format(self.pid, self.project_name, float(global_progress)).encode('utf-8'), (UDP_IP, self.port)) sock.sendto("PGUP/{}/{}/{}".format(self.pid, self.project_name, float(global_progress)), (UDP_IP, self.port))
except: except:
log.ODM_WARNING("Failed to broadcast progress update on UDP port %s" % str(self.port)) log.ODM_WARNING("Failed to broadcast progress update on UDP port %s" % str(self.port))

3
run.sh
Wyświetl plik

@ -1,7 +1,6 @@
#!/bin/bash #!/bin/bash
RUNPATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" RUNPATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
export PYTHONPATH=$RUNPATH/SuperBuild/install/lib/python2.7/dist-packages:$RUNPATH/SuperBuild/src/opensfm:$PYTHONPATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$RUNPATH/SuperBuild/install/lib export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$RUNPATH/SuperBuild/install/lib
python $RUNPATH/run.py "$@" python3 $RUNPATH/run.py "$@"

Wyświetl plik

@ -6,19 +6,19 @@ from opendm import io
from opendm import system from opendm import system
from opendm import log from opendm import log
from dataset import ODMLoadDatasetStage from stages.dataset import ODMLoadDatasetStage
from run_opensfm import ODMOpenSfMStage from stages.run_opensfm import ODMOpenSfMStage
from mve import ODMMveStage from stages.mve import ODMMveStage
from odm_slam import ODMSlamStage from stages.odm_slam import ODMSlamStage
from odm_meshing import ODMeshingStage from stages.odm_meshing import ODMeshingStage
from mvstex import ODMMvsTexStage from stages.mvstex import ODMMvsTexStage
from odm_georeferencing import ODMGeoreferencingStage from stages.odm_georeferencing import ODMGeoreferencingStage
from odm_orthophoto import ODMOrthoPhotoStage from stages.odm_orthophoto import ODMOrthoPhotoStage
from odm_dem import ODMDEMStage from stages.odm_dem import ODMDEMStage
from odm_filterpoints import ODMFilterPoints from stages.odm_filterpoints import ODMFilterPoints
from splitmerge import ODMSplitStage, ODMMergeStage from stages.splitmerge import ODMSplitStage, ODMMergeStage
from odm_report import ODMReport
from stages.odm_report import ODMReport
class ODMApp: class ODMApp:
def __init__(self, args): def __init__(self, args):

Wyświetl plik

@ -75,6 +75,7 @@ fi
export PORT="${PORT:=3000}" export PORT="${PORT:=3000}"
export QTC="${QTC:=NO}" export QTC="${QTC:=NO}"
export IMAGE="${IMAGE:=opendronemap/nodeodm}"
if [ -z "$DATA" ]; then if [ -z "$DATA" ]; then
echo "Usage: DATA=/path/to/datasets [VARS] $0" echo "Usage: DATA=/path/to/datasets [VARS] $0"
@ -82,6 +83,7 @@ if [ -z "$DATA" ]; then
echo "VARS:" echo "VARS:"
echo " DATA Path to directory that contains datasets for testing. The directory will be mounted in /datasets. If you don't have any, simply set it to a folder outside the ODM repository." echo " DATA Path to directory that contains datasets for testing. The directory will be mounted in /datasets. If you don't have any, simply set it to a folder outside the ODM repository."
echo " PORT Port to expose for NodeODM (default: $PORT)" echo " PORT Port to expose for NodeODM (default: $PORT)"
echo " IMAGE Docker image to use (default: $IMAGE)"
echo " QTC When set to YES, installs QT Creator for C++ development (default: $QTC)" echo " QTC When set to YES, installs QT Creator for C++ development (default: $QTC)"
exit 1 exit 1
fi fi
@ -89,8 +91,9 @@ fi
echo "Starting development environment..." echo "Starting development environment..."
echo "Datasets path: $DATA" echo "Datasets path: $DATA"
echo "NodeODM port: $PORT" echo "Expose port: $PORT"
echo "QT Creator: $QTC" echo "QT Creator: $QTC"
echo "Image: $IMAGE"
if [ ! -e "$HOME"/.odm-dev-home ]; then if [ ! -e "$HOME"/.odm-dev-home ]; then
mkdir -p "$HOME"/.odm-dev-home mkdir -p "$HOME"/.odm-dev-home
@ -100,5 +103,5 @@ USER_ID=$(id -u)
GROUP_ID=$(id -g) GROUP_ID=$(id -g)
USER=$(id -un) USER=$(id -un)
xhost + xhost +
docker run -ti --entrypoint bash --name odmdev -v $(pwd):/code -v "$DATA":/datasets -p $PORT:3000 --privileged -e DISPLAY -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 -v="/tmp/.X11-unix:/tmp/.X11-unix:rw" -v="$HOME/.odm-dev-home:/home/$USER" opendronemap/nodeodm -c "/code/start-dev-env.sh --setup $USER $USER_ID $GROUP_ID $QTC" docker run -ti --entrypoint bash --name odmdev -v $(pwd):/code -v "$DATA":/datasets -p $PORT:3000 --privileged -e DISPLAY -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 -v="/tmp/.X11-unix:/tmp/.X11-unix:rw" -v="$HOME/.odm-dev-home:/home/$USER" $IMAGE -c "/code/start-dev-env.sh --setup $USER $USER_ID $GROUP_ID $QTC"
exit 0 exit 0