이미지가 들리나요?
저는 현재 Bumble에서 Android 엔지니어로 일하고 있지만 이 문서의 내용은 Bumble에서의 작업과 관련이 없습니다.
접근성은 기능이 아니라 사회적 추세입니다 — Antonio Santos
접근성은 앱 개발에서 종종 간과되는 측면입니다. 설계 및 구현에 대한 몇 가지 사전 고려가 필요합니다. 불행하게도 많은 개발자들은 사용자 기반에 현재 접근성 기능을 사용하는 사람들이 많지 않기 때문에 노력할 가치가 없다고 생각합니다.
여기에 문제가 있습니다. 접근성을 염두에 두고 앱을 개발하지 않으면 접근성 기능을 사용하는 사람들이 앱을 다운로드하지 않으므로 사용자 기반은 주로 사람을 사용하는 비접근성 기능이 됩니다. 이로 인해 개발자는 접근성 기능을 구현하는 것이 그다지 유익하지 않을 것이라고 생각하여 그렇게 하지 않습니다. 그리고 그 주기는 계속됩니다.
최근에 나는 누군가가 모바일 앱의 접근성에 대해 이야기하는 것을 듣고 있었는데 그들은 누군가의 프로필에서 가장 먼저 보는 것이 그들의 사진이라고 지적했습니다. 그런 다음 그들은 시각 장애가 있어서 볼 수 없으며 화면의 이 부분에 사진이 있음을 알려주는 약간의 텍스트만 제공되었다고 모든 사람에게 지적했습니다.
나는 당신이 "그래, 또 무엇을 할 것인가? "라고 말하는 것을 들었습니다. .
거의 모든 스크린 리더가 이미지를 만났을 때 수행하는 작업과 정확히 일치한다는 가정이 맞을 것입니다. 그 이유는 개발자가 대신 읽을 대체 텍스트( 대체 텍스트 ) 를 스크린 리더에 제공하기 때문입니다 . 이 상황에서 가장 쉬운 방법은 다음과 같이 작성하는 것입니다.
altText = "image"
우리가 사진을 볼 때 일반적으로 사람에 대해 알아차리는 몇 가지 특성을 고려한다면 다음과 같을 것이라고 확신합니다. 머리 색깔, 눈 색깔, 안경을 쓰고 있습니까? 등. 그렇다면 스크린 리더가 "이것은 이미지입니다." 대신 모든 정보를 알려줄 수 있다면 어떨까요?
TensorFlow Lite 소개
TensorFlow는 기계 학습을 위한 플랫폼이며 이 예제에서 사용할 Android 라이브러리(및 iOS 라이브러리!)를 매우 유용하게 제공합니다.
이전 예의 특성 중 하나만 취하면 머리 색깔; 사진 속 인물의 머리 색깔을 알려주는 방법을 앱에 "가르칠" 수 있습니다.
시작하려면 Android 앱을 만드는 방법을 알고 있다고 가정하고( 튜토리얼이 없는 경우 ) 새 프로젝트를 만드십시오.
내 모습은 다음과 같습니다.
더 알고 싶은 사진의 ImageView와 머리 색깔을 결정하는 데 사용할 Button이 있습니다. 버튼 바로 아래에 결과를 표시하는 데 사용할 TextView도 있습니다.
TensorFlow Lite도 가져와야 합니다.
implementation 'org.tensorflow:tensorflow-lite-support:0.1.0'
implementation 'org.tensorflow:tensorflow-lite-metadata:0.1.0'
aaptOptions {
noCompress "tflite"
}
모델 교육
더 진행하기 전에 모델을 교육해야 합니다. 모델은 앱에서 사진의 머리 색깔을 결정하는 데 사용하는 것입니다.
이를 수행하는 몇 가지 방법이 있지만 내 컴퓨터의 처리 능력에 제한이 있으므로 CoLab을 사용하기로 했습니다 (이 옵션을 사용하려면 약간의 Python을 작성해야 하지만 익숙하지 않더라도 걱정하지 마십시오. 여기에 필요한 코드).
계속해서 CoLab에서 새 노트북을 만들고 다음을 붙여넣습니다.
!pip install tf-nightly
!pip install tflite-model-maker
그런 다음 동일한 노트북에서 다음 Python 가져오기를 추가합니다.
from tflite_model_maker import image_classifier
from tflite_model_maker.image_classifier import DataLoader
data = DataLoader.from_folder('test-data/')
model = image_classifier.create(data)
loss, accuracy = model.evaluate(data)
model.export(export_dir='/tmp/')
그러면 test-data라는 폴더에서 이미지를 로드하고 분류한 다음 /tmp/ 폴더에 TensorFlow 모델을 생성합니다.
하지만 이 코드를 실행하기 전에 테스트 데이터 폴더를 사진으로 채워야 합니다. 이것이 작동하려면 구별하려는 각 머리 색깔에 대한 test-data 내부의 폴더가 필요합니다. 예: 금발, 갈색 머리, 검정, 생강, 회색. 그런 다음 해당 머리 색깔을 가진 사람들의 사진으로 각 머리 색깔 폴더를 채웁니다(몇 가지 파일 형식만 허용하므로 jpg 및 png를 고수하십시오). 이 test-data 폴더가 CoLab의 sample-data 폴더 안에 있는지 확인하십시오. 각 데이터 세트에서 최소 10개의 이미지를 목표로 하지만 이미지가 많을수록 더 확신할 수 있습니다!
그것을 실행하자!
런타임* 동안 모든 것이 잘 진행되면 이제 CoLab /tmp/ 폴더에 model.tflite 파일이 있어야 합니다. 이 파일을 다운로드한 다음 Android 프로젝트로 가져옵니다. 다른 리소스 폴더와 동일한 수준에 "ml"이라는 새 리소스 폴더를 추가해야 합니다. 거기에 모델을 추가하십시오.
사진 분류
이제 마지막으로 할 일은 TensorFlow 모델에 대해 앱에서 사진을 실행하는 것입니다. 사진이 아직 비트맵이 아닌 경우 변환해야 합니다. 내가 한 방법은 다음과 같습니다.
val img: ImageView = findViewById(R.id.image)
val fileName = "person.jpeg"
val bitmap: Bitmap? = assetsToBitmap(fileName)
bitmap?.apply {
img.setImageBitmap(this)
}
btn.setOnClickListener {
var tfImage = TensorImage(DataType.FLOAT32)
tfImage.load(bitmap)
val imageProcessor = ImageProcessor.Builder()
.add(ResizeOp(224, 224, ResizeOp.ResizeMethod.BILINEAR))
.build()
tfImage = imageProcessor.process(tfImage)
val model = Model.newInstance(this@MainActivity)
val outputs = model.process(tfImage)
val outputBuffer = outputs.probabilityAsCategoryList
var outputText = ""
for (label in outputBuffer.iterator()) {
val text = label.label
val confidence = label.score
outputText += "$text : $confidence\n"
}
txtOutput.text = outputText
}
val outputs = model.process(tfImage)
해당 스니펫의 마지막 줄은 내 TextView에 신뢰도 점수를 표시하는 역할을 합니다. 이 맥락에서 신뢰도 점수는 그 사람이 사진의 각 머리 색깔을 가질 가능성이 얼마나 되는지 알려줍니다.
내 모습은 다음과 같습니다.
여기에서 그 사람의 머리가 검은색이라고 47% 확신하지만 회색이라고 35% 확신한다는 것을 알 수 있습니다. 약 100개의 서로 다른 이미지로 구성된 비교적 작은 데이터 세트를 사용했기 때문입니다. 대신 1000개의 이미지 데이터 세트를 사용한다면 신뢰도가 훨씬 높아질 것입니다.
이제 우리는 신뢰도 점수를 얻었고, 가장 높은 신뢰도를 가진 것을 선택하고 문자열 조작을 사용하여 사람이 읽을 수 있는 사실로 바꿀 수 있습니다. 예: "이것은 검은 머리를 가진 사람의 사진입니다." 그런 다음 이미지의 대체 텍스트를 대체할 수 있습니다. 그러므로 이미지를 묘사하라!
그런 다음 이 동일한 프로세스를 사용하여 눈 색깔, 헤어스타일, 웃는 경우 등과 같은 다른 특성에 대한 모델을 생성하여 대체 텍스트를 더욱 설명적으로 만들 수 있습니다!
머신 러닝은 종종 머리를 숙이는 것이 무섭도록 어려운 개념처럼 보이지만 TensorFlow Lite 및 MLKit과 같은 옵션을 사용할 수 있으므로 모든 수준의 개발자가 시도할 수 있습니다.
이 기사가 개발자가 앱 내 접근성을 더 고려하고 실행 가능한 솔루션을 향한 작업을 시작하는 데 도움이 되기를 바랍니다.
즐거운 코딩하세요! ⭐️
문제 해결
(*) CoLab 스크립트를 실행하는 데 문제가 있는 경우 다음을 제거해야 할 수 있습니다(가지고 있는 헤어 컬러 폴더 각각 교체).
test-data/blonde/.ipynb_checkpoints

![연결된 목록이란 무엇입니까? [1 부]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































