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 DelegationsDeleg
+4.371SP
Detailed Balance
| STEEM | ||
| balance | 0.000STEEM | STEEM |
| market_balance | 0.000STEEM | STEEM |
| savings_balance | 0.000STEEM | STEEM |
| reward_steem_balance | 0.000STEEM | STEEM |
| STEEM POWER | ||
| Own SP | 0.635SP | SP |
| Delegated Out | 0.000SP | SP |
| Delegation In | 4.371SP | SP |
| Effective Power | 5.007SP | SP |
| Reward SP (pending) | 0.000SP | SP |
| SBD | ||
| sbd_balance | 0.000SBD | SBD |
| sbd_conversions | 0.000SBD | SBD |
| sbd_market_balance | 0.000SBD | SBD |
| savings_sbd_balance | 0.000SBD | SBD |
| reward_sbd_balance | 0.000SBD | SBD |
{
"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
| name | defy |
| id | 281057 |
| rank | 244,017 |
| reputation | 1817494 |
| created | 2017-07-25T06:15:57 |
| recovery_account | steem |
| proxy | None |
| post_count | 2 |
| comment_count | 0 |
| lifetime_vote_count | 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 |
| proxied_vsf_votes | 0, 0, 0, 0 |
| can_vote | 1 |
| voting_power | 0 |
| delayed_votes | 0 |
| balance | 0.000 STEEM |
| savings_balance | 0.000 STEEM |
| sbd_balance | 0.000 SBD |
| savings_sbd_balance | 0.000 SBD |
| vesting_shares | 1033.083185 VESTS |
| delegated_vesting_shares | 0.000000 VESTS |
| received_vesting_shares | 7110.576621 VESTS |
| reward_vesting_balance | 0.000000 VESTS |
| vesting_balance | 0.000 STEEM |
| vesting_withdraw_rate | 0.000000 VESTS |
| next_vesting_withdrawal | 1969-12-31T23:59:59 |
| withdrawn | 0 |
| to_withdraw | 0 |
| withdraw_routes | 0 |
| savings_withdraw_requests | 0 |
| last_account_recovery | 1970-01-01T00:00:00 |
| reset_account | null |
| last_owner_update | 1970-01-01T00:00:00 |
| last_account_update | 2019-12-29T20:55:54 |
| mined | No |
| sbd_seconds | 0 |
| sbd_last_interest_payment | 1970-01-01T00:00:00 |
| savings_sbd_last_interest_payment | 1970-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
| Incoming | Outgoing |
|---|---|
Empty | Empty |
{
"incoming": [],
"outgoing": []
}From Date
To Date
2026/05/17 23:22:12
2026/05/17 23:22:12
| delegator | steem |
| delegatee | defy |
| vesting shares | 7110.576621 VESTS |
| Transaction Info | Block #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"
}
]
}2026/05/12 00:16:06
2026/05/12 00:16:06
| delegator | steem |
| delegatee | defy |
| vesting shares | 4398.366216 VESTS |
| Transaction Info | Block #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"
}
]
}2026/04/25 22:44:33
2026/04/25 22:44:33
| delegator | steem |
| delegatee | defy |
| vesting shares | 7123.092377 VESTS |
| Transaction Info | Block #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"
}
]
}2026/01/23 05:25:42
2026/01/23 05:25:42
| delegator | steem |
| delegatee | defy |
| vesting shares | 4439.913035 VESTS |
| Transaction Info | Block #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"
}
]
}2024/12/17 00:45:42
2024/12/17 00:45:42
| delegator | steem |
| delegatee | defy |
| vesting shares | 4604.132232 VESTS |
| Transaction Info | Block #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"
}
]
}2023/11/13 16:29:00
2023/11/13 16:29:00
| delegator | steem |
| delegatee | defy |
| vesting shares | 4773.265764 VESTS |
| Transaction Info | Block #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"
}
]
}2023/09/21 20:47:27
2023/09/21 20:47:27
| delegator | steem |
| delegatee | defy |
| vesting shares | 7710.544550 VESTS |
| Transaction Info | Block #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"
}
]
}2022/11/03 10:43:09
2022/11/03 10:43:09
| delegator | steem |
| delegatee | defy |
| vesting shares | 7932.225988 VESTS |
| Transaction Info | Block #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"
}
]
}2022/01/17 10:03:57
2022/01/17 10:03:57
| delegator | steem |
| delegatee | defy |
| vesting shares | 8152.759219 VESTS |
| Transaction Info | Block #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"
}
]
}2021/06/14 00:01:21
2021/06/14 00:01:21
| delegator | steem |
| delegatee | defy |
| vesting shares | 8336.527877 VESTS |
| Transaction Info | Block #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"
}
]
}2020/12/11 10:21:36
2020/12/11 10:21:36
| delegator | steem |
| delegatee | defy |
| vesting shares | 8523.949851 VESTS |
| Transaction Info | Block #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"
}
]
}2020/12/06 03:58:42
2020/12/06 03:58:42
| delegator | steem |
| delegatee | defy |
| vesting shares | 1912.543513 VESTS |
| Transaction Info | Block #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"
}
]
}2020/12/05 11:55:57
2020/12/05 11:55:57
| delegator | steem |
| delegatee | defy |
| vesting shares | 8530.316490 VESTS |
| Transaction Info | Block #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"
}
]
}2020/11/02 13:59:30
2020/11/02 13:59:30
| delegator | steem |
| delegatee | defy |
| vesting shares | 1920.017158 VESTS |
| Transaction Info | Block #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"
}
]
}2020/05/09 04:55:12
2020/05/09 04:55:12
| delegator | steem |
| delegatee | defy |
| vesting shares | 8732.963064 VESTS |
| Transaction Info | Block #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"
}
]
}2020/05/08 08:24:06
2020/05/08 08:24:06
| delegator | steem |
| delegatee | defy |
| vesting shares | 1953.311140 VESTS |
| Transaction Info | Block #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 properties2019/12/29 20:55:54
defyupdated their account properties
2019/12/29 20:55:54
| account | defy |
| memo key | STM8NC1R2yfVkLwpv4CVXVpARan6bKUG52Ppu7mkUbZXPaLo6FQhV |
| json metadata | {"profile":{"name":"defy","cover_image":"http://www.candlechem.com/images/D152teal.gif"}} |
| Transaction Info | Block #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 properties2019/12/29 20:55:42
defyupdated their account properties
2019/12/29 20:55:42
| 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"}} |
| Transaction Info | Block #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\"}}"
}
]
}2019/11/01 07:22:06
2019/11/01 07:22:06
| delegator | steem |
| delegatee | defy |
| vesting shares | 8839.362147 VESTS |
| Transaction Info | Block #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
2019/07/25 06:49:15
| 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! <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 Info | Block #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\"]}"
}
]
}2018/11/26 17:13:00
2018/11/26 17:13:00
| delegator | steem |
| delegatee | defy |
| vesting shares | 9036.837524 VESTS |
| Transaction Info | Block #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"
}
]
}2018/08/02 08:21:03
2018/08/02 08:21:03
| required auths | [] |
| required posting auths | ["defy"] |
| id | follow |
| json | ["follow",{"follower":"defy","following":"adsactly","what":[]}] |
| Transaction Info | Block #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\":[]}]"
}
]
}defyfollowed @markgritter2018/07/25 12:25:54
defyfollowed @markgritter
2018/07/25 12:25:54
| required auths | [] |
| required posting auths | ["defy"] |
| id | follow |
| json | ["follow",{"follower":"defy","following":"markgritter","what":["blog"]}] |
| Transaction Info | Block #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\"]}]"
}
]
}defyfollowed @birchmark2018/07/25 12:25:45
defyfollowed @birchmark
2018/07/25 12:25:45
| required auths | [] |
| required posting auths | ["defy"] |
| id | follow |
| json | ["follow",{"follower":"defy","following":"birchmark","what":["blog"]}] |
| Transaction Info | Block #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\"]}]"
}
]
}2018/07/25 12:24:12
2018/07/25 12:24:12
| required auths | [] |
| required posting auths | ["defy"] |
| id | follow |
| json | ["follow",{"follower":"defy","following":"adsactly","what":["blog"]}] |
| Transaction Info | Block #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 properties2018/07/25 11:52:24
defyupdated their account properties
2018/07/25 11:52:24
| 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"}} |
| Transaction Info | Block #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\"}}"
}
]
}defypublished a new post: etape-2-mise-a-disposition-sur-le-web2018/07/25 09:52:03
defypublished a new post: etape-2-mise-a-disposition-sur-le-web
2018/07/25 09:52:03
| 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. 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 Info | Block #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-service2018/07/25 09:51:36
defypublished a new post: etape-1-creation-du-service
2018/07/25 09:51:36
| 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. 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 Info | Block #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-service2018/07/23 15:27:12
defypublished a new post: etape-1-creation-du-service
2018/07/23 15:27:12
| 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. 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 Info | Block #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-service2018/07/23 15:08:51
defypublished a new post: etape-1-creation-du-service
2018/07/23 15:08:51
| 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. 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 Info | Block #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-service2018/07/23 15:08:18
defypublished a new post: etape-1-creation-du-service
2018/07/23 15:08:18
| 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 @@ 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 Info | Block #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\"}"
}
]
}defypublished a new post: etape-2-mise-a-disposition-sur-le-web2018/07/23 15:07:39
defypublished a new post: etape-2-mise-a-disposition-sur-le-web
2018/07/23 15:07:39
| 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. 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 Info | Block #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\"}"
}
]
}2018/07/23 11:50:42
2018/07/23 11:50:42
| delegator | steem |
| delegatee | defy |
| vesting shares | 29381.674569 VESTS |
| Transaction Info | Block #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"
}
]
}youngogmarqsupvoted (0.02%) @defy / etape-1-creation-du-service2018/07/23 11:10:18
youngogmarqsupvoted (0.02%) @defy / etape-1-creation-du-service
2018/07/23 11:10:18
| voter | youngogmarqs |
| author | defy |
| permlink | etape-1-creation-du-service |
| weight | 2 (0.02%) |
| Transaction Info | Block #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-service2018/07/23 10:53:42
defypublished a new post: etape-1-creation-du-service
2018/07/23 10:53:42
| 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 @@ 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 Info | Block #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 properties2018/07/23 10:52:27
defyupdated their account properties
2018/07/23 10:52:27
| account | defy |
| memo key | STM8NC1R2yfVkLwpv4CVXVpARan6bKUG52Ppu7mkUbZXPaLo6FQhV |
| json metadata | {"profile":{"name":"ddonatien","profile_image":"https://cdn.steemitimages.com/DQmTXzxLdLJxEZf6Gc1BdHHfj9oiutKam1rgmg2LvtzChHq/DONATIEN_SMALLER_SQUARE.jpg"}} |
| Transaction Info | Block #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-service2018/07/23 10:51:18
defypublished a new post: etape-1-creation-du-service
2018/07/23 10:51:18
| 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. 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 Info | Block #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 properties2018/07/23 10:26:33
defyupdated their account properties
2018/07/23 10:26:33
| account | defy |
| memo key | STM8NC1R2yfVkLwpv4CVXVpARan6bKUG52Ppu7mkUbZXPaLo6FQhV |
| json metadata | {"profile":{"name":"ddonatien"}} |
| Transaction Info | Block #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\"}}"
}
]
}2018/05/16 20:13:39
2018/05/16 20:13:39
| delegator | steem |
| delegatee | defy |
| vesting shares | 9141.115723 VESTS |
| Transaction Info | Block #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"
}
]
}2018/01/09 06:37:06
2018/01/09 06:37:06
| delegator | steem |
| delegatee | defy |
| vesting shares | 29692.106107 VESTS |
| Transaction Info | Block #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"
}
]
}2017/08/04 05:13:27
2017/08/04 05:13:27
| delegator | steem |
| delegatee | defy |
| vesting shares | 29942.916815 VESTS |
| Transaction Info | Block #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"
}
]
}defyupvoted (100.00%) @furion / this-demo-app-lets-you-publish-videos-on-steem2017/07/25 17:44:12
defyupvoted (100.00%) @furion / this-demo-app-lets-you-publish-videos-on-steem
2017/07/25 17:44:12
| voter | defy |
| author | furion |
| permlink | this-demo-app-lets-you-publish-videos-on-steem |
| weight | 10000 (100.00%) |
| Transaction Info | Block #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
2017/07/25 17:14:06
| voter | defy |
| author | hilarski |
| permlink | monkey-capital-gives-away-1000-tokens-worth-millions-to-crypto-currency-skeptic-peter-schiff |
| weight | 10000 (100.00%) |
| Transaction Info | Block #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
}
]
}defyupvoted (100.00%) @imagicnation / when-u-watch-a-movie-with-a-stranger2017/07/25 16:55:00
defyupvoted (100.00%) @imagicnation / when-u-watch-a-movie-with-a-stranger
2017/07/25 16:55:00
| voter | defy |
| author | imagicnation |
| permlink | when-u-watch-a-movie-with-a-stranger |
| weight | 10000 (100.00%) |
| Transaction Info | Block #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
}
]
}defyfollowed @imagicnation2017/07/25 16:54:54
defyfollowed @imagicnation
2017/07/25 16:54:54
| required auths | [] |
| required posting auths | ["defy"] |
| id | follow |
| json | ["follow",{"follower":"defy","following":"imagicnation","what":["blog"]}] |
| Transaction Info | Block #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\"]}]"
}
]
}2017/07/25 06:15:57
2017/07/25 06:15:57
| 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 | [] |
| Transaction Info | Block #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": []
}
]
}Manabar
Voting Power100.00%
Downvote Power100.00%
Resource Credits100.00%
Reputation Progress0.00%
{
"voting_manabar": {
"current_mana": "8143659806",
"last_update_time": 1779060132
},
"downvote_manabar": {
"current_mana": 2035914951,
"last_update_time": 1779060132
},
"rc_account": {
"account": "defy",
"rc_manabar": {
"current_mana": "10164408779",
"last_update_time": 1779060132
},
"max_rc_creation_adjustment": {
"amount": "2020748973",
"precision": 6,
"nai": "@@000000037"
},
"max_rc": "10164408779"
}
}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.
[]