Ecoer Logo
VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS0.00%
Net Worth
0.037USD
STEEM
0.000STEEM
SBD
0.000SBD
Effective Power
5.007SP
├── Own SP
0.635SP
└── Incoming Deleg
+4.371SP

Detailed Balance

STEEM
balance
0.000STEEM
market_balance
0.000STEEM
savings_balance
0.000STEEM
reward_steem_balance
0.000STEEM
STEEM POWER
Own SP
0.635SP
Delegated Out
0.000SP
Delegation In
4.371SP
Effective Power
5.007SP
Reward SP (pending)
0.000SP
SBD
sbd_balance
0.000SBD
sbd_conversions
0.000SBD
sbd_market_balance
0.000SBD
savings_sbd_balance
0.000SBD
reward_sbd_balance
0.000SBD
{
  "balance": "0.000 STEEM",
  "savings_balance": "0.000 STEEM",
  "reward_steem_balance": "0.000 STEEM",
  "vesting_shares": "1033.083185 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "7110.576621 VESTS",
  "sbd_balance": "0.000 SBD",
  "savings_sbd_balance": "0.000 SBD",
  "reward_sbd_balance": "0.000 SBD",
  "conversions": []
}

Account Info

namedefy
id281057
rank244,017
reputation1817494
created2017-07-25T06:15:57
recovery_accountsteem
proxyNone
post_count2
comment_count0
lifetime_vote_count0
witnesses_voted_for0
last_post2018-07-23T15:07:39
last_root_post2018-07-23T15:07:39
last_vote_time2017-07-25T17:14:06
proxied_vsf_votes0, 0, 0, 0
can_vote1
voting_power0
delayed_votes0
balance0.000 STEEM
savings_balance0.000 STEEM
sbd_balance0.000 SBD
savings_sbd_balance0.000 SBD
vesting_shares1033.083185 VESTS
delegated_vesting_shares0.000000 VESTS
received_vesting_shares7110.576621 VESTS
reward_vesting_balance0.000000 VESTS
vesting_balance0.000 STEEM
vesting_withdraw_rate0.000000 VESTS
next_vesting_withdrawal1969-12-31T23:59:59
withdrawn0
to_withdraw0
withdraw_routes0
savings_withdraw_requests0
last_account_recovery1970-01-01T00:00:00
reset_accountnull
last_owner_update1970-01-01T00:00:00
last_account_update2019-12-29T20:55:54
minedNo
sbd_seconds0
sbd_last_interest_payment1970-01-01T00:00:00
savings_sbd_last_interest_payment1970-01-01T00:00:00
{
  "id": 281057,
  "name": "defy",
  "owner": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM6PnxLCdP7ehx8MXuEvNbXBfhD1qt8Xhgv3AtmmyGQQonHrqymq",
        1
      ]
    ]
  },
  "active": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM7DZaQ366Tsqq7kLSzm58gbAWqx8C1M6rEaCUEqg2gi6ZctBCaY",
        1
      ]
    ]
  },
  "posting": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM7BKSGmnqqnz7dexSeZ1bBrVYRYPtuZqtH5goMqiZY7YufXfsNb",
        1
      ]
    ]
  },
  "memo_key": "STM8NC1R2yfVkLwpv4CVXVpARan6bKUG52Ppu7mkUbZXPaLo6FQhV",
  "json_metadata": "{\"profile\":{\"name\":\"defy\",\"cover_image\":\"http://www.candlechem.com/images/D152teal.gif\"}}",
  "posting_json_metadata": "{\"profile\":{\"name\":\"ddonatien\",\"profile_image\":\"https://cdn.steemitimages.com/DQmTXzxLdLJxEZf6Gc1BdHHfj9oiutKam1rgmg2LvtzChHq/DONATIEN_SMALLER_SQUARE.jpg\",\"cover_image\":\"http://www.candlechem.com/images/D152teal.gif\"}}",
  "proxy": "",
  "last_owner_update": "1970-01-01T00:00:00",
  "last_account_update": "2019-12-29T20:55:54",
  "created": "2017-07-25T06:15:57",
  "mined": false,
  "recovery_account": "steem",
  "last_account_recovery": "1970-01-01T00:00:00",
  "reset_account": "null",
  "comment_count": 0,
  "lifetime_vote_count": 0,
  "post_count": 2,
  "can_vote": true,
  "voting_manabar": {
    "current_mana": "8143659806",
    "last_update_time": 1779060132
  },
  "downvote_manabar": {
    "current_mana": 2035914951,
    "last_update_time": 1779060132
  },
  "voting_power": 0,
  "balance": "0.000 STEEM",
  "savings_balance": "0.000 STEEM",
  "sbd_balance": "0.000 SBD",
  "sbd_seconds": "0",
  "sbd_seconds_last_update": "1970-01-01T00:00:00",
  "sbd_last_interest_payment": "1970-01-01T00:00:00",
  "savings_sbd_balance": "0.000 SBD",
  "savings_sbd_seconds": "0",
  "savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
  "savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
  "savings_withdraw_requests": 0,
  "reward_sbd_balance": "0.000 SBD",
  "reward_steem_balance": "0.000 STEEM",
  "reward_vesting_balance": "0.000000 VESTS",
  "reward_vesting_steem": "0.000 STEEM",
  "vesting_shares": "1033.083185 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "7110.576621 VESTS",
  "vesting_withdraw_rate": "0.000000 VESTS",
  "next_vesting_withdrawal": "1969-12-31T23:59:59",
  "withdrawn": 0,
  "to_withdraw": 0,
  "withdraw_routes": 0,
  "curation_rewards": 0,
  "posting_rewards": 0,
  "proxied_vsf_votes": [
    0,
    0,
    0,
    0
  ],
  "witnesses_voted_for": 0,
  "last_post": "2018-07-23T15:07:39",
  "last_root_post": "2018-07-23T15:07:39",
  "last_vote_time": "2017-07-25T17:14:06",
  "post_bandwidth": 0,
  "pending_claimed_accounts": 0,
  "vesting_balance": "0.000 STEEM",
  "reputation": 1817494,
  "transfer_history": [],
  "market_history": [],
  "post_history": [],
  "vote_history": [],
  "other_history": [],
  "witness_votes": [],
  "tags_usage": [],
  "guest_bloggers": [],
  "rank": 244017
}

Withdraw Routes

IncomingOutgoing
Empty
Empty
{
  "incoming": [],
  "outgoing": []
}
From Date
To Date
steemdelegated 4.371 SP to @defy
2026/05/17 23:22:12
delegatorsteem
delegateedefy
vesting shares7110.576621 VESTS
Transaction InfoBlock #106142392/Trx a4c0c2396c03455cc580401638e584ac706f9530
View Raw JSON Data
{
  "trx_id": "a4c0c2396c03455cc580401638e584ac706f9530",
  "block": 106142392,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-05-17T23:22:12",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "defy",
      "vesting_shares": "7110.576621 VESTS"
    }
  ]
}
steemdelegated 2.704 SP to @defy
2026/05/12 00:16:06
delegatorsteem
delegateedefy
vesting shares4398.366216 VESTS
Transaction InfoBlock #105971434/Trx 6d9d12beaef9f8bbfca309f2867738a87049ed8a
View Raw JSON Data
{
  "trx_id": "6d9d12beaef9f8bbfca309f2867738a87049ed8a",
  "block": 105971434,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-05-12T00:16:06",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "defy",
      "vesting_shares": "4398.366216 VESTS"
    }
  ]
}
steemdelegated 4.379 SP to @defy
2026/04/25 22:44:33
delegatorsteem
delegateedefy
vesting shares7123.092377 VESTS
Transaction InfoBlock #105510071/Trx b7fa46a7ccf654ee0f56d06f378534889a43ae62
View Raw JSON Data
{
  "trx_id": "b7fa46a7ccf654ee0f56d06f378534889a43ae62",
  "block": 105510071,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-04-25T22:44:33",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "defy",
      "vesting_shares": "7123.092377 VESTS"
    }
  ]
}
steemdelegated 2.730 SP to @defy
2026/01/23 05:25:42
delegatorsteem
delegateedefy
vesting shares4439.913035 VESTS
Transaction InfoBlock #102848967/Trx acf07ed1a78507d22c29f2d171fb36b253bef357
View Raw JSON Data
{
  "trx_id": "acf07ed1a78507d22c29f2d171fb36b253bef357",
  "block": 102848967,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-01-23T05:25:42",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "defy",
      "vesting_shares": "4439.913035 VESTS"
    }
  ]
}
steemdelegated 2.831 SP to @defy
2024/12/17 00:45:42
delegatorsteem
delegateedefy
vesting shares4604.132232 VESTS
Transaction InfoBlock #91295393/Trx d524ac0942cc22c4ac2b2d6f9a322830ad838c62
View Raw JSON Data
{
  "trx_id": "d524ac0942cc22c4ac2b2d6f9a322830ad838c62",
  "block": 91295393,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2024-12-17T00:45:42",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "defy",
      "vesting_shares": "4604.132232 VESTS"
    }
  ]
}
steemdelegated 2.935 SP to @defy
2023/11/13 16:29:00
delegatorsteem
delegateedefy
vesting shares4773.265764 VESTS
Transaction InfoBlock #79849615/Trx d89e2d9e14ee559ceac8248d6462c6867502b77c
View Raw JSON Data
{
  "trx_id": "d89e2d9e14ee559ceac8248d6462c6867502b77c",
  "block": 79849615,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2023-11-13T16:29:00",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "defy",
      "vesting_shares": "4773.265764 VESTS"
    }
  ]
}
steemdelegated 4.740 SP to @defy
2023/09/21 20:47:27
delegatorsteem
delegateedefy
vesting shares7710.544550 VESTS
Transaction InfoBlock #78346587/Trx 6162ad48418887e23c288c807e8ed73a99bafa37
View Raw JSON Data
{
  "trx_id": "6162ad48418887e23c288c807e8ed73a99bafa37",
  "block": 78346587,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2023-09-21T20:47:27",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "defy",
      "vesting_shares": "7710.544550 VESTS"
    }
  ]
}
steemdelegated 4.877 SP to @defy
2022/11/03 10:43:09
delegatorsteem
delegateedefy
vesting shares7932.225988 VESTS
Transaction InfoBlock #69112086/Trx 59d573cc15e4a58bbfa9bfb0f3b82395bcf7a9c3
View Raw JSON Data
{
  "trx_id": "59d573cc15e4a58bbfa9bfb0f3b82395bcf7a9c3",
  "block": 69112086,
  "trx_in_block": 6,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2022-11-03T10:43:09",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "defy",
      "vesting_shares": "7932.225988 VESTS"
    }
  ]
}
steemdelegated 5.012 SP to @defy
2022/01/17 10:03:57
delegatorsteem
delegateedefy
vesting shares8152.759219 VESTS
Transaction InfoBlock #60808351/Trx 6a16198fa070465a7f48021e79f9cf85e03f3d4f
View Raw JSON Data
{
  "trx_id": "6a16198fa070465a7f48021e79f9cf85e03f3d4f",
  "block": 60808351,
  "trx_in_block": 28,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2022-01-17T10:03:57",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "defy",
      "vesting_shares": "8152.759219 VESTS"
    }
  ]
}
steemdelegated 5.125 SP to @defy
2021/06/14 00:01:21
delegatorsteem
delegateedefy
vesting shares8336.527877 VESTS
Transaction InfoBlock #54606782/Trx 1ba5ad3811451022d33b5155e91d71a1959663f8
View Raw JSON Data
{
  "trx_id": "1ba5ad3811451022d33b5155e91d71a1959663f8",
  "block": 54606782,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2021-06-14T00:01:21",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "defy",
      "vesting_shares": "8336.527877 VESTS"
    }
  ]
}
steemdelegated 5.240 SP to @defy
2020/12/11 10:21:36
delegatorsteem
delegateedefy
vesting shares8523.949851 VESTS
Transaction InfoBlock #49354278/Trx f991391c7e0ebbe206f21b1b3a5eb27cccd0eb5c
View Raw JSON Data
{
  "trx_id": "f991391c7e0ebbe206f21b1b3a5eb27cccd0eb5c",
  "block": 49354278,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-12-11T10:21:36",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "defy",
      "vesting_shares": "8523.949851 VESTS"
    }
  ]
}
steemdelegated 1.176 SP to @defy
2020/12/06 03:58:42
delegatorsteem
delegateedefy
vesting shares1912.543513 VESTS
Transaction InfoBlock #49205840/Trx 516a4e5dec6405595f7c7ed83fef3c80bb389f33
View Raw JSON Data
{
  "trx_id": "516a4e5dec6405595f7c7ed83fef3c80bb389f33",
  "block": 49205840,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-12-06T03:58:42",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "defy",
      "vesting_shares": "1912.543513 VESTS"
    }
  ]
}
steemdelegated 5.244 SP to @defy
2020/12/05 11:55:57
delegatorsteem
delegateedefy
vesting shares8530.316490 VESTS
Transaction InfoBlock #49186949/Trx 4a4f79a0b0130eaef470ea1b9a568cc2cf940632
View Raw JSON Data
{
  "trx_id": "4a4f79a0b0130eaef470ea1b9a568cc2cf940632",
  "block": 49186949,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-12-05T11:55:57",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "defy",
      "vesting_shares": "8530.316490 VESTS"
    }
  ]
}
steemdelegated 1.180 SP to @defy
2020/11/02 13:59:30
delegatorsteem
delegateedefy
vesting shares1920.017158 VESTS
Transaction InfoBlock #48255864/Trx cde04eea2181bf1941583aeb7be46dde155acb01
View Raw JSON Data
{
  "trx_id": "cde04eea2181bf1941583aeb7be46dde155acb01",
  "block": 48255864,
  "trx_in_block": 5,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-11-02T13:59:30",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "defy",
      "vesting_shares": "1920.017158 VESTS"
    }
  ]
}
steemdelegated 5.369 SP to @defy
2020/05/09 04:55:12
delegatorsteem
delegateedefy
vesting shares8732.963064 VESTS
Transaction InfoBlock #43216078/Trx fefadb385dbbd78dcfacc58e87d76a001b1422de
View Raw JSON Data
{
  "trx_id": "fefadb385dbbd78dcfacc58e87d76a001b1422de",
  "block": 43216078,
  "trx_in_block": 28,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-05-09T04:55:12",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "defy",
      "vesting_shares": "8732.963064 VESTS"
    }
  ]
}
steemdelegated 1.201 SP to @defy
2020/05/08 08:24:06
delegatorsteem
delegateedefy
vesting shares1953.311140 VESTS
Transaction InfoBlock #43192031/Trx 80af7bb9133859c6daf7abd6833016ccd837ac7e
View Raw JSON Data
{
  "trx_id": "80af7bb9133859c6daf7abd6833016ccd837ac7e",
  "block": 43192031,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-05-08T08:24:06",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "defy",
      "vesting_shares": "1953.311140 VESTS"
    }
  ]
}
defyupdated their account properties
2019/12/29 20:55:54
accountdefy
memo keySTM8NC1R2yfVkLwpv4CVXVpARan6bKUG52Ppu7mkUbZXPaLo6FQhV
json metadata{"profile":{"name":"defy","cover_image":"http://www.candlechem.com/images/D152teal.gif"}}
Transaction InfoBlock #39471153/Trx a511a248951df9d9e1cebee15069a4f01682e099
View Raw JSON Data
{
  "trx_id": "a511a248951df9d9e1cebee15069a4f01682e099",
  "block": 39471153,
  "trx_in_block": 19,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2019-12-29T20:55:54",
  "op": [
    "account_update",
    {
      "account": "defy",
      "memo_key": "STM8NC1R2yfVkLwpv4CVXVpARan6bKUG52Ppu7mkUbZXPaLo6FQhV",
      "json_metadata": "{\"profile\":{\"name\":\"defy\",\"cover_image\":\"http://www.candlechem.com/images/D152teal.gif\"}}"
    }
  ]
}
defyupdated their account properties
2019/12/29 20:55:42
accountdefy
memo keySTM8NC1R2yfVkLwpv4CVXVpARan6bKUG52Ppu7mkUbZXPaLo6FQhV
json metadata{"profile":{"name":"defy","profile_image":"https://cdn.steemitimages.com/DQmTXzxLdLJxEZf6Gc1BdHHfj9oiutKam1rgmg2LvtzChHq/DONATIEN_SMALLER_SQUARE.jpg","cover_image":"http://www.candlechem.com/images/D152teal.gif"}}
Transaction InfoBlock #39471149/Trx 19c1fe2c7737e8dd4f47e50f8eb017fb8a3c3064
View Raw JSON Data
{
  "trx_id": "19c1fe2c7737e8dd4f47e50f8eb017fb8a3c3064",
  "block": 39471149,
  "trx_in_block": 23,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2019-12-29T20:55:42",
  "op": [
    "account_update",
    {
      "account": "defy",
      "memo_key": "STM8NC1R2yfVkLwpv4CVXVpARan6bKUG52Ppu7mkUbZXPaLo6FQhV",
      "json_metadata": "{\"profile\":{\"name\":\"defy\",\"profile_image\":\"https://cdn.steemitimages.com/DQmTXzxLdLJxEZf6Gc1BdHHfj9oiutKam1rgmg2LvtzChHq/DONATIEN_SMALLER_SQUARE.jpg\",\"cover_image\":\"http://www.candlechem.com/images/D152teal.gif\"}}"
    }
  ]
}
steemdelegated 5.434 SP to @defy
2019/11/01 07:22:06
delegatorsteem
delegateedefy
vesting shares8839.362147 VESTS
Transaction InfoBlock #37787624/Trx 3e709f72f6b621ab8a565f4a88e5af06a56c3645
View Raw JSON Data
{
  "trx_id": "3e709f72f6b621ab8a565f4a88e5af06a56c3645",
  "block": 37787624,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2019-11-01T07:22:06",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "defy",
      "vesting_shares": "8839.362147 VESTS"
    }
  ]
}
2019/07/25 06:49:15
parent authordefy
parent permlinketape-2-mise-a-disposition-sur-le-web
authorsteemitboard
permlinksteemitboard-notify-defy-20190725t064914000z
title
bodyCongratulations @defy! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@defy/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table> <sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@defy) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=defy)_</sub> ###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
Transaction InfoBlock #34964091/Trx 8bfe71bb38683f4fd60e52eb01a0c96acfb5c01c
View Raw JSON Data
{
  "trx_id": "8bfe71bb38683f4fd60e52eb01a0c96acfb5c01c",
  "block": 34964091,
  "trx_in_block": 11,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2019-07-25T06:49:15",
  "op": [
    "comment",
    {
      "parent_author": "defy",
      "parent_permlink": "etape-2-mise-a-disposition-sur-le-web",
      "author": "steemitboard",
      "permlink": "steemitboard-notify-defy-20190725t064914000z",
      "title": "",
      "body": "Congratulations @defy! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@defy/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table>\n\n<sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@defy) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=defy)_</sub>\n\n\n###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}"
    }
  ]
}
steemdelegated 5.556 SP to @defy
2018/11/26 17:13:00
delegatorsteem
delegateedefy
vesting shares9036.837524 VESTS
Transaction InfoBlock #28043601/Trx fafe2f5af2f97d05a1cdf97ef2f7df537d9891af
View Raw JSON Data
{
  "trx_id": "fafe2f5af2f97d05a1cdf97ef2f7df537d9891af",
  "block": 28043601,
  "trx_in_block": 9,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-11-26T17:13:00",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "defy",
      "vesting_shares": "9036.837524 VESTS"
    }
  ]
}
defyunfollowed @adsactly
2018/08/02 08:21:03
required auths[]
required posting auths["defy"]
idfollow
json["follow",{"follower":"defy","following":"adsactly","what":[]}]
Transaction InfoBlock #24709866/Trx 8b2c9bc2f5a54e0a03950369ab949d223b60b7dd
View Raw JSON Data
{
  "trx_id": "8b2c9bc2f5a54e0a03950369ab949d223b60b7dd",
  "block": 24709866,
  "trx_in_block": 28,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-08-02T08:21:03",
  "op": [
    "custom_json",
    {
      "required_auths": [],
      "required_posting_auths": [
        "defy"
      ],
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"defy\",\"following\":\"adsactly\",\"what\":[]}]"
    }
  ]
}
2018/07/25 12:25:54
required auths[]
required posting auths["defy"]
idfollow
json["follow",{"follower":"defy","following":"markgritter","what":["blog"]}]
Transaction InfoBlock #24484943/Trx 5c4b895f2edbd29fd697eef992e95b6ca166378d
View Raw JSON Data
{
  "trx_id": "5c4b895f2edbd29fd697eef992e95b6ca166378d",
  "block": 24484943,
  "trx_in_block": 13,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-25T12:25:54",
  "op": [
    "custom_json",
    {
      "required_auths": [],
      "required_posting_auths": [
        "defy"
      ],
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"defy\",\"following\":\"markgritter\",\"what\":[\"blog\"]}]"
    }
  ]
}
2018/07/25 12:25:45
required auths[]
required posting auths["defy"]
idfollow
json["follow",{"follower":"defy","following":"birchmark","what":["blog"]}]
Transaction InfoBlock #24484940/Trx 4cc18267e9353c0ab212257431eb53f260979d03
View Raw JSON Data
{
  "trx_id": "4cc18267e9353c0ab212257431eb53f260979d03",
  "block": 24484940,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-25T12:25:45",
  "op": [
    "custom_json",
    {
      "required_auths": [],
      "required_posting_auths": [
        "defy"
      ],
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"defy\",\"following\":\"birchmark\",\"what\":[\"blog\"]}]"
    }
  ]
}
defyfollowed @adsactly
2018/07/25 12:24:12
required auths[]
required posting auths["defy"]
idfollow
json["follow",{"follower":"defy","following":"adsactly","what":["blog"]}]
Transaction InfoBlock #24484909/Trx 15118358c2d94be5720da625d936ea0addace313
View Raw JSON Data
{
  "trx_id": "15118358c2d94be5720da625d936ea0addace313",
  "block": 24484909,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-25T12:24:12",
  "op": [
    "custom_json",
    {
      "required_auths": [],
      "required_posting_auths": [
        "defy"
      ],
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"defy\",\"following\":\"adsactly\",\"what\":[\"blog\"]}]"
    }
  ]
}
defyupdated their account properties
2018/07/25 11:52:24
accountdefy
memo keySTM8NC1R2yfVkLwpv4CVXVpARan6bKUG52Ppu7mkUbZXPaLo6FQhV
json metadata{"profile":{"name":"ddonatien","profile_image":"https://cdn.steemitimages.com/DQmTXzxLdLJxEZf6Gc1BdHHfj9oiutKam1rgmg2LvtzChHq/DONATIEN_SMALLER_SQUARE.jpg","cover_image":"http://www.candlechem.com/images/D152teal.gif"}}
Transaction InfoBlock #24484274/Trx 9907cba32617016829bc33b997cdda500d927f47
View Raw JSON Data
{
  "trx_id": "9907cba32617016829bc33b997cdda500d927f47",
  "block": 24484274,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-25T11:52:24",
  "op": [
    "account_update",
    {
      "account": "defy",
      "memo_key": "STM8NC1R2yfVkLwpv4CVXVpARan6bKUG52Ppu7mkUbZXPaLo6FQhV",
      "json_metadata": "{\"profile\":{\"name\":\"ddonatien\",\"profile_image\":\"https://cdn.steemitimages.com/DQmTXzxLdLJxEZf6Gc1BdHHfj9oiutKam1rgmg2LvtzChHq/DONATIEN_SMALLER_SQUARE.jpg\",\"cover_image\":\"http://www.candlechem.com/images/D152teal.gif\"}}"
    }
  ]
}
2018/07/25 09:52:03
parent author
parent permlinkprogramming
authordefy
permlinketape-2-mise-a-disposition-sur-le-web
titleEtape 2 : mise à disposition sur le web
bodyUne fois un tel service mis en place, il est de l'ordre de l'intérêt général de le mettre à disposition de tous. Nous allons donc devoir coder une api minimaliste pour pouvoir rendre ce service accessible via le web. C'est ce que nous allons nous atteler dans cette partie. Et pour ce faire et rester dans le Python nous allons utiliser le microframework [flask](http://flask.pocoo.org/). # Initialisation du projet - Organisation des fichiers J'ai pour ma part choisi de développer mon micro serveur dans le même projet que celui de l'étape précedente, mais on peut choisir de mettre la racine où l'on souhaite. Pour cette partie nous auront besoin que d'une arborescence très limitée. En effet nous aurons juste besoin d'un fichier .py qui décrit le fonctionnement du serveur et d'un dossier `templates` qui contiendra le template de notre page d'accueil. On penchera donc pour la structure suivante : ``` / server.py templates/ index.html ``` - Installation de Flask Flask s'installe très facilement avec pip : `pip install flask` On aura aussi besoin du package flask-uploads tout à l'heure pour gérer les uploads d'images, donc il peut être pertinent de l'installer maintenant : ` pip install Flask-Uploads` # Développement d'un serveur basique Nous allons commencer par un serveur très minimaliste que nous complèterons ensuite. Pour cela nous aurons seulement besoin de créer un fichier _index.html_ et un fichier _server.py_. **index.html** Nous aurons seulement besoin sur notre page web d'un formulaire pour pourvoir téléverser des images vers notre serveur. Un fichier html de ce type nous convient donc amplement : ``` <html> <head> <title>Détection visage</title> </head> <body> Veuillez soumettre une image à la détection : <form method=POST enctype=multipart/form-data action=""> <input type=file name=photo> <input type="submit"> </form> </body> </html> ``` On remarquera que nous avons laissé le champ action vide car nous n'avons pas encore créé la route pour l'upload d'images **server.py** Pour l'instant nous avons seulement besoin d'une route qui permette de renvoyer notre page html à une requête GET sur notre url. Rien de plus simple : ``` from flask import Flask, render_template app = Flask(__name__) @app.route('/') def index(): return render_template('index.html') if __name__ == '__main__': app.run() ``` Notre serveur est prêt ! Pour le lancer : ``` export FLASK_APP=server.py flask run ``` On retrouve notre page web sur `localhost:5000`. C'est très bien, mais il nous manque encore la fonctionnalité principale, à savoir renvoyer les résultats de notre run.py de l'étape précédente à notre utilisateur. # Ajout de la route d'upload pour la détection Nous allons commencer par ajouter la route dans server.py. Les requêtes que nous attendrons seront des requêtes POST sur la route _/upload_. ``` @app.route('/upload', methods=['POST']) def upload(): ``` Pour gérer la récupération des images nous allons utiliser le package [flask_upload](https://pythonhosted.org/Flask-Uploads/). Nous allons donc créer un nouveau UploadSet et le configurer de manière à définir le dossier où seront téléversées les images envoyées par les utilisateurs. ``` photos = UploadSet('photos', IMAGES) app.config['UPLOADED_PHOTOS_DEST'] = 'static/img' configure_uploads(app, photos) ``` Une fois ceci fait nous pouvons facilement enregistrer les images envoyées grâce à la méthode _save_ de notre _UploadSet_ : ``` if 'photo' in request.files: filename = photos.save(request.files['photo']) ``` Nous utiliserons le package _subprocess_ pour exécuter la commande de l'étape 1 et il ne nous reste qu'à rajouter notre route comme action dans notre template html et le tour est joué ! /!\ Il faut penser à ajouter le dossier parent de notre package "detect_visage" au path python pour que subprocess sache où le chercher. Pour lancer le serveur : ``` export PYTHONPATH=$PYTHONPATH:<path_vers_parent_detect_visage>" export FLASK_APP=server.py flask run ``` Code complet : https://github.com/ddonatien/detect_visage/releases/tag/v1
json metadata{"tags":["programming","python","flask","fr","francais"],"links":["http://flask.pocoo.org/","https://pythonhosted.org/Flask-Uploads/","https://github.com/ddonatien/detect_visage/releases/tag/v1"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #24481867/Trx ce2bcd856efb56fce58cb7e1f362fc0653c2128c
View Raw JSON Data
{
  "trx_id": "ce2bcd856efb56fce58cb7e1f362fc0653c2128c",
  "block": 24481867,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-25T09:52:03",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "programming",
      "author": "defy",
      "permlink": "etape-2-mise-a-disposition-sur-le-web",
      "title": "Etape 2 : mise à disposition sur le web",
      "body": "Une fois un tel service mis en place, il est de l'ordre de l'intérêt général de le mettre à disposition de tous.  \nNous allons donc devoir coder une api minimaliste pour pouvoir rendre ce service accessible via le web.\nC'est ce que nous allons nous atteler dans cette partie. Et pour ce faire et rester dans le Python nous allons utiliser le microframework [flask](http://flask.pocoo.org/).\n\n# Initialisation du projet\n - Organisation des fichiers\n  J'ai pour ma part choisi de développer mon micro serveur dans le même projet que celui de l'étape précedente, mais on peut choisir de mettre la racine où l'on souhaite.  \n  Pour cette partie nous auront besoin que d'une arborescence très limitée. En effet nous aurons juste besoin d'un fichier .py qui décrit le fonctionnement du serveur et d'un dossier `templates` qui contiendra  le template de notre page d'accueil.  \n  On penchera donc pour la structure suivante :\n    ``` \n    /\n       server.py\n       templates/\n         index.html\n    ```\n\n- Installation de Flask\n    Flask s'installe très facilement avec pip : `pip install flask`  \n    On aura aussi besoin du package flask-uploads tout à l'heure pour gérer les uploads d'images, donc il peut être pertinent de l'installer maintenant : ` pip install Flask-Uploads`\n\n# Développement d'un serveur basique\n  Nous allons commencer par un serveur très minimaliste que nous complèterons ensuite. Pour cela nous aurons seulement besoin de créer un fichier _index.html_ et un fichier _server.py_.\n\n  **index.html**\n   Nous aurons seulement besoin sur notre page web d'un formulaire pour pourvoir téléverser des images vers notre serveur. Un fichier html de ce type nous convient donc amplement :  \n  ```\n    <html>\n        <head>\n            <title>Détection visage</title>\n        </head>\n        <body>\n            Veuillez soumettre une image à la détection :\n            <form method=POST enctype=multipart/form-data action=\"\">\n                <input type=file name=photo>\n                <input type=\"submit\">\n            </form>\n        </body>\n    </html>\n  ```\n  On remarquera que nous avons laissé le champ action vide car nous n'avons pas encore créé la route pour l'upload d'images\n\n  **server.py**\n  Pour l'instant nous avons seulement besoin d'une route qui permette de renvoyer notre page html à une requête GET sur notre url.\n  Rien de plus simple :   \n  ```\n from flask import Flask, render_template\n\napp = Flask(__name__)\n\[email protected]('/')\ndef index():\n    return render_template('index.html')\n\n\nif __name__ == '__main__':\n    app.run()\n```\n  \n   \nNotre serveur est prêt !\nPour le lancer : \n```\nexport FLASK_APP=server.py\nflask run\n```\n\nOn retrouve notre page web sur `localhost:5000`.   \nC'est très bien,  mais il nous manque encore la fonctionnalité principale, à savoir renvoyer les résultats de notre run.py de l'étape précédente à notre utilisateur.\n\n# Ajout de la route d'upload pour la détection\n\nNous allons commencer par ajouter la route dans server.py. Les requêtes que nous attendrons seront des requêtes POST sur la route _/upload_.\n```\[email protected]('/upload', methods=['POST'])\ndef upload():\n```\n\nPour gérer la récupération des images nous allons utiliser le package [flask_upload](https://pythonhosted.org/Flask-Uploads/). Nous allons  donc créer un nouveau UploadSet et le configurer de manière à définir le dossier où seront téléversées les images envoyées par les utilisateurs.\n\n```\nphotos = UploadSet('photos', IMAGES)\n\napp.config['UPLOADED_PHOTOS_DEST'] = 'static/img'\nconfigure_uploads(app, photos)\n```\n\nUne fois ceci fait nous pouvons facilement enregistrer les images envoyées grâce à la méthode _save_ de notre _UploadSet_ :\n```\n    if 'photo' in request.files:\n        filename = photos.save(request.files['photo'])\n```\nNous utiliserons le package _subprocess_ pour exécuter la commande de l'étape 1 et il ne nous reste qu'à rajouter notre route comme action dans notre template html et le tour est joué !\n\n/!\\ Il faut penser à ajouter le dossier parent de notre package \"detect_visage\" au path python pour que subprocess sache où le chercher.\n\nPour lancer le serveur :\n```\nexport PYTHONPATH=$PYTHONPATH:<path_vers_parent_detect_visage>\"\nexport  FLASK_APP=server.py\nflask run\n```\n\nCode complet :  https://github.com/ddonatien/detect_visage/releases/tag/v1",
      "json_metadata": "{\"tags\":[\"programming\",\"python\",\"flask\",\"fr\",\"francais\"],\"links\":[\"http://flask.pocoo.org/\",\"https://pythonhosted.org/Flask-Uploads/\",\"https://github.com/ddonatien/detect_visage/releases/tag/v1\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
defypublished a new post: etape-1-creation-du-service
2018/07/25 09:51:36
parent author
parent permlinkpython
authordefy
permlinketape-1-creation-du-service
titleEtape 1 : création du service
bodyDans cette première étape nous allons développer un service simple de détection de visages comme base pour la suite. Comment faire de la détection de visage en python grâce à openCV ? Nous allons utiliser la librairie python cv2 et plus particulièrement le _CascadeClassifier_. # Initialisation du projet. - Organisation des fichiers. Nous allons suivre l'arborescence suivante pour notre projet. C'est une organisation très classique pour un package python. ``` / run.py app/ __init__.py detect.py models/ a.xml data/ img.jpg ``` - Technologie de reconnaissance. Dans le but de rester assez concis nous allons utiliser pour ce projet un modèle pré-entrainé de haar cascade détection fourni avec openCV. Pour aller plus loin des informations complémentaires sont disponibles au lien suivant : https://docs.opencv.org/3.3.1/d7/d8b/tutorial_py_face_detection.html # Développement. Comme on peut l'intuiter en observant l'arborescence nous allons dans ce projet séparer la partie intelligence et la partie interface dans deux fichiers différents. Dans le fichier detect.py nous allons réunir tout ce qui est nécessaire au détecteur, tandis que le fichier run.py permettra d'instancier un détecteur et de l'utiliser sur une image soumise par l'utilisateur. Préalablement au développement il est nécessaire de télécharger la modèle pré-entrainé disponible au lien suivant : https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml dans le dossier `models`. - detect.py Dans detect.py nous allons faire une classe python DetectVisage que nous pourrons ensuite importer et instancier dans le run.py. Cette classe n'a que deux actions à effectuer : charger le modèle en mémoire et utiliser ce modèle pour faire de la détéction. On va donc traduire cela par deux méthodes : une méthode charge_model et une méthode detect. *charge_model* : ``` def charge_model(self): root_path = os.path.dirname(sys.modules['__main__'].__file__) model_path = os.path.join(root_path, 'models') self.filtre = cv2.CascadeClassifier( os.path.join(model_path, 'haarcascade_frontalface_default.xml')) ``` On notera que l'on récupère le chemin vers le xml du modèle relativement à la racine du projet. Cela permet de pouvoir déplacer facilement le projet dans un système ou d'un système à un autre sans avoir à se soucier de problème de fichiers perdus. *detect* : ``` def detect(self, path_image): image = cv2.imread(path_image) image_niveaux_gris = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) face = self.filtre.detectMultiScale(image_niveaux_gris) return False if len(face) == 0 else True ``` Pour faire la détection nous allons utiliser la méthode detectMultiScale de notre CascadeClassifier. Cette méthode va chercher plusieurs fois un visage dans l'image en augmentant la taille de la zone de détection de 10% à chaque itération (on utilise la valeur par défaut. Cela permet d'être robuste au zoom. Le détecteur fonctionne sur des images en niveaux de gris. Il est donc important de convertir l'espace des couleurs avant de l'utiliser. Code complet : https://github.com/ddonatien/detect_visage/blob/v0/app/detect.py Nous avons maintenant un détecteur de visage ! Mais aucune façon de dialoguer avec... - run.py Pour pallier ce problème nous allons pour l'instant faire une interface minimaliste avec la console. Pour ce faire nous nous servirons de la librairie getopts pour pouvoir passer des chemins vers des images au détecteur. Une fois la librairie importée il ne nous restera plus qu'à définir les arguments attendus et agir en conséquences. ``` try: opts, args = getopt.getopt(sys.argv[1:], 'h:i:', ['help', 'image']) except getopt.GetoptError: sys.exit(2) chemin_image = '' for opt, arg in opts: if opt in ('-i', '--image'): chemin_image = arg detecteur = DetectVisage() if detecteur.detect(chemin_image): print("Visage detecte !") else: print("Pas de visage") ``` Code complet ici : https://github.com/ddonatien/detect_visage/blob/v0/run.py Vous pouvez maintenant tester votre détecteur avec vos images ou avec les deux images de test fournies avec le projet (dans data) en appelant le run du package et en lui donnant le chemin vers une image : `python2 -m detect_visage.run -i detect_visage/data/pas_visage.png` par exemple ! Etape 2 : https://steemit.com/programming/@defy/etape-2-mise-a-disposition-sur-le-web
json metadata{"tags":["python","programming","opencv","fr","francais"],"links":["https://docs.opencv.org/3.3.1/d7/d8b/tutorial_py_face_detection.html","https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml","https://github.com/ddonatien/detect_visage/blob/v0/app/detect.py","https://github.com/ddonatien/detect_visage/blob/v0/run.py","https://steemit.com/programming/@defy/etape-2-mise-a-disposition-sur-le-web"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #24481858/Trx 9b2b1131ab3cd68d25a960b5de3b35cd2fc98b69
View Raw JSON Data
{
  "trx_id": "9b2b1131ab3cd68d25a960b5de3b35cd2fc98b69",
  "block": 24481858,
  "trx_in_block": 16,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-25T09:51:36",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "python",
      "author": "defy",
      "permlink": "etape-1-creation-du-service",
      "title": "Etape 1 : création du service",
      "body": "Dans cette première étape nous allons développer un service simple de détection de visages comme base pour la suite.\n\nComment faire de la détection de visage en python grâce à openCV ?\n\nNous allons utiliser la librairie python cv2 et plus particulièrement le _CascadeClassifier_.\n\n# Initialisation du projet.\n\n\n- Organisation des fichiers.\n\n    Nous allons suivre l'arborescence suivante pour notre projet. C'est une organisation très classique pour un package python.\n  ```\n  /\n    run.py\n    app/\n      __init__.py\n      detect.py\n    models/\n      a.xml\n    data/\n      img.jpg\n  ```\n\n\n- Technologie de reconnaissance.\n\n  Dans le but de rester assez concis nous allons utiliser pour ce projet un modèle pré-entrainé de haar cascade détection fourni avec openCV. Pour aller plus loin des informations complémentaires sont disponibles au lien suivant : https://docs.opencv.org/3.3.1/d7/d8b/tutorial_py_face_detection.html\n\n\n# Développement.\n\n\nComme on peut l'intuiter en observant l'arborescence nous allons dans ce projet séparer la partie intelligence et la partie interface dans deux fichiers différents. Dans le fichier detect.py nous allons réunir tout ce qui est nécessaire au détecteur, tandis que le fichier run.py permettra d'instancier un détecteur et de l'utiliser sur une image soumise par l'utilisateur.\n\n  Préalablement au développement il est nécessaire de télécharger la modèle pré-entrainé disponible au lien suivant : https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml  dans le dossier `models`.\n\n  - detect.py\n      Dans detect.py nous allons faire une classe python DetectVisage que nous pourrons ensuite importer et instancier dans le run.py.\n      Cette classe n'a que deux actions à effectuer :  charger le modèle en mémoire et utiliser ce modèle pour faire de la détéction. On va donc traduire cela par deux méthodes : une méthode charge_model et une méthode detect.\n\n    *charge_model* :\n\n    ```\n    def charge_model(self):\n\n        root_path = os.path.dirname(sys.modules['__main__'].__file__)\n        model_path = os.path.join(root_path, 'models')\n        self.filtre = cv2.CascadeClassifier(\n            os.path.join(model_path, 'haarcascade_frontalface_default.xml'))\n    ```\n\n    On notera que l'on récupère le chemin vers le xml du modèle relativement à la racine du projet. Cela permet de pouvoir déplacer facilement le projet dans un système ou d'un système à un autre sans avoir à se soucier de problème de fichiers perdus.\n\n    *detect* :\n\n     ``` \n    def detect(self, path_image):\n\n        image = cv2.imread(path_image)\n        image_niveaux_gris = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n        face = self.filtre.detectMultiScale(image_niveaux_gris)\n        return False if len(face) == 0 else True\n      ```\n\n    Pour faire la détection nous allons utiliser la méthode detectMultiScale de notre CascadeClassifier. Cette méthode va chercher plusieurs fois un visage dans l'image en augmentant la taille de la zone de détection de 10% à chaque itération (on utilise la valeur par défaut. Cela permet d'être robuste au zoom.\n    Le détecteur fonctionne sur des images en niveaux de gris. Il est donc important de convertir l'espace des couleurs avant de l'utiliser.\n\n    Code complet : https://github.com/ddonatien/detect_visage/blob/v0/app/detect.py\n\n\n\n\n\n  Nous avons maintenant un détecteur de visage ! Mais aucune façon de dialoguer avec...\n\n  - run.py\n\n    Pour pallier  ce problème nous allons pour l'instant faire une interface minimaliste avec la console. Pour ce faire nous nous servirons de la librairie getopts pour pouvoir passer des chemins vers des images au détecteur.\n\n    Une fois la librairie importée il ne nous restera plus qu'à définir les arguments attendus et agir en conséquences.\n\n    ```\n    try:\n        opts, args = getopt.getopt(sys.argv[1:], 'h:i:', ['help', 'image'])\n    except getopt.GetoptError:\n        sys.exit(2)\n    \n    chemin_image = ''\n    for opt, arg in opts:\n        if opt in ('-i', '--image'):\n            chemin_image = arg\n    \n    detecteur = DetectVisage()\n    if detecteur.detect(chemin_image):\n        print(\"Visage detecte !\")\n    else:\n        print(\"Pas de visage\")\n    ```\n\n    Code complet ici : https://github.com/ddonatien/detect_visage/blob/v0/run.py\n  \nVous pouvez maintenant tester votre détecteur avec vos images ou avec les deux images de test fournies avec le projet (dans data) en appelant le run du package et en lui donnant le chemin vers une image : `python2 -m detect_visage.run -i detect_visage/data/pas_visage.png` par exemple !\n\n\n\n\nEtape 2 : https://steemit.com/programming/@defy/etape-2-mise-a-disposition-sur-le-web",
      "json_metadata": "{\"tags\":[\"python\",\"programming\",\"opencv\",\"fr\",\"francais\"],\"links\":[\"https://docs.opencv.org/3.3.1/d7/d8b/tutorial_py_face_detection.html\",\"https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml\",\"https://github.com/ddonatien/detect_visage/blob/v0/app/detect.py\",\"https://github.com/ddonatien/detect_visage/blob/v0/run.py\",\"https://steemit.com/programming/@defy/etape-2-mise-a-disposition-sur-le-web\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
defypublished a new post: etape-1-creation-du-service
2018/07/23 15:27:12
parent author
parent permlinkpython
authordefy
permlinketape-1-creation-du-service
titleEtape 1 : création du service
bodyDans cette première étape nous allons développer un service simple de détection de visages comme base pour la suite. Comment faire de la détection de visage en python grâce à openCV ? Nous allons utiliser la librairie python cv2 et plus particulièrement le _CascadeClassifier_. # Initialisation du projet. - Organisation des fichiers. Nous allons suivre l'arborescence suivante pour notre projet. C'est une organisation très classique pour un package python. ``` / run.py app/ __init__.py detect.py models/ a.xml data/ img.jpg ``` - Technologie de reconnaissance. Dans le but de rester assez concis nous allons utiliser pour ce projet un modèle pré-entrainé de haar cascade détection fourni avec openCV. Pour aller plus loin des informations complémentaires sont disponibles au lien suivant : https://docs.opencv.org/3.3.1/d7/d8b/tutorial_py_face_detection.html # Développement. Comme on peut l'intuiter en observant l'arborescence nous allons dans ce projet séparer la partie intelligence et la partie interface dans deux fichiers différents. Dans le fichier detect.py nous allons réunir tout ce qui est nécessaire au détecteur, tandis que le fichier run.py permettra d'instancier un détecteur et de l'utiliser sur une image soumise par l'utilisateur. Préalablement au développement il est nécessaire de télécharger la modèle pré-entrainé disponible au lien suivant : https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml dans le dossier `models`. - detect.py Dans detect.py nous allons faire une classe python DetectVisage que nous pourrons ensuite importer et instancier dans le run.py. Cette classe n'a que deux actions à effectuer : charger le modèle en mémoire et utiliser ce modèle pour faire de la détéction. On va donc traduire cela par deux méthodes : une méthode charge_model et une méthode detect. *charge_model* : ``` def charge_model(self): root_path = os.path.dirname(sys.modules['__main__'].__file__) model_path = os.path.join(root_path, 'models') self.filtre = cv2.CascadeClassifier( os.path.join(model_path, 'haarcascade_frontalface_default.xml')) ``` On notera que l'on récupère le chemin vers le xml du modèle relativement à la racine du projet. Cela permet de pouvoir déplacer facilement le projet dans un système ou d'un système à un autre sans avoir à se soucier de problème de fichiers perdus. *detect* : ``` def detect(self, path_image): image = cv2.imread(path_image) image_niveaux_gris = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) face = self.filtre.detectMultiScale(image_niveaux_gris) return False if len(face) == 0 else True ``` Pour faire la détection nous allons utiliser la méthode detectMultiScale de notre CascadeClassifier. Cette méthode va chercher plusieurs fois un visage dans l'image en augmentant la taille de la zone de détection de 10% à chaque itération (on utilise la valeur par défaut. Cela permet d'être robuste au zoom. Le détecteur fonctionne sur des images en niveaux de gris. Il est donc important de convertir l'espace des couleurs avant de l'utiliser. Code complet : https://github.com/ddonatien/detect_visage/blob/v0/app/detect.py Nous avons maintenant un détecteur de visage ! Mais aucune façon de dialoguer avec... - run.py Pour pallier ce problème nous allons pour l'instant faire une interface minimaliste avec la console. Pour ce faire nous nous servirons de la librairie getopts pour pouvoir passer des chemins vers des images au détecteur. Une fois la librairie importée il ne nous restera plus qu'à définir les arguments attendus et agir en conséquences. ``` try: opts, args = getopt.getopt(sys.argv[1:], 'h:i:', ['help', 'image']) except getopt.GetoptError: sys.exit(2) chemin_image = '' for opt, arg in opts: if opt in ('-i', '--image'): chemin_image = arg detecteur = DetectVisage() if detecteur.detect(chemin_image): print("Visage detecte !") else: print("Pas de visage") ``` Code complet ici : https://github.com/ddonatien/detect_visage/blob/v0/run.py Vous pouvez maintenant tester votre détecteur avec vos images ou avec les deux images de test fournies avec le projet (dans data) en appelant le run du package et en lui donnant le chemin vers une image : `python2 -m detect_visage.run -i detect_visage/data/pas_visage.png` par exemple ! Etape 2 : https://steemit.com/programming/@defy/etape-2-mise-a-disposition-sur-le-web
json metadata{"tags":["programming","python","opencv"],"links":["https://docs.opencv.org/3.3.1/d7/d8b/tutorial_py_face_detection.html","https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml","https://github.com/ddonatien/detect_visage/blob/v0/app/detect.py","https://github.com/ddonatien/detect_visage/blob/v0/run.py","https://steemit.com/programming/@defy/etape-2-mise-a-disposition-sur-le-web"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #24430989/Trx efd1b79d46a19b502b23cfc66d8a51502ed45cd4
View Raw JSON Data
{
  "trx_id": "efd1b79d46a19b502b23cfc66d8a51502ed45cd4",
  "block": 24430989,
  "trx_in_block": 21,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-23T15:27:12",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "python",
      "author": "defy",
      "permlink": "etape-1-creation-du-service",
      "title": "Etape 1 : création du service",
      "body": "Dans cette première étape nous allons développer un service simple de détection de visages comme base pour la suite.\n\nComment faire de la détection de visage en python grâce à openCV ?\n\nNous allons utiliser la librairie python cv2 et plus particulièrement le _CascadeClassifier_.\n\n# Initialisation du projet.\n\n\n- Organisation des fichiers.\n\n    Nous allons suivre l'arborescence suivante pour notre projet. C'est une organisation très classique pour un package python.\n  ```\n  /\n    run.py\n    app/\n      __init__.py\n      detect.py\n    models/\n      a.xml\n    data/\n      img.jpg\n  ```\n\n\n- Technologie de reconnaissance.\n\n  Dans le but de rester assez concis nous allons utiliser pour ce projet un modèle pré-entrainé de haar cascade détection fourni avec openCV. Pour aller plus loin des informations complémentaires sont disponibles au lien suivant : https://docs.opencv.org/3.3.1/d7/d8b/tutorial_py_face_detection.html\n\n\n# Développement.\n\n\nComme on peut l'intuiter en observant l'arborescence nous allons dans ce projet séparer la partie intelligence et la partie interface dans deux fichiers différents. Dans le fichier detect.py nous allons réunir tout ce qui est nécessaire au détecteur, tandis que le fichier run.py permettra d'instancier un détecteur et de l'utiliser sur une image soumise par l'utilisateur.\n\n  Préalablement au développement il est nécessaire de télécharger la modèle pré-entrainé disponible au lien suivant : https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml  dans le dossier `models`.\n\n  - detect.py\n      Dans detect.py nous allons faire une classe python DetectVisage que nous pourrons ensuite importer et instancier dans le run.py.\n      Cette classe n'a que deux actions à effectuer :  charger le modèle en mémoire et utiliser ce modèle pour faire de la détéction. On va donc traduire cela par deux méthodes : une méthode charge_model et une méthode detect.\n\n    *charge_model* :\n\n    ```\n    def charge_model(self):\n\n        root_path = os.path.dirname(sys.modules['__main__'].__file__)\n        model_path = os.path.join(root_path, 'models')\n        self.filtre = cv2.CascadeClassifier(\n            os.path.join(model_path, 'haarcascade_frontalface_default.xml'))\n    ```\n\n    On notera que l'on récupère le chemin vers le xml du modèle relativement à la racine du projet. Cela permet de pouvoir déplacer facilement le projet dans un système ou d'un système à un autre sans avoir à se soucier de problème de fichiers perdus.\n\n    *detect* :\n\n     ``` \n    def detect(self, path_image):\n\n        image = cv2.imread(path_image)\n        image_niveaux_gris = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n        face = self.filtre.detectMultiScale(image_niveaux_gris)\n        return False if len(face) == 0 else True\n      ```\n\n    Pour faire la détection nous allons utiliser la méthode detectMultiScale de notre CascadeClassifier. Cette méthode va chercher plusieurs fois un visage dans l'image en augmentant la taille de la zone de détection de 10% à chaque itération (on utilise la valeur par défaut. Cela permet d'être robuste au zoom.\n    Le détecteur fonctionne sur des images en niveaux de gris. Il est donc important de convertir l'espace des couleurs avant de l'utiliser.\n\n    Code complet : https://github.com/ddonatien/detect_visage/blob/v0/app/detect.py\n\n\n\n\n\n  Nous avons maintenant un détecteur de visage ! Mais aucune façon de dialoguer avec...\n\n  - run.py\n\n    Pour pallier  ce problème nous allons pour l'instant faire une interface minimaliste avec la console. Pour ce faire nous nous servirons de la librairie getopts pour pouvoir passer des chemins vers des images au détecteur.\n\n    Une fois la librairie importée il ne nous restera plus qu'à définir les arguments attendus et agir en conséquences.\n\n    ```\n    try:\n        opts, args = getopt.getopt(sys.argv[1:], 'h:i:', ['help', 'image'])\n    except getopt.GetoptError:\n        sys.exit(2)\n    \n    chemin_image = ''\n    for opt, arg in opts:\n        if opt in ('-i', '--image'):\n            chemin_image = arg\n    \n    detecteur = DetectVisage()\n    if detecteur.detect(chemin_image):\n        print(\"Visage detecte !\")\n    else:\n        print(\"Pas de visage\")\n    ```\n\n    Code complet ici : https://github.com/ddonatien/detect_visage/blob/v0/run.py\n  \nVous pouvez maintenant tester votre détecteur avec vos images ou avec les deux images de test fournies avec le projet (dans data) en appelant le run du package et en lui donnant le chemin vers une image : `python2 -m detect_visage.run -i detect_visage/data/pas_visage.png` par exemple !\n\n\n\n\nEtape 2 : https://steemit.com/programming/@defy/etape-2-mise-a-disposition-sur-le-web",
      "json_metadata": "{\"tags\":[\"programming\",\"python\",\"opencv\"],\"links\":[\"https://docs.opencv.org/3.3.1/d7/d8b/tutorial_py_face_detection.html\",\"https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml\",\"https://github.com/ddonatien/detect_visage/blob/v0/app/detect.py\",\"https://github.com/ddonatien/detect_visage/blob/v0/run.py\",\"https://steemit.com/programming/@defy/etape-2-mise-a-disposition-sur-le-web\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
defypublished a new post: etape-1-creation-du-service
2018/07/23 15:08:51
parent author
parent permlinkpython
authordefy
permlinketape-1-creation-du-service
titleEtape 1 : création du service
bodyDans cette première étape nous allons développer un service simple de détection de visages comme base pour la suite. Comment faire de la détection de visage en python grâce à openCV ? Nous allons utiliser la librairie python cv2 et plus particulièrement le _CascadeClassifier_. # Initialisation du projet. - Organisation des fichiers. Nous allons suivre l'arborescence suivante pour notre projet. C'est une organisation très classique pour un package python. ``` / run.py app/ __init__.py detect.py models/ a.xml data/ img.jpg ``` - Technologie de reconnaissance. Dans le but de rester assez concis nous allons utiliser pour ce projet un modèle pré-entrainé de haar cascade détection fourni avec openCV. Pour aller plus loin des informations complémentaires sont disponibles au lien suivant : https://docs.opencv.org/3.3.1/d7/d8b/tutorial_py_face_detection.html # Développement. Comme on peut l'intuiter en observant l'arborescence nous allons dans ce projet séparer la partie intelligence et la partie interface dans deux fichiers différents. Dans le fichier detect.py nous allons réunir tout ce qui est nécessaire au détecteur, tandis que le fichier run.py permettra d'instancier un détecteur et de l'utiliser sur une image soumise par l'utilisateur. Préalablement au développement il est nécessaire de télécharger la modèle pré-entrainé disponible au lien suivant : https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml dans le dossier `models`. - detect.py Dans detect.py nous allons faire une classe python DetectVisage que nous pourrons ensuite importer et instancier dans le run.py. Cette classe n'a que deux actions à effectuer : charger le modèle en mémoire et utiliser ce modèle pour faire de la détéction. On va donc traduire cela par deux méthodes : une méthode charge_model et une méthode detect. *charge_model* : ``` def charge_model(self): root_path = os.path.dirname(sys.modules['__main__'].__file__) model_path = os.path.join(root_path, 'models') self.filtre = cv2.CascadeClassifier( os.path.join(model_path, 'haarcascade_frontalface_default.xml')) ``` On notera que l'on récupère le chemin vers le xml du modèle relativement à la racine du projet. Cela permet de pouvoir déplacer facilement le projet dans un système ou d'un système à un autre sans avoir à se soucier de problème de fichiers perdus. *detect* : ``` def detect(self, path_image): image = cv2.imread(path_image) image_niveaux_gris = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) face = self.filtre.detectMultiScale(image_niveaux_gris) return False if len(face) == 0 else True ``` Pour faire la détection nous allons utiliser la méthode detectMultiScale de notre CascadeClassifier. Cette méthode va chercher plusieurs fois un visage dans l'image en augmentant la taille de la zone de détection de 10% à chaque itération (on utilise la valeur par défaut. Cela permet d'être robuste au zoom. Le détecteur fonctionne sur des images en niveaux de gris. Il est donc important de convertir l'espace des couleurs avant de l'utiliser. Code complet : https://github.com/ddonatien/detect_visage/blob/v0/app/detect.py Nous avons maintenant un détecteur de visage ! Mais aucune façon de dialoguer avec... - run.py Pour pallier ce problème nous allons pour l'instant faire une interface minimaliste avec la console. Pour ce faire nous nous servirons de la librairie getopts pour pouvoir passer des chemins vers des images au détecteur. Une fois la librairie importée il ne nous restera plus qu'à définir les arguments attendus et agir en conséquences. ``` try: opts, args = getopt.getopt(sys.argv[1:], 'h:i:', ['help', 'image']) except getopt.GetoptError: sys.exit(2) chemin_image = '' for opt, arg in opts: if opt in ('-i', '--image'): chemin_image = arg detecteur = DetectVisage() if detecteur.detect(chemin_image): print("Visage detecte !") else: print("Pas de visage") ``` Code complet ici : https://github.com/ddonatien/detect_visage/blob/v0/run.py Vous pouvez maintenant tester votre détecteur avec vos images ou avec les deux images de test fournies avec le projet (dans data) en appelant le run du package et en lui donnant le chemin vers une image : `python2 -m detect_visage.run -i detect_visage/data/pas_visage.png` par exemple ! Etape 2 : https://steemit.com/programming/@defy/etape-2-mise-a-disposition-sur-le-web
json metadata{"tags":["programming","python","opencv"],"links":["https://docs.opencv.org/3.3.1/d7/d8b/tutorial_py_face_detection.html","https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml","https://github.com/ddonatien/detect_visage/blob/v0/app/detect.py","https://github.com/ddonatien/detect_visage/blob/v0/run.py","https://steemit.com/programming/@defy/etape-2-mise-a-disposition-sur-le-web"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #24430622/Trx 1e69fcf2daa94bdfdd9e312157c16bbbe85f14a4
View Raw JSON Data
{
  "trx_id": "1e69fcf2daa94bdfdd9e312157c16bbbe85f14a4",
  "block": 24430622,
  "trx_in_block": 41,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-23T15:08:51",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "python",
      "author": "defy",
      "permlink": "etape-1-creation-du-service",
      "title": "Etape 1 : création du service",
      "body": "Dans cette première étape nous allons développer un service simple de détection de visages comme base pour la suite.\n\nComment faire de la détection de visage en python grâce à openCV ?\n\nNous allons utiliser la librairie python cv2 et plus particulièrement le _CascadeClassifier_.\n\n# Initialisation du projet.\n\n\n- Organisation des fichiers.\n\n    Nous allons suivre l'arborescence suivante pour notre projet. C'est une organisation très classique pour un package python.\n  ```\n  /\n    run.py\n    app/\n      __init__.py\n      detect.py\n    models/\n      a.xml\n    data/\n      img.jpg\n  ```\n\n\n- Technologie de reconnaissance.\n\n  Dans le but de rester assez concis nous allons utiliser pour ce projet un modèle pré-entrainé de haar cascade détection fourni avec openCV. Pour aller plus loin des informations complémentaires sont disponibles au lien suivant : https://docs.opencv.org/3.3.1/d7/d8b/tutorial_py_face_detection.html\n\n\n# Développement.\n\n\nComme on peut l'intuiter en observant l'arborescence nous allons dans ce projet séparer la partie intelligence et la partie interface dans deux fichiers différents. Dans le fichier detect.py nous allons réunir tout ce qui est nécessaire au détecteur, tandis que le fichier run.py permettra d'instancier un détecteur et de l'utiliser sur une image soumise par l'utilisateur.\n\n  Préalablement au développement il est nécessaire de télécharger la modèle pré-entrainé disponible au lien suivant : https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml  dans le dossier `models`.\n\n  - detect.py\n      Dans detect.py nous allons faire une classe python DetectVisage que nous pourrons ensuite importer et instancier dans le run.py.\n      Cette classe n'a que deux actions à effectuer :  charger le modèle en mémoire et utiliser ce modèle pour faire de la détéction. On va donc traduire cela par deux méthodes : une méthode charge_model et une méthode detect.\n\n    *charge_model* :\n\n    ```\n    def charge_model(self):\n\n        root_path = os.path.dirname(sys.modules['__main__'].__file__)\n        model_path = os.path.join(root_path, 'models')\n        self.filtre = cv2.CascadeClassifier(\n            os.path.join(model_path, 'haarcascade_frontalface_default.xml'))\n    ```\n\n    On notera que l'on récupère le chemin vers le xml du modèle relativement à la racine du projet. Cela permet de pouvoir déplacer facilement le projet dans un système ou d'un système à un autre sans avoir à se soucier de problème de fichiers perdus.\n\n    *detect* :\n\n     ``` \n    def detect(self, path_image):\n\n        image = cv2.imread(path_image)\n        image_niveaux_gris = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n        face = self.filtre.detectMultiScale(image_niveaux_gris)\n        return False if len(face) == 0 else True\n      ```\n\n    Pour faire la détection nous allons utiliser la méthode detectMultiScale de notre CascadeClassifier. Cette méthode va chercher plusieurs fois un visage dans l'image en augmentant la taille de la zone de détection de 10% à chaque itération (on utilise la valeur par défaut. Cela permet d'être robuste au zoom.\n    Le détecteur fonctionne sur des images en niveaux de gris. Il est donc important de convertir l'espace des couleurs avant de l'utiliser.\n\n    Code complet : https://github.com/ddonatien/detect_visage/blob/v0/app/detect.py\n\n\n\n\n\n  Nous avons maintenant un détecteur de visage ! Mais aucune façon de dialoguer avec...\n\n  - run.py\n\n    Pour pallier  ce problème nous allons pour l'instant faire une interface minimaliste avec la console. Pour ce faire nous nous servirons de la librairie getopts pour pouvoir passer des chemins vers des images au détecteur.\n\n    Une fois la librairie importée il ne nous restera plus qu'à définir les arguments attendus et agir en conséquences.\n\n    ```\n    try:\n        opts, args = getopt.getopt(sys.argv[1:], 'h:i:', ['help', 'image'])\n    except getopt.GetoptError:\n        sys.exit(2)\n    \n    chemin_image = ''\n    for opt, arg in opts:\n        if opt in ('-i', '--image'):\n            chemin_image = arg\n    \n    detecteur = DetectVisage()\n    if detecteur.detect(chemin_image):\n        print(\"Visage detecte !\")\n    else:\n        print(\"Pas de visage\")\n    ```\n\n    Code complet ici : https://github.com/ddonatien/detect_visage/blob/v0/run.py\n  \nVous pouvez maintenant tester votre détecteur avec vos images ou avec les deux images de test fournies avec le projet (dans data) en appelant le run du package et en lui donnant le chemin vers une image : `python2 -m detect_visage.run -i detect_visage/data/pas_visage.png` par exemple !\n\n\n\n\nEtape 2 : https://steemit.com/programming/@defy/etape-2-mise-a-disposition-sur-le-web",
      "json_metadata": "{\"tags\":[\"programming\",\"python\",\"opencv\"],\"links\":[\"https://docs.opencv.org/3.3.1/d7/d8b/tutorial_py_face_detection.html\",\"https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml\",\"https://github.com/ddonatien/detect_visage/blob/v0/app/detect.py\",\"https://github.com/ddonatien/detect_visage/blob/v0/run.py\",\"https://steemit.com/programming/@defy/etape-2-mise-a-disposition-sur-le-web\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
defypublished a new post: etape-1-creation-du-service
2018/07/23 15:08:18
parent author
parent permlinkpython
authordefy
permlinketape-1-creation-du-service
titleEtape 1 : création du service
body@@ -4592,8 +4592,98 @@ xemple ! +%0A%0A%0A%0A%0AEtape 2 : https://steemit.com/programming/@defy/etape-2-mise-a-disposition-sur-le-web
json metadata{"tags":["python","programming","opencv"],"links":["https://docs.opencv.org/3.3.1/d7/d8b/tutorial_py_face_detection.html","https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml","https://github.com/ddonatien/detect_visage/blob/v0/app/detect.py","https://github.com/ddonatien/detect_visage/blob/v0/run.py","https://steemit.com/programming/@defy/etape-2-mise-a-disposition-sur-le-web"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #24430611/Trx 7eb6ce6b1d1342206a22677d0ae346a7829ea2a8
View Raw JSON Data
{
  "trx_id": "7eb6ce6b1d1342206a22677d0ae346a7829ea2a8",
  "block": 24430611,
  "trx_in_block": 64,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-23T15:08:18",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "python",
      "author": "defy",
      "permlink": "etape-1-creation-du-service",
      "title": "Etape 1 : création du service",
      "body": "@@ -4592,8 +4592,98 @@\n xemple !\n+%0A%0A%0A%0A%0AEtape 2 : https://steemit.com/programming/@defy/etape-2-mise-a-disposition-sur-le-web\n",
      "json_metadata": "{\"tags\":[\"python\",\"programming\",\"opencv\"],\"links\":[\"https://docs.opencv.org/3.3.1/d7/d8b/tutorial_py_face_detection.html\",\"https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml\",\"https://github.com/ddonatien/detect_visage/blob/v0/app/detect.py\",\"https://github.com/ddonatien/detect_visage/blob/v0/run.py\",\"https://steemit.com/programming/@defy/etape-2-mise-a-disposition-sur-le-web\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
2018/07/23 15:07:39
parent author
parent permlinkprogramming
authordefy
permlinketape-2-mise-a-disposition-sur-le-web
titleEtape 2 : mise à disposition sur le web
bodyUne fois un tel service mis en place, il est de l'ordre de l'intérêt général de le mettre à disposition de tous. Nous allons donc devoir coder une api minimaliste pour pouvoir rendre ce service accessible via le web. C'est ce que nous allons nous atteler dans cette partie. Et pour ce faire et rester dans le Python nous allons utiliser le microframework [flask](http://flask.pocoo.org/). # Initialisation du projet - Organisation des fichiers J'ai pour ma part choisi de développer mon micro serveur dans le même projet que celui de l'étape précedente, mais on peut choisir de mettre la racine où l'on souhaite. Pour cette partie nous auront besoin que d'une arborescence très limitée. En effet nous aurons juste besoin d'un fichier .py qui décrit le fonctionnement du serveur et d'un dossier `templates` qui contiendra le template de notre page d'accueil. On penchera donc pour la structure suivante : ``` / server.py templates/ index.html ``` - Installation de Flask Flask s'installe très facilement avec pip : `pip install flask` On aura aussi besoin du package flask-uploads tout à l'heure pour gérer les uploads d'images, donc il peut être pertinent de l'installer maintenant : ` pip install Flask-Uploads` # Développement d'un serveur basique Nous allons commencer par un serveur très minimaliste que nous complèterons ensuite. Pour cela nous aurons seulement besoin de créer un fichier _index.html_ et un fichier _server.py_. **index.html** Nous aurons seulement besoin sur notre page web d'un formulaire pour pourvoir téléverser des images vers notre serveur. Un fichier html de ce type nous convient donc amplement : ``` <html> <head> <title>Détection visage</title> </head> <body> Veuillez soumettre une image à la détection : <form method=POST enctype=multipart/form-data action=""> <input type=file name=photo> <input type="submit"> </form> </body> </html> ``` On remarquera que nous avons laissé le champ action vide car nous n'avons pas encore créé la route pour l'upload d'images **server.py** Pour l'instant nous avons seulement besoin d'une route qui permette de renvoyer notre page html à une requête GET sur notre url. Rien de plus simple : ``` from flask import Flask, render_template app = Flask(__name__) @app.route('/') def index(): return render_template('index.html') if __name__ == '__main__': app.run() ``` Notre serveur est prêt ! Pour le lancer : ``` export FLASK_APP=server.py flask run ``` On retrouve notre page web sur `localhost:5000`. C'est très bien, mais il nous manque encore la fonctionnalité principale, à savoir renvoyer les résultats de notre run.py de l'étape précédente à notre utilisateur. # Ajout de la route d'upload pour la détection Nous allons commencer par ajouter la route dans server.py. Les requêtes que nous attendrons seront des requêtes POST sur la route _/upload_. ``` @app.route('/upload', methods=['POST']) def upload(): ``` Pour gérer la récupération des images nous allons utiliser le package [flask_upload](https://pythonhosted.org/Flask-Uploads/). Nous allons donc créer un nouveau UploadSet et le configurer de manière à définir le dossier où seront téléversées les images envoyées par les utilisateurs. ``` photos = UploadSet('photos', IMAGES) app.config['UPLOADED_PHOTOS_DEST'] = 'static/img' configure_uploads(app, photos) ``` Une fois ceci fait nous pouvons facilement enregistrer les images envoyées grâce à la méthode _save_ de notre _UploadSet_ : ``` if 'photo' in request.files: filename = photos.save(request.files['photo']) ``` Nous utiliserons le package _subprocess_ pour exécuter la commande de l'étape 1 et il ne nous reste qu'à rajouter notre route comme action dans notre template html et le tour est joué ! /!\ Il faut penser à ajouter le dossier parent de notre package "detect_visage" au path python pour que subprocess sache où le chercher. Pour lancer le serveur : ``` export PYTHONPATH=$PYTHONPATH:<path_vers_parent_detect_visage>" export FLASK_APP=server.py flask run ``` Code complet : https://github.com/ddonatien/detect_visage/releases/tag/v1
json metadata{"tags":["programming","python","flask"],"links":["http://flask.pocoo.org/","https://pythonhosted.org/Flask-Uploads/","https://github.com/ddonatien/detect_visage/releases/tag/v1"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #24430598/Trx 862ac332c0b1fd7f0236e33062a4251ecb4bddfa
View Raw JSON Data
{
  "trx_id": "862ac332c0b1fd7f0236e33062a4251ecb4bddfa",
  "block": 24430598,
  "trx_in_block": 45,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-23T15:07:39",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "programming",
      "author": "defy",
      "permlink": "etape-2-mise-a-disposition-sur-le-web",
      "title": "Etape 2 : mise à disposition sur le web",
      "body": "Une fois un tel service mis en place, il est de l'ordre de l'intérêt général de le mettre à disposition de tous.  \nNous allons donc devoir coder une api minimaliste pour pouvoir rendre ce service accessible via le web.\nC'est ce que nous allons nous atteler dans cette partie. Et pour ce faire et rester dans le Python nous allons utiliser le microframework [flask](http://flask.pocoo.org/).\n\n# Initialisation du projet\n - Organisation des fichiers\n  J'ai pour ma part choisi de développer mon micro serveur dans le même projet que celui de l'étape précedente, mais on peut choisir de mettre la racine où l'on souhaite.  \n  Pour cette partie nous auront besoin que d'une arborescence très limitée. En effet nous aurons juste besoin d'un fichier .py qui décrit le fonctionnement du serveur et d'un dossier `templates` qui contiendra  le template de notre page d'accueil.  \n  On penchera donc pour la structure suivante :\n    ``` \n    /\n       server.py\n       templates/\n         index.html\n    ```\n\n- Installation de Flask\n    Flask s'installe très facilement avec pip : `pip install flask`  \n    On aura aussi besoin du package flask-uploads tout à l'heure pour gérer les uploads d'images, donc il peut être pertinent de l'installer maintenant : ` pip install Flask-Uploads`\n\n# Développement d'un serveur basique\n  Nous allons commencer par un serveur très minimaliste que nous complèterons ensuite. Pour cela nous aurons seulement besoin de créer un fichier _index.html_ et un fichier _server.py_.\n\n  **index.html**\n   Nous aurons seulement besoin sur notre page web d'un formulaire pour pourvoir téléverser des images vers notre serveur. Un fichier html de ce type nous convient donc amplement :  \n  ```\n    <html>\n        <head>\n            <title>Détection visage</title>\n        </head>\n        <body>\n            Veuillez soumettre une image à la détection :\n            <form method=POST enctype=multipart/form-data action=\"\">\n                <input type=file name=photo>\n                <input type=\"submit\">\n            </form>\n        </body>\n    </html>\n  ```\n  On remarquera que nous avons laissé le champ action vide car nous n'avons pas encore créé la route pour l'upload d'images\n\n  **server.py**\n  Pour l'instant nous avons seulement besoin d'une route qui permette de renvoyer notre page html à une requête GET sur notre url.\n  Rien de plus simple :   \n  ```\n from flask import Flask, render_template\n\napp = Flask(__name__)\n\[email protected]('/')\ndef index():\n    return render_template('index.html')\n\n\nif __name__ == '__main__':\n    app.run()\n```\n  \n   \nNotre serveur est prêt !\nPour le lancer : \n```\nexport FLASK_APP=server.py\nflask run\n```\n\nOn retrouve notre page web sur `localhost:5000`.   \nC'est très bien,  mais il nous manque encore la fonctionnalité principale, à savoir renvoyer les résultats de notre run.py de l'étape précédente à notre utilisateur.\n\n# Ajout de la route d'upload pour la détection\n\nNous allons commencer par ajouter la route dans server.py. Les requêtes que nous attendrons seront des requêtes POST sur la route _/upload_.\n```\[email protected]('/upload', methods=['POST'])\ndef upload():\n```\n\nPour gérer la récupération des images nous allons utiliser le package [flask_upload](https://pythonhosted.org/Flask-Uploads/). Nous allons  donc créer un nouveau UploadSet et le configurer de manière à définir le dossier où seront téléversées les images envoyées par les utilisateurs.\n\n```\nphotos = UploadSet('photos', IMAGES)\n\napp.config['UPLOADED_PHOTOS_DEST'] = 'static/img'\nconfigure_uploads(app, photos)\n```\n\nUne fois ceci fait nous pouvons facilement enregistrer les images envoyées grâce à la méthode _save_ de notre _UploadSet_ :\n```\n    if 'photo' in request.files:\n        filename = photos.save(request.files['photo'])\n```\nNous utiliserons le package _subprocess_ pour exécuter la commande de l'étape 1 et il ne nous reste qu'à rajouter notre route comme action dans notre template html et le tour est joué !\n\n/!\\ Il faut penser à ajouter le dossier parent de notre package \"detect_visage\" au path python pour que subprocess sache où le chercher.\n\nPour lancer le serveur :\n```\nexport PYTHONPATH=$PYTHONPATH:<path_vers_parent_detect_visage>\"\nexport  FLASK_APP=server.py\nflask run\n```\n\nCode complet :  https://github.com/ddonatien/detect_visage/releases/tag/v1",
      "json_metadata": "{\"tags\":[\"programming\",\"python\",\"flask\"],\"links\":[\"http://flask.pocoo.org/\",\"https://pythonhosted.org/Flask-Uploads/\",\"https://github.com/ddonatien/detect_visage/releases/tag/v1\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
steemdelegated 18.063 SP to @defy
2018/07/23 11:50:42
delegatorsteem
delegateedefy
vesting shares29381.674569 VESTS
Transaction InfoBlock #24426662/Trx 04619469d8bb12db0d4c1887e3821883e1ac7a32
View Raw JSON Data
{
  "trx_id": "04619469d8bb12db0d4c1887e3821883e1ac7a32",
  "block": 24426662,
  "trx_in_block": 7,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-23T11:50:42",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "defy",
      "vesting_shares": "29381.674569 VESTS"
    }
  ]
}
2018/07/23 11:10:18
voteryoungogmarqs
authordefy
permlinketape-1-creation-du-service
weight2 (0.02%)
Transaction InfoBlock #24425854/Trx 1307415dfdce28aba4fb67b420f4eb2ef98b5897
View Raw JSON Data
{
  "trx_id": "1307415dfdce28aba4fb67b420f4eb2ef98b5897",
  "block": 24425854,
  "trx_in_block": 14,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-23T11:10:18",
  "op": [
    "vote",
    {
      "voter": "youngogmarqs",
      "author": "defy",
      "permlink": "etape-1-creation-du-service",
      "weight": 2
    }
  ]
}
defypublished a new post: etape-1-creation-du-service
2018/07/23 10:53:42
parent author
parent permlinkpython
authordefy
permlinketape-1-creation-du-service
titleEtape 1 : création du service
body@@ -921,17 +921,17 @@ ml%0A%0A%0A# D -e +%C3%A9 veloppem
json metadata{"tags":["python","programming","opencv"],"links":["https://docs.opencv.org/3.3.1/d7/d8b/tutorial_py_face_detection.html","https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml","https://github.com/ddonatien/detect_visage/blob/v0/app/detect.py","https://github.com/ddonatien/detect_visage/blob/v0/run.py"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #24425522/Trx 56609feb505dfe10835ebdf1937fa32d3ebce8cf
View Raw JSON Data
{
  "trx_id": "56609feb505dfe10835ebdf1937fa32d3ebce8cf",
  "block": 24425522,
  "trx_in_block": 49,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-23T10:53:42",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "python",
      "author": "defy",
      "permlink": "etape-1-creation-du-service",
      "title": "Etape 1 : création du service",
      "body": "@@ -921,17 +921,17 @@\n ml%0A%0A%0A# D\n-e\n+%C3%A9\n veloppem\n",
      "json_metadata": "{\"tags\":[\"python\",\"programming\",\"opencv\"],\"links\":[\"https://docs.opencv.org/3.3.1/d7/d8b/tutorial_py_face_detection.html\",\"https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml\",\"https://github.com/ddonatien/detect_visage/blob/v0/app/detect.py\",\"https://github.com/ddonatien/detect_visage/blob/v0/run.py\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
defyupdated their account properties
2018/07/23 10:52:27
accountdefy
memo keySTM8NC1R2yfVkLwpv4CVXVpARan6bKUG52Ppu7mkUbZXPaLo6FQhV
json metadata{"profile":{"name":"ddonatien","profile_image":"https://cdn.steemitimages.com/DQmTXzxLdLJxEZf6Gc1BdHHfj9oiutKam1rgmg2LvtzChHq/DONATIEN_SMALLER_SQUARE.jpg"}}
Transaction InfoBlock #24425497/Trx 81789014b12203954add705d6392a734dd402675
View Raw JSON Data
{
  "trx_id": "81789014b12203954add705d6392a734dd402675",
  "block": 24425497,
  "trx_in_block": 44,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-23T10:52:27",
  "op": [
    "account_update",
    {
      "account": "defy",
      "memo_key": "STM8NC1R2yfVkLwpv4CVXVpARan6bKUG52Ppu7mkUbZXPaLo6FQhV",
      "json_metadata": "{\"profile\":{\"name\":\"ddonatien\",\"profile_image\":\"https://cdn.steemitimages.com/DQmTXzxLdLJxEZf6Gc1BdHHfj9oiutKam1rgmg2LvtzChHq/DONATIEN_SMALLER_SQUARE.jpg\"}}"
    }
  ]
}
defypublished a new post: etape-1-creation-du-service
2018/07/23 10:51:18
parent author
parent permlinkpython
authordefy
permlinketape-1-creation-du-service
titleEtape 1 : création du service
bodyDans cette première étape nous allons développer un service simple de détection de visages comme base pour la suite. Comment faire de la détection de visage en python grâce à openCV ? Nous allons utiliser la librairie python cv2 et plus particulièrement le _CascadeClassifier_. # Initialisation du projet. - Organisation des fichiers. Nous allons suivre l'arborescence suivante pour notre projet. C'est une organisation très classique pour un package python. ``` / run.py app/ __init__.py detect.py models/ a.xml data/ img.jpg ``` - Technologie de reconnaissance. Dans le but de rester assez concis nous allons utiliser pour ce projet un modèle pré-entrainé de haar cascade détection fourni avec openCV. Pour aller plus loin des informations complémentaires sont disponibles au lien suivant : https://docs.opencv.org/3.3.1/d7/d8b/tutorial_py_face_detection.html # Developpement. Comme on peut l'intuiter en observant l'arborescence nous allons dans ce projet séparer la partie intelligence et la partie interface dans deux fichiers différents. Dans le fichier detect.py nous allons réunir tout ce qui est nécessaire au détecteur, tandis que le fichier run.py permettra d'instancier un détecteur et de l'utiliser sur une image soumise par l'utilisateur. Préalablement au développement il est nécessaire de télécharger la modèle pré-entrainé disponible au lien suivant : https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml dans le dossier `models`. - detect.py Dans detect.py nous allons faire une classe python DetectVisage que nous pourrons ensuite importer et instancier dans le run.py. Cette classe n'a que deux actions à effectuer : charger le modèle en mémoire et utiliser ce modèle pour faire de la détéction. On va donc traduire cela par deux méthodes : une méthode charge_model et une méthode detect. *charge_model* : ``` def charge_model(self): root_path = os.path.dirname(sys.modules['__main__'].__file__) model_path = os.path.join(root_path, 'models') self.filtre = cv2.CascadeClassifier( os.path.join(model_path, 'haarcascade_frontalface_default.xml')) ``` On notera que l'on récupère le chemin vers le xml du modèle relativement à la racine du projet. Cela permet de pouvoir déplacer facilement le projet dans un système ou d'un système à un autre sans avoir à se soucier de problème de fichiers perdus. *detect* : ``` def detect(self, path_image): image = cv2.imread(path_image) image_niveaux_gris = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) face = self.filtre.detectMultiScale(image_niveaux_gris) return False if len(face) == 0 else True ``` Pour faire la détection nous allons utiliser la méthode detectMultiScale de notre CascadeClassifier. Cette méthode va chercher plusieurs fois un visage dans l'image en augmentant la taille de la zone de détection de 10% à chaque itération (on utilise la valeur par défaut. Cela permet d'être robuste au zoom. Le détecteur fonctionne sur des images en niveaux de gris. Il est donc important de convertir l'espace des couleurs avant de l'utiliser. Code complet : https://github.com/ddonatien/detect_visage/blob/v0/app/detect.py Nous avons maintenant un détecteur de visage ! Mais aucune façon de dialoguer avec... - run.py Pour pallier ce problème nous allons pour l'instant faire une interface minimaliste avec la console. Pour ce faire nous nous servirons de la librairie getopts pour pouvoir passer des chemins vers des images au détecteur. Une fois la librairie importée il ne nous restera plus qu'à définir les arguments attendus et agir en conséquences. ``` try: opts, args = getopt.getopt(sys.argv[1:], 'h:i:', ['help', 'image']) except getopt.GetoptError: sys.exit(2) chemin_image = '' for opt, arg in opts: if opt in ('-i', '--image'): chemin_image = arg detecteur = DetectVisage() if detecteur.detect(chemin_image): print("Visage detecte !") else: print("Pas de visage") ``` Code complet ici : https://github.com/ddonatien/detect_visage/blob/v0/run.py Vous pouvez maintenant tester votre détecteur avec vos images ou avec les deux images de test fournies avec le projet (dans data) en appelant le run du package et en lui donnant le chemin vers une image : `python2 -m detect_visage.run -i detect_visage/data/pas_visage.png` par exemple !
json metadata{"tags":["python","programming","opencv"],"links":["https://docs.opencv.org/3.3.1/d7/d8b/tutorial_py_face_detection.html","https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml","https://github.com/ddonatien/detect_visage/blob/v0/app/detect.py","https://github.com/ddonatien/detect_visage/blob/v0/run.py"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #24425474/Trx b51591a3d82561ae602c1a4ceb11d7676d478d0e
View Raw JSON Data
{
  "trx_id": "b51591a3d82561ae602c1a4ceb11d7676d478d0e",
  "block": 24425474,
  "trx_in_block": 11,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-23T10:51:18",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "python",
      "author": "defy",
      "permlink": "etape-1-creation-du-service",
      "title": "Etape 1 : création du service",
      "body": "Dans cette première étape nous allons développer un service simple de détection de visages comme base pour la suite.\n\nComment faire de la détection de visage en python grâce à openCV ?\n\nNous allons utiliser la librairie python cv2 et plus particulièrement le _CascadeClassifier_.\n\n# Initialisation du projet.\n\n\n- Organisation des fichiers.\n\n    Nous allons suivre l'arborescence suivante pour notre projet. C'est une organisation très classique pour un package python.\n  ```\n  /\n    run.py\n    app/\n      __init__.py\n      detect.py\n    models/\n      a.xml\n    data/\n      img.jpg\n  ```\n\n\n- Technologie de reconnaissance.\n\n  Dans le but de rester assez concis nous allons utiliser pour ce projet un modèle pré-entrainé de haar cascade détection fourni avec openCV. Pour aller plus loin des informations complémentaires sont disponibles au lien suivant : https://docs.opencv.org/3.3.1/d7/d8b/tutorial_py_face_detection.html\n\n\n# Developpement.\n\n\nComme on peut l'intuiter en observant l'arborescence nous allons dans ce projet séparer la partie intelligence et la partie interface dans deux fichiers différents. Dans le fichier detect.py nous allons réunir tout ce qui est nécessaire au détecteur, tandis que le fichier run.py permettra d'instancier un détecteur et de l'utiliser sur une image soumise par l'utilisateur.\n\n  Préalablement au développement il est nécessaire de télécharger la modèle pré-entrainé disponible au lien suivant : https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml  dans le dossier `models`.\n\n  - detect.py\n      Dans detect.py nous allons faire une classe python DetectVisage que nous pourrons ensuite importer et instancier dans le run.py.\n      Cette classe n'a que deux actions à effectuer :  charger le modèle en mémoire et utiliser ce modèle pour faire de la détéction. On va donc traduire cela par deux méthodes : une méthode charge_model et une méthode detect.\n\n    *charge_model* :\n\n    ```\n    def charge_model(self):\n\n        root_path = os.path.dirname(sys.modules['__main__'].__file__)\n        model_path = os.path.join(root_path, 'models')\n        self.filtre = cv2.CascadeClassifier(\n            os.path.join(model_path, 'haarcascade_frontalface_default.xml'))\n    ```\n\n    On notera que l'on récupère le chemin vers le xml du modèle relativement à la racine du projet. Cela permet de pouvoir déplacer facilement le projet dans un système ou d'un système à un autre sans avoir à se soucier de problème de fichiers perdus.\n\n    *detect* :\n\n     ``` \n    def detect(self, path_image):\n\n        image = cv2.imread(path_image)\n        image_niveaux_gris = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n        face = self.filtre.detectMultiScale(image_niveaux_gris)\n        return False if len(face) == 0 else True\n      ```\n\n    Pour faire la détection nous allons utiliser la méthode detectMultiScale de notre CascadeClassifier. Cette méthode va chercher plusieurs fois un visage dans l'image en augmentant la taille de la zone de détection de 10% à chaque itération (on utilise la valeur par défaut. Cela permet d'être robuste au zoom.\n    Le détecteur fonctionne sur des images en niveaux de gris. Il est donc important de convertir l'espace des couleurs avant de l'utiliser.\n\n    Code complet : https://github.com/ddonatien/detect_visage/blob/v0/app/detect.py\n\n\n\n\n\n  Nous avons maintenant un détecteur de visage ! Mais aucune façon de dialoguer avec...\n\n  - run.py\n\n    Pour pallier  ce problème nous allons pour l'instant faire une interface minimaliste avec la console. Pour ce faire nous nous servirons de la librairie getopts pour pouvoir passer des chemins vers des images au détecteur.\n\n    Une fois la librairie importée il ne nous restera plus qu'à définir les arguments attendus et agir en conséquences.\n\n    ```\n    try:\n        opts, args = getopt.getopt(sys.argv[1:], 'h:i:', ['help', 'image'])\n    except getopt.GetoptError:\n        sys.exit(2)\n    \n    chemin_image = ''\n    for opt, arg in opts:\n        if opt in ('-i', '--image'):\n            chemin_image = arg\n    \n    detecteur = DetectVisage()\n    if detecteur.detect(chemin_image):\n        print(\"Visage detecte !\")\n    else:\n        print(\"Pas de visage\")\n    ```\n\n    Code complet ici : https://github.com/ddonatien/detect_visage/blob/v0/run.py\n  \nVous pouvez maintenant tester votre détecteur avec vos images ou avec les deux images de test fournies avec le projet (dans data) en appelant le run du package et en lui donnant le chemin vers une image : `python2 -m detect_visage.run -i detect_visage/data/pas_visage.png` par exemple !",
      "json_metadata": "{\"tags\":[\"python\",\"programming\",\"opencv\"],\"links\":[\"https://docs.opencv.org/3.3.1/d7/d8b/tutorial_py_face_detection.html\",\"https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml\",\"https://github.com/ddonatien/detect_visage/blob/v0/app/detect.py\",\"https://github.com/ddonatien/detect_visage/blob/v0/run.py\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
defyupdated their account properties
2018/07/23 10:26:33
accountdefy
memo keySTM8NC1R2yfVkLwpv4CVXVpARan6bKUG52Ppu7mkUbZXPaLo6FQhV
json metadata{"profile":{"name":"ddonatien"}}
Transaction InfoBlock #24424979/Trx 88e9211b853dccf093c6e3f453b0743c86382021
View Raw JSON Data
{
  "trx_id": "88e9211b853dccf093c6e3f453b0743c86382021",
  "block": 24424979,
  "trx_in_block": 41,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-23T10:26:33",
  "op": [
    "account_update",
    {
      "account": "defy",
      "memo_key": "STM8NC1R2yfVkLwpv4CVXVpARan6bKUG52Ppu7mkUbZXPaLo6FQhV",
      "json_metadata": "{\"profile\":{\"name\":\"ddonatien\"}}"
    }
  ]
}
steemdelegated 5.620 SP to @defy
2018/05/16 20:13:39
delegatorsteem
delegateedefy
vesting shares9141.115723 VESTS
Transaction InfoBlock #22489774/Trx 6c064c4adec1ca25dbf43a7eb9aa6478b1e80e8c
View Raw JSON Data
{
  "trx_id": "6c064c4adec1ca25dbf43a7eb9aa6478b1e80e8c",
  "block": 22489774,
  "trx_in_block": 27,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-05-16T20:13:39",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "defy",
      "vesting_shares": "9141.115723 VESTS"
    }
  ]
}
steemdelegated 18.254 SP to @defy
2018/01/09 06:37:06
delegatorsteem
delegateedefy
vesting shares29692.106107 VESTS
Transaction InfoBlock #18819542/Trx fa994cce403449c44a018e690e988821a6cc39ba
View Raw JSON Data
{
  "trx_id": "fa994cce403449c44a018e690e988821a6cc39ba",
  "block": 18819542,
  "trx_in_block": 16,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-01-09T06:37:06",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "defy",
      "vesting_shares": "29692.106107 VESTS"
    }
  ]
}
steemdelegated 18.408 SP to @defy
2017/08/04 05:13:27
delegatorsteem
delegateedefy
vesting shares29942.916815 VESTS
Transaction InfoBlock #14271354/Trx 2dc120a87077a69420a5cb71f37903da4fc5cd96
View Raw JSON Data
{
  "trx_id": "2dc120a87077a69420a5cb71f37903da4fc5cd96",
  "block": 14271354,
  "trx_in_block": 18,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-04T05:13:27",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "defy",
      "vesting_shares": "29942.916815 VESTS"
    }
  ]
}
2017/07/25 17:44:12
voterdefy
authorfurion
permlinkthis-demo-app-lets-you-publish-videos-on-steem
weight10000 (100.00%)
Transaction InfoBlock #13998521/Trx 4e19186f36776ad538fe8730cd71aaf7eb1bf45e
View Raw JSON Data
{
  "trx_id": "4e19186f36776ad538fe8730cd71aaf7eb1bf45e",
  "block": 13998521,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-25T17:44:12",
  "op": [
    "vote",
    {
      "voter": "defy",
      "author": "furion",
      "permlink": "this-demo-app-lets-you-publish-videos-on-steem",
      "weight": 10000
    }
  ]
}
2017/07/25 17:14:06
voterdefy
authorhilarski
permlinkmonkey-capital-gives-away-1000-tokens-worth-millions-to-crypto-currency-skeptic-peter-schiff
weight10000 (100.00%)
Transaction InfoBlock #13997921/Trx b77e84c557acf39c0df56d6324e4dc5d07b3d15a
View Raw JSON Data
{
  "trx_id": "b77e84c557acf39c0df56d6324e4dc5d07b3d15a",
  "block": 13997921,
  "trx_in_block": 6,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-25T17:14:06",
  "op": [
    "vote",
    {
      "voter": "defy",
      "author": "hilarski",
      "permlink": "monkey-capital-gives-away-1000-tokens-worth-millions-to-crypto-currency-skeptic-peter-schiff",
      "weight": 10000
    }
  ]
}
2017/07/25 16:55:00
voterdefy
authorimagicnation
permlinkwhen-u-watch-a-movie-with-a-stranger
weight10000 (100.00%)
Transaction InfoBlock #13997539/Trx 6551a4682cc03d4714665e108bf8533f74942981
View Raw JSON Data
{
  "trx_id": "6551a4682cc03d4714665e108bf8533f74942981",
  "block": 13997539,
  "trx_in_block": 18,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-25T16:55:00",
  "op": [
    "vote",
    {
      "voter": "defy",
      "author": "imagicnation",
      "permlink": "when-u-watch-a-movie-with-a-stranger",
      "weight": 10000
    }
  ]
}
2017/07/25 16:54:54
required auths[]
required posting auths["defy"]
idfollow
json["follow",{"follower":"defy","following":"imagicnation","what":["blog"]}]
Transaction InfoBlock #13997537/Trx b3eab3bc4d1a21882405766e4238d7e21c873381
View Raw JSON Data
{
  "trx_id": "b3eab3bc4d1a21882405766e4238d7e21c873381",
  "block": 13997537,
  "trx_in_block": 16,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-25T16:54:54",
  "op": [
    "custom_json",
    {
      "required_auths": [],
      "required_posting_auths": [
        "defy"
      ],
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"defy\",\"following\":\"imagicnation\",\"what\":[\"blog\"]}]"
    }
  ]
}
steemcreated a new account: @defy
2017/07/25 06:15:57
fee0.500 STEEM
delegation57000.000000 VESTS
creatorsteem
new account namedefy
owner{"weight_threshold":1,"account_auths":[],"key_auths":[["STM6PnxLCdP7ehx8MXuEvNbXBfhD1qt8Xhgv3AtmmyGQQonHrqymq",1]]}
active{"weight_threshold":1,"account_auths":[],"key_auths":[["STM7DZaQ366Tsqq7kLSzm58gbAWqx8C1M6rEaCUEqg2gi6ZctBCaY",1]]}
posting{"weight_threshold":1,"account_auths":[],"key_auths":[["STM7BKSGmnqqnz7dexSeZ1bBrVYRYPtuZqtH5goMqiZY7YufXfsNb",1]]}
memo keySTM8NC1R2yfVkLwpv4CVXVpARan6bKUG52Ppu7mkUbZXPaLo6FQhV
json metadata
extensions[]
Transaction InfoBlock #13984767/Trx 9eb14c2589951abcda88f1edf1fd1f246245cc0e
View Raw JSON Data
{
  "trx_id": "9eb14c2589951abcda88f1edf1fd1f246245cc0e",
  "block": 13984767,
  "trx_in_block": 15,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-25T06:15:57",
  "op": [
    "account_create_with_delegation",
    {
      "fee": "0.500 STEEM",
      "delegation": "57000.000000 VESTS",
      "creator": "steem",
      "new_account_name": "defy",
      "owner": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM6PnxLCdP7ehx8MXuEvNbXBfhD1qt8Xhgv3AtmmyGQQonHrqymq",
            1
          ]
        ]
      },
      "active": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM7DZaQ366Tsqq7kLSzm58gbAWqx8C1M6rEaCUEqg2gi6ZctBCaY",
            1
          ]
        ]
      },
      "posting": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM7BKSGmnqqnz7dexSeZ1bBrVYRYPtuZqtH5goMqiZY7YufXfsNb",
            1
          ]
        ]
      },
      "memo_key": "STM8NC1R2yfVkLwpv4CVXVpARan6bKUG52Ppu7mkUbZXPaLo6FQhV",
      "json_metadata": "",
      "extensions": []
    }
  ]
}

Account Metadata

POSTING JSON METADATA
profile{"name":"ddonatien","profile_image":"https://cdn.steemitimages.com/DQmTXzxLdLJxEZf6Gc1BdHHfj9oiutKam1rgmg2LvtzChHq/DONATIEN_SMALLER_SQUARE.jpg","cover_image":"http://www.candlechem.com/images/D152teal.gif"}
JSON METADATA
profile{"name":"defy","cover_image":"http://www.candlechem.com/images/D152teal.gif"}
{
  "posting_json_metadata": {
    "profile": {
      "name": "ddonatien",
      "profile_image": "https://cdn.steemitimages.com/DQmTXzxLdLJxEZf6Gc1BdHHfj9oiutKam1rgmg2LvtzChHq/DONATIEN_SMALLER_SQUARE.jpg",
      "cover_image": "http://www.candlechem.com/images/D152teal.gif"
    }
  },
  "json_metadata": {
    "profile": {
      "name": "defy",
      "cover_image": "http://www.candlechem.com/images/D152teal.gif"
    }
  }
}

Auth Keys

Owner
Single Signature
Public Keys
STM6PnxLCdP7ehx8MXuEvNbXBfhD1qt8Xhgv3AtmmyGQQonHrqymq1/1
Active
Single Signature
Public Keys
STM7DZaQ366Tsqq7kLSzm58gbAWqx8C1M6rEaCUEqg2gi6ZctBCaY1/1
Posting
Single Signature
Public Keys
STM7BKSGmnqqnz7dexSeZ1bBrVYRYPtuZqtH5goMqiZY7YufXfsNb1/1
Memo
STM8NC1R2yfVkLwpv4CVXVpARan6bKUG52Ppu7mkUbZXPaLo6FQhV
{
  "owner": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM6PnxLCdP7ehx8MXuEvNbXBfhD1qt8Xhgv3AtmmyGQQonHrqymq",
        1
      ]
    ]
  },
  "active": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM7DZaQ366Tsqq7kLSzm58gbAWqx8C1M6rEaCUEqg2gi6ZctBCaY",
        1
      ]
    ]
  },
  "posting": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM7BKSGmnqqnz7dexSeZ1bBrVYRYPtuZqtH5goMqiZY7YufXfsNb",
        1
      ]
    ]
  },
  "memo": "STM8NC1R2yfVkLwpv4CVXVpARan6bKUG52Ppu7mkUbZXPaLo6FQhV"
}

Witness Votes

0 / 30
No active witness votes.
[]