{
  "id": 21916,
  "title": "100% ML",
  "url": "/competitions/draper-satellite-image-chronology/discussion/21916",
  "author_name": "",
  "post_date": "2016-06-28T04:29:02.663Z",
  "votes": null,
  "comment_count": 8,
  "views": 1300,
  "content": "<p>Congrats to the winners on this unusual competition!</p>\n\n<p>For those who focused on a 100% ML solution,  would you please describe your approach and go in some of the details of the techniques used? </p>\n\n<p>Personally, I tried to register, find the common area, dig into the opencv package, use flatten histograms and file size as features and calculate average image as referencial without success since I got beaten by all the public basic public script including the infamous benchmark &quot;1 2 3 4 5&quot;... </p>\n\n<p>How did you handled this evaluation metric that doesn't forgive any mistakes ?</p>",
  "messages": [
    {
      "id": "125251",
      "postDate": "06/28/2016 04:29:02",
      "content": "<p>Congrats to the winners on this unusual competition!</p>\n\n<p>For those who focused on a 100% ML solution,  would you please describe your approach and go in some of the details of the techniques used? </p>\n\n<p>Personally, I tried to register, find the common area, dig into the opencv package, use flatten histograms and file size as features and calculate average image as referencial without success since I got beaten by all the public basic public script including the infamous benchmark &quot;1 2 3 4 5&quot;... </p>\n\n<p>How did you handled this evaluation metric that doesn't forgive any mistakes ?</p>",
      "rawMarkdown": "Congrats to the winners on this unusual competition!\r\n\r\nFor those who focused on a 100% ML solution,  would you please describe your approach and go in some of the details of the techniques used? \r\n\r\nPersonally, I tried to register, find the common area, dig into the opencv package, use flatten histograms and file size as features and calculate average image as referencial without success since I got beaten by all the public basic public script including the infamous benchmark \"1 2 3 4 5\"... \r\n\r\nHow did you handled this evaluation metric that doesn't forgive any mistakes ?",
      "votes": null
    },
    {
      "id": "125253",
      "postDate": "06/28/2016 05:45:28",
      "content": "<p>Writing from phone here.. (going fast) didn't even remember this competition has finished until I saw emails about this topic:</p>\n\n<p>Features, the &quot;old school&quot; way for 0.26 on private LB:</p>\n\n<ul>\n<li>ImageJ (macro automated) registration in ImageJ (good old methods patent-free)</li>\n<li>ImageJ (macro automated) multiplication of pictures to create a mask, then AND on the mask and the other pictures</li>\n<li>ImageJ (macro automated) feature extraction (only stuff like Kurtosis, etc that are dependent to an image and not to the group of image like Mean)</li>\n<li>Creating new sets of features: for each set, creating a bucket of features made from pic 2-1, 3-1, 4-1, 5-1. I had at that point around 50 features I think.</li>\n<li>Labeled sets from -1 to 1 for each set (1 best possible prediction, -1 worst possible prediction I.e reverse, pairwise correlation)</li>\n<li>Using xgboost with a custom objective function to compute spearman objective and rank:pairwise (or reg:linear, I don't remember but I don't think CV is available for rank:pairwise+sets), talking into account the best 3 sets of each set and weighting them by their ranked regression score (this in 1 model, 3 votes), using 70 folds, 35 folds, 17 folds, 10 folds, 7 folds, 5 folds, 2 folds (targeted folds in most cases to avoid leakage - you can compute similarity score between sets and set your own thresholds)</li>\n<li>Predicting on test set (324 sets, 1420 premade feature sets)</li>\n<li>Selecting using the same method in xgboost the three best sets, weighted by their rank</li>\n</ul>",
      "rawMarkdown": "Writing from phone here.. (going fast) didn't even remember this competition has finished until I saw emails about this topic:\r\n\r\nFeatures, the \"old school\" way for 0.26 on private LB:\r\n\r\n* ImageJ (macro automated) registration in ImageJ (good old methods patent-free)\r\n* ImageJ (macro automated) multiplication of pictures to create a mask, then AND on the mask and the other pictures\r\n* ImageJ (macro automated) feature extraction (only stuff like Kurtosis, etc that are dependent to an image and not to the group of image like Mean)\r\n* Creating new sets of features: for each set, creating a bucket of features made from pic 2-1, 3-1, 4-1, 5-1. I had at that point around 50 features I think.\r\n* Labeled sets from -1 to 1 for each set (1 best possible prediction, -1 worst possible prediction I.e reverse, pairwise correlation)\r\n* Using xgboost with a custom objective function to compute spearman objective and rank:pairwise (or reg:linear, I don't remember but I don't think CV is available for rank:pairwise+sets), talking into account the best 3 sets of each set and weighting them by their ranked regression score (this in 1 model, 3 votes), using 70 folds, 35 folds, 17 folds, 10 folds, 7 folds, 5 folds, 2 folds (targeted folds in most cases to avoid leakage - you can compute similarity score between sets and set your own thresholds)\r\n* Predicting on test set (324 sets, 1420 premade feature sets)\r\n* Selecting using the same method in xgboost the three best sets, weighted by their rank",
      "votes": null
    },
    {
      "id": "125264",
      "postDate": "06/28/2016 08:37:50",
      "content": "<p>Not ML, I reckon, but a simple measure of for each image sum random pixel delta value in each RGB with closest neighbors weighted by inverse distance. Some sort of &quot;entropy&quot; measure. Yielded 0.11665 -- I'm absolutely baffled at 50th spot.</p>",
      "rawMarkdown": "Not ML, I reckon, but a simple measure of for each image sum random pixel delta value in each RGB with closest neighbors weighted by inverse distance. Some sort of \"entropy\" measure. Yielded 0.11665 -- I'm absolutely baffled at 50th spot.",
      "votes": null
    },
    {
      "id": "125266",
      "postDate": "06/28/2016 08:51:08",
      "content": "<p>In my opinion, &quot;normal&quot; computer vision based approach could reach as high as 0.90 score.</p>\n\n<p>There would have several ways to boost score up to that high on local CV, but again, it provides many over-fitting risks because the time indicator of those images is very hard to characterize. In many cases, the model will learn other relations rather than the time relations. The situation of training a model on only 70 sets and then testing on 250 sets makes the model's objective shift from learning to prevent-overfiting. If I could have access to more training samples, for example 700 sets for training, thing would be different.</p>\n\n<p>Anyway, those 1.0 scores in only 2 weeks from the competition start really make me feel unmotivated to put more effort for the &quot;usual&quot; ML based approach. If someone know the right labels for all the data from the beginning, they could easily produce a xgboost or random forest or &quot;put any models here&quot;  to generate the perfect scores.</p>",
      "rawMarkdown": "In my opinion, \"normal\" computer vision based approach could reach as high as 0.90 score.\r\n\r\nThere would have several ways to boost score up to that high on local CV, but again, it provides many over-fitting risks because the time indicator of those images is very hard to characterize. In many cases, the model will learn other relations rather than the time relations. The situation of training a model on only 70 sets and then testing on 250 sets makes the model's objective shift from learning to prevent-overfiting. If I could have access to more training samples, for example 700 sets for training, thing would be different.\r\n\r\nAnyway, those 1.0 scores in only 2 weeks from the competition start really make me feel unmotivated to put more effort for the \"usual\" ML based approach. If someone know the right labels for all the data from the beginning, they could easily produce a xgboost or random forest or \"put any models here\"  to generate the perfect scores.",
      "votes": null
    },
    {
      "id": "125477",
      "postDate": "06/29/2016 20:44:18",
      "content": "<p>I used 20% manual and 80% ML work.\nBut I did not focus on Images content, I focused on images rotation zoom and shift.</p>\n\n<p>First 2 pictures have zoom 1.3, while rest 3,4,5 have zoom 1</p>\n\n<p>Rotation abs angle was small for 1,2,4 images (&lt;10 degrees) big for 5 image (10-14 degrees) and very big for 3 image (14-18 degrees)</p>\n\n<p>I created C# tool to manually set 2 points presented on each image in set and save them to csv.\nBased on each pair of points we can calculate zoom and rotation now.</p>\n\n<p>I used that to train SVM and predict. It gave 0.72 on public and 0.77 on private.(you can see my script and files)</p>",
      "rawMarkdown": "I used 20% manual and 80% ML work.\r\nBut I did not focus on Images content, I focused on images rotation zoom and shift.\r\n\r\nFirst 2 pictures have zoom 1.3, while rest 3,4,5 have zoom 1\r\n\r\nRotation abs angle was small for 1,2,4 images (<10 degrees) big for 5 image (10-14 degrees) and very big for 3 image (14-18 degrees)\r\n\r\nI created C# tool to manually set 2 points presented on each image in set and save them to csv.\r\nBased on each pair of points we can calculate zoom and rotation now.\r\n\r\nI used that to train SVM and predict. It gave 0.72 on public and 0.77 on private.(you can see my script and files)",
      "votes": null
    },
    {
      "id": "125664",
      "postDate": "07/01/2016 13:22:16",
      "content": "<p>I got the same observation as Dmitry on the zoom levels and rotation angles, but I was using the homography matrices as inputs.</p>\n\n<p>I think some images in the test set with only forest or desert prevented the ML method to get a higher score. That kind of images doesn't exist in the train set and they are difficult to find the matched points to generate the homography matrices.</p>",
      "rawMarkdown": "I got the same observation as Dmitry on the zoom levels and rotation angles, but I was using the homography matrices as inputs.\r\n\r\nI think some images in the test set with only forest or desert prevented the ML method to get a higher score. That kind of images doesn't exist in the train set and they are difficult to find the matched points to generate the homography matrices.",
      "votes": null
    },
    {
      "id": "125677",
      "postDate": "07/01/2016 14:59:53",
      "content": "<p>[quote=mingtotti;125664]\nI got the same observation as Dmitry on the zoom levels and rotation angles, but I was using the homography matrices as inputs.\n[/quote]</p>\n\n<p>It's not hard to convert from homography to more familiar translation, rotation, scale &amp; shear:</p>\n\n<pre><code>def getComponents(homography):\n        '''((translationx, translationy), rotation, (scalex, scaley), shear)'''\n        a = homography[0,0]\n        b = homography[0,1]\n        c = homography[0,2]\n        d = homography[1,0]\n        e = homography[1,1]\n        f = homography[1,2]\n\n        p = math.sqrt(a*a + b*b)\n        r = (a*e - b*d)/(p)\n        q = (a*d + b*e)/(a*e - b*d)\n\n        translation = (c, f)\n        scale = (p, r)\n        shear = q\n\n        theta = math.atan2(b,a)\n        inAngle = theta * 180/math.pi\n        angle = abs( inAngle )\n\n        return [c, f, p, r, q, theta, inAngle, angle]\n</code></pre>",
      "rawMarkdown": "[quote=mingtotti;125664]\r\nI got the same observation as Dmitry on the zoom levels and rotation angles, but I was using the homography matrices as inputs.\r\n[/quote]\r\n\r\nIt's not hard to convert from homography to more familiar translation, rotation, scale & shear:\r\n\r\n    def getComponents(homography):\r\n        \t'''((translationx, translationy), rotation, (scalex, scaley), shear)'''\r\n        \ta = homography[0,0]\r\n        \tb = homography[0,1]\r\n        \tc = homography[0,2]\r\n        \td = homography[1,0]\r\n        \te = homography[1,1]\r\n        \tf = homography[1,2]\r\n        \r\n        \tp = math.sqrt(a*a + b*b)\r\n        \tr = (a*e - b*d)/(p)\r\n        \tq = (a*d + b*e)/(a*e - b*d)\r\n        \r\n        \ttranslation = (c, f)\r\n        \tscale = (p, r)\r\n        \tshear = q\r\n        \r\n        \ttheta = math.atan2(b,a)\r\n        \tinAngle = theta * 180/math.pi\r\n        \tangle = abs( inAngle )\r\n        \r\n        \treturn [c, f, p, r, q, theta, inAngle, angle]",
      "votes": null
    },
    {
      "id": "125719",
      "postDate": "07/01/2016 21:02:14",
      "content": "<p>BTW I think using of rotations and zoom cannot be considered as 100% ML.\nIt's using of images metadata, not the contents.</p>\n\n<p>During the whole competition I thought it would be much more exciting if competition organizers could provide fotos from absolutely unique locations. So that none of sets intersect and all sets are isolated from each other (no correlation between sets and days - absolutely different shooting time, brightness, contrast, rotation, zoom and others). So that the only way is to analyze contents (puddles, shadows, cars, etc). In this case it would be very challenging to guess the time order.</p>\n\n<p>Then I can imagine only one approach - find same pixels on all images which are doing some movement in relation to static pixels.  Based on the movement value in each picture, restore it's timeline position. (but still there's possibility to get 100% reverse answer)</p>",
      "rawMarkdown": "BTW I think using of rotations and zoom cannot be considered as 100% ML.\r\nIt's using of images metadata, not the contents.\r\n\r\nDuring the whole competition I thought it would be much more exciting if competition organizers could provide fotos from absolutely unique locations. So that none of sets intersect and all sets are isolated from each other (no correlation between sets and days - absolutely different shooting time, brightness, contrast, rotation, zoom and others). So that the only way is to analyze contents (puddles, shadows, cars, etc). In this case it would be very challenging to guess the time order.\r\n\r\nThen I can imagine only one approach - find same pixels on all images which are doing some movement in relation to static pixels.  Based on the movement value in each picture, restore it's timeline position. (but still there's possibility to get 100% reverse answer)",
      "votes": null
    },
    {
      "id": "125735",
      "postDate": "07/02/2016 03:02:44",
      "content": "<p>Totally agree. Analyzing contents to find the moving objects or changing environments will be more challenging.</p>",
      "rawMarkdown": "Totally agree. Analyzing contents to find the moving objects or changing environments will be more challenging.",
      "votes": null
    }
  ],
  "comments": [
    {
      "id": 125253,
      "author_name": "laurae2",
      "author_url": "",
      "post_date": "06/28/2016 05:45:28",
      "content": "<p>Writing from phone here.. (going fast) didn't even remember this competition has finished until I saw emails about this topic:</p>\n\n<p>Features, the &quot;old school&quot; way for 0.26 on private LB:</p>\n\n<ul>\n<li>ImageJ (macro automated) registration in ImageJ (good old methods patent-free)</li>\n<li>ImageJ (macro automated) multiplication of pictures to create a mask, then AND on the mask and the other pictures</li>\n<li>ImageJ (macro automated) feature extraction (only stuff like Kurtosis, etc that are dependent to an image and not to the group of image like Mean)</li>\n<li>Creating new sets of features: for each set, creating a bucket of features made from pic 2-1, 3-1, 4-1, 5-1. I had at that point around 50 features I think.</li>\n<li>Labeled sets from -1 to 1 for each set (1 best possible prediction, -1 worst possible prediction I.e reverse, pairwise correlation)</li>\n<li>Using xgboost with a custom objective function to compute spearman objective and rank:pairwise (or reg:linear, I don't remember but I don't think CV is available for rank:pairwise+sets), talking into account the best 3 sets of each set and weighting them by their ranked regression score (this in 1 model, 3 votes), using 70 folds, 35 folds, 17 folds, 10 folds, 7 folds, 5 folds, 2 folds (targeted folds in most cases to avoid leakage - you can compute similarity score between sets and set your own thresholds)</li>\n<li>Predicting on test set (324 sets, 1420 premade feature sets)</li>\n<li>Selecting using the same method in xgboost the three best sets, weighted by their rank</li>\n</ul>",
      "votes": null,
      "replies": []
    },
    {
      "id": 125264,
      "author_name": "glimmung",
      "author_url": "",
      "post_date": "06/28/2016 08:37:50",
      "content": "<p>Not ML, I reckon, but a simple measure of for each image sum random pixel delta value in each RGB with closest neighbors weighted by inverse distance. Some sort of &quot;entropy&quot; measure. Yielded 0.11665 -- I'm absolutely baffled at 50th spot.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 125266,
      "author_name": "a11rand0m",
      "author_url": "",
      "post_date": "06/28/2016 08:51:08",
      "content": "<p>In my opinion, &quot;normal&quot; computer vision based approach could reach as high as 0.90 score.</p>\n\n<p>There would have several ways to boost score up to that high on local CV, but again, it provides many over-fitting risks because the time indicator of those images is very hard to characterize. In many cases, the model will learn other relations rather than the time relations. The situation of training a model on only 70 sets and then testing on 250 sets makes the model's objective shift from learning to prevent-overfiting. If I could have access to more training samples, for example 700 sets for training, thing would be different.</p>\n\n<p>Anyway, those 1.0 scores in only 2 weeks from the competition start really make me feel unmotivated to put more effort for the &quot;usual&quot; ML based approach. If someone know the right labels for all the data from the beginning, they could easily produce a xgboost or random forest or &quot;put any models here&quot;  to generate the perfect scores.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 125477,
      "author_name": "dogrishin",
      "author_url": "",
      "post_date": "06/29/2016 20:44:18",
      "content": "<p>I used 20% manual and 80% ML work.\nBut I did not focus on Images content, I focused on images rotation zoom and shift.</p>\n\n<p>First 2 pictures have zoom 1.3, while rest 3,4,5 have zoom 1</p>\n\n<p>Rotation abs angle was small for 1,2,4 images (&lt;10 degrees) big for 5 image (10-14 degrees) and very big for 3 image (14-18 degrees)</p>\n\n<p>I created C# tool to manually set 2 points presented on each image in set and save them to csv.\nBased on each pair of points we can calculate zoom and rotation now.</p>\n\n<p>I used that to train SVM and predict. It gave 0.72 on public and 0.77 on private.(you can see my script and files)</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 125664,
      "author_name": "mingtotti",
      "author_url": "",
      "post_date": "07/01/2016 13:22:16",
      "content": "<p>I got the same observation as Dmitry on the zoom levels and rotation angles, but I was using the homography matrices as inputs.</p>\n\n<p>I think some images in the test set with only forest or desert prevented the ML method to get a higher score. That kind of images doesn't exist in the train set and they are difficult to find the matched points to generate the homography matrices.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 125677,
      "author_name": "itodorovic",
      "author_url": "",
      "post_date": "07/01/2016 14:59:53",
      "content": "<p>[quote=mingtotti;125664]\nI got the same observation as Dmitry on the zoom levels and rotation angles, but I was using the homography matrices as inputs.\n[/quote]</p>\n\n<p>It's not hard to convert from homography to more familiar translation, rotation, scale &amp; shear:</p>\n\n<pre><code>def getComponents(homography):\n        '''((translationx, translationy), rotation, (scalex, scaley), shear)'''\n        a = homography[0,0]\n        b = homography[0,1]\n        c = homography[0,2]\n        d = homography[1,0]\n        e = homography[1,1]\n        f = homography[1,2]\n\n        p = math.sqrt(a*a + b*b)\n        r = (a*e - b*d)/(p)\n        q = (a*d + b*e)/(a*e - b*d)\n\n        translation = (c, f)\n        scale = (p, r)\n        shear = q\n\n        theta = math.atan2(b,a)\n        inAngle = theta * 180/math.pi\n        angle = abs( inAngle )\n\n        return [c, f, p, r, q, theta, inAngle, angle]\n</code></pre>",
      "votes": null,
      "replies": []
    },
    {
      "id": 125719,
      "author_name": "dogrishin",
      "author_url": "",
      "post_date": "07/01/2016 21:02:14",
      "content": "<p>BTW I think using of rotations and zoom cannot be considered as 100% ML.\nIt's using of images metadata, not the contents.</p>\n\n<p>During the whole competition I thought it would be much more exciting if competition organizers could provide fotos from absolutely unique locations. So that none of sets intersect and all sets are isolated from each other (no correlation between sets and days - absolutely different shooting time, brightness, contrast, rotation, zoom and others). So that the only way is to analyze contents (puddles, shadows, cars, etc). In this case it would be very challenging to guess the time order.</p>\n\n<p>Then I can imagine only one approach - find same pixels on all images which are doing some movement in relation to static pixels.  Based on the movement value in each picture, restore it's timeline position. (but still there's possibility to get 100% reverse answer)</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 125735,
      "author_name": "mingtotti",
      "author_url": "",
      "post_date": "07/02/2016 03:02:44",
      "content": "<p>Totally agree. Analyzing contents to find the moving objects or changing environments will be more challenging.</p>",
      "votes": null,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "125251": "Congrats to the winners on this unusual competition!\r\n\r\nFor those who focused on a 100% ML solution,  would you please describe your approach and go in some of the details of the techniques used? \r\n\r\nPersonally, I tried to register, find the common area, dig into the opencv package, use flatten histograms and file size as features and calculate average image as referencial without success since I got beaten by all the public basic public script including the infamous benchmark \"1 2 3 4 5\"... \r\n\r\nHow did you handled this evaluation metric that doesn't forgive any mistakes ?",
    "125253": "Writing from phone here.. (going fast) didn't even remember this competition has finished until I saw emails about this topic:\r\n\r\nFeatures, the \"old school\" way for 0.26 on private LB:\r\n\r\n* ImageJ (macro automated) registration in ImageJ (good old methods patent-free)\r\n* ImageJ (macro automated) multiplication of pictures to create a mask, then AND on the mask and the other pictures\r\n* ImageJ (macro automated) feature extraction (only stuff like Kurtosis, etc that are dependent to an image and not to the group of image like Mean)\r\n* Creating new sets of features: for each set, creating a bucket of features made from pic 2-1, 3-1, 4-1, 5-1. I had at that point around 50 features I think.\r\n* Labeled sets from -1 to 1 for each set (1 best possible prediction, -1 worst possible prediction I.e reverse, pairwise correlation)\r\n* Using xgboost with a custom objective function to compute spearman objective and rank:pairwise (or reg:linear, I don't remember but I don't think CV is available for rank:pairwise+sets), talking into account the best 3 sets of each set and weighting them by their ranked regression score (this in 1 model, 3 votes), using 70 folds, 35 folds, 17 folds, 10 folds, 7 folds, 5 folds, 2 folds (targeted folds in most cases to avoid leakage - you can compute similarity score between sets and set your own thresholds)\r\n* Predicting on test set (324 sets, 1420 premade feature sets)\r\n* Selecting using the same method in xgboost the three best sets, weighted by their rank",
    "125264": "Not ML, I reckon, but a simple measure of for each image sum random pixel delta value in each RGB with closest neighbors weighted by inverse distance. Some sort of \"entropy\" measure. Yielded 0.11665 -- I'm absolutely baffled at 50th spot.",
    "125266": "In my opinion, \"normal\" computer vision based approach could reach as high as 0.90 score.\r\n\r\nThere would have several ways to boost score up to that high on local CV, but again, it provides many over-fitting risks because the time indicator of those images is very hard to characterize. In many cases, the model will learn other relations rather than the time relations. The situation of training a model on only 70 sets and then testing on 250 sets makes the model's objective shift from learning to prevent-overfiting. If I could have access to more training samples, for example 700 sets for training, thing would be different.\r\n\r\nAnyway, those 1.0 scores in only 2 weeks from the competition start really make me feel unmotivated to put more effort for the \"usual\" ML based approach. If someone know the right labels for all the data from the beginning, they could easily produce a xgboost or random forest or \"put any models here\"  to generate the perfect scores.",
    "125477": "I used 20% manual and 80% ML work.\r\nBut I did not focus on Images content, I focused on images rotation zoom and shift.\r\n\r\nFirst 2 pictures have zoom 1.3, while rest 3,4,5 have zoom 1\r\n\r\nRotation abs angle was small for 1,2,4 images (<10 degrees) big for 5 image (10-14 degrees) and very big for 3 image (14-18 degrees)\r\n\r\nI created C# tool to manually set 2 points presented on each image in set and save them to csv.\r\nBased on each pair of points we can calculate zoom and rotation now.\r\n\r\nI used that to train SVM and predict. It gave 0.72 on public and 0.77 on private.(you can see my script and files)",
    "125664": "I got the same observation as Dmitry on the zoom levels and rotation angles, but I was using the homography matrices as inputs.\r\n\r\nI think some images in the test set with only forest or desert prevented the ML method to get a higher score. That kind of images doesn't exist in the train set and they are difficult to find the matched points to generate the homography matrices.",
    "125677": "[quote=mingtotti;125664]\r\nI got the same observation as Dmitry on the zoom levels and rotation angles, but I was using the homography matrices as inputs.\r\n[/quote]\r\n\r\nIt's not hard to convert from homography to more familiar translation, rotation, scale & shear:\r\n\r\n    def getComponents(homography):\r\n        \t'''((translationx, translationy), rotation, (scalex, scaley), shear)'''\r\n        \ta = homography[0,0]\r\n        \tb = homography[0,1]\r\n        \tc = homography[0,2]\r\n        \td = homography[1,0]\r\n        \te = homography[1,1]\r\n        \tf = homography[1,2]\r\n        \r\n        \tp = math.sqrt(a*a + b*b)\r\n        \tr = (a*e - b*d)/(p)\r\n        \tq = (a*d + b*e)/(a*e - b*d)\r\n        \r\n        \ttranslation = (c, f)\r\n        \tscale = (p, r)\r\n        \tshear = q\r\n        \r\n        \ttheta = math.atan2(b,a)\r\n        \tinAngle = theta * 180/math.pi\r\n        \tangle = abs( inAngle )\r\n        \r\n        \treturn [c, f, p, r, q, theta, inAngle, angle]",
    "125719": "BTW I think using of rotations and zoom cannot be considered as 100% ML.\r\nIt's using of images metadata, not the contents.\r\n\r\nDuring the whole competition I thought it would be much more exciting if competition organizers could provide fotos from absolutely unique locations. So that none of sets intersect and all sets are isolated from each other (no correlation between sets and days - absolutely different shooting time, brightness, contrast, rotation, zoom and others). So that the only way is to analyze contents (puddles, shadows, cars, etc). In this case it would be very challenging to guess the time order.\r\n\r\nThen I can imagine only one approach - find same pixels on all images which are doing some movement in relation to static pixels.  Based on the movement value in each picture, restore it's timeline position. (but still there's possibility to get 100% reverse answer)",
    "125735": "Totally agree. Analyzing contents to find the moving objects or changing environments will be more challenging."
  },
  "source": "meta"
}